Kaynağa Gözat

Experimenting with Geometry2 being an extension of BufferGeometry.

Mr.doob 11 yıl önce
ebeveyn
işleme
8adc048978

+ 49 - 37
examples/js/loaders/OBJLoader2.js

@@ -28,27 +28,7 @@ THREE.OBJLoader.prototype = {
 
 
 	parse: function ( text ) {
 	parse: function ( text ) {
 
 
-		/*
-		function vector( x, y, z ) {
-
-			return new THREE.Vector3( parseFloat( x ), parseFloat( y ), parseFloat( z ) );
-
-		}
-
-		function uv( u, v ) {
-
-			return new THREE.Vector2( parseFloat( u ), parseFloat( v ) );
-
-		}
-
-		function face3( a, b, c, normals ) {
-
-			return new THREE.Face3( a, b, c, normals );
-
-		}
-		*/
-		
-		var object = new THREE.Object3D();
+		var object, objects = [];
 		var geometry, material, mesh;
 		var geometry, material, mesh;
 
 
 		function parseVertexIndex( value ) {
 		function parseVertexIndex( value ) {
@@ -172,10 +152,23 @@ THREE.OBJLoader.prototype = {
 
 
 		if ( /^o /gm.test( text ) === false ) {
 		if ( /^o /gm.test( text ) === false ) {
 
 
-			geometry = new THREE.Geometry2();
-			material = new THREE.MeshLambertMaterial();
-			mesh = new THREE.Mesh( geometry, material );
-			object.add( mesh );
+			geometry = {
+				vertices: [],
+				normals: [],
+				uvs: []
+			};
+
+			material = {
+				name: ''
+			};
+
+			object = {
+				name: '',
+				geometry: geometry,
+				material: material
+			};
+
+			objects.push( object );
 
 
 		}
 		}
 
 
@@ -285,12 +278,22 @@ THREE.OBJLoader.prototype = {
 
 
 			} else if ( /^o /.test( line ) ) {
 			} else if ( /^o /.test( line ) ) {
 
 
-				geometry = new THREE.Geometry2();
-				material = new THREE.MeshLambertMaterial();
+				geometry = {
+					vertices: [],
+					normals: [],
+					uvs: []
+				};
+
+				material = {
+					name: ''
+				};
 
 
-				mesh = new THREE.Mesh( geometry, material );
-				mesh.name = line.substring( 2 ).trim();
-				object.add( mesh );
+				object = {
+					name: line.substring( 2 ).trim(),
+					geometry: geometry
+				};
+
+				objects.push( object )
 
 
 			} else if ( /^g /.test( line ) ) {
 			} else if ( /^g /.test( line ) ) {
 
 
@@ -318,19 +321,28 @@ THREE.OBJLoader.prototype = {
 
 
 		}
 		}
 
 
-		var children = object.children;
+		var container = new THREE.Object3D();
+
+		for ( var i = 0, l = objects.length; i < l; i ++ ) {
+
+			var object = objects[ i ];
+
+			var geometry = new THREE.Geometry2( object.geometry.vertices.length / 3 );
+			geometry.vertices.set( object.geometry.vertices );
+			geometry.normals.set( object.geometry.normals );
+			geometry.uvs.set( object.geometry.uvs );
 
 
-		for ( var i = 0, l = children.length; i < l; i ++ ) {
+			var material = new THREE.MeshLambertMaterial();
+			material.name = object.material.name;
 
 
-			var geometry = children[ i ].geometry;
+			var mesh = new THREE.Mesh( geometry, material );
+			mesh.name = object.name;
 
 
-			geometry.vertices = new Float32Array( geometry.vertices );
-			geometry.normals = new Float32Array( geometry.normals );
-			geometry.uvs = new Float32Array( geometry.uvs );
+			container.add( mesh );
 
 
 		}
 		}
 
 
-		return object;
+		return container;
 
 
 	}
 	}
 
 

+ 5 - 129
src/core/Geometry2.js

@@ -4,139 +4,15 @@
 
 
 THREE.Geometry2 = function ( size ) {
 THREE.Geometry2 = function ( size ) {
 
 
-	this.id = THREE.GeometryIdCount ++;
-	this.uuid = THREE.Math.generateUUID();
+	THREE.BufferGeometry.call( this );
 
 
-	this.name = '';
-
-	this.vertices = size !== undefined ? new Float32Array( size * 3 ) : [];
-	this.normals = size !== undefined ? new Float32Array( size * 3 ) : [];
-	this.uvs = size !== undefined ? new Float32Array( size * 2 ) : [];
+	this.vertices = this.addAttribute( 'position', Float32Array, size, 3 ).array;
+	this.normals = this.addAttribute( 'normal', Float32Array, size, 3 ).array;
+	this.uvs = this.addAttribute( 'uv', Float32Array, size, 2 ).array;
 
 
 	this.boundingBox = null;
 	this.boundingBox = null;
 	this.boundingSphere = null;
 	this.boundingSphere = null;
 
 
 };
 };
 
 
-THREE.Geometry2.prototype = {
-
-	constructor: THREE.Geometry2,
-
-	applyMatrix: function ( matrix ) {
-
-		matrix.multiplyVector3Array( this.vertices );
-
-	},
-
-	computeBoundingBox: function () {
-
-		if ( this.boundingBox === null ) {
-
-			this.boundingBox = new THREE.Box3();
-
-		}
-
-		var vertices = this.vertices;
-		var bb = this.boundingBox;
-
-		if ( vertices.length >= 3 ) {
-
-			bb.min.x = bb.max.x = vertices[ 0 ];
-			bb.min.y = bb.max.y = vertices[ 1 ];
-			bb.min.z = bb.max.z = vertices[ 2 ];
-
-		}
-
-		for ( var i = 3, il = vertices.length; i < il; i += 3 ) {
-
-			var x = vertices[ i ];
-			var y = vertices[ i + 1 ];
-			var z = vertices[ i + 2 ];
-
-			// bounding box
-
-			if ( x < bb.min.x ) {
-
-				bb.min.x = x;
-
-			} else if ( x > bb.max.x ) {
-
-				bb.max.x = x;
-
-			}
-
-			if ( y < bb.min.y ) {
-
-				bb.min.y = y;
-
-			} else if ( y > bb.max.y ) {
-
-				bb.max.y = y;
-
-			}
-
-			if ( z < bb.min.z ) {
-
-				bb.min.z = z;
-
-			} else if ( z > bb.max.z ) {
-
-				bb.max.z = z;
-
-			}
-
-		}
-
-	},
-
-	computeBoundingSphere: function () {
-
-		var box = new THREE.Box3();
-		var vector = new THREE.Vector3();
-
-		return function () {
-
-			if ( this.boundingSphere === null ) {
-
-				this.boundingSphere = new THREE.Sphere();
-
-			}
-
-			box.makeEmpty();
-
-			var vertices = this.vertices;
-			var center = this.boundingSphere.center;
-
-			for ( var i = 0, il = vertices.length; i < il; i += 3 ) {
-
-				vector.set( vertices[ i ], vertices[ i + 1 ], vertices[ i + 2 ] );
-				box.addPoint( vector );
-
-			}
-
-			box.center( center );
-
-			var maxRadiusSq = 0;
-
-			for ( var i = 0, il = vertices.length; i < il; i += 3 ) {
-
-				vector.set( vertices[ i ], vertices[ i + 1 ], vertices[ i + 2 ] );
-				maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );
-
-			}
-
-			this.boundingSphere.radius = Math.sqrt( maxRadiusSq );
-
-		}
-
-	}(),
-
-	dispose: function () {
-
-		this.dispatchEvent( { type: 'dispose' } );
-
-	}
-
-};
-
-THREE.EventDispatcher.prototype.apply( THREE.Geometry2.prototype );
+THREE.Geometry2.prototype = Object.create( THREE.BufferGeometry.prototype );

+ 0 - 14
src/core/Projector.js

@@ -375,20 +375,6 @@ THREE.Projector = function () {
 
 
 					}
 					}
 
 
-				} else if ( geometry instanceof THREE.Geometry2 ) {
-
-					vertices = geometry.vertices;
-
-					for ( var i = 0, j = 0, l = vertices.length; i < l; i += 9, j += 3 ) {
-
-						renderList.pushVertex( vertices[ i + 0 ], vertices[ i + 1 ], vertices[ i + 2 ] );
-						renderList.pushVertex( vertices[ i + 3 ], vertices[ i + 4 ], vertices[ i + 5 ] );
-						renderList.pushVertex( vertices[ i + 6 ], vertices[ i + 7 ], vertices[ i + 8 ] );
-
-						renderList.pushTriangle( j + 0, j + 1, j + 2 );
-
-					}
-
 				} else if ( geometry instanceof THREE.Geometry ) {
 				} else if ( geometry instanceof THREE.Geometry ) {
 
 
 					vertices = geometry.vertices;
 					vertices = geometry.vertices;

+ 4 - 4
src/extras/geometries/BoxGeometry2.js

@@ -5,8 +5,6 @@
 
 
 THREE.BoxGeometry2 = function ( width, height, depth, widthSegments, heightSegments, depthSegments ) {
 THREE.BoxGeometry2 = function ( width, height, depth, widthSegments, heightSegments, depthSegments ) {
 
 
-	THREE.Geometry2.call( this );
-
 	var scope = this;
 	var scope = this;
 
 
 	this.width = width;
 	this.width = width;
@@ -24,7 +22,7 @@ THREE.BoxGeometry2 = function ( width, height, depth, widthSegments, heightSegme
 	var vector = new THREE.Vector3();
 	var vector = new THREE.Vector3();
 
 
 	var vectors = [];
 	var vectors = [];
-	var vertices = this.vertices;
+	var vertices = [];
 
 
 	var addVertex = function ( a, b, c ) {
 	var addVertex = function ( a, b, c ) {
 
 
@@ -106,7 +104,9 @@ THREE.BoxGeometry2 = function ( width, height, depth, widthSegments, heightSegme
 
 
 	}
 	}
 
 
-	this.vertices = new Float32Array( vertices );
+	THREE.Geometry2.call( this, vertices.length / 3 );
+
+	this.vertices.set( vertices );
 
 
 };
 };
 
 

+ 0 - 114
src/renderers/WebGLRenderer.js

@@ -608,12 +608,6 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 			_this.info.memory.geometries --;
 			_this.info.memory.geometries --;
 
 
-		} if ( geometry instanceof THREE.Geometry2 ) {
-
-			delete _buffers[ geometry.id ];
-
-			_this.info.memory.geometries --;
-
 		} else {
 		} else {
 
 
 			if ( geometry.geometryGroups !== undefined ) {
 			if ( geometry.geometryGroups !== undefined ) {
@@ -1090,27 +1084,6 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 	};
 	};
 
 
-	function initGeometry2Buffers( geometry ) {
-
-		var buffers = {};
-		var attributes = [ 'vertices', 'normals', 'uvs' ];
-
-		for ( var key in attributes ) {
-
-			var array = geometry[ attributes[ key ] ];
-			var buffer = _gl.createBuffer();
-
-			_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );
-			_gl.bufferData( _gl.ARRAY_BUFFER, array, _gl.STATIC_DRAW );
-
-			buffers[ attributes[ key ] ] = buffer;
-
-		}
-
-		_buffers[ geometry.id ] = buffers;
-
-	};
-
 	// Buffer setting
 	// Buffer setting
 
 
 	function setParticleBuffers ( geometry, hint, object ) {
 	function setParticleBuffers ( geometry, hint, object ) {
@@ -2481,27 +2454,6 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 	}
 	}
 
 
-	function setGeometry2Buffers( geometry, hint ) {
-
-		if ( geometry.needsUpdate === false ) return;
-
-		var attributes = [ 'vertices', 'normals', 'uvs' ];
-		var buffers = _buffers[ geometry.id ];
-
-		for ( var key in attributes ) {
-
-			var array = geometry[ attributes[ key ] ];
-			var buffer = buffers[ attributes[ key ] ];
-
-			_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );
-			_gl.bufferData( _gl.ARRAY_BUFFER, array, hint );
-
-		}
-
-		geometry.needsUpdate = false;
-
-	};
-
 	// Buffer rendering
 	// Buffer rendering
 
 
 	this.renderBufferImmediate = function ( object, program, material ) {
 	this.renderBufferImmediate = function ( object, program, material ) {
@@ -2597,56 +2549,6 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 	};
 	};
 
 
-	this.renderBufferGeometry2 = function ( camera, lights, fog, material, geometry, object ) {
-
-		var program = setProgram( camera, lights, fog, material, object );
-
-		var programAttributes = program.attributes;
-
-		var attributes = { 'position': 'vertices', 'normal': 'normals', 'uv': 'uvs' };
-		var itemSizes = { 'position': 3, 'normal': 3, 'uv': 2 };
-
-		var buffers = _buffers[ geometry.id ];
-
-		disableAttributes();
-
-		for ( var name in programAttributes ) {
-
-			var attributePointer = programAttributes[ name ];
-			
-			if ( attributePointer >= 0 ) {
-
-				var array = geometry[ attributes[ name ] ];
-
-				if ( array !== undefined && array.length > 0 ) {
-
-					_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers[ attributes[ name ] ] );
-					enableAttribute( attributePointer );
-					_gl.vertexAttribPointer( attributePointer, itemSizes[ name ], _gl.FLOAT, false, 0, 0 );
-
-				} else {
-
-					if ( itemSizes[ name ] === 3 ) {
-
-						_gl.vertexAttrib3fv( attributePointer, [ 0, 0, 0 ] );
-
-					} else if ( itemSizes[ name ] === 2 ) {
-
-						_gl.vertexAttrib2fv( attributePointer, [ 0, 0 ] );
-
-					}
-
-
-				}
-
-			}
-
-		}
-
-		_gl.drawArrays( _gl.TRIANGLES, 0, geometry.vertices.length / 3 );
-
-	};
-
 	this.renderBufferDirect = function ( camera, lights, fog, material, geometry, object ) {
 	this.renderBufferDirect = function ( camera, lights, fog, material, geometry, object ) {
 
 
 		if ( material.visible === false ) return;
 		if ( material.visible === false ) return;
@@ -3611,10 +3513,6 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 					_this.renderBufferDirect( camera, lights, fog, material, buffer, object );
 					_this.renderBufferDirect( camera, lights, fog, material, buffer, object );
 
 
-				} else if ( buffer instanceof THREE.Geometry2 ) {
-
-					_this.renderBufferGeometry2( camera, lights, fog, material, buffer, object );
-
 				} else {
 				} else {
 
 
 					_this.renderBuffer( camera, lights, fog, material, buffer, object );
 					_this.renderBuffer( camera, lights, fog, material, buffer, object );
@@ -3834,10 +3732,6 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 				initDirectBuffers( geometry );
 				initDirectBuffers( geometry );
 
 
-			} else if ( geometry instanceof THREE.Geometry2 ) {
-
-				initGeometry2Buffers( geometry );
-
 			} else if ( object instanceof THREE.Mesh ) {
 			} else if ( object instanceof THREE.Mesh ) {
 
 
 				material = object.material;
 				material = object.material;
@@ -3912,10 +3806,6 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 					addBuffer( scene.__webglObjects, geometry, object );
 					addBuffer( scene.__webglObjects, geometry, object );
 
 
-				} else if ( geometry instanceof THREE.Geometry2 ) {
-
-					addBuffer( scene.__webglObjects, geometry, object );
-
 				} else if ( geometry instanceof THREE.Geometry ) {
 				} else if ( geometry instanceof THREE.Geometry ) {
 
 
 					for ( g in geometry.geometryGroups ) {
 					for ( g in geometry.geometryGroups ) {
@@ -3994,10 +3884,6 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 			setDirectBuffers( geometry, _gl.DYNAMIC_DRAW );
 			setDirectBuffers( geometry, _gl.DYNAMIC_DRAW );
 
 
-		} else if ( geometry instanceof THREE.Geometry2 ) {
-
-			setGeometry2Buffers( geometry, _gl.DYNAMIC_DRAW );
-
 		} else if ( object instanceof THREE.Mesh ) {
 		} else if ( object instanceof THREE.Mesh ) {
 
 
 			// check all geometry groups
 			// check all geometry groups

+ 1 - 1
utils/build/includes/common.json

@@ -27,9 +27,9 @@
 	"src/core/Projector.js",
 	"src/core/Projector.js",
 	"src/core/Face3.js",
 	"src/core/Face3.js",
 	"src/core/Face4.js",
 	"src/core/Face4.js",
+	"src/core/BufferGeometry.js",
 	"src/core/Geometry.js",
 	"src/core/Geometry.js",
 	"src/core/Geometry2.js",
 	"src/core/Geometry2.js",
-	"src/core/BufferGeometry.js",
 	"src/cameras/Camera.js",
 	"src/cameras/Camera.js",
 	"src/cameras/OrthographicCamera.js",
 	"src/cameras/OrthographicCamera.js",
 	"src/cameras/PerspectiveCamera.js",
 	"src/cameras/PerspectiveCamera.js",