geometry.js 13 KB

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