geometry-browser.html 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532
  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. const twoPi = Math.PI * 2;
  70. class CustomSinCurve extends Curve {
  71. constructor( scale = 1 ) {
  72. super();
  73. this.scale = scale;
  74. }
  75. getPoint( t, optionalTarget = new Vector3() ) {
  76. const tx = t * 3 - 1.5;
  77. const ty = Math.sin( 2 * Math.PI * t );
  78. const tz = 0;
  79. return optionalTarget.set( tx, ty, tz ).multiplyScalar( this.scale );
  80. }
  81. }
  82. function updateGroupGeometry( mesh, geometry ) {
  83. if ( geometry.isGeometry ) {
  84. geometry = new BufferGeometry().fromGeometry( geometry );
  85. console.warn( 'THREE.GeometryBrowser: Converted Geometry to BufferGeometry.' );
  86. }
  87. mesh.children[ 0 ].geometry.dispose();
  88. mesh.children[ 1 ].geometry.dispose();
  89. mesh.children[ 0 ].geometry = new WireframeGeometry( geometry );
  90. mesh.children[ 1 ].geometry = geometry;
  91. // these do not update nicely together if shared
  92. }
  93. // heart shape
  94. const x = 0, y = 0;
  95. const 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. const guis = {
  104. BoxBufferGeometry: function ( mesh ) {
  105. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const points = [];
  404. for ( let i = 0; i < 10; i ++ ) {
  405. points.push( new Vector2( Math.sin( i * 0.2 ) * 10 + 5, ( i - 5 ) * 2 ) );
  406. }
  407. const data = {
  408. segments: 12,
  409. phiStart: 0,
  410. phiLength: twoPi
  411. };
  412. function generateGeometry() {
  413. const geometry = new LatheBufferGeometry(
  414. points, data.segments, data.phiStart, data.phiLength
  415. );
  416. updateGroupGeometry( mesh, geometry );
  417. }
  418. const 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. const points = [];
  426. for ( let i = 0; i < 10; i ++ ) {
  427. points.push( new Vector2( Math.sin( i * 0.2 ) * 10 + 5, ( i - 5 ) * 2 ) );
  428. }
  429. const data = {
  430. segments: 12,
  431. phiStart: 0,
  432. phiLength: twoPi
  433. };
  434. function generateGeometry() {
  435. const geometry = new LatheGeometry(
  436. points, data.segments, data.phiStart, data.phiLength
  437. );
  438. updateGroupGeometry( mesh, geometry );
  439. }
  440. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const fonts = [
  675. "helvetiker",
  676. "optimer",
  677. "gentilis",
  678. "droid/droid_serif"
  679. ];
  680. const weights = [
  681. "regular", "bold"
  682. ];
  683. function generateGeometry() {
  684. const loader = new FontLoader();
  685. loader.load( '../../examples/fonts/' + data.font + '_' + data.weight + '.typeface.json', function ( font ) {
  686. const 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. const 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. const 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. const fonts = [
  732. "helvetiker",
  733. "optimer",
  734. "gentilis",
  735. "droid/droid_serif"
  736. ];
  737. const weights = [
  738. "regular", "bold"
  739. ];
  740. function generateGeometry() {
  741. const loader = new FontLoader();
  742. loader.load( '../../examples/fonts/' + data.font + '_' + data.weight + '.typeface.json', function ( font ) {
  743. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const 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. const data = {
  904. segments: 20,
  905. radius: 2,
  906. radialSegments: 8
  907. };
  908. const path = new CustomSinCurve( 10 );
  909. function generateGeometry() {
  910. updateGroupGeometry( mesh,
  911. new TubeGeometry( path, data.segments, data.radius, data.radialSegments, false )
  912. );
  913. }
  914. const 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. const data = {
  922. segments: 20,
  923. radius: 2,
  924. radialSegments: 8
  925. };
  926. const path = new CustomSinCurve( 10 );
  927. function generateGeometry() {
  928. updateGroupGeometry( mesh,
  929. new TubeBufferGeometry( path, data.segments, data.radius, data.radialSegments, false )
  930. );
  931. }
  932. const 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. const data = {
  940. segments: 12
  941. };
  942. function generateGeometry() {
  943. const geometry = new ShapeGeometry( heartShape, data.segments );
  944. geometry.center();
  945. updateGroupGeometry( mesh, geometry );
  946. }
  947. const folder = gui.addFolder( 'THREE.ShapeGeometry' );
  948. folder.add( data, 'segments', 1, 100 ).step( 1 ).onChange( generateGeometry );
  949. generateGeometry();
  950. },
  951. ShapeBufferGeometry: function ( mesh ) {
  952. const data = {
  953. segments: 12
  954. };
  955. function generateGeometry() {
  956. const geometry = new ShapeBufferGeometry( heartShape, data.segments );
  957. geometry.center();
  958. updateGroupGeometry( mesh, geometry );
  959. }
  960. const folder = gui.addFolder( 'THREE.ShapeBufferGeometry' );
  961. folder.add( data, 'segments', 1, 100 ).step( 1 ).onChange( generateGeometry );
  962. generateGeometry();
  963. },
  964. ExtrudeGeometry: function ( mesh ) {
  965. const data = {
  966. steps: 2,
  967. depth: 16,
  968. bevelEnabled: true,
  969. bevelThickness: 1,
  970. bevelSize: 1,
  971. bevelOffset: 0,
  972. bevelSegments: 1
  973. };
  974. const length = 12, width = 8;
  975. const 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. const geometry = new ExtrudeGeometry( shape, data );
  983. geometry.center();
  984. updateGroupGeometry( mesh, geometry );
  985. }
  986. const 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. const data = {
  997. steps: 2,
  998. depth: 16,
  999. bevelEnabled: true,
  1000. bevelThickness: 1,
  1001. bevelSize: 1,
  1002. bevelOffset: 0,
  1003. bevelSegments: 1
  1004. };
  1005. const length = 12, width = 8;
  1006. const 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. const geometry = new ExtrudeBufferGeometry( shape, data );
  1014. geometry.center();
  1015. updateGroupGeometry( mesh, geometry );
  1016. }
  1017. const 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. const 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. const gui = new GUI();
  1041. const scene = new Scene();
  1042. scene.background = new Color( 0x444444 );
  1043. const camera = new PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 50 );
  1044. camera.position.z = 30;
  1045. const renderer = new WebGLRenderer( { antialias: true } );
  1046. renderer.setPixelRatio( window.devicePixelRatio );
  1047. renderer.setSize( window.innerWidth, window.innerHeight );
  1048. document.body.appendChild( renderer.domElement );
  1049. const orbit = new OrbitControls( camera, renderer.domElement );
  1050. orbit.enableZoom = false;
  1051. const 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. const group = new Group();
  1062. const geometry = new BufferGeometry();
  1063. geometry.setAttribute( 'position', new Float32BufferAttribute( [], 3 ) );
  1064. const lineMaterial = new LineBasicMaterial( { color: 0xffffff, transparent: true, opacity: 0.5 } );
  1065. const 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. const options = chooseFromHash( group );
  1069. scene.add( group );
  1070. function render() {
  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>