Răsfoiți Sursa

New ParametricBufferGeometry (#9702)

* ParametricBufferGeometry: Inital Commit

* ParametricGeometry: cleanup

* ParametricGeometry: Correct Format
Michael Herzog 8 ani în urmă
părinte
comite
ce7fb828f6

+ 5 - 48
examples/webgl_geometries2.html

@@ -25,8 +25,6 @@
 
 		<script>
 
-			/* Testing the new Parametric Surfaces Geometries*/
-
 			if ( ! Detector.webgl ) Detector.addGetWebGLMessage();
 
 			var container, stats;
@@ -73,26 +71,11 @@
 				var sphere2 = new THREE.ParametricGeometries.SphereGeometry( 75, 20, 10 );
 				var tube2 = new THREE.ParametricGeometries.TubeGeometry( GrannyKnot, 150, 2, 8, true, false );
 
-				// var torus = new THREE.TorusKnotGeometry( radius, tube, segmentsR, segmentsT, p , q );
-				// var sphere = new THREE.SphereGeometry( 75, 20, 10 );
-				// var tube = new THREE.TubeGeometry( GrannyKnot, 150, 2, 8, true, false );
-
-
-				// var benchmarkCopies = 1000;
-				// var benchmarkObject = tube;
-				// var rand = function() { return (Math.random() - 0.5 ) * 600; };
-				// for (var b=0;b<benchmarkCopies;b++) {
-				//    object = THREE.SceneUtils.createMultiMaterialObject( benchmarkObject, materials );
-				//   object.position.set( rand(), rand(), rand() );
-				//   scene.add( object );
-				// }
-
-				console.log(THREE.ParametricGeometries);
 				var geo;
 
 				// Klein Bottle
 
-				geo = new THREE.ParametricGeometry( THREE.ParametricGeometries.klein, 20, 20 );
+				geo = new THREE.ParametricBufferGeometry( THREE.ParametricGeometries.klein, 20, 20 );
 				object = THREE.SceneUtils.createMultiMaterialObject( geo, materials );
 				object.position.set( 0, 0, 0 );
 				object.scale.multiplyScalar( 10 );
@@ -100,57 +83,35 @@
 
 				// Mobius Strip
 
-				geo = new THREE.ParametricGeometry( THREE.ParametricGeometries.mobius, 20, 20 );
+				geo = new THREE.ParametricBufferGeometry( THREE.ParametricGeometries.mobius, 20, 20 );
 				object = THREE.SceneUtils.createMultiMaterialObject( geo, materials );
 				object.position.set( 10, 0, 0 );
 				object.scale.multiplyScalar( 100 );
 				scene.add( object );
 
-				var geo = new THREE.ParametricGeometry( THREE.ParametricGeometries.plane( 200, 200 ), 10, 20 );
+				// Plane
+
+				geo = new THREE.ParametricBufferGeometry( THREE.ParametricGeometries.plane( 200, 200 ), 10, 20 );
 				object = THREE.SceneUtils.createMultiMaterialObject( geo, materials );
 				object.position.set( 0, 0, 0 );
 				scene.add( object );
 
-				// object = THREE.SceneUtils.createMultiMaterialObject( torus, materials );
-				// object.position.set( 0, 0, 0 );
-				// scene.add( object );
-
 				object = THREE.SceneUtils.createMultiMaterialObject( torus2, materials );
 				object.position.set( 0, 100, 0 );
 				scene.add( object );
 
-
-
-
-				//  object = THREE.SceneUtils.createMultiMaterialObject( sphere, materials );
-				//  object.position.set( 500, 0, 0 );
-				//  scene.add( object );
-
 				object = THREE.SceneUtils.createMultiMaterialObject( sphere2, materials );
 				object.position.set( 200, 0, 0 );
 				scene.add( object );
 
-				// object = THREE.SceneUtils.createMultiMaterialObject( tube, materials );
-				// object.position.set( 0, 0, 0 );
-				// scene.add( object );
-
 				object = THREE.SceneUtils.createMultiMaterialObject( tube2, materials );
 				object.position.set( 100, 0, 0 );
 				scene.add( object );
 
-
-				// object = THREE.SceneUtils.createMultiMaterialObject( new THREE.PlaneGeometry( 400, 400, 4, 4 ), materials );
-				// object.position.set( -200, 100, 0 );
-				// scene.add( object );
-
 				object = new THREE.AxisHelper( 50 );
 				object.position.set( 200, 0, -200 );
 				scene.add( object );
 
-				object = new THREE.ArrowHelper( new THREE.Vector3( 0, 1, 0 ), new THREE.Vector3( 0, 0, 0 ), 50 );
-				object.position.set( 200, 0, 400 );
-				scene.add( object );
-
 				renderer = new THREE.WebGLRenderer( { antialias: true } );
 				renderer.setPixelRatio( window.devicePixelRatio );
 				renderer.setSize( window.innerWidth, window.innerHeight );
@@ -159,8 +120,6 @@
 				stats = new Stats();
 				container.appendChild( stats.dom );
 
-				//
-
 				window.addEventListener( 'resize', onWindowResize, false );
 
 			}
@@ -174,8 +133,6 @@
 
 			}
 
-			//
-
 			function animate() {
 
 				requestAnimationFrame( animate );

+ 1 - 1
examples/webgl_geometry_nurbs.html

@@ -159,7 +159,7 @@
 					return nurbsSurface.getPoint(u, v);
 				};
 
-				var geometry = new THREE.ParametricGeometry( getSurfacePoint, 20, 20 );
+				var geometry = new THREE.ParametricBufferGeometry( getSurfacePoint, 20, 20 );
 				var material = new THREE.MeshLambertMaterial( { map: map, side: THREE.DoubleSide } );
 				var object = new THREE.Mesh( geometry, material );
 				object.position.set( - 200, 100, 0 );

+ 1 - 0
src/geometries/Geometries.js

@@ -1,5 +1,6 @@
 export { WireframeGeometry } from './WireframeGeometry.js';
 export { ParametricGeometry } from './ParametricGeometry.js';
+export { ParametricBufferGeometry } from './ParametricBufferGeometry.js';
 export { TetrahedronGeometry } from './TetrahedronGeometry.js';
 export { OctahedronGeometry } from './OctahedronGeometry.js';
 export { IcosahedronGeometry } from './IcosahedronGeometry.js';

+ 89 - 0
src/geometries/ParametricBufferGeometry.js

@@ -0,0 +1,89 @@
+import { BufferGeometry } from '../core/BufferGeometry';
+import { Float32Attribute, Uint16Attribute } from '../core/BufferAttribute';
+
+/**
+ * @author Mugen87 / https://github.com/Mugen87
+ *
+ * Parametric Surfaces Geometry
+ * based on the brilliant article by @prideout http://prideout.net/blog/?p=44
+ */
+
+function ParametricBufferGeometry( func, slices, stacks ) {
+
+	BufferGeometry.call( this );
+
+	this.type = 'ParametricBufferGeometry';
+
+	this.parameters = {
+		func: func,
+		slices: slices,
+		stacks: stacks
+	};
+
+	// generate vertices and uvs
+
+	var vertices = [];
+	var uvs = [];
+
+	var i, j, p;
+	var u, v;
+
+	var sliceCount = slices + 1;
+
+	for ( i = 0; i <= stacks; i ++ ) {
+
+		v = i / stacks;
+
+		for ( j = 0; j <= slices; j ++ ) {
+
+			u = j / slices;
+
+			p = func( u, v );
+			vertices.push( p.x, p.y, p.z );
+
+			uvs.push( j / slices, i / stacks );
+
+		}
+
+	}
+
+	// generate indices
+
+	var indices = [];
+	var a, b, c, d;
+
+	for ( i = 0; i < stacks; i ++ ) {
+
+		for ( j = 0; j < slices; j ++ ) {
+
+			a = i * sliceCount + j;
+			b = i * sliceCount + j + 1;
+			c = ( i + 1 ) * sliceCount + j + 1;
+			d = ( i + 1 ) * sliceCount + j;
+
+			// faces one and two
+
+			indices.push( a, b, d );
+			indices.push( b, c, d );
+
+		}
+
+	}
+
+	// build geometry
+
+	this.setIndex( Uint16Attribute( indices, 1 ) );
+	this.addAttribute( 'position', Float32Attribute( vertices, 3 ) );
+	this.addAttribute( 'uv', Float32Attribute( uvs, 2 ) );
+
+	// generate normals
+
+	this.computeVertexNormals();
+
+}
+
+ParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
+ParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry;
+
+
+export { ParametricBufferGeometry };

+ 4 - 64
src/geometries/ParametricGeometry.js

@@ -1,14 +1,11 @@
 import { Geometry } from '../core/Geometry';
-import { Face3 } from '../core/Face3';
-import { Vector2 } from '../math/Vector2';
+import { ParametricBufferGeometry } from './ParametricBufferGeometry';
 
 /**
  * @author zz85 / https://github.com/zz85
+ *
  * Parametric Surfaces Geometry
  * based on the brilliant article by @prideout http://prideout.net/blog/?p=44
- *
- * new THREE.ParametricGeometry( parametricFunction, uSegments, ySegements );
- *
  */
 
 function ParametricGeometry( func, slices, stacks ) {
@@ -23,65 +20,8 @@ function ParametricGeometry( func, slices, stacks ) {
 		stacks: stacks
 	};
 
-	var verts = this.vertices;
-	var faces = this.faces;
-	var uvs = this.faceVertexUvs[ 0 ];
-
-	var i, j, p;
-	var u, v;
-
-	var sliceCount = slices + 1;
-
-	for ( i = 0; i <= stacks; i ++ ) {
-
-		v = i / stacks;
-
-		for ( j = 0; j <= slices; j ++ ) {
-
-			u = j / slices;
-
-			p = func( u, v );
-			verts.push( p );
-
-		}
-
-	}
-
-	var a, b, c, d;
-	var uva, uvb, uvc, uvd;
-
-	for ( i = 0; i < stacks; i ++ ) {
-
-		for ( j = 0; j < slices; j ++ ) {
-
-			a = i * sliceCount + j;
-			b = i * sliceCount + j + 1;
-			c = ( i + 1 ) * sliceCount + j + 1;
-			d = ( i + 1 ) * sliceCount + j;
-
-			uva = new Vector2( j / slices, i / stacks );
-			uvb = new Vector2( ( j + 1 ) / slices, i / stacks );
-			uvc = new Vector2( ( j + 1 ) / slices, ( i + 1 ) / stacks );
-			uvd = new Vector2( j / slices, ( i + 1 ) / stacks );
-
-			faces.push( new Face3( a, b, d ) );
-			uvs.push( [ uva, uvb, uvd ] );
-
-			faces.push( new Face3( b, c, d ) );
-			uvs.push( [ uvb.clone(), uvc, uvd.clone() ] );
-
-		}
-
-	}
-
-	// console.log(this);
-
-	// magic bullet
-	// var diff = this.mergeVertices();
-	// console.log('removed ', diff, ' vertices by merging');
-
-	this.computeFaceNormals();
-	this.computeVertexNormals();
+	this.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) );
+	this.mergeVertices();
 
 }