geometry.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548
  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 : "normal",
  293. style : "normal",
  294. bevelEnabled : false,
  295. bevelThickness : 1,
  296. bevelSize : 0.5
  297. };
  298. var fonts = [
  299. "helvetiker",
  300. "optimer",
  301. "gentilis",
  302. "droid serif"
  303. ]
  304. var weights = [
  305. "normal", "bold"
  306. ]
  307. function generateGeometry() {
  308. var geometry = new THREE.TextGeometry( data.text, data )
  309. geometry.center()
  310. updateGroupGeometry( mesh, geometry );
  311. }
  312. //Hide the wireframe
  313. mesh.children[0].visible = false;
  314. var folder = gui.addFolder('THREE.TextGeometry');
  315. folder.add( data, 'text' ).onChange( generateGeometry );
  316. folder.add( data, 'size', 1, 30 ).onChange( generateGeometry );
  317. folder.add( data, 'height', 1, 20 ).onChange( generateGeometry );
  318. folder.add( data, 'curveSegments', 1, 20 ).step(1).onChange( generateGeometry );
  319. folder.add( data, 'font', fonts ).onChange( generateGeometry );
  320. folder.add( data, 'weight', weights ).onChange( generateGeometry );
  321. // folder.add( data, 'style', 1, 1 ).onChange( generateGeometry );
  322. folder.add( data, 'bevelEnabled' ).onChange( generateGeometry );
  323. folder.add( data, 'bevelThickness', 0.1, 3 ).onChange( generateGeometry );
  324. folder.add( data, 'bevelSize', 0.1, 3 ).onChange( generateGeometry );
  325. generateGeometry();
  326. },
  327. TorusGeometry : function( mesh ) {
  328. var data = {
  329. radius : 10,
  330. tube : 3,
  331. radialSegments : 16,
  332. tubularSegments : 100,
  333. arc : twoPi
  334. };
  335. function generateGeometry() {
  336. updateGroupGeometry( mesh,
  337. new THREE.TorusGeometry(
  338. data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc
  339. )
  340. )
  341. }
  342. var folder = gui.addFolder('THREE.TorusGeometry');
  343. folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
  344. folder.add( data, 'tube', 0.1, 10 ).onChange( generateGeometry );
  345. folder.add( data, 'radialSegments', 2, 30 ).step(1).onChange( generateGeometry );
  346. folder.add( data, 'tubularSegments', 3, 200 ).step(1).onChange( generateGeometry );
  347. folder.add( data, 'arc', 0.1, twoPi ).onChange( generateGeometry );
  348. generateGeometry();
  349. },
  350. TorusKnotGeometry : function( mesh ) {
  351. var data = {
  352. radius : 10,
  353. tube : 3,
  354. radialSegments : 64,
  355. tubularSegments : 8,
  356. p : 2,
  357. q : 3,
  358. heightScale : 1
  359. };
  360. function generateGeometry() {
  361. updateGroupGeometry( mesh,
  362. new THREE.TorusKnotGeometry(
  363. data.radius, data.tube, data.radialSegments, data.tubularSegments,
  364. data.p, data.q, data.heightScale
  365. )
  366. )
  367. }
  368. var folder = gui.addFolder('THREE.TorusGeometry');
  369. folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry )
  370. folder.add( data, 'tube', 0.1, 10 ).onChange( generateGeometry )
  371. folder.add( data, 'radialSegments', 3, 300 ).step(1).onChange( generateGeometry )
  372. folder.add( data, 'tubularSegments', 3, 20 ).step(1).onChange( generateGeometry )
  373. folder.add( data, 'p', 1, 20 ).step(1).onChange( generateGeometry )
  374. folder.add( data, 'q', 1, 20 ).step(1).onChange( generateGeometry )
  375. folder.add( data, 'heightScale', 1, 20 ).onChange( generateGeometry )
  376. generateGeometry()
  377. }
  378. }
  379. function chooseFromHash ( mesh ) {
  380. var selectedGeometry = window.location.hash.substring(1) || "TorusGeometry";
  381. if ( guis[ selectedGeometry ] !== undefined ) {
  382. guis[ selectedGeometry ]( mesh );
  383. }
  384. if ( selectedGeometry === 'TextGeometry' ) {
  385. return { fixed : true };
  386. }
  387. //No configuration options
  388. return {};
  389. }