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