geometry-browser.html 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>Three.js Geometry Browser</title>
  6. <link rel="shortcut icon" href="../../files/favicon.ico" />
  7. <link rel="stylesheet" type="text/css" href="../../files/main.css">
  8. <style>
  9. canvas {
  10. display: block;
  11. width: 100%;
  12. height: 100%;
  13. }
  14. #newWindow {
  15. display: block;
  16. position: absolute;
  17. bottom: 0.3em;
  18. left: 0.5em;
  19. color: #fff;
  20. }
  21. </style>
  22. </head>
  23. <body>
  24. <a id='newWindow' href='./geometry-browser.html' target='_blank'>Open in New Window</a>
  25. <script type="module">
  26. import {
  27. BoxGeometry, BoxBufferGeometry,
  28. BufferGeometry,
  29. CircleGeometry, CircleBufferGeometry,
  30. Color,
  31. ConeGeometry, ConeBufferGeometry,
  32. Curve,
  33. CylinderGeometry, CylinderBufferGeometry,
  34. DodecahedronGeometry, DodecahedronBufferGeometry,
  35. DoubleSide,
  36. ExtrudeGeometry, ExtrudeBufferGeometry,
  37. Float32BufferAttribute,
  38. FontLoader,
  39. Group,
  40. IcosahedronGeometry, IcosahedronBufferGeometry,
  41. LatheGeometry, LatheBufferGeometry,
  42. LineSegments,
  43. LineBasicMaterial,
  44. Mesh,
  45. MeshPhongMaterial,
  46. OctahedronGeometry, OctahedronBufferGeometry,
  47. ParametricGeometry, ParametricBufferGeometry,
  48. PerspectiveCamera,
  49. PlaneGeometry, PlaneBufferGeometry,
  50. PointLight,
  51. RingGeometry, RingBufferGeometry,
  52. Scene,
  53. Shape,
  54. ShapeGeometry, ShapeBufferGeometry,
  55. SphereGeometry, SphereBufferGeometry,
  56. TetrahedronGeometry, TetrahedronBufferGeometry,
  57. TextGeometry, TextBufferGeometry,
  58. TorusGeometry, TorusBufferGeometry,
  59. TorusKnotGeometry, TorusKnotBufferGeometry,
  60. TubeGeometry, TubeBufferGeometry,
  61. Vector2,
  62. Vector3,
  63. WireframeGeometry,
  64. WebGLRenderer
  65. } from "../../build/three.module.js";
  66. import { GUI } from '../../examples/jsm/libs/dat.gui.module.js';
  67. import { OrbitControls } from '../../examples/jsm/controls/OrbitControls.js';
  68. import { ParametricGeometries } from '../../examples/jsm/geometries/ParametricGeometries.js';
  69. var twoPi = Math.PI * 2;
  70. function updateGroupGeometry( mesh, geometry ) {
  71. if ( geometry.isGeometry ) {
  72. geometry = new BufferGeometry().fromGeometry( geometry );
  73. console.warn( 'THREE.GeometryBrowser: Converted Geometry to BufferGeometry.' );
  74. }
  75. mesh.children[ 0 ].geometry.dispose();
  76. mesh.children[ 1 ].geometry.dispose();
  77. mesh.children[ 0 ].geometry = new WireframeGeometry( geometry );
  78. mesh.children[ 1 ].geometry = geometry;
  79. // these do not update nicely together if shared
  80. }
  81. function CustomSinCurve( scale ) {
  82. Curve.call( this );
  83. this.scale = ( scale === undefined ) ? 1 : scale;
  84. }
  85. CustomSinCurve.prototype = Object.create( Curve.prototype );
  86. CustomSinCurve.prototype.constructor = CustomSinCurve;
  87. CustomSinCurve.prototype.getPoint = function ( t ) {
  88. var tx = t * 3 - 1.5;
  89. var ty = Math.sin( 2 * Math.PI * t );
  90. var tz = 0;
  91. return new Vector3( tx, ty, tz ).multiplyScalar( this.scale );
  92. };
  93. // heart shape
  94. var x = 0, y = 0;
  95. var heartShape = new Shape();
  96. heartShape.moveTo( x + 5, y + 5 );
  97. heartShape.bezierCurveTo( x + 5, y + 5, x + 4, y, x, y );
  98. heartShape.bezierCurveTo( x - 6, y, x - 6, y + 7, x - 6, y + 7 );
  99. heartShape.bezierCurveTo( x - 6, y + 11, x - 3, y + 15.4, x + 5, y + 19 );
  100. heartShape.bezierCurveTo( x + 12, y + 15.4, x + 16, y + 11, x + 16, y + 7 );
  101. heartShape.bezierCurveTo( x + 16, y + 7, x + 16, y, x + 10, y );
  102. heartShape.bezierCurveTo( x + 7, y, x + 5, y + 5, x + 5, y + 5 );
  103. var guis = {
  104. BoxBufferGeometry: function ( mesh ) {
  105. var data = {
  106. width: 15,
  107. height: 15,
  108. depth: 15,
  109. widthSegments: 1,
  110. heightSegments: 1,
  111. depthSegments: 1
  112. };
  113. function generateGeometry() {
  114. updateGroupGeometry( mesh,
  115. new BoxBufferGeometry(
  116. data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments
  117. )
  118. );
  119. }
  120. var folder = gui.addFolder( 'THREE.BoxBufferGeometry' );
  121. folder.add( data, 'width', 1, 30 ).onChange( generateGeometry );
  122. folder.add( data, 'height', 1, 30 ).onChange( generateGeometry );
  123. folder.add( data, 'depth', 1, 30 ).onChange( generateGeometry );
  124. folder.add( data, 'widthSegments', 1, 10 ).step( 1 ).onChange( generateGeometry );
  125. folder.add( data, 'heightSegments', 1, 10 ).step( 1 ).onChange( generateGeometry );
  126. folder.add( data, 'depthSegments', 1, 10 ).step( 1 ).onChange( generateGeometry );
  127. generateGeometry();
  128. },
  129. BoxGeometry: function ( mesh ) {
  130. var data = {
  131. width: 15,
  132. height: 15,
  133. depth: 15,
  134. widthSegments: 1,
  135. heightSegments: 1,
  136. depthSegments: 1
  137. };
  138. function generateGeometry() {
  139. updateGroupGeometry( mesh,
  140. new BoxGeometry(
  141. data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments
  142. )
  143. );
  144. }
  145. var folder = gui.addFolder( 'THREE.BoxGeometry' );
  146. folder.add( data, 'width', 1, 30 ).onChange( generateGeometry );
  147. folder.add( data, 'height', 1, 30 ).onChange( generateGeometry );
  148. folder.add( data, 'depth', 1, 30 ).onChange( generateGeometry );
  149. folder.add( data, 'widthSegments', 1, 10 ).step( 1 ).onChange( generateGeometry );
  150. folder.add( data, 'heightSegments', 1, 10 ).step( 1 ).onChange( generateGeometry );
  151. folder.add( data, 'depthSegments', 1, 10 ).step( 1 ).onChange( generateGeometry );
  152. generateGeometry();
  153. },
  154. CylinderBufferGeometry: function ( mesh ) {
  155. var data = {
  156. radiusTop: 5,
  157. radiusBottom: 5,
  158. height: 10,
  159. radialSegments: 8,
  160. heightSegments: 1,
  161. openEnded: false,
  162. thetaStart: 0,
  163. thetaLength: twoPi
  164. };
  165. function generateGeometry() {
  166. updateGroupGeometry( mesh,
  167. new CylinderBufferGeometry(
  168. data.radiusTop,
  169. data.radiusBottom,
  170. data.height,
  171. data.radialSegments,
  172. data.heightSegments,
  173. data.openEnded,
  174. data.thetaStart,
  175. data.thetaLength
  176. )
  177. );
  178. }
  179. var folder = gui.addFolder( 'THREE.CylinderBufferGeometry' );
  180. folder.add( data, 'radiusTop', 0, 30 ).onChange( generateGeometry );
  181. folder.add( data, 'radiusBottom', 0, 30 ).onChange( generateGeometry );
  182. folder.add( data, 'height', 1, 50 ).onChange( generateGeometry );
  183. folder.add( data, 'radialSegments', 3, 64 ).step( 1 ).onChange( generateGeometry );
  184. folder.add( data, 'heightSegments', 1, 64 ).step( 1 ).onChange( generateGeometry );
  185. folder.add( data, 'openEnded' ).onChange( generateGeometry );
  186. folder.add( data, 'thetaStart', 0, twoPi ).onChange( generateGeometry );
  187. folder.add( data, 'thetaLength', 0, twoPi ).onChange( generateGeometry );
  188. generateGeometry();
  189. },
  190. CylinderGeometry: function ( mesh ) {
  191. var data = {
  192. radiusTop: 5,
  193. radiusBottom: 5,
  194. height: 10,
  195. radialSegments: 8,
  196. heightSegments: 1,
  197. openEnded: false,
  198. thetaStart: 0,
  199. thetaLength: twoPi
  200. };
  201. function generateGeometry() {
  202. updateGroupGeometry( mesh,
  203. new CylinderGeometry(
  204. data.radiusTop,
  205. data.radiusBottom,
  206. data.height,
  207. data.radialSegments,
  208. data.heightSegments,
  209. data.openEnded,
  210. data.thetaStart,
  211. data.thetaLength
  212. )
  213. );
  214. }
  215. var folder = gui.addFolder( 'THREE.CylinderGeometry' );
  216. folder.add( data, 'radiusTop', 1, 30 ).onChange( generateGeometry );
  217. folder.add( data, 'radiusBottom', 1, 30 ).onChange( generateGeometry );
  218. folder.add( data, 'height', 1, 50 ).onChange( generateGeometry );
  219. folder.add( data, 'radialSegments', 3, 64 ).step( 1 ).onChange( generateGeometry );
  220. folder.add( data, 'heightSegments', 1, 64 ).step( 1 ).onChange( generateGeometry );
  221. folder.add( data, 'openEnded' ).onChange( generateGeometry );
  222. folder.add( data, 'thetaStart', 0, twoPi ).onChange( generateGeometry );
  223. folder.add( data, 'thetaLength', 0, twoPi ).onChange( generateGeometry );
  224. generateGeometry();
  225. },
  226. ConeBufferGeometry: function ( mesh ) {
  227. var data = {
  228. radius: 5,
  229. height: 10,
  230. radialSegments: 8,
  231. heightSegments: 1,
  232. openEnded: false,
  233. thetaStart: 0,
  234. thetaLength: twoPi
  235. };
  236. function generateGeometry() {
  237. updateGroupGeometry( mesh,
  238. new ConeBufferGeometry(
  239. data.radius,
  240. data.height,
  241. data.radialSegments,
  242. data.heightSegments,
  243. data.openEnded,
  244. data.thetaStart,
  245. data.thetaLength
  246. )
  247. );
  248. }
  249. var folder = gui.addFolder( 'THREE.ConeBufferGeometry' );
  250. folder.add( data, 'radius', 0, 30 ).onChange( generateGeometry );
  251. folder.add( data, 'height', 1, 50 ).onChange( generateGeometry );
  252. folder.add( data, 'radialSegments', 3, 64 ).step( 1 ).onChange( generateGeometry );
  253. folder.add( data, 'heightSegments', 1, 64 ).step( 1 ).onChange( generateGeometry );
  254. folder.add( data, 'openEnded' ).onChange( generateGeometry );
  255. folder.add( data, 'thetaStart', 0, twoPi ).onChange( generateGeometry );
  256. folder.add( data, 'thetaLength', 0, twoPi ).onChange( generateGeometry );
  257. generateGeometry();
  258. },
  259. ConeGeometry: function ( mesh ) {
  260. var data = {
  261. radius: 5,
  262. height: 10,
  263. radialSegments: 8,
  264. heightSegments: 1,
  265. openEnded: false,
  266. thetaStart: 0,
  267. thetaLength: twoPi
  268. };
  269. function generateGeometry() {
  270. updateGroupGeometry( mesh,
  271. new ConeGeometry(
  272. data.radius,
  273. data.height,
  274. data.radialSegments,
  275. data.heightSegments,
  276. data.openEnded,
  277. data.thetaStart,
  278. data.thetaLength
  279. )
  280. );
  281. }
  282. var folder = gui.addFolder( 'THREE.ConeGeometry' );
  283. folder.add( data, 'radius', 0, 30 ).onChange( generateGeometry );
  284. folder.add( data, 'height', 1, 50 ).onChange( generateGeometry );
  285. folder.add( data, 'radialSegments', 3, 64 ).step( 1 ).onChange( generateGeometry );
  286. folder.add( data, 'heightSegments', 1, 64 ).step( 1 ).onChange( generateGeometry );
  287. folder.add( data, 'openEnded' ).onChange( generateGeometry );
  288. folder.add( data, 'thetaStart', 0, twoPi ).onChange( generateGeometry );
  289. folder.add( data, 'thetaLength', 0, twoPi ).onChange( generateGeometry );
  290. generateGeometry();
  291. },
  292. CircleBufferGeometry: function ( mesh ) {
  293. var data = {
  294. radius: 10,
  295. segments: 32,
  296. thetaStart: 0,
  297. thetaLength: twoPi
  298. };
  299. function generateGeometry() {
  300. updateGroupGeometry( mesh,
  301. new CircleBufferGeometry(
  302. data.radius, data.segments, data.thetaStart, data.thetaLength
  303. )
  304. );
  305. }
  306. var folder = gui.addFolder( 'THREE.CircleBufferGeometry' );
  307. folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
  308. folder.add( data, 'segments', 0, 128 ).step( 1 ).onChange( generateGeometry );
  309. folder.add( data, 'thetaStart', 0, twoPi ).onChange( generateGeometry );
  310. folder.add( data, 'thetaLength', 0, twoPi ).onChange( generateGeometry );
  311. generateGeometry();
  312. },
  313. CircleGeometry: function ( mesh ) {
  314. var data = {
  315. radius: 10,
  316. segments: 32,
  317. thetaStart: 0,
  318. thetaLength: twoPi
  319. };
  320. function generateGeometry() {
  321. updateGroupGeometry( mesh,
  322. new CircleGeometry(
  323. data.radius, data.segments, data.thetaStart, data.thetaLength
  324. )
  325. );
  326. }
  327. var folder = gui.addFolder( 'THREE.CircleGeometry' );
  328. folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
  329. folder.add( data, 'segments', 0, 128 ).step( 1 ).onChange( generateGeometry );
  330. folder.add( data, 'thetaStart', 0, twoPi ).onChange( generateGeometry );
  331. folder.add( data, 'thetaLength', 0, twoPi ).onChange( generateGeometry );
  332. generateGeometry();
  333. },
  334. DodecahedronGeometry: function ( mesh ) {
  335. var data = {
  336. radius: 10,
  337. detail: 0
  338. };
  339. function generateGeometry() {
  340. updateGroupGeometry( mesh,
  341. new DodecahedronGeometry(
  342. data.radius, data.detail
  343. )
  344. );
  345. }
  346. var folder = gui.addFolder( 'THREE.DodecahedronGeometry' );
  347. folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
  348. folder.add( data, 'detail', 0, 5 ).step( 1 ).onChange( generateGeometry );
  349. generateGeometry();
  350. },
  351. DodecahedronBufferGeometry: function ( mesh ) {
  352. var data = {
  353. radius: 10,
  354. detail: 0
  355. };
  356. function generateGeometry() {
  357. updateGroupGeometry( mesh,
  358. new DodecahedronBufferGeometry(
  359. data.radius, data.detail
  360. )
  361. );
  362. }
  363. var folder = gui.addFolder( 'THREE.DodecahedronBufferGeometry' );
  364. folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
  365. folder.add( data, 'detail', 0, 5 ).step( 1 ).onChange( generateGeometry );
  366. generateGeometry();
  367. },
  368. IcosahedronGeometry: function ( mesh ) {
  369. var data = {
  370. radius: 10,
  371. detail: 0
  372. };
  373. function generateGeometry() {
  374. updateGroupGeometry( mesh,
  375. new IcosahedronGeometry(
  376. data.radius, data.detail
  377. )
  378. );
  379. }
  380. var folder = gui.addFolder( 'THREE.IcosahedronGeometry' );
  381. folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
  382. folder.add( data, 'detail', 0, 5 ).step( 1 ).onChange( generateGeometry );
  383. generateGeometry();
  384. },
  385. IcosahedronBufferGeometry: function ( mesh ) {
  386. var data = {
  387. radius: 10,
  388. detail: 0
  389. };
  390. function generateGeometry() {
  391. updateGroupGeometry( mesh,
  392. new IcosahedronBufferGeometry(
  393. data.radius, data.detail
  394. )
  395. );
  396. }
  397. var folder = gui.addFolder( 'THREE.IcosahedronBufferGeometry' );
  398. folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
  399. folder.add( data, 'detail', 0, 5 ).step( 1 ).onChange( generateGeometry );
  400. generateGeometry();
  401. },
  402. LatheBufferGeometry: function ( mesh ) {
  403. var points = [];
  404. for ( var i = 0; i < 10; i ++ ) {
  405. points.push( new Vector2( Math.sin( i * 0.2 ) * 10 + 5, ( i - 5 ) * 2 ) );
  406. }
  407. var data = {
  408. segments: 12,
  409. phiStart: 0,
  410. phiLength: twoPi
  411. };
  412. function generateGeometry() {
  413. var geometry = new LatheBufferGeometry(
  414. points, data.segments, data.phiStart, data.phiLength
  415. );
  416. updateGroupGeometry( mesh, geometry );
  417. }
  418. var folder = gui.addFolder( 'THREE.LatheBufferGeometry' );
  419. folder.add( data, 'segments', 1, 30 ).step( 1 ).onChange( generateGeometry );
  420. folder.add( data, 'phiStart', 0, twoPi ).onChange( generateGeometry );
  421. folder.add( data, 'phiLength', 0, twoPi ).onChange( generateGeometry );
  422. generateGeometry();
  423. },
  424. LatheGeometry: function ( mesh ) {
  425. var points = [];
  426. for ( var i = 0; i < 10; i ++ ) {
  427. points.push( new Vector2( Math.sin( i * 0.2 ) * 10 + 5, ( i - 5 ) * 2 ) );
  428. }
  429. var data = {
  430. segments: 12,
  431. phiStart: 0,
  432. phiLength: twoPi
  433. };
  434. function generateGeometry() {
  435. var geometry = new LatheGeometry(
  436. points, data.segments, data.phiStart, data.phiLength
  437. );
  438. updateGroupGeometry( mesh, geometry );
  439. }
  440. var folder = gui.addFolder( 'THREE.LatheGeometry' );
  441. folder.add( data, 'segments', 1, 30 ).step( 1 ).onChange( generateGeometry );
  442. folder.add( data, 'phiStart', 0, twoPi ).onChange( generateGeometry );
  443. folder.add( data, 'phiLength', 0, twoPi ).onChange( generateGeometry );
  444. generateGeometry();
  445. },
  446. OctahedronGeometry: function ( mesh ) {
  447. var data = {
  448. radius: 10,
  449. detail: 0
  450. };
  451. function generateGeometry() {
  452. updateGroupGeometry( mesh,
  453. new OctahedronGeometry(
  454. data.radius, data.detail
  455. )
  456. );
  457. }
  458. var folder = gui.addFolder( 'THREE.OctahedronGeometry' );
  459. folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
  460. folder.add( data, 'detail', 0, 5 ).step( 1 ).onChange( generateGeometry );
  461. generateGeometry();
  462. },
  463. OctahedronBufferGeometry: function ( mesh ) {
  464. var data = {
  465. radius: 10,
  466. detail: 0
  467. };
  468. function generateGeometry() {
  469. updateGroupGeometry( mesh,
  470. new OctahedronBufferGeometry(
  471. data.radius, data.detail
  472. )
  473. );
  474. }
  475. var folder = gui.addFolder( 'THREE.OctahedronBufferGeometry' );
  476. folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
  477. folder.add( data, 'detail', 0, 5 ).step( 1 ).onChange( generateGeometry );
  478. generateGeometry();
  479. },
  480. PlaneBufferGeometry: function ( mesh ) {
  481. var data = {
  482. width: 10,
  483. height: 10,
  484. widthSegments: 1,
  485. heightSegments: 1
  486. };
  487. function generateGeometry() {
  488. updateGroupGeometry( mesh,
  489. new PlaneBufferGeometry(
  490. data.width, data.height, data.widthSegments, data.heightSegments
  491. )
  492. );
  493. }
  494. var folder = gui.addFolder( 'THREE.PlaneBufferGeometry' );
  495. folder.add( data, 'width', 1, 30 ).onChange( generateGeometry );
  496. folder.add( data, 'height', 1, 30 ).onChange( generateGeometry );
  497. folder.add( data, 'widthSegments', 1, 30 ).step( 1 ).onChange( generateGeometry );
  498. folder.add( data, 'heightSegments', 1, 30 ).step( 1 ).onChange( generateGeometry );
  499. generateGeometry();
  500. },
  501. PlaneGeometry: function ( mesh ) {
  502. var data = {
  503. width: 10,
  504. height: 10,
  505. widthSegments: 1,
  506. heightSegments: 1
  507. };
  508. function generateGeometry() {
  509. updateGroupGeometry( mesh,
  510. new PlaneGeometry(
  511. data.width, data.height, data.widthSegments, data.heightSegments
  512. )
  513. );
  514. }
  515. var folder = gui.addFolder( 'THREE.PlaneGeometry' );
  516. folder.add( data, 'width', 1, 30 ).onChange( generateGeometry );
  517. folder.add( data, 'height', 1, 30 ).onChange( generateGeometry );
  518. folder.add( data, 'widthSegments', 1, 30 ).step( 1 ).onChange( generateGeometry );
  519. folder.add( data, 'heightSegments', 1, 30 ).step( 1 ).onChange( generateGeometry );
  520. generateGeometry();
  521. },
  522. RingBufferGeometry: function ( mesh ) {
  523. var data = {
  524. innerRadius: 5,
  525. outerRadius: 10,
  526. thetaSegments: 8,
  527. phiSegments: 8,
  528. thetaStart: 0,
  529. thetaLength: twoPi
  530. };
  531. function generateGeometry() {
  532. updateGroupGeometry( mesh,
  533. new RingBufferGeometry(
  534. data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength
  535. )
  536. );
  537. }
  538. var folder = gui.addFolder( 'THREE.RingBufferGeometry' );
  539. folder.add( data, 'innerRadius', 1, 30 ).onChange( generateGeometry );
  540. folder.add( data, 'outerRadius', 1, 30 ).onChange( generateGeometry );
  541. folder.add( data, 'thetaSegments', 1, 30 ).step( 1 ).onChange( generateGeometry );
  542. folder.add( data, 'phiSegments', 1, 30 ).step( 1 ).onChange( generateGeometry );
  543. folder.add( data, 'thetaStart', 0, twoPi ).onChange( generateGeometry );
  544. folder.add( data, 'thetaLength', 0, twoPi ).onChange( generateGeometry );
  545. generateGeometry();
  546. },
  547. RingGeometry: function ( mesh ) {
  548. var data = {
  549. innerRadius: 5,
  550. outerRadius: 10,
  551. thetaSegments: 8,
  552. phiSegments: 8,
  553. thetaStart: 0,
  554. thetaLength: twoPi
  555. };
  556. function generateGeometry() {
  557. updateGroupGeometry( mesh,
  558. new RingGeometry(
  559. data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength
  560. )
  561. );
  562. }
  563. var folder = gui.addFolder( 'THREE.RingGeometry' );
  564. folder.add( data, 'innerRadius', 1, 30 ).onChange( generateGeometry );
  565. folder.add( data, 'outerRadius', 1, 30 ).onChange( generateGeometry );
  566. folder.add( data, 'thetaSegments', 1, 30 ).step( 1 ).onChange( generateGeometry );
  567. folder.add( data, 'phiSegments', 1, 30 ).step( 1 ).onChange( generateGeometry );
  568. folder.add( data, 'thetaStart', 0, twoPi ).onChange( generateGeometry );
  569. folder.add( data, 'thetaLength', 0, twoPi ).onChange( generateGeometry );
  570. generateGeometry();
  571. },
  572. SphereBufferGeometry: function ( mesh ) {
  573. var data = {
  574. radius: 15,
  575. widthSegments: 8,
  576. heightSegments: 6,
  577. phiStart: 0,
  578. phiLength: twoPi,
  579. thetaStart: 0,
  580. thetaLength: Math.PI
  581. };
  582. function generateGeometry() {
  583. updateGroupGeometry( mesh,
  584. new SphereBufferGeometry(
  585. data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength
  586. )
  587. );
  588. }
  589. var folder = gui.addFolder( 'THREE.SphereBufferGeometry' );
  590. folder.add( data, 'radius', 1, 30 ).onChange( generateGeometry );
  591. folder.add( data, 'widthSegments', 3, 32 ).step( 1 ).onChange( generateGeometry );
  592. folder.add( data, 'heightSegments', 2, 32 ).step( 1 ).onChange( generateGeometry );
  593. folder.add( data, 'phiStart', 0, twoPi ).onChange( generateGeometry );
  594. folder.add( data, 'phiLength', 0, twoPi ).onChange( generateGeometry );
  595. folder.add( data, 'thetaStart', 0, twoPi ).onChange( generateGeometry );
  596. folder.add( data, 'thetaLength', 0, twoPi ).onChange( generateGeometry );
  597. generateGeometry();
  598. },
  599. SphereGeometry: function ( mesh ) {
  600. var data = {
  601. radius: 15,
  602. widthSegments: 8,
  603. heightSegments: 6,
  604. phiStart: 0,
  605. phiLength: twoPi,
  606. thetaStart: 0,
  607. thetaLength: Math.PI
  608. };
  609. function generateGeometry() {
  610. updateGroupGeometry( mesh,
  611. new SphereGeometry(
  612. data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength
  613. )
  614. );
  615. }
  616. var folder = gui.addFolder( 'THREE.SphereGeometry' );
  617. folder.add( data, 'radius', 1, 30 ).onChange( generateGeometry );
  618. folder.add( data, 'widthSegments', 3, 32 ).step( 1 ).onChange( generateGeometry );
  619. folder.add( data, 'heightSegments', 2, 32 ).step( 1 ).onChange( generateGeometry );
  620. folder.add( data, 'phiStart', 0, twoPi ).onChange( generateGeometry );
  621. folder.add( data, 'phiLength', 0, twoPi ).onChange( generateGeometry );
  622. folder.add( data, 'thetaStart', 0, twoPi ).onChange( generateGeometry );
  623. folder.add( data, 'thetaLength', 0, twoPi ).onChange( generateGeometry );
  624. generateGeometry();
  625. },
  626. TetrahedronGeometry: function ( mesh ) {
  627. var data = {
  628. radius: 10,
  629. detail: 0
  630. };
  631. function generateGeometry() {
  632. updateGroupGeometry( mesh,
  633. new TetrahedronGeometry(
  634. data.radius, data.detail
  635. )
  636. );
  637. }
  638. var folder = gui.addFolder( 'THREE.TetrahedronGeometry' );
  639. folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
  640. folder.add( data, 'detail', 0, 5 ).step( 1 ).onChange( generateGeometry );
  641. generateGeometry();
  642. },
  643. TetrahedronBufferGeometry: function ( mesh ) {
  644. var data = {
  645. radius: 10,
  646. detail: 0
  647. };
  648. function generateGeometry() {
  649. updateGroupGeometry( mesh,
  650. new TetrahedronBufferGeometry(
  651. data.radius, data.detail
  652. )
  653. );
  654. }
  655. var folder = gui.addFolder( 'THREE.TetrahedronBufferGeometry' );
  656. folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
  657. folder.add( data, 'detail', 0, 5 ).step( 1 ).onChange( generateGeometry );
  658. generateGeometry();
  659. },
  660. TextGeometry: function ( mesh ) {
  661. var data = {
  662. text: "TextGeometry",
  663. size: 5,
  664. height: 2,
  665. curveSegments: 12,
  666. font: "helvetiker",
  667. weight: "regular",
  668. bevelEnabled: false,
  669. bevelThickness: 1,
  670. bevelSize: 0.5,
  671. bevelOffset: 0.0,
  672. bevelSegments: 3
  673. };
  674. var fonts = [
  675. "helvetiker",
  676. "optimer",
  677. "gentilis",
  678. "droid/droid_serif"
  679. ];
  680. var weights = [
  681. "regular", "bold"
  682. ];
  683. function generateGeometry() {
  684. var loader = new FontLoader();
  685. loader.load( '../../examples/fonts/' + data.font + '_' + data.weight + '.typeface.json', function ( font ) {
  686. var geometry = new TextGeometry( data.text, {
  687. font: font,
  688. size: data.size,
  689. height: data.height,
  690. curveSegments: data.curveSegments,
  691. bevelEnabled: data.bevelEnabled,
  692. bevelThickness: data.bevelThickness,
  693. bevelSize: data.bevelSize,
  694. bevelOffset: data.bevelOffset,
  695. bevelSegments: data.bevelSegments
  696. } );
  697. geometry.center();
  698. updateGroupGeometry( mesh, geometry );
  699. } );
  700. }
  701. //Hide the wireframe
  702. mesh.children[ 0 ].visible = false;
  703. var folder = gui.addFolder( 'THREE.TextGeometry' );
  704. folder.add( data, 'text' ).onChange( generateGeometry );
  705. folder.add( data, 'size', 1, 30 ).onChange( generateGeometry );
  706. folder.add( data, 'height', 1, 20 ).onChange( generateGeometry );
  707. folder.add( data, 'curveSegments', 1, 20 ).step( 1 ).onChange( generateGeometry );
  708. folder.add( data, 'font', fonts ).onChange( generateGeometry );
  709. folder.add( data, 'weight', weights ).onChange( generateGeometry );
  710. folder.add( data, 'bevelEnabled' ).onChange( generateGeometry );
  711. folder.add( data, 'bevelThickness', 0.1, 3 ).onChange( generateGeometry );
  712. folder.add( data, 'bevelSize', 0, 3 ).onChange( generateGeometry );
  713. folder.add( data, 'bevelOffset', - 0.5, 1.5 ).onChange( generateGeometry );
  714. folder.add( data, 'bevelSegments', 0, 8 ).step( 1 ).onChange( generateGeometry );
  715. generateGeometry();
  716. },
  717. TextBufferGeometry: function ( mesh ) {
  718. var data = {
  719. text: "TextBufferGeometry",
  720. size: 5,
  721. height: 2,
  722. curveSegments: 12,
  723. font: "helvetiker",
  724. weight: "regular",
  725. bevelEnabled: false,
  726. bevelThickness: 1,
  727. bevelSize: 0.5,
  728. bevelOffset: 0.0,
  729. bevelSegments: 3
  730. };
  731. var fonts = [
  732. "helvetiker",
  733. "optimer",
  734. "gentilis",
  735. "droid/droid_serif"
  736. ];
  737. var weights = [
  738. "regular", "bold"
  739. ];
  740. function generateGeometry() {
  741. var loader = new FontLoader();
  742. loader.load( '../../examples/fonts/' + data.font + '_' + data.weight + '.typeface.json', function ( font ) {
  743. var geometry = new TextBufferGeometry( data.text, {
  744. font: font,
  745. size: data.size,
  746. height: data.height,
  747. curveSegments: data.curveSegments,
  748. bevelEnabled: data.bevelEnabled,
  749. bevelThickness: data.bevelThickness,
  750. bevelSize: data.bevelSize,
  751. bevelOffset: data.bevelOffset,
  752. bevelSegments: data.bevelSegments
  753. } );
  754. geometry.center();
  755. updateGroupGeometry( mesh, geometry );
  756. } );
  757. }
  758. //Hide the wireframe
  759. mesh.children[ 0 ].visible = false;
  760. var folder = gui.addFolder( 'THREE.TextBufferGeometry' );
  761. folder.add( data, 'text' ).onChange( generateGeometry );
  762. folder.add( data, 'size', 1, 30 ).onChange( generateGeometry );
  763. folder.add( data, 'height', 1, 20 ).onChange( generateGeometry );
  764. folder.add( data, 'curveSegments', 1, 20 ).step( 1 ).onChange( generateGeometry );
  765. folder.add( data, 'font', fonts ).onChange( generateGeometry );
  766. folder.add( data, 'weight', weights ).onChange( generateGeometry );
  767. folder.add( data, 'bevelEnabled' ).onChange( generateGeometry );
  768. folder.add( data, 'bevelThickness', 0.1, 3 ).onChange( generateGeometry );
  769. folder.add( data, 'bevelSize', 0, 3 ).onChange( generateGeometry );
  770. folder.add( data, 'bevelOffset', - 0.5, 1.5 ).onChange( generateGeometry );
  771. folder.add( data, 'bevelSegments', 0, 8 ).step( 1 ).onChange( generateGeometry );
  772. generateGeometry();
  773. },
  774. TorusBufferGeometry: function ( mesh ) {
  775. var data = {
  776. radius: 10,
  777. tube: 3,
  778. radialSegments: 16,
  779. tubularSegments: 100,
  780. arc: twoPi
  781. };
  782. function generateGeometry() {
  783. updateGroupGeometry( mesh,
  784. new TorusBufferGeometry(
  785. data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc
  786. )
  787. );
  788. }
  789. var folder = gui.addFolder( 'THREE.TorusBufferGeometry' );
  790. folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
  791. folder.add( data, 'tube', 0.1, 10 ).onChange( generateGeometry );
  792. folder.add( data, 'radialSegments', 2, 30 ).step( 1 ).onChange( generateGeometry );
  793. folder.add( data, 'tubularSegments', 3, 200 ).step( 1 ).onChange( generateGeometry );
  794. folder.add( data, 'arc', 0.1, twoPi ).onChange( generateGeometry );
  795. generateGeometry();
  796. },
  797. TorusGeometry: function ( mesh ) {
  798. var data = {
  799. radius: 10,
  800. tube: 3,
  801. radialSegments: 16,
  802. tubularSegments: 100,
  803. arc: twoPi
  804. };
  805. function generateGeometry() {
  806. updateGroupGeometry( mesh,
  807. new TorusGeometry(
  808. data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc
  809. )
  810. );
  811. }
  812. var folder = gui.addFolder( 'THREE.TorusGeometry' );
  813. folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
  814. folder.add( data, 'tube', 0.1, 10 ).onChange( generateGeometry );
  815. folder.add( data, 'radialSegments', 2, 30 ).step( 1 ).onChange( generateGeometry );
  816. folder.add( data, 'tubularSegments', 3, 200 ).step( 1 ).onChange( generateGeometry );
  817. folder.add( data, 'arc', 0.1, twoPi ).onChange( generateGeometry );
  818. generateGeometry();
  819. },
  820. TorusKnotBufferGeometry: function ( mesh ) {
  821. var data = {
  822. radius: 10,
  823. tube: 3,
  824. tubularSegments: 64,
  825. radialSegments: 8,
  826. p: 2,
  827. q: 3
  828. };
  829. function generateGeometry() {
  830. updateGroupGeometry( mesh,
  831. new TorusKnotBufferGeometry(
  832. data.radius, data.tube, data.tubularSegments, data.radialSegments,
  833. data.p, data.q
  834. )
  835. );
  836. }
  837. var folder = gui.addFolder( 'THREE.TorusKnotBufferGeometry' );
  838. folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
  839. folder.add( data, 'tube', 0.1, 10 ).onChange( generateGeometry );
  840. folder.add( data, 'tubularSegments', 3, 300 ).step( 1 ).onChange( generateGeometry );
  841. folder.add( data, 'radialSegments', 3, 20 ).step( 1 ).onChange( generateGeometry );
  842. folder.add( data, 'p', 1, 20 ).step( 1 ).onChange( generateGeometry );
  843. folder.add( data, 'q', 1, 20 ).step( 1 ).onChange( generateGeometry );
  844. generateGeometry();
  845. },
  846. TorusKnotGeometry: function ( mesh ) {
  847. var data = {
  848. radius: 10,
  849. tube: 3,
  850. tubularSegments: 64,
  851. radialSegments: 8,
  852. p: 2,
  853. q: 3
  854. };
  855. function generateGeometry() {
  856. updateGroupGeometry( mesh,
  857. new TorusKnotGeometry(
  858. data.radius, data.tube, data.tubularSegments, data.radialSegments,
  859. data.p, data.q
  860. )
  861. );
  862. }
  863. var folder = gui.addFolder( 'THREE.TorusKnotGeometry' );
  864. folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
  865. folder.add( data, 'tube', 0.1, 10 ).onChange( generateGeometry );
  866. folder.add( data, 'tubularSegments', 3, 300 ).step( 1 ).onChange( generateGeometry );
  867. folder.add( data, 'radialSegments', 3, 20 ).step( 1 ).onChange( generateGeometry );
  868. folder.add( data, 'p', 1, 20 ).step( 1 ).onChange( generateGeometry );
  869. folder.add( data, 'q', 1, 20 ).step( 1 ).onChange( generateGeometry );
  870. generateGeometry();
  871. },
  872. ParametricBufferGeometry: function ( mesh ) {
  873. var data = {
  874. slices: 25,
  875. stacks: 25
  876. };
  877. function generateGeometry() {
  878. updateGroupGeometry( mesh,
  879. new ParametricBufferGeometry( ParametricGeometries.klein, data.slices, data.stacks )
  880. );
  881. }
  882. var folder = gui.addFolder( 'THREE.ParametricBufferGeometry' );
  883. folder.add( data, 'slices', 1, 100 ).step( 1 ).onChange( generateGeometry );
  884. folder.add( data, 'stacks', 1, 100 ).step( 1 ).onChange( generateGeometry );
  885. generateGeometry();
  886. },
  887. ParametricGeometry: function ( mesh ) {
  888. var data = {
  889. slices: 25,
  890. stacks: 25
  891. };
  892. function generateGeometry() {
  893. updateGroupGeometry( mesh,
  894. new ParametricGeometry( ParametricGeometries.klein, data.slices, data.stacks )
  895. );
  896. }
  897. var folder = gui.addFolder( 'THREE.ParametricGeometry' );
  898. folder.add( data, 'slices', 1, 100 ).step( 1 ).onChange( generateGeometry );
  899. folder.add( data, 'stacks', 1, 100 ).step( 1 ).onChange( generateGeometry );
  900. generateGeometry();
  901. },
  902. TubeGeometry: function ( mesh ) {
  903. var data = {
  904. segments: 20,
  905. radius: 2,
  906. radialSegments: 8
  907. };
  908. var path = new CustomSinCurve( 10 );
  909. function generateGeometry() {
  910. updateGroupGeometry( mesh,
  911. new TubeGeometry( path, data.segments, data.radius, data.radialSegments, false )
  912. );
  913. }
  914. var folder = gui.addFolder( 'THREE.TubeGeometry' );
  915. folder.add( data, 'segments', 1, 100 ).step( 1 ).onChange( generateGeometry );
  916. folder.add( data, 'radius', 1, 10 ).onChange( generateGeometry );
  917. folder.add( data, 'radialSegments', 1, 20 ).step( 1 ).onChange( generateGeometry );
  918. generateGeometry();
  919. },
  920. TubeBufferGeometry: function ( mesh ) {
  921. var data = {
  922. segments: 20,
  923. radius: 2,
  924. radialSegments: 8
  925. };
  926. var path = new CustomSinCurve( 10 );
  927. function generateGeometry() {
  928. updateGroupGeometry( mesh,
  929. new TubeBufferGeometry( path, data.segments, data.radius, data.radialSegments, false )
  930. );
  931. }
  932. var folder = gui.addFolder( 'THREE.TubeBufferGeometry' );
  933. folder.add( data, 'segments', 1, 100 ).step( 1 ).onChange( generateGeometry );
  934. folder.add( data, 'radius', 1, 10 ).onChange( generateGeometry );
  935. folder.add( data, 'radialSegments', 1, 20 ).step( 1 ).onChange( generateGeometry );
  936. generateGeometry();
  937. },
  938. ShapeGeometry: function ( mesh ) {
  939. var data = {
  940. segments: 12
  941. };
  942. function generateGeometry() {
  943. var geometry = new ShapeGeometry( heartShape, data.segments );
  944. geometry.center();
  945. updateGroupGeometry( mesh, geometry );
  946. }
  947. var folder = gui.addFolder( 'THREE.ShapeGeometry' );
  948. folder.add( data, 'segments', 1, 100 ).step( 1 ).onChange( generateGeometry );
  949. generateGeometry();
  950. },
  951. ShapeBufferGeometry: function ( mesh ) {
  952. var data = {
  953. segments: 12
  954. };
  955. function generateGeometry() {
  956. var geometry = new ShapeBufferGeometry( heartShape, data.segments );
  957. geometry.center();
  958. updateGroupGeometry( mesh, geometry );
  959. }
  960. var folder = gui.addFolder( 'THREE.ShapeBufferGeometry' );
  961. folder.add( data, 'segments', 1, 100 ).step( 1 ).onChange( generateGeometry );
  962. generateGeometry();
  963. },
  964. ExtrudeGeometry: function ( mesh ) {
  965. var data = {
  966. steps: 2,
  967. depth: 16,
  968. bevelEnabled: true,
  969. bevelThickness: 1,
  970. bevelSize: 1,
  971. bevelOffset: 0,
  972. bevelSegments: 1
  973. };
  974. var length = 12, width = 8;
  975. var shape = new Shape();
  976. shape.moveTo( 0, 0 );
  977. shape.lineTo( 0, width );
  978. shape.lineTo( length, width );
  979. shape.lineTo( length, 0 );
  980. shape.lineTo( 0, 0 );
  981. function generateGeometry() {
  982. var geometry = new ExtrudeGeometry( shape, data );
  983. geometry.center();
  984. updateGroupGeometry( mesh, geometry );
  985. }
  986. var folder = gui.addFolder( 'THREE.ExtrudeGeometry' );
  987. folder.add( data, 'steps', 1, 10 ).step( 1 ).onChange( generateGeometry );
  988. folder.add( data, 'depth', 1, 20 ).onChange( generateGeometry );
  989. folder.add( data, 'bevelThickness', 1, 5 ).step( 1 ).onChange( generateGeometry );
  990. folder.add( data, 'bevelSize', 0, 5 ).step( 1 ).onChange( generateGeometry );
  991. folder.add( data, 'bevelOffset', - 4, 5 ).step( 1 ).onChange( generateGeometry );
  992. folder.add( data, 'bevelSegments', 1, 5 ).step( 1 ).onChange( generateGeometry );
  993. generateGeometry();
  994. },
  995. ExtrudeBufferGeometry: function ( mesh ) {
  996. var data = {
  997. steps: 2,
  998. depth: 16,
  999. bevelEnabled: true,
  1000. bevelThickness: 1,
  1001. bevelSize: 1,
  1002. bevelOffset: 0,
  1003. bevelSegments: 1
  1004. };
  1005. var length = 12, width = 8;
  1006. var shape = new Shape();
  1007. shape.moveTo( 0, 0 );
  1008. shape.lineTo( 0, width );
  1009. shape.lineTo( length, width );
  1010. shape.lineTo( length, 0 );
  1011. shape.lineTo( 0, 0 );
  1012. function generateGeometry() {
  1013. var geometry = new ExtrudeBufferGeometry( shape, data );
  1014. geometry.center();
  1015. updateGroupGeometry( mesh, geometry );
  1016. }
  1017. var folder = gui.addFolder( 'THREE.ExtrudeBufferGeometry' );
  1018. folder.add( data, 'steps', 1, 10 ).step( 1 ).onChange( generateGeometry );
  1019. folder.add( data, 'depth', 1, 20 ).onChange( generateGeometry );
  1020. folder.add( data, 'bevelThickness', 1, 5 ).step( 1 ).onChange( generateGeometry );
  1021. folder.add( data, 'bevelSize', 0, 5 ).step( 1 ).onChange( generateGeometry );
  1022. folder.add( data, 'bevelOffset', - 4, 5 ).step( 1 ).onChange( generateGeometry );
  1023. folder.add( data, 'bevelSegments', 1, 5 ).step( 1 ).onChange( generateGeometry );
  1024. generateGeometry();
  1025. }
  1026. };
  1027. function chooseFromHash( mesh ) {
  1028. var selectedGeometry = window.location.hash.substring( 1 ) || "TorusGeometry";
  1029. if ( guis[ selectedGeometry ] !== undefined ) {
  1030. guis[ selectedGeometry ]( mesh );
  1031. }
  1032. if ( selectedGeometry === 'TextGeometry' || selectedGeometry === 'TextBufferGeometry' ) {
  1033. return { fixed: true };
  1034. }
  1035. //No configuration options
  1036. return {};
  1037. }
  1038. //
  1039. document.getElementById( 'newWindow' ).href += window.location.hash;
  1040. var gui = new GUI();
  1041. var scene = new Scene();
  1042. scene.background = new Color( 0x444444 );
  1043. var camera = new PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 50 );
  1044. camera.position.z = 30;
  1045. var renderer = new WebGLRenderer( { antialias: true } );
  1046. renderer.setPixelRatio( window.devicePixelRatio );
  1047. renderer.setSize( window.innerWidth, window.innerHeight );
  1048. document.body.appendChild( renderer.domElement );
  1049. var orbit = new OrbitControls( camera, renderer.domElement );
  1050. orbit.enableZoom = false;
  1051. var lights = [];
  1052. lights[ 0 ] = new PointLight( 0xffffff, 1, 0 );
  1053. lights[ 1 ] = new PointLight( 0xffffff, 1, 0 );
  1054. lights[ 2 ] = new PointLight( 0xffffff, 1, 0 );
  1055. lights[ 0 ].position.set( 0, 200, 0 );
  1056. lights[ 1 ].position.set( 100, 200, 100 );
  1057. lights[ 2 ].position.set( - 100, - 200, - 100 );
  1058. scene.add( lights[ 0 ] );
  1059. scene.add( lights[ 1 ] );
  1060. scene.add( lights[ 2 ] );
  1061. var group = new Group();
  1062. var geometry = new BufferGeometry();
  1063. geometry.setAttribute( 'position', new Float32BufferAttribute( [], 3 ) );
  1064. var lineMaterial = new LineBasicMaterial( { color: 0xffffff, transparent: true, opacity: 0.5 } );
  1065. var meshMaterial = new MeshPhongMaterial( { color: 0x156289, emissive: 0x072534, side: DoubleSide, flatShading: true } );
  1066. group.add( new LineSegments( geometry, lineMaterial ) );
  1067. group.add( new Mesh( geometry, meshMaterial ) );
  1068. var options = chooseFromHash( group );
  1069. scene.add( group );
  1070. var render = function () {
  1071. requestAnimationFrame( render );
  1072. if ( ! options.fixed ) {
  1073. group.rotation.x += 0.005;
  1074. group.rotation.y += 0.005;
  1075. }
  1076. renderer.render( scene, camera );
  1077. };
  1078. window.addEventListener( 'resize', function () {
  1079. camera.aspect = window.innerWidth / window.innerHeight;
  1080. camera.updateProjectionMatrix();
  1081. renderer.setSize( window.innerWidth, window.innerHeight );
  1082. }, false );
  1083. render();
  1084. </script>
  1085. </body>
  1086. </html>