geometry.js 33 KB

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