OSDN Git Service

three.jsをThirdPartyに追加
[webglgame/webgl_framework.git] / webglFramework / Thirdparty / three.js-master / docs / scenes / js / geometry.js
1 /**
2  * @author TatumCreative (Greg Tatum) / http://gregtatum.com/
3  */
4
5 var twoPi = Math.PI * 2;
6
7 var constants = {
8
9         combine: {
10
11                 "THREE.MultiplyOperation" : THREE.MultiplyOperation,
12                 "THREE.MixOperation" : THREE.MixOperation,
13                 "THREE.AddOperation" : THREE.AddOperation
14
15         },
16
17         side : {
18
19                 "THREE.FrontSide" : THREE.FrontSide,
20                 "THREE.BackSide" : THREE.BackSide,
21                 "THREE.DoubleSide" : THREE.DoubleSide
22
23         },
24
25         colors : {
26
27                 "THREE.NoColors" : THREE.NoColors,
28                 "THREE.FaceColors" : THREE.FaceColors,
29                 "THREE.VertexColors" : THREE.VertexColors
30
31         },
32
33         blendingMode : {
34
35                 "THREE.NoBlending" : THREE.NoBlending,
36                 "THREE.NormalBlending" : THREE.NormalBlending,
37                 "THREE.AdditiveBlending" : THREE.AdditiveBlending,
38                 "THREE.SubtractiveBlending" : THREE.SubtractiveBlending,
39                 "THREE.MultiplyBlending" : THREE.MultiplyBlending,
40                 "THREE.CustomBlending" : THREE.CustomBlending
41
42         },
43
44         equations : {
45
46                 "THREE.AddEquation" : THREE.AddEquation,
47                 "THREE.SubtractEquation" : THREE.SubtractEquation,
48                 "THREE.ReverseSubtractEquation" : THREE.ReverseSubtractEquation
49
50         },
51
52         destinationFactors : {
53
54                 "THREE.ZeroFactor" : THREE.ZeroFactor,
55                 "THREE.OneFactor" : THREE.OneFactor,
56                 "THREE.SrcColorFactor" : THREE.SrcColorFactor,
57                 "THREE.OneMinusSrcColorFactor" : THREE.OneMinusSrcColorFactor,
58                 "THREE.SrcAlphaFactor" : THREE.SrcAlphaFactor,
59                 "THREE.OneMinusSrcAlphaFactor" : THREE.OneMinusSrcAlphaFactor,
60                 "THREE.DstAlphaFactor" : THREE.DstAlphaFactor,
61                 "THREE.OneMinusDstAlphaFactor" : THREE.OneMinusDstAlphaFactor
62
63         },
64
65         sourceFactors : {
66
67                 "THREE.DstColorFactor" : THREE.DstColorFactor,
68                 "THREE.OneMinusDstColorFactor" : THREE.OneMinusDstColorFactor,
69                 "THREE.SrcAlphaSaturateFactor" : THREE.SrcAlphaSaturateFactor
70
71         }
72
73 };
74
75 function updateGroupGeometry( mesh, geometry ) {
76
77         mesh.children[ 0 ].geometry.dispose();
78         mesh.children[ 1 ].geometry.dispose();
79
80         mesh.children[ 0 ].geometry = new THREE.WireframeGeometry( geometry );
81         mesh.children[ 1 ].geometry = geometry;
82
83         // these do not update nicely together if shared
84
85 }
86
87 function CustomSinCurve( scale ) {
88
89         THREE.Curve.call( this );
90
91         this.scale = ( scale === undefined ) ? 1 : scale;
92
93 }
94
95 CustomSinCurve.prototype = Object.create( THREE.Curve.prototype );
96 CustomSinCurve.prototype.constructor = CustomSinCurve;
97
98 CustomSinCurve.prototype.getPoint = function ( t ) {
99
100         var tx = t * 3 - 1.5;
101         var ty = Math.sin( 2 * Math.PI * t );
102         var tz = 0;
103
104         return new THREE.Vector3( tx, ty, tz ).multiplyScalar( this.scale );
105
106 };
107
108 // heart shape
109
110 var x = 0, y = 0;
111
112 var heartShape = new THREE.Shape();
113
114 heartShape.moveTo( x + 5, y + 5 );
115 heartShape.bezierCurveTo( x + 5, y + 5, x + 4, y, x, y );
116 heartShape.bezierCurveTo( x - 6, y, x - 6, y + 7,x - 6, y + 7 );
117 heartShape.bezierCurveTo( x - 6, y + 11, x - 3, y + 15.4, x + 5, y + 19 );
118 heartShape.bezierCurveTo( x + 12, y + 15.4, x + 16, y + 11, x + 16, y + 7 );
119 heartShape.bezierCurveTo( x + 16, y + 7, x + 16, y, x + 10, y );
120 heartShape.bezierCurveTo( x + 7, y, x + 5, y + 5, x + 5, y + 5 );
121
122 var guis = {
123
124         BoxBufferGeometry : function( mesh ) {
125
126                 var data = {
127                         width : 15,
128                         height : 15,
129                         depth : 15,
130                         widthSegments : 1,
131                         heightSegments : 1,
132                         depthSegments : 1
133                 };
134
135                 function generateGeometry() {
136
137                         updateGroupGeometry( mesh,
138                                 new THREE.BoxBufferGeometry(
139                                         data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments
140                                 )
141                         );
142
143                 }
144
145                 var folder = gui.addFolder( 'THREE.BoxBufferGeometry' );
146
147                 folder.add( data, 'width', 1, 30 ).onChange( generateGeometry );
148                 folder.add( data, 'height', 1, 30 ).onChange( generateGeometry );
149                 folder.add( data, 'depth', 1, 30 ).onChange( generateGeometry );
150                 folder.add( data, 'widthSegments', 1, 10 ).step( 1 ).onChange( generateGeometry );
151                 folder.add( data, 'heightSegments', 1, 10 ).step( 1 ).onChange( generateGeometry );
152                 folder.add( data, 'depthSegments', 1, 10 ).step( 1 ).onChange( generateGeometry );
153
154                 generateGeometry();
155
156         },
157
158         BoxGeometry : function( mesh ) {
159
160                 var data = {
161                         width : 15,
162                         height : 15,
163                         depth : 15,
164                         widthSegments : 1,
165                         heightSegments : 1,
166                         depthSegments : 1
167                 };
168
169                 function generateGeometry() {
170
171                         updateGroupGeometry( mesh,
172                                 new THREE.BoxGeometry(
173                                         data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments
174                                 )
175                         );
176
177                 }
178
179                 var folder = gui.addFolder( 'THREE.BoxGeometry' );
180
181                 folder.add( data, 'width', 1, 30 ).onChange( generateGeometry );
182                 folder.add( data, 'height', 1, 30 ).onChange( generateGeometry );
183                 folder.add( data, 'depth', 1, 30 ).onChange( generateGeometry );
184                 folder.add( data, 'widthSegments', 1, 10 ).step( 1 ).onChange( generateGeometry );
185                 folder.add( data, 'heightSegments', 1, 10 ).step( 1 ).onChange( generateGeometry );
186                 folder.add( data, 'depthSegments', 1, 10 ).step( 1 ).onChange( generateGeometry );
187
188                 generateGeometry();
189
190         },
191
192         CylinderBufferGeometry : function( mesh ) {
193
194                 var data = {
195                         radiusTop : 5,
196                         radiusBottom : 5,
197                         height : 10,
198                         radiusSegments : 8,
199                         heightSegments : 1,
200                         openEnded : false,
201                         thetaStart : 0,
202                         thetaLength : twoPi
203                 };
204
205                 function generateGeometry() {
206
207                         updateGroupGeometry( mesh,
208                                 new THREE.CylinderBufferGeometry(
209                                         data.radiusTop,
210                                         data.radiusBottom,
211                                         data.height,
212                                         data.radiusSegments,
213                                         data.heightSegments,
214                                         data.openEnded,
215                                         data.thetaStart,
216                                         data.thetaLength
217                                 )
218                         );
219
220                 }
221
222                 var folder = gui.addFolder( 'THREE.CylinderBufferGeometry' );
223
224                 folder.add( data, 'radiusTop', 0, 30 ).onChange( generateGeometry );
225                 folder.add( data, 'radiusBottom', 0, 30 ).onChange( generateGeometry );
226                 folder.add( data, 'height', 1, 50 ).onChange( generateGeometry );
227                 folder.add( data, 'radiusSegments', 3, 64 ).step( 1 ).onChange( generateGeometry );
228                 folder.add( data, 'heightSegments', 1, 64 ).step( 1 ).onChange( generateGeometry );
229                 folder.add( data, 'openEnded' ).onChange( generateGeometry );
230                 folder.add( data, 'thetaStart', 0, twoPi ).onChange( generateGeometry );
231                 folder.add( data, 'thetaLength', 0, twoPi ).onChange( generateGeometry );
232
233
234                 generateGeometry();
235
236         },
237
238         CylinderGeometry : function( mesh ) {
239
240                 var data = {
241                         radiusTop : 5,
242                         radiusBottom : 5,
243                         height : 10,
244                         radiusSegments : 8,
245                         heightSegments : 1,
246                         openEnded : false,
247                         thetaStart : 0,
248                         thetaLength : twoPi
249                 };
250
251                 function generateGeometry() {
252
253                         updateGroupGeometry( mesh,
254                                 new THREE.CylinderGeometry(
255                                         data.radiusTop,
256                                         data.radiusBottom,
257                                         data.height,
258                                         data.radiusSegments,
259                                         data.heightSegments,
260                                         data.openEnded,
261                                         data.thetaStart,
262                                         data.thetaLength
263                                 )
264                         );
265
266                 }
267
268                 var folder = gui.addFolder( 'THREE.CylinderGeometry' );
269
270                 folder.add( data, 'radiusTop', 1, 30 ).onChange( generateGeometry );
271                 folder.add( data, 'radiusBottom', 1, 30 ).onChange( generateGeometry );
272                 folder.add( data, 'height', 1, 50 ).onChange( generateGeometry );
273                 folder.add( data, 'radiusSegments', 3, 64 ).step( 1 ).onChange( generateGeometry );
274                 folder.add( data, 'heightSegments', 1, 64 ).step( 1 ).onChange( generateGeometry );
275                 folder.add( data, 'openEnded' ).onChange( generateGeometry );
276                 folder.add( data, 'thetaStart', 0, twoPi ).onChange( generateGeometry );
277                 folder.add( data, 'thetaLength', 0, twoPi ).onChange( generateGeometry );
278
279
280                 generateGeometry();
281
282         },
283
284         ConeBufferGeometry : function( mesh ) {
285
286                 var data = {
287                         radius : 5,
288                         height : 10,
289                         radiusSegments : 8,
290                         heightSegments : 1,
291                         openEnded : false,
292                         thetaStart : 0,
293                         thetaLength : twoPi
294                 };
295
296                 function generateGeometry() {
297
298                         updateGroupGeometry( mesh,
299                                 new THREE.ConeBufferGeometry(
300                                         data.radius,
301                                         data.height,
302                                         data.radiusSegments,
303                                         data.heightSegments,
304                                         data.openEnded,
305                                         data.thetaStart,
306                                         data.thetaLength
307                                 )
308                         );
309
310                 }
311
312                 var folder = gui.addFolder( 'THREE.ConeBufferGeometry' );
313
314                 folder.add( data, 'radius', 0, 30 ).onChange( generateGeometry );
315                 folder.add( data, 'height', 1, 50 ).onChange( generateGeometry );
316                 folder.add( data, 'radiusSegments', 3, 64 ).step( 1 ).onChange( generateGeometry );
317                 folder.add( data, 'heightSegments', 1, 64 ).step( 1 ).onChange( generateGeometry );
318                 folder.add( data, 'openEnded' ).onChange( generateGeometry );
319                 folder.add( data, 'thetaStart', 0, twoPi ).onChange( generateGeometry );
320                 folder.add( data, 'thetaLength', 0, twoPi ).onChange( generateGeometry );
321
322
323                 generateGeometry();
324
325         },
326
327         ConeGeometry : function( mesh ) {
328
329                 var data = {
330                         radius : 5,
331                         height : 10,
332                         radiusSegments : 8,
333                         heightSegments : 1,
334                         openEnded : false,
335                         thetaStart : 0,
336                         thetaLength : twoPi
337                 };
338
339                 function generateGeometry() {
340
341                         updateGroupGeometry( mesh,
342                                 new THREE.ConeGeometry(
343                                         data.radius,
344                                         data.height,
345                                         data.radiusSegments,
346                                         data.heightSegments,
347                                         data.openEnded,
348                                         data.thetaStart,
349                                         data.thetaLength
350                                 )
351                         );
352
353                 }
354
355                 var folder = gui.addFolder( 'THREE.ConeGeometry' );
356
357                 folder.add( data, 'radius', 0, 30 ).onChange( generateGeometry );
358                 folder.add( data, 'height', 1, 50 ).onChange( generateGeometry );
359                 folder.add( data, 'radiusSegments', 3, 64 ).step( 1 ).onChange( generateGeometry );
360                 folder.add( data, 'heightSegments', 1, 64 ).step( 1 ).onChange( generateGeometry );
361                 folder.add( data, 'openEnded' ).onChange( generateGeometry );
362                 folder.add( data, 'thetaStart', 0, twoPi ).onChange( generateGeometry );
363                 folder.add( data, 'thetaLength', 0, twoPi ).onChange( generateGeometry );
364
365
366                 generateGeometry();
367
368         },
369
370
371         CircleBufferGeometry : function( mesh ) {
372
373                 var data = {
374                         radius : 10,
375                         segments : 32,
376                         thetaStart : 0,
377                         thetaLength : twoPi
378                 };
379
380                 function generateGeometry() {
381
382                         updateGroupGeometry( mesh,
383                                 new THREE.CircleBufferGeometry(
384                                         data.radius, data.segments, data.thetaStart, data.thetaLength
385                                 )
386                         );
387
388                 }
389
390                 var folder = gui.addFolder( 'THREE.CircleBufferGeometry' );
391
392                 folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
393                 folder.add( data, 'segments', 0, 128 ).step( 1 ).onChange( generateGeometry );
394                 folder.add( data, 'thetaStart', 0, twoPi ).onChange( generateGeometry );
395                 folder.add( data, 'thetaLength', 0, twoPi ).onChange( generateGeometry );
396
397                 generateGeometry();
398
399         },
400
401         CircleGeometry : function( mesh ) {
402
403                 var data = {
404                         radius : 10,
405                         segments : 32,
406                         thetaStart : 0,
407                         thetaLength : twoPi
408                 };
409
410                 function generateGeometry() {
411
412                         updateGroupGeometry( mesh,
413                                 new THREE.CircleGeometry(
414                                         data.radius, data.segments, data.thetaStart, data.thetaLength
415                                 )
416                         );
417
418                 }
419
420                 var folder = gui.addFolder( 'THREE.CircleGeometry' );
421
422                 folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
423                 folder.add( data, 'segments', 0, 128 ).step( 1 ).onChange( generateGeometry );
424                 folder.add( data, 'thetaStart', 0, twoPi ).onChange( generateGeometry );
425                 folder.add( data, 'thetaLength', 0, twoPi ).onChange( generateGeometry );
426
427                 generateGeometry();
428
429         },
430
431         DodecahedronGeometry : function() {
432
433                 var data = {
434                         radius : 10,
435                         detail : 0
436                 };
437
438                 function generateGeometry() {
439
440                         updateGroupGeometry( mesh,
441                                 new THREE.DodecahedronGeometry(
442                                         data.radius, data.detail
443                                 )
444                         );
445
446                 }
447
448                 var folder = gui.addFolder( 'THREE.DodecahedronGeometry' );
449
450                 folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
451                 folder.add( data, 'detail', 0, 5 ).step( 1 ).onChange( generateGeometry );
452
453                 generateGeometry();
454
455         },
456
457         DodecahedronBufferGeometry : function() {
458
459                 var data = {
460                         radius : 10,
461                         detail : 0
462                 };
463
464                 function generateGeometry() {
465
466                         updateGroupGeometry( mesh,
467                                 new THREE.DodecahedronBufferGeometry(
468                                         data.radius, data.detail
469                                 )
470                         );
471
472                 }
473
474                 var folder = gui.addFolder( 'THREE.DodecahedronBufferGeometry' );
475
476                 folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
477                 folder.add( data, 'detail', 0, 5 ).step( 1 ).onChange( generateGeometry );
478
479                 generateGeometry();
480
481         },
482
483         IcosahedronGeometry : function() {
484
485                 var data = {
486                         radius : 10,
487                         detail : 0
488                 };
489
490                 function generateGeometry() {
491
492                         updateGroupGeometry( mesh,
493                                 new THREE.IcosahedronGeometry(
494                                         data.radius, data.detail
495                                 )
496                         );
497
498                 }
499
500                 var folder = gui.addFolder( 'THREE.IcosahedronGeometry' );
501
502                 folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
503                 folder.add( data, 'detail', 0, 5 ).step( 1 ).onChange( generateGeometry );
504
505                 generateGeometry();
506
507         },
508
509         IcosahedronBufferGeometry : function() {
510
511                 var data = {
512                         radius : 10,
513                         detail : 0
514                 };
515
516                 function generateGeometry() {
517
518                         updateGroupGeometry( mesh,
519                                 new THREE.IcosahedronBufferGeometry(
520                                         data.radius, data.detail
521                                 )
522                         );
523
524                 }
525
526                 var folder = gui.addFolder( 'THREE.IcosahedronBufferGeometry' );
527
528                 folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
529                 folder.add( data, 'detail', 0, 5 ).step( 1 ).onChange( generateGeometry );
530
531                 generateGeometry();
532
533         },
534
535         LatheBufferGeometry : function() {
536
537                 var points = [];
538
539                 for ( var i = 0; i < 10; i ++ ) {
540
541                         points.push( new THREE.Vector2( Math.sin( i * 0.2 ) * 10 + 5, ( i - 5 ) * 2 ) );
542
543                 }
544
545                 var data = {
546                         segments : 12,
547                         phiStart : 0,
548                         phiLength : twoPi
549                 };
550
551                 function generateGeometry() {
552
553                         var geometry = new THREE.LatheBufferGeometry(
554                                 points, data.segments, data.phiStart, data.phiLength
555                         );
556
557                         updateGroupGeometry( mesh, geometry );
558
559                 }
560
561                 var folder = gui.addFolder( 'THREE.LatheBufferGeometry' );
562
563                 folder.add( data, 'segments', 1, 30 ).step( 1 ).onChange( generateGeometry );
564                 folder.add( data, 'phiStart', 0, twoPi ).onChange( generateGeometry );
565                 folder.add( data, 'phiLength', 0, twoPi ).onChange( generateGeometry );
566
567                 generateGeometry();
568
569         },
570
571         LatheGeometry : function() {
572
573                 var points = [];
574
575                 for ( var i = 0; i < 10; i ++ ) {
576
577                         points.push( new THREE.Vector2( Math.sin( i * 0.2 ) * 10 + 5, ( i - 5 ) * 2 ) );
578
579                 }
580
581                 var data = {
582                         segments : 12,
583                         phiStart : 0,
584                         phiLength : twoPi
585                 };
586
587                 function generateGeometry() {
588
589                         var geometry = new THREE.LatheGeometry(
590                                 points, data.segments, data.phiStart, data.phiLength
591                         );
592
593                         updateGroupGeometry( mesh, geometry );
594
595                 }
596
597                 var folder = gui.addFolder( 'THREE.LatheGeometry' );
598
599                 folder.add( data, 'segments', 1, 30 ).step( 1 ).onChange( generateGeometry );
600                 folder.add( data, 'phiStart', 0, twoPi ).onChange( generateGeometry );
601                 folder.add( data, 'phiLength', 0, twoPi ).onChange( generateGeometry );
602
603                 generateGeometry();
604
605         },
606
607         OctahedronGeometry : function() {
608
609                 var data = {
610                         radius : 10,
611                         detail : 0
612                 };
613
614                 function generateGeometry() {
615
616                         updateGroupGeometry( mesh,
617                                 new THREE.OctahedronGeometry(
618                                         data.radius, data.detail
619                                 )
620                         );
621
622                 }
623
624                 var folder = gui.addFolder( 'THREE.OctahedronGeometry' );
625
626                 folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
627                 folder.add( data, 'detail', 0, 5 ).step( 1 ).onChange( generateGeometry );
628
629                 generateGeometry();
630
631         },
632
633         OctahedronBufferGeometry : function() {
634
635                 var data = {
636                         radius : 10,
637                         detail : 0
638                 };
639
640                 function generateGeometry() {
641
642                         updateGroupGeometry( mesh,
643                                 new THREE.OctahedronBufferGeometry(
644                                         data.radius, data.detail
645                                 )
646                         );
647
648                 }
649
650                 var folder = gui.addFolder( 'THREE.OctahedronBufferGeometry' );
651
652                 folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
653                 folder.add( data, 'detail', 0, 5 ).step( 1 ).onChange( generateGeometry );
654
655                 generateGeometry();
656
657         },
658
659         PlaneBufferGeometry : function( mesh ) {
660
661                 var data = {
662                         width : 10,
663                         height : 10,
664                         widthSegments : 1,
665                         heightSegments : 1
666                 };
667
668                 function generateGeometry() {
669
670                         updateGroupGeometry( mesh,
671                                 new THREE.PlaneBufferGeometry(
672                                         data.width, data.height, data.widthSegments, data.heightSegments
673                                 )
674                         );
675
676                 }
677
678                 var folder = gui.addFolder( 'THREE.PlaneBufferGeometry' );
679
680                 folder.add( data, 'width', 1, 30 ).onChange( generateGeometry );
681                 folder.add( data, 'height', 1, 30 ).onChange( generateGeometry );
682                 folder.add( data, 'widthSegments', 1, 30 ).step( 1 ).onChange( generateGeometry );
683                 folder.add( data, 'heightSegments', 1, 30 ).step( 1 ).onChange( generateGeometry );
684
685                 generateGeometry();
686
687         },
688
689         PlaneGeometry : function( mesh ) {
690
691                 var data = {
692                         width : 10,
693                         height : 10,
694                         widthSegments : 1,
695                         heightSegments : 1
696                 };
697
698                 function generateGeometry() {
699
700                         updateGroupGeometry( mesh,
701                                 new THREE.PlaneGeometry(
702                                         data.width, data.height, data.widthSegments, data.heightSegments
703                                 )
704                         );
705
706                 }
707
708                 var folder = gui.addFolder( 'THREE.PlaneGeometry' );
709
710                 folder.add( data, 'width', 1, 30 ).onChange( generateGeometry );
711                 folder.add( data, 'height', 1, 30 ).onChange( generateGeometry );
712                 folder.add( data, 'widthSegments', 1, 30 ).step( 1 ).onChange( generateGeometry );
713                 folder.add( data, 'heightSegments', 1, 30 ).step( 1 ).onChange( generateGeometry );
714
715                 generateGeometry();
716
717         },
718
719         RingBufferGeometry : function( mesh ) {
720
721                 var data = {
722                         innerRadius : 5,
723                         outerRadius : 10,
724                         thetaSegments : 8,
725                         phiSegments : 8,
726                         thetaStart : 0,
727                         thetaLength : twoPi
728                 };
729
730                 function generateGeometry() {
731
732                         updateGroupGeometry( mesh,
733                                 new THREE.RingBufferGeometry(
734                                         data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength
735                                 )
736                         );
737
738                 }
739
740                 var folder = gui.addFolder( 'THREE.RingBufferGeometry' );
741
742                 folder.add( data, 'innerRadius', 1, 30 ).onChange( generateGeometry );
743                 folder.add( data, 'outerRadius', 1, 30 ).onChange( generateGeometry );
744                 folder.add( data, 'thetaSegments', 1, 30 ).step( 1 ).onChange( generateGeometry );
745                 folder.add( data, 'phiSegments', 1, 30 ).step( 1 ).onChange( generateGeometry );
746                 folder.add( data, 'thetaStart', 0, twoPi ).onChange( generateGeometry );
747                 folder.add( data, 'thetaLength', 0, twoPi ).onChange( generateGeometry );
748
749                 generateGeometry();
750
751         },
752
753         RingGeometry : function( mesh ) {
754
755                 var data = {
756                         innerRadius : 5,
757                         outerRadius : 10,
758                         thetaSegments : 8,
759                         phiSegments : 8,
760                         thetaStart : 0,
761                         thetaLength : twoPi
762                 };
763
764                 function generateGeometry() {
765
766                         updateGroupGeometry( mesh,
767                                 new THREE.RingGeometry(
768                                         data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength
769                                 )
770                         );
771
772                 }
773
774                 var folder = gui.addFolder( 'THREE.RingGeometry' );
775
776                 folder.add( data, 'innerRadius', 1, 30 ).onChange( generateGeometry );
777                 folder.add( data, 'outerRadius', 1, 30 ).onChange( generateGeometry );
778                 folder.add( data, 'thetaSegments', 1, 30 ).step( 1 ).onChange( generateGeometry );
779                 folder.add( data, 'phiSegments', 1, 30 ).step( 1 ).onChange( generateGeometry );
780                 folder.add( data, 'thetaStart', 0, twoPi ).onChange( generateGeometry );
781                 folder.add( data, 'thetaLength', 0, twoPi ).onChange( generateGeometry );
782
783                 generateGeometry();
784
785         },
786
787         SphereBufferGeometry : function( mesh ) {
788
789                 var data = {
790                         radius : 15,
791                         widthSegments : 8,
792                         heightSegments : 6,
793                         phiStart : 0,
794                         phiLength : twoPi,
795                         thetaStart : 0,
796                         thetaLength : Math.PI
797                 };
798
799                 function generateGeometry() {
800
801                         updateGroupGeometry( mesh,
802                                 new THREE.SphereBufferGeometry(
803                                         data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength
804                                 )
805                         );
806
807                 }
808
809                 var folder = gui.addFolder( 'THREE.SphereBufferGeometry' );
810
811                 folder.add( data, 'radius', 1, 30 ).onChange( generateGeometry );
812                 folder.add( data, 'widthSegments', 3, 32 ).step( 1 ).onChange( generateGeometry );
813                 folder.add( data, 'heightSegments', 2, 32 ).step( 1 ).onChange( generateGeometry );
814                 folder.add( data, 'phiStart', 0, twoPi ).onChange( generateGeometry );
815                 folder.add( data, 'phiLength', 0, twoPi ).onChange( generateGeometry );
816                 folder.add( data, 'thetaStart', 0, twoPi ).onChange( generateGeometry );
817                 folder.add( data, 'thetaLength', 0, twoPi ).onChange( generateGeometry );
818
819                 generateGeometry();
820
821         },
822
823         SphereGeometry : function( mesh ) {
824
825                 var data = {
826                         radius : 15,
827                         widthSegments : 8,
828                         heightSegments : 6,
829                         phiStart : 0,
830                         phiLength : twoPi,
831                         thetaStart : 0,
832                         thetaLength : Math.PI
833                 };
834
835                 function generateGeometry() {
836
837                         updateGroupGeometry( mesh,
838                                 new THREE.SphereGeometry(
839                                         data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength
840                                 )
841                         );
842
843                 }
844
845                 var folder = gui.addFolder( 'THREE.SphereGeometry' );
846
847                 folder.add( data, 'radius', 1, 30 ).onChange( generateGeometry );
848                 folder.add( data, 'widthSegments', 3, 32 ).step( 1 ).onChange( generateGeometry );
849                 folder.add( data, 'heightSegments', 2, 32 ).step( 1 ).onChange( generateGeometry );
850                 folder.add( data, 'phiStart', 0, twoPi ).onChange( generateGeometry );
851                 folder.add( data, 'phiLength', 0, twoPi ).onChange( generateGeometry );
852                 folder.add( data, 'thetaStart', 0, twoPi ).onChange( generateGeometry );
853                 folder.add( data, 'thetaLength', 0, twoPi ).onChange( generateGeometry );
854
855                 generateGeometry();
856
857         },
858
859         TetrahedronGeometry : function() {
860
861                 var data = {
862                         radius : 10,
863                         detail : 0
864                 };
865
866                 function generateGeometry() {
867
868                         updateGroupGeometry( mesh,
869                                 new THREE.TetrahedronGeometry(
870                                         data.radius, data.detail
871                                 )
872                         );
873
874                 }
875
876                 var folder = gui.addFolder( 'THREE.TetrahedronGeometry' );
877
878                 folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
879                 folder.add( data, 'detail', 0, 5 ).step( 1 ).onChange( generateGeometry );
880
881                 generateGeometry();
882
883         },
884
885         TetrahedronBufferGeometry : function() {
886
887                 var data = {
888                         radius : 10,
889                         detail : 0
890                 };
891
892                 function generateGeometry() {
893
894                         updateGroupGeometry( mesh,
895                                 new THREE.TetrahedronBufferGeometry(
896                                         data.radius, data.detail
897                                 )
898                         );
899
900                 }
901
902                 var folder = gui.addFolder( 'THREE.TetrahedronBufferGeometry' );
903
904                 folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
905                 folder.add( data, 'detail', 0, 5 ).step( 1 ).onChange( generateGeometry );
906
907                 generateGeometry();
908
909         },
910
911         TextGeometry : function( mesh ) {
912
913                 var data = {
914                         text : "TextGeometry",
915                         size : 5,
916                         height : 2,
917                         curveSegments : 12,
918                         font : "helvetiker",
919                         weight : "regular",
920                         bevelEnabled : false,
921                         bevelThickness : 1,
922                         bevelSize : 0.5,
923                         bevelSegments : 3
924                 };
925
926                 var fonts = [
927                         "helvetiker",
928                         "optimer",
929                         "gentilis",
930                         "droid/droid_serif"
931                 ];
932
933                 var weights = [
934                         "regular", "bold"
935                 ];
936
937                 function generateGeometry() {
938
939                         var loader = new THREE.FontLoader();
940                         loader.load( '../../examples/fonts/' + data.font + '_' + data.weight + '.typeface.json', function ( font ) {
941
942                                 var geometry = new THREE.TextGeometry( data.text, {
943                                         font: font,
944                                         size: data.size,
945                                         height: data.height,
946                                         curveSegments: data.curveSegments,
947                                         bevelEnabled: data.bevelEnabled,
948                                         bevelThickness: data.bevelThickness,
949                                         bevelSize: data.bevelSize,
950                                         bevelSegments: data.bevelSegments
951                                 } );
952                                 geometry.center();
953
954                                 updateGroupGeometry( mesh, geometry );
955
956                         } );
957
958                 }
959
960                 //Hide the wireframe
961                 mesh.children[ 0 ].visible = false;
962
963                 var folder = gui.addFolder( 'THREE.TextGeometry' );
964
965                 folder.add( data, 'text' ).onChange( generateGeometry );
966                 folder.add( data, 'size', 1, 30 ).onChange( generateGeometry );
967                 folder.add( data, 'height', 1, 20 ).onChange( generateGeometry );
968                 folder.add( data, 'curveSegments', 1, 20 ).step( 1 ).onChange( generateGeometry );
969                 folder.add( data, 'font', fonts ).onChange( generateGeometry );
970                 folder.add( data, 'weight', weights ).onChange( generateGeometry );
971                 folder.add( data, 'bevelEnabled' ).onChange( generateGeometry );
972                 folder.add( data, 'bevelThickness', 0.1, 3 ).onChange( generateGeometry );
973                 folder.add( data, 'bevelSize', 0.1, 3 ).onChange( generateGeometry );
974                 folder.add( data, 'bevelSegments', 0, 8 ).step( 1 ).onChange( generateGeometry );
975
976                 generateGeometry();
977
978         },
979
980         TextBufferGeometry : function( mesh ) {
981
982                 var data = {
983                         text : "TextBufferGeometry",
984                         size : 5,
985                         height : 2,
986                         curveSegments : 12,
987                         font : "helvetiker",
988                         weight : "regular",
989                         bevelEnabled : false,
990                         bevelThickness : 1,
991                         bevelSize : 0.5,
992                         bevelSegments : 3
993                 };
994
995                 var fonts = [
996                         "helvetiker",
997                         "optimer",
998                         "gentilis",
999                         "droid/droid_serif"
1000                 ];
1001
1002                 var weights = [
1003                         "regular", "bold"
1004                 ];
1005
1006                 function generateGeometry() {
1007
1008                         var loader = new THREE.FontLoader();
1009                         loader.load( '../../examples/fonts/' + data.font + '_' + data.weight + '.typeface.json', function ( font ) {
1010
1011                                 var geometry = new THREE.TextBufferGeometry( data.text, {
1012                                         font: font,
1013                                         size: data.size,
1014                                         height: data.height,
1015                                         curveSegments: data.curveSegments,
1016                                         bevelEnabled: data.bevelEnabled,
1017                                         bevelThickness: data.bevelThickness,
1018                                         bevelSize: data.bevelSize,
1019                                         bevelSegments: data.bevelSegments
1020                                 } );
1021                                 geometry.center();
1022
1023                                 updateGroupGeometry( mesh, geometry );
1024
1025                         } );
1026
1027                 }
1028
1029                 //Hide the wireframe
1030                 mesh.children[ 0 ].visible = false;
1031
1032                 var folder = gui.addFolder( 'THREE.TextBufferGeometry' );
1033
1034                 folder.add( data, 'text' ).onChange( generateGeometry );
1035                 folder.add( data, 'size', 1, 30 ).onChange( generateGeometry );
1036                 folder.add( data, 'height', 1, 20 ).onChange( generateGeometry );
1037                 folder.add( data, 'curveSegments', 1, 20 ).step( 1 ).onChange( generateGeometry );
1038                 folder.add( data, 'font', fonts ).onChange( generateGeometry );
1039                 folder.add( data, 'weight', weights ).onChange( generateGeometry );
1040                 folder.add( data, 'bevelEnabled' ).onChange( generateGeometry );
1041                 folder.add( data, 'bevelThickness', 0.1, 3 ).onChange( generateGeometry );
1042                 folder.add( data, 'bevelSize', 0.1, 3 ).onChange( generateGeometry );
1043                 folder.add( data, 'bevelSegments', 0, 8 ).step( 1 ).onChange( generateGeometry );
1044
1045                 generateGeometry();
1046
1047         },
1048
1049         TorusBufferGeometry : function( mesh ) {
1050
1051                 var data = {
1052                         radius : 10,
1053                         tube : 3,
1054                         radialSegments : 16,
1055                         tubularSegments : 100,
1056                         arc : twoPi
1057                 };
1058
1059                 function generateGeometry() {
1060
1061                         updateGroupGeometry( mesh,
1062                                 new THREE.TorusBufferGeometry(
1063                                         data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc
1064                                 )
1065                         );
1066
1067                 }
1068
1069                 var folder = gui.addFolder( 'THREE.TorusBufferGeometry' );
1070
1071                 folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
1072                 folder.add( data, 'tube', 0.1, 10 ).onChange( generateGeometry );
1073                 folder.add( data, 'radialSegments', 2, 30 ).step( 1 ).onChange( generateGeometry );
1074                 folder.add( data, 'tubularSegments', 3, 200 ).step( 1 ).onChange( generateGeometry );
1075                 folder.add( data, 'arc', 0.1, twoPi ).onChange( generateGeometry );
1076
1077                 generateGeometry();
1078
1079         },
1080
1081         TorusGeometry : function( mesh ) {
1082
1083                 var data = {
1084                         radius : 10,
1085                         tube : 3,
1086                         radialSegments : 16,
1087                         tubularSegments : 100,
1088                         arc : twoPi
1089                 };
1090
1091                 function generateGeometry() {
1092
1093                         updateGroupGeometry( mesh,
1094                                 new THREE.TorusGeometry(
1095                                         data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc
1096                                 )
1097                         );
1098
1099                 }
1100
1101                 var folder = gui.addFolder( 'THREE.TorusGeometry' );
1102
1103                 folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
1104                 folder.add( data, 'tube', 0.1, 10 ).onChange( generateGeometry );
1105                 folder.add( data, 'radialSegments', 2, 30 ).step( 1 ).onChange( generateGeometry );
1106                 folder.add( data, 'tubularSegments', 3, 200 ).step( 1 ).onChange( generateGeometry );
1107                 folder.add( data, 'arc', 0.1, twoPi ).onChange( generateGeometry );
1108
1109                 generateGeometry();
1110
1111         },
1112
1113         TorusKnotBufferGeometry : function( mesh ) {
1114
1115                 var data = {
1116                         radius : 10,
1117                         tube : 3,
1118                         tubularSegments : 64,
1119                         radialSegments : 8,
1120                         p : 2,
1121                         q : 3
1122                 };
1123
1124                 function generateGeometry() {
1125
1126                         updateGroupGeometry( mesh,
1127                                 new THREE.TorusKnotBufferGeometry(
1128                                         data.radius, data.tube, data.tubularSegments, data.radialSegments,
1129                                         data.p, data.q
1130                                 )
1131                         );
1132
1133                 }
1134
1135                 var folder = gui.addFolder( 'THREE.TorusKnotBufferGeometry' );
1136
1137                 folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
1138                 folder.add( data, 'tube', 0.1, 10 ).onChange( generateGeometry );
1139                 folder.add( data, 'tubularSegments', 3, 300 ).step( 1 ).onChange( generateGeometry );
1140                 folder.add( data, 'radialSegments', 3, 20 ).step( 1 ).onChange( generateGeometry );
1141                 folder.add( data, 'p', 1, 20 ).step( 1 ).onChange( generateGeometry );
1142                 folder.add( data, 'q', 1, 20 ).step( 1 ).onChange( generateGeometry );
1143
1144                 generateGeometry();
1145
1146         },
1147
1148         TorusKnotGeometry : function( mesh ) {
1149
1150                 var data = {
1151                         radius : 10,
1152                         tube : 3,
1153                         tubularSegments : 64,
1154                         radialSegments : 8,
1155                         p : 2,
1156                         q : 3
1157                 };
1158
1159                 function generateGeometry() {
1160
1161                         updateGroupGeometry( mesh,
1162                                 new THREE.TorusKnotGeometry(
1163                                         data.radius, data.tube, data.tubularSegments, data.radialSegments,
1164                                         data.p, data.q
1165                                 )
1166                         );
1167
1168                 }
1169
1170                 var folder = gui.addFolder( 'THREE.TorusKnotGeometry' );
1171
1172                 folder.add( data, 'radius', 1, 20 ).onChange( generateGeometry );
1173                 folder.add( data, 'tube', 0.1, 10 ).onChange( generateGeometry );
1174                 folder.add( data, 'tubularSegments', 3, 300 ).step( 1 ).onChange( generateGeometry );
1175                 folder.add( data, 'radialSegments', 3, 20 ).step( 1 ).onChange( generateGeometry );
1176                 folder.add( data, 'p', 1, 20 ).step( 1 ).onChange( generateGeometry );
1177                 folder.add( data, 'q', 1, 20 ).step( 1 ).onChange( generateGeometry );
1178
1179                 generateGeometry();
1180
1181         },
1182
1183         ParametricBufferGeometry : function( mesh ) {
1184
1185                 var data = {
1186                         slices : 25,
1187                         stacks : 25
1188                 };
1189
1190                 function generateGeometry() {
1191
1192                         updateGroupGeometry( mesh,
1193                                 new THREE.ParametricBufferGeometry( THREE.ParametricGeometries.klein, data.slices, data.stacks )
1194                         );
1195
1196                 }
1197
1198                 var folder = gui.addFolder( 'THREE.ParametricBufferGeometry' );
1199
1200                 folder.add( data, 'slices', 1, 100 ).step( 1 ).onChange( generateGeometry );
1201                 folder.add( data, 'stacks', 1, 100 ).step( 1 ).onChange( generateGeometry );
1202
1203                 generateGeometry();
1204
1205         },
1206
1207         ParametricGeometry : function( mesh ) {
1208
1209                 var data = {
1210                         slices : 25,
1211                         stacks : 25
1212                 };
1213
1214                 function generateGeometry() {
1215
1216                         updateGroupGeometry( mesh,
1217                                 new THREE.ParametricGeometry( THREE.ParametricGeometries.klein, data.slices, data.stacks )
1218                         );
1219
1220                 }
1221
1222                 var folder = gui.addFolder( 'THREE.ParametricGeometry' );
1223
1224                 folder.add( data, 'slices', 1, 100 ).step( 1 ).onChange( generateGeometry );
1225                 folder.add( data, 'stacks', 1, 100 ).step( 1 ).onChange( generateGeometry );
1226
1227                 generateGeometry();
1228
1229         },
1230
1231         TubeGeometry : function( mesh ) {
1232
1233                 var data = {
1234                         segments : 20,
1235                         radius : 2,
1236                         radiusSegments: 8
1237                 };
1238
1239                 var path = new CustomSinCurve( 10 );
1240
1241                 function generateGeometry() {
1242
1243                         updateGroupGeometry( mesh,
1244                                 new THREE.TubeGeometry( path, data.segments, data.radius, data.radiusSegments, false )
1245                         );
1246
1247                 }
1248
1249                 var folder = gui.addFolder( 'THREE.TubeGeometry' );
1250
1251                 folder.add( data, 'segments', 1, 100 ).step( 1 ).onChange( generateGeometry );
1252                 folder.add( data, 'radius', 1, 10 ).onChange( generateGeometry );
1253                 folder.add( data, 'radiusSegments', 1, 20 ).step( 1 ).onChange( generateGeometry );
1254
1255                 generateGeometry();
1256
1257         },
1258
1259         TubeBufferGeometry : function( mesh ) {
1260
1261                 var data = {
1262                         segments : 20,
1263                         radius : 2,
1264                         radiusSegments: 8
1265                 };
1266
1267                 var path = new CustomSinCurve( 10 );
1268
1269                 function generateGeometry() {
1270
1271                         updateGroupGeometry( mesh,
1272                                 new THREE.TubeBufferGeometry( path, data.segments, data.radius, data.radiusSegments, false )
1273                         );
1274
1275                 }
1276
1277                 var folder = gui.addFolder( 'THREE.TubeBufferGeometry' );
1278
1279                 folder.add( data, 'segments', 1, 100 ).step( 1 ).onChange( generateGeometry );
1280                 folder.add( data, 'radius', 1, 10 ).onChange( generateGeometry );
1281                 folder.add( data, 'radiusSegments', 1, 20 ).step( 1 ).onChange( generateGeometry );
1282
1283                 generateGeometry();
1284
1285         },
1286
1287         ShapeGeometry: function( mesh ) {
1288
1289                 var data = {
1290                         segments : 12
1291                 };
1292
1293                 function generateGeometry() {
1294
1295                         updateGroupGeometry( mesh,
1296                                 new THREE.ShapeGeometry( heartShape, data.segments )
1297                         );
1298
1299                 }
1300
1301                 var folder = gui.addFolder( 'THREE.ShapeGeometry' );
1302                 folder.add( data, 'segments', 1, 100 ).step( 1 ).onChange( generateGeometry );
1303
1304                 generateGeometry();
1305
1306         },
1307
1308         ShapeBufferGeometry: function( mesh ) {
1309
1310                 var data = {
1311                         segments : 12
1312                 };
1313
1314                 function generateGeometry() {
1315
1316                         updateGroupGeometry( mesh,
1317                                 new THREE.ShapeBufferGeometry( heartShape, data.segments )
1318                         );
1319
1320                 }
1321
1322                 var folder = gui.addFolder( 'THREE.ShapeBufferGeometry' );
1323                 folder.add( data, 'segments', 1, 100 ).step( 1 ).onChange( generateGeometry );
1324
1325                 generateGeometry();
1326
1327         },
1328
1329         ExtrudeGeometry: function( mesh ) {
1330
1331                 var data = {
1332                         steps: 2,
1333                         amount: 16,
1334                         bevelEnabled: true,
1335                         bevelThickness: 1,
1336                         bevelSize: 1,
1337                         bevelSegments: 1
1338                 };
1339
1340                 var length = 12, width = 8;
1341
1342                 var shape = new THREE.Shape();
1343                 shape.moveTo( 0,0 );
1344                 shape.lineTo( 0, width );
1345                 shape.lineTo( length, width );
1346                 shape.lineTo( length, 0 );
1347                 shape.lineTo( 0, 0 );
1348
1349                 function generateGeometry() {
1350
1351                         updateGroupGeometry( mesh,
1352                                 new THREE.ExtrudeGeometry( shape, data )
1353                         );
1354
1355                 }
1356
1357                 var folder = gui.addFolder( 'THREE.ExtrudeGeometry' );
1358
1359                 folder.add( data, 'steps', 1, 10 ).step( 1 ).onChange( generateGeometry );
1360                 folder.add( data, 'amount', 1, 20 ).step( 1 ).onChange( generateGeometry );
1361                 folder.add( data, 'bevelThickness', 1, 5 ).step( 1 ).onChange( generateGeometry );
1362                 folder.add( data, 'bevelSize', 1, 5 ).step( 1 ).onChange( generateGeometry );
1363                 folder.add( data, 'bevelSegments', 1, 5 ).step( 1 ).onChange( generateGeometry );
1364
1365                 generateGeometry();
1366
1367         },
1368
1369         ExtrudeBufferGeometry: function( mesh ) {
1370
1371                 var data = {
1372                         steps: 2,
1373                         amount: 16,
1374                         bevelEnabled: true,
1375                         bevelThickness: 1,
1376                         bevelSize: 1,
1377                         bevelSegments: 1
1378                 };
1379
1380                 var length = 12, width = 8;
1381
1382                 var shape = new THREE.Shape();
1383                 shape.moveTo( 0,0 );
1384                 shape.lineTo( 0, width );
1385                 shape.lineTo( length, width );
1386                 shape.lineTo( length, 0 );
1387                 shape.lineTo( 0, 0 );
1388
1389                 function generateGeometry() {
1390
1391                         updateGroupGeometry( mesh,
1392                                 new THREE.ExtrudeBufferGeometry( shape, data )
1393                         );
1394
1395                 }
1396
1397                 var folder = gui.addFolder( 'THREE.ExtrudeBufferGeometry' );
1398
1399                 folder.add( data, 'steps', 1, 10 ).step( 1 ).onChange( generateGeometry );
1400                 folder.add( data, 'amount', 1, 20 ).step( 1 ).onChange( generateGeometry );
1401                 folder.add( data, 'bevelThickness', 1, 5 ).step( 1 ).onChange( generateGeometry );
1402                 folder.add( data, 'bevelSize', 1, 5 ).step( 1 ).onChange( generateGeometry );
1403                 folder.add( data, 'bevelSegments', 1, 5 ).step( 1 ).onChange( generateGeometry );
1404
1405                 generateGeometry();
1406
1407         }
1408
1409 };
1410
1411 function chooseFromHash ( mesh ) {
1412
1413         var selectedGeometry = window.location.hash.substring( 1 ) || "TorusGeometry";
1414
1415         if ( guis[ selectedGeometry ] !== undefined ) {
1416
1417                 guis[ selectedGeometry ]( mesh );
1418
1419         }
1420
1421         if ( selectedGeometry === 'TextGeometry' || selectedGeometry === 'TextBufferGeometry' ) {
1422
1423                 return { fixed : true };
1424
1425         }
1426
1427         //No configuration options
1428         return {};
1429
1430 }