geometry.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566
  1. /**
  2. * @author TatumCreative (Greg Tatum) / http://gregtatum.com/
  3. */
  4. var twoPi = Math.PI * 2;
  5. var constants = {
  6. combine: {
  7. "THREE.MultiplyOperation" : THREE.MultiplyOperation,
  8. "THREE.MixOperation" : THREE.MixOperation,
  9. "THREE.AddOperation" : THREE.AddOperation
  10. },
  11. side : {
  12. "THREE.FrontSide" : THREE.FrontSide,
  13. "THREE.BackSide" : THREE.BackSide,
  14. "THREE.DoubleSide" : THREE.DoubleSide
  15. },
  16. shading : {
  17. "THREE.FlatShading" : THREE.FlatShading,
  18. "THREE.SmoothShading" : THREE.SmoothShading
  19. },
  20. colors : {
  21. "THREE.NoColors" : THREE.NoColors,
  22. "THREE.FaceColors" : THREE.FaceColors,
  23. "THREE.VertexColors" : THREE.VertexColors
  24. },
  25. blendingMode : {
  26. "THREE.NoBlending" : THREE.NoBlending,
  27. "THREE.NormalBlending" : THREE.NormalBlending,
  28. "THREE.AdditiveBlending" : THREE.AdditiveBlending,
  29. "THREE.SubtractiveBlending" : THREE.SubtractiveBlending,
  30. "THREE.MultiplyBlending" : THREE.MultiplyBlending,
  31. "THREE.CustomBlending" : THREE.CustomBlending
  32. },
  33. equations : {
  34. "THREE.AddEquation" : THREE.AddEquation,
  35. "THREE.SubtractEquation" : THREE.SubtractEquation,
  36. "THREE.ReverseSubtractEquation" : THREE.ReverseSubtractEquation
  37. },
  38. destinationFactors : {
  39. "THREE.ZeroFactor" : THREE.ZeroFactor,
  40. "THREE.OneFactor" : THREE.OneFactor,
  41. "THREE.SrcColorFactor" : THREE.SrcColorFactor,
  42. "THREE.OneMinusSrcColorFactor" : THREE.OneMinusSrcColorFactor,
  43. "THREE.SrcAlphaFactor" : THREE.SrcAlphaFactor,
  44. "THREE.OneMinusSrcAlphaFactor" : THREE.OneMinusSrcAlphaFactor,
  45. "THREE.DstAlphaFactor" : THREE.DstAlphaFactor,
  46. "THREE.OneMinusDstAlphaFactor" : THREE.OneMinusDstAlphaFactor
  47. },
  48. sourceFactors : {
  49. "THREE.DstColorFactor" : THREE.DstColorFactor,
  50. "THREE.OneMinusDstColorFactor" : THREE.OneMinusDstColorFactor,
  51. "THREE.SrcAlphaSaturateFactor" : THREE.SrcAlphaSaturateFactor
  52. }
  53. };
  54. function updateGroupGeometry( mesh, geometry ) {
  55. mesh.children[ 0 ].geometry.dispose();
  56. mesh.children[ 1 ].geometry.dispose();
  57. mesh.children[ 0 ].geometry = new THREE.WireframeGeometry( geometry );
  58. mesh.children[ 1 ].geometry = geometry;
  59. // these do not update nicely together if shared
  60. }
  61. var guis = {
  62. BoxGeometry : function( mesh ) {
  63. var data = {
  64. width : 15,
  65. height : 15,
  66. depth : 15,
  67. widthSegments : 1,
  68. heightSegments : 1,
  69. depthSegments : 1
  70. };
  71. function generateGeometry() {
  72. updateGroupGeometry( mesh,
  73. new THREE.BoxGeometry(
  74. data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments
  75. )
  76. );
  77. }
  78. var folder = gui.addFolder( 'THREE.BoxGeometry' );
  79. folder.add( data, 'width', 1, 30 ).onChange( generateGeometry );
  80. folder.add( data, 'height', 1, 30 ).onChange( generateGeometry );
  81. folder.add( data, 'depth', 1, 30 ).onChange( generateGeometry );
  82. folder.add( data, 'widthSegments', 1, 10 ).step( 1 ).onChange( generateGeometry );
  83. folder.add( data, 'heightSegments', 1, 10 ).step( 1 ).onChange( generateGeometry );
  84. folder.add( data, 'depthSegments', 1, 10 ).step( 1 ).onChange( generateGeometry );
  85. generateGeometry();
  86. },
  87. CylinderGeometry : function( mesh ) {
  88. var data = {
  89. radiusTop : 5,
  90. radiusBottom : 5,
  91. height : 10,
  92. radiusSegments : 8,
  93. heightSegments : 1,
  94. openEnded : false,
  95. thetaStart : 0,
  96. thetaLength : twoPi,
  97. };
  98. function generateGeometry() {
  99. updateGroupGeometry( mesh,
  100. new THREE.CylinderGeometry(
  101. data.radiusTop,
  102. data.radiusBottom,
  103. data.height,
  104. data.radiusSegments,
  105. data.heightSegments,
  106. data.openEnded,
  107. data.thetaStart,
  108. data.thetaLength
  109. )
  110. );
  111. }
  112. var folder = gui.addFolder( 'THREE.CylinderGeometry' );
  113. folder.add( data, 'radiusTop', 1, 30 ).onChange( generateGeometry );
  114. folder.add( data, 'radiusBottom', 1, 30 ).onChange( generateGeometry );
  115. folder.add( data, 'height', 1, 50 ).onChange( generateGeometry );
  116. folder.add( data, 'radiusSegments', 3, 64 ).step( 1 ).onChange( generateGeometry );
  117. folder.add( data, 'heightSegments', 1, 64 ).step( 1 ).onChange( generateGeometry );
  118. folder.add( data, 'openEnded' ).onChange( generateGeometry );
  119. folder.add( data, 'thetaStart', 0, twoPi ).onChange( generateGeometry );
  120. folder.add( data, 'thetaLength', 0, twoPi ).onChange( generateGeometry );
  121. generateGeometry();
  122. },
  123. CircleGeometry : function( mesh ) {
  124. var data = {
  125. radius : 10,
  126. segments : 32,
  127. thetaStart : 0,
  128. thetaLength : twoPi,
  129. };
  130. function generateGeometry() {
  131. updateGroupGeometry( mesh,
  132. new THREE.CircleGeometry(
  133. data.radius, data.segments, data.thetaStart, data.thetaLength
  134. )
  135. );
  136. }
  137. var folder = gui.addFolder( 'THREE.CircleGeometry' );
  138. folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
  139. folder.add( data, 'segments', 0, 128 ).step( 1 ).onChange( generateGeometry );
  140. folder.add( data, 'thetaStart', 0, twoPi ).onChange( generateGeometry );
  141. folder.add( data, 'thetaLength', 0, twoPi ).onChange( generateGeometry );
  142. generateGeometry();
  143. },
  144. DodecahedronGeometry : function() {
  145. var data = {
  146. radius : 10,
  147. detail : 0,
  148. };
  149. function generateGeometry() {
  150. updateGroupGeometry( mesh,
  151. new THREE.DodecahedronGeometry(
  152. data.radius, data.detail
  153. )
  154. );
  155. }
  156. var folder = gui.addFolder( 'THREE.DodecahedronGeometry' );
  157. folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
  158. folder.add( data, 'detail', 0, 5 ).step( 1 ).onChange( generateGeometry );
  159. generateGeometry();
  160. },
  161. IcosahedronGeometry : function() {
  162. var data = {
  163. radius : 10,
  164. detail : 0,
  165. };
  166. function generateGeometry() {
  167. updateGroupGeometry( mesh,
  168. new THREE.IcosahedronGeometry(
  169. data.radius, data.detail
  170. )
  171. );
  172. }
  173. var folder = gui.addFolder( 'THREE.IcosahedronGeometry' );
  174. folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
  175. folder.add( data, 'detail', 0, 5 ).step( 1 ).onChange( generateGeometry );
  176. generateGeometry();
  177. },
  178. OctahedronGeometry : function() {
  179. var data = {
  180. radius : 10,
  181. detail : 0,
  182. };
  183. function generateGeometry() {
  184. updateGroupGeometry( mesh,
  185. new THREE.OctahedronGeometry(
  186. data.radius, data.detail
  187. )
  188. );
  189. }
  190. var folder = gui.addFolder( 'THREE.OctahedronGeometry' );
  191. folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
  192. folder.add( data, 'detail', 0, 5 ).step( 1 ).onChange( generateGeometry );
  193. generateGeometry();
  194. },
  195. PlaneGeometry : function( mesh ) {
  196. var data = {
  197. width : 10,
  198. height : 10,
  199. widthSegments : 1,
  200. heightSegments : 1
  201. };
  202. function generateGeometry() {
  203. updateGroupGeometry( mesh,
  204. new THREE.PlaneGeometry(
  205. data.width, data.height, data.widthSegments, data.heightSegments
  206. )
  207. );
  208. }
  209. var folder = gui.addFolder( 'THREE.PlaneGeometry' );
  210. folder.add( data, 'width', 1, 30 ).onChange( generateGeometry );
  211. folder.add( data, 'height', 1, 30 ).onChange( generateGeometry );
  212. folder.add( data, 'widthSegments', 1, 30 ).step( 1 ).onChange( generateGeometry );
  213. folder.add( data, 'heightSegments', 1, 30 ).step( 1 ).onChange( generateGeometry );
  214. generateGeometry();
  215. },
  216. RingGeometry : function( mesh ) {
  217. var data = {
  218. innerRadius : 5,
  219. outerRadius : 10,
  220. thetaSegments : 8,
  221. phiSegments : 8,
  222. thetaStart : 0,
  223. thetaLength : twoPi,
  224. };
  225. function generateGeometry() {
  226. updateGroupGeometry( mesh,
  227. new THREE.RingGeometry(
  228. data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength
  229. )
  230. );
  231. }
  232. var folder = gui.addFolder( 'THREE.RingGeometry' );
  233. folder.add( data, 'innerRadius', 0, 30 ).onChange( generateGeometry );
  234. folder.add( data, 'outerRadius', 1, 30 ).onChange( generateGeometry );
  235. folder.add( data, 'thetaSegments', 1, 30 ).step( 1 ).onChange( generateGeometry );
  236. folder.add( data, 'phiSegments', 1, 30 ).step( 1 ).onChange( generateGeometry );
  237. folder.add( data, 'thetaStart', 0, twoPi ).onChange( generateGeometry );
  238. folder.add( data, 'thetaLength', 0, twoPi ).onChange( generateGeometry );
  239. generateGeometry();
  240. },
  241. SphereGeometry : function( mesh ) {
  242. var data = {
  243. radius : 15,
  244. widthSegments : 8,
  245. heightSegments : 6,
  246. phiStart : 0,
  247. phiLength : twoPi,
  248. thetaStart : 0,
  249. thetaLength : Math.PI,
  250. };
  251. function generateGeometry() {
  252. updateGroupGeometry( mesh,
  253. new THREE.SphereGeometry(
  254. data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength
  255. )
  256. );
  257. }
  258. var folder = gui.addFolder( 'THREE.SphereGeometry' );
  259. folder.add( data, 'radius', 1, 30 ).onChange( generateGeometry );
  260. folder.add( data, 'widthSegments', 3, 32 ).step( 1 ).onChange( generateGeometry );
  261. folder.add( data, 'heightSegments', 2, 32 ).step( 1 ).onChange( generateGeometry );
  262. folder.add( data, 'phiStart', 0, twoPi ).onChange( generateGeometry );
  263. folder.add( data, 'phiLength', 0, twoPi ).onChange( generateGeometry );
  264. folder.add( data, 'thetaStart', 0, twoPi ).onChange( generateGeometry );
  265. folder.add( data, 'thetaLength', 0, twoPi ).onChange( generateGeometry );
  266. generateGeometry();
  267. },
  268. TetrahedronGeometry : function() {
  269. var data = {
  270. radius : 10,
  271. detail : 0,
  272. };
  273. function generateGeometry() {
  274. updateGroupGeometry( mesh,
  275. new THREE.TetrahedronGeometry(
  276. data.radius, data.detail
  277. )
  278. );
  279. }
  280. var folder = gui.addFolder( 'THREE.TetrahedronGeometry' );
  281. folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
  282. folder.add( data, 'detail', 0, 5 ).step( 1 ).onChange( generateGeometry );
  283. generateGeometry();
  284. },
  285. TextGeometry : function( mesh ) {
  286. var data = {
  287. text : "TextGeometry",
  288. size : 5,
  289. height : 2,
  290. curveSegments : 12,
  291. font : "helvetiker",
  292. weight : "regular",
  293. bevelEnabled : false,
  294. bevelThickness : 1,
  295. bevelSize : 0.5
  296. };
  297. var fonts = [
  298. "helvetiker",
  299. "optimer",
  300. "gentilis",
  301. "droid/droid_serif"
  302. ];
  303. var weights = [
  304. "regular", "bold"
  305. ];
  306. function generateGeometry() {
  307. var loader = new THREE.FontLoader();
  308. loader.load( '../../examples/fonts/' + data.font + '_' + data.weight + '.typeface.js', function ( font ) {
  309. var geometry = new THREE.TextGeometry( data.text, {
  310. font: font,
  311. size: data.size,
  312. height: data.height,
  313. curveSegments: data.curveSegments,
  314. bevelEnabled: data.bevelEnabled,
  315. bevelThickness: data.bevelThickness,
  316. bevelSize: data.bevelSize
  317. } );
  318. geometry.center();
  319. updateGroupGeometry( mesh, geometry );
  320. } );
  321. }
  322. //Hide the wireframe
  323. mesh.children[ 0 ].visible = false;
  324. var folder = gui.addFolder( 'THREE.TextGeometry' );
  325. folder.add( data, 'text' ).onChange( generateGeometry );
  326. folder.add( data, 'size', 1, 30 ).onChange( generateGeometry );
  327. folder.add( data, 'height', 1, 20 ).onChange( generateGeometry );
  328. folder.add( data, 'curveSegments', 1, 20 ).step( 1 ).onChange( generateGeometry );
  329. folder.add( data, 'font', fonts ).onChange( generateGeometry );
  330. folder.add( data, 'weight', weights ).onChange( generateGeometry );
  331. folder.add( data, 'bevelEnabled' ).onChange( generateGeometry );
  332. folder.add( data, 'bevelThickness', 0.1, 3 ).onChange( generateGeometry );
  333. folder.add( data, 'bevelSize', 0.1, 3 ).onChange( generateGeometry );
  334. generateGeometry();
  335. },
  336. TorusGeometry : function( mesh ) {
  337. var data = {
  338. radius : 10,
  339. tube : 3,
  340. radialSegments : 16,
  341. tubularSegments : 100,
  342. arc : twoPi
  343. };
  344. function generateGeometry() {
  345. updateGroupGeometry( mesh,
  346. new THREE.TorusGeometry(
  347. data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc
  348. )
  349. );
  350. }
  351. var folder = gui.addFolder( 'THREE.TorusGeometry' );
  352. folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
  353. folder.add( data, 'tube', 0.1, 10 ).onChange( generateGeometry );
  354. folder.add( data, 'radialSegments', 2, 30 ).step( 1 ).onChange( generateGeometry );
  355. folder.add( data, 'tubularSegments', 3, 200 ).step( 1 ).onChange( generateGeometry );
  356. folder.add( data, 'arc', 0.1, twoPi ).onChange( generateGeometry );
  357. generateGeometry();
  358. },
  359. TorusKnotGeometry : function( mesh ) {
  360. var data = {
  361. radius : 10,
  362. tube : 3,
  363. radialSegments : 64,
  364. tubularSegments : 8,
  365. p : 2,
  366. q : 3,
  367. heightScale : 1
  368. };
  369. function generateGeometry() {
  370. updateGroupGeometry( mesh,
  371. new THREE.TorusKnotGeometry(
  372. data.radius, data.tube, data.radialSegments, data.tubularSegments,
  373. data.p, data.q, data.heightScale
  374. )
  375. );
  376. }
  377. var folder = gui.addFolder( 'THREE.TorusGeometry' );
  378. folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
  379. folder.add( data, 'tube', 0.1, 10 ).onChange( generateGeometry );
  380. folder.add( data, 'radialSegments', 3, 300 ).step( 1 ).onChange( generateGeometry );
  381. folder.add( data, 'tubularSegments', 3, 20 ).step( 1 ).onChange( generateGeometry );
  382. folder.add( data, 'p', 1, 20 ).step( 1 ).onChange( generateGeometry );
  383. folder.add( data, 'q', 1, 20 ).step( 1 ).onChange( generateGeometry );
  384. folder.add( data, 'heightScale', 1, 20 ).onChange( generateGeometry );
  385. generateGeometry();
  386. }
  387. };
  388. function chooseFromHash ( mesh ) {
  389. var selectedGeometry = window.location.hash.substring( 1 ) || "TorusGeometry";
  390. if ( guis[ selectedGeometry ] !== undefined ) {
  391. guis[ selectedGeometry ]( mesh );
  392. }
  393. if ( selectedGeometry === 'TextGeometry' ) {
  394. return { fixed : true };
  395. }
  396. //No configuration options
  397. return {};
  398. }