|
@@ -15975,7 +15975,7 @@ function WebGLAttributes( gl ) {
|
|
|
|
|
|
var data = buffers[ attribute.id ];
|
|
var data = buffers[ attribute.id ];
|
|
|
|
|
|
- if ( data !== undefined ) {
|
|
|
|
|
|
+ if ( data ) {
|
|
|
|
|
|
gl.deleteBuffer( data.buffer );
|
|
gl.deleteBuffer( data.buffer );
|
|
|
|
|
|
@@ -16162,6 +16162,195 @@ function WebGLBufferRenderer( gl, extensions, infoRender ) {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * @author mrdoob / http://mrdoob.com/
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+function WebGLGeometries( gl, attributes, info ) {
|
|
|
|
+
|
|
|
|
+ var geometries = {};
|
|
|
|
+ var wireframeAttributes = {};
|
|
|
|
+
|
|
|
|
+ function onGeometryDispose( event ) {
|
|
|
|
+
|
|
|
|
+ var geometry = event.target;
|
|
|
|
+ var buffergeometry = geometries[ geometry.id ];
|
|
|
|
+
|
|
|
|
+ if ( buffergeometry.index !== null ) {
|
|
|
|
+
|
|
|
|
+ attributes.remove( buffergeometry.index );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for ( var name in buffergeometry.attributes ) {
|
|
|
|
+
|
|
|
|
+ attributes.remove( buffergeometry.attributes[ name ] );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ geometry.removeEventListener( 'dispose', onGeometryDispose );
|
|
|
|
+
|
|
|
|
+ delete geometries[ geometry.id ];
|
|
|
|
+
|
|
|
|
+ // TODO Remove duplicate code
|
|
|
|
+
|
|
|
|
+ var attribute = wireframeAttributes[ geometry.id ];
|
|
|
|
+
|
|
|
|
+ if ( attribute ) {
|
|
|
|
+
|
|
|
|
+ attributes.remove( attribute );
|
|
|
|
+ delete wireframeAttributes[ geometry.id ];
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ attribute = wireframeAttributes[ buffergeometry.id ];
|
|
|
|
+
|
|
|
|
+ if ( attribute ) {
|
|
|
|
+
|
|
|
|
+ attributes.remove( attribute );
|
|
|
|
+ delete wireframeAttributes[ buffergeometry.id ];
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //
|
|
|
|
+
|
|
|
|
+ info.memory.geometries --;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function get( object ) {
|
|
|
|
+
|
|
|
|
+ var geometry = object.geometry;
|
|
|
|
+ var buffergeometry = geometries[ geometry.id ];
|
|
|
|
+
|
|
|
|
+ if ( buffergeometry ) return buffergeometry;
|
|
|
|
+
|
|
|
|
+ geometry.addEventListener( 'dispose', onGeometryDispose );
|
|
|
|
+
|
|
|
|
+ if ( geometry.isBufferGeometry ) {
|
|
|
|
+
|
|
|
|
+ buffergeometry = geometry;
|
|
|
|
+
|
|
|
|
+ } else if ( geometry.isGeometry ) {
|
|
|
|
+
|
|
|
|
+ if ( geometry._bufferGeometry === undefined ) {
|
|
|
|
+
|
|
|
|
+ geometry._bufferGeometry = new BufferGeometry().setFromObject( object );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ buffergeometry = geometry._bufferGeometry;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ geometries[ geometry.id ] = buffergeometry;
|
|
|
|
+
|
|
|
|
+ info.memory.geometries ++;
|
|
|
|
+
|
|
|
|
+ return buffergeometry;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function getWireframeAttribute( geometry ) {
|
|
|
|
+
|
|
|
|
+ var attribute = wireframeAttributes[ geometry.id ];
|
|
|
|
+
|
|
|
|
+ if ( attribute ) return attribute;
|
|
|
|
+
|
|
|
|
+ var indices = [];
|
|
|
|
+
|
|
|
|
+ var geometryIndex = geometry.index;
|
|
|
|
+ var geometryAttributes = geometry.attributes;
|
|
|
|
+
|
|
|
|
+ // console.time( 'wireframe' );
|
|
|
|
+
|
|
|
|
+ if ( geometryIndex !== null ) {
|
|
|
|
+
|
|
|
|
+ var array = geometryIndex.array;
|
|
|
|
+
|
|
|
|
+ for ( var i = 0, l = array.length; i < l; i += 3 ) {
|
|
|
|
+
|
|
|
|
+ var a = array[ i + 0 ];
|
|
|
|
+ var b = array[ i + 1 ];
|
|
|
|
+ var c = array[ i + 2 ];
|
|
|
|
+
|
|
|
|
+ indices.push( a, b, b, c, c, a );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ } else {
|
|
|
|
+
|
|
|
|
+ var array = geometryAttributes.position.array;
|
|
|
|
+
|
|
|
|
+ for ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {
|
|
|
|
+
|
|
|
|
+ var a = i + 0;
|
|
|
|
+ var b = i + 1;
|
|
|
|
+ var c = i + 2;
|
|
|
|
+
|
|
|
|
+ indices.push( a, b, b, c, c, a );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // console.timeEnd( 'wireframe' );
|
|
|
|
+
|
|
|
|
+ attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );
|
|
|
|
+
|
|
|
|
+ attributes.update( attribute, gl.ELEMENT_ARRAY_BUFFER );
|
|
|
|
+
|
|
|
|
+ wireframeAttributes[ geometry.id ] = attribute;
|
|
|
|
+
|
|
|
|
+ return attribute;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function update( geometry ) {
|
|
|
|
+
|
|
|
|
+ var index = geometry.index;
|
|
|
|
+ var geometryAttributes = geometry.attributes;
|
|
|
|
+
|
|
|
|
+ if ( index !== null ) {
|
|
|
|
+
|
|
|
|
+ attributes.update( index, gl.ELEMENT_ARRAY_BUFFER );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for ( var name in geometryAttributes ) {
|
|
|
|
+
|
|
|
|
+ attributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // morph targets
|
|
|
|
+
|
|
|
|
+ var morphAttributes = geometry.morphAttributes;
|
|
|
|
+
|
|
|
|
+ for ( var name in morphAttributes ) {
|
|
|
|
+
|
|
|
|
+ var array = morphAttributes[ name ];
|
|
|
|
+
|
|
|
|
+ for ( var i = 0, l = array.length; i < l; i ++ ) {
|
|
|
|
+
|
|
|
|
+ attributes.update( array[ i ], gl.ARRAY_BUFFER );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return {
|
|
|
|
+
|
|
|
|
+ get: get,
|
|
|
|
+ getWireframeAttribute: getWireframeAttribute,
|
|
|
|
+ update: update
|
|
|
|
+
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
*/
|
|
@@ -16257,6 +16446,38 @@ function WebGLLights() {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * @author mrdoob / http://mrdoob.com/
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+function WebGLObjects( gl, geometries ) {
|
|
|
|
+
|
|
|
|
+ function update( object ) {
|
|
|
|
+
|
|
|
|
+ // TODO: Avoid updating twice (when using shadowMap). Maybe add frame counter.
|
|
|
|
+
|
|
|
|
+ var geometry = geometries.get( object );
|
|
|
|
+
|
|
|
|
+ if ( object.geometry.isGeometry ) {
|
|
|
|
+
|
|
|
|
+ geometry.updateFromObject( object );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ geometries.update( geometry );
|
|
|
|
+
|
|
|
|
+ return geometry;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return {
|
|
|
|
+
|
|
|
|
+ update: update
|
|
|
|
+
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
*/
|
|
@@ -17284,234 +17505,6 @@ function WebGLPrograms( renderer, capabilities ) {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
-/**
|
|
|
|
- * @author mrdoob / http://mrdoob.com/
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
-function WebGLGeometries( gl, attributes, properties, info ) {
|
|
|
|
-
|
|
|
|
- var geometries = {};
|
|
|
|
-
|
|
|
|
- function onGeometryDispose( event ) {
|
|
|
|
-
|
|
|
|
- var geometry = event.target;
|
|
|
|
- var buffergeometry = geometries[ geometry.id ];
|
|
|
|
-
|
|
|
|
- if ( buffergeometry.index !== null ) {
|
|
|
|
-
|
|
|
|
- attributes.remove( buffergeometry.index );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- for ( var name in buffergeometry.attributes ) {
|
|
|
|
-
|
|
|
|
- attributes.remove( buffergeometry.attributes[ name ] );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- geometry.removeEventListener( 'dispose', onGeometryDispose );
|
|
|
|
-
|
|
|
|
- delete geometries[ geometry.id ];
|
|
|
|
-
|
|
|
|
- // TODO
|
|
|
|
-
|
|
|
|
- var property = properties.get( geometry );
|
|
|
|
-
|
|
|
|
- if ( property.wireframe ) {
|
|
|
|
-
|
|
|
|
- attributes.remove( property.wireframe );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- properties.remove( geometry );
|
|
|
|
-
|
|
|
|
- var bufferproperty = properties.get( buffergeometry );
|
|
|
|
-
|
|
|
|
- if ( bufferproperty.wireframe ) {
|
|
|
|
-
|
|
|
|
- attributes.remove( bufferproperty.wireframe );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- properties.remove( buffergeometry );
|
|
|
|
-
|
|
|
|
- //
|
|
|
|
-
|
|
|
|
- info.memory.geometries --;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- function get( object ) {
|
|
|
|
-
|
|
|
|
- var geometry = object.geometry;
|
|
|
|
-
|
|
|
|
- if ( geometries[ geometry.id ] !== undefined ) {
|
|
|
|
-
|
|
|
|
- return geometries[ geometry.id ];
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- geometry.addEventListener( 'dispose', onGeometryDispose );
|
|
|
|
-
|
|
|
|
- var buffergeometry;
|
|
|
|
-
|
|
|
|
- if ( geometry.isBufferGeometry ) {
|
|
|
|
-
|
|
|
|
- buffergeometry = geometry;
|
|
|
|
-
|
|
|
|
- } else if ( geometry.isGeometry ) {
|
|
|
|
-
|
|
|
|
- if ( geometry._bufferGeometry === undefined ) {
|
|
|
|
-
|
|
|
|
- geometry._bufferGeometry = new BufferGeometry().setFromObject( object );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- buffergeometry = geometry._bufferGeometry;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- geometries[ geometry.id ] = buffergeometry;
|
|
|
|
-
|
|
|
|
- info.memory.geometries ++;
|
|
|
|
-
|
|
|
|
- return buffergeometry;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return {
|
|
|
|
-
|
|
|
|
- get: get
|
|
|
|
-
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- * @author mrdoob / http://mrdoob.com/
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
-function WebGLObjects( gl, attributes, properties, info ) {
|
|
|
|
-
|
|
|
|
- var geometries = new WebGLGeometries( gl, attributes, properties, info );
|
|
|
|
-
|
|
|
|
- //
|
|
|
|
-
|
|
|
|
- function update( object ) {
|
|
|
|
-
|
|
|
|
- // TODO: Avoid updating twice (when using shadowMap). Maybe add frame counter.
|
|
|
|
-
|
|
|
|
- var geometry = geometries.get( object );
|
|
|
|
-
|
|
|
|
- if ( object.geometry.isGeometry ) {
|
|
|
|
-
|
|
|
|
- geometry.updateFromObject( object );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- var index = geometry.index;
|
|
|
|
- var geometryAttributes = geometry.attributes;
|
|
|
|
-
|
|
|
|
- if ( index !== null ) {
|
|
|
|
-
|
|
|
|
- attributes.update( index, gl.ELEMENT_ARRAY_BUFFER );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- for ( var name in geometryAttributes ) {
|
|
|
|
-
|
|
|
|
- attributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- // morph targets
|
|
|
|
-
|
|
|
|
- var morphAttributes = geometry.morphAttributes;
|
|
|
|
-
|
|
|
|
- for ( var name in morphAttributes ) {
|
|
|
|
-
|
|
|
|
- var array = morphAttributes[ name ];
|
|
|
|
-
|
|
|
|
- for ( var i = 0, l = array.length; i < l; i ++ ) {
|
|
|
|
-
|
|
|
|
- attributes.update( array[ i ], gl.ARRAY_BUFFER );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return geometry;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- function getWireframeAttribute( geometry ) {
|
|
|
|
-
|
|
|
|
- var property = properties.get( geometry );
|
|
|
|
-
|
|
|
|
- if ( property.wireframe !== undefined ) {
|
|
|
|
-
|
|
|
|
- return property.wireframe;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- var indices = [];
|
|
|
|
-
|
|
|
|
- var geometryIndex = geometry.index;
|
|
|
|
- var geometryAttributes = geometry.attributes;
|
|
|
|
-
|
|
|
|
- // console.time( 'wireframe' );
|
|
|
|
-
|
|
|
|
- if ( geometryIndex !== null ) {
|
|
|
|
-
|
|
|
|
- var array = geometryIndex.array;
|
|
|
|
-
|
|
|
|
- for ( var i = 0, l = array.length; i < l; i += 3 ) {
|
|
|
|
-
|
|
|
|
- var a = array[ i + 0 ];
|
|
|
|
- var b = array[ i + 1 ];
|
|
|
|
- var c = array[ i + 2 ];
|
|
|
|
-
|
|
|
|
- indices.push( a, b, b, c, c, a );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- } else {
|
|
|
|
-
|
|
|
|
- var array = geometryAttributes.position.array;
|
|
|
|
-
|
|
|
|
- for ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {
|
|
|
|
-
|
|
|
|
- var a = i + 0;
|
|
|
|
- var b = i + 1;
|
|
|
|
- var c = i + 2;
|
|
|
|
-
|
|
|
|
- indices.push( a, b, b, c, c, a );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- // console.timeEnd( 'wireframe' );
|
|
|
|
-
|
|
|
|
- var attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );
|
|
|
|
-
|
|
|
|
- attributes.update( attribute, gl.ELEMENT_ARRAY_BUFFER );
|
|
|
|
-
|
|
|
|
- property.wireframe = attribute;
|
|
|
|
-
|
|
|
|
- return attribute;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return {
|
|
|
|
-
|
|
|
|
- getWireframeAttribute: getWireframeAttribute,
|
|
|
|
- update: update
|
|
|
|
-
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
/**
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
*/
|
|
@@ -19897,7 +19890,8 @@ function WebGLRenderer( parameters ) {
|
|
var properties = new WebGLProperties();
|
|
var properties = new WebGLProperties();
|
|
var textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, this.info );
|
|
var textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, this.info );
|
|
var attributes = new WebGLAttributes( _gl );
|
|
var attributes = new WebGLAttributes( _gl );
|
|
- var objects = new WebGLObjects( _gl, attributes, properties, this.info );
|
|
|
|
|
|
+ var geometries = new WebGLGeometries( _gl, attributes, this.info );
|
|
|
|
+ var objects = new WebGLObjects( _gl, geometries );
|
|
var programCache = new WebGLPrograms( this, capabilities );
|
|
var programCache = new WebGLPrograms( this, capabilities );
|
|
var lightCache = new WebGLLights();
|
|
var lightCache = new WebGLLights();
|
|
|
|
|
|
@@ -20380,7 +20374,7 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
if ( material.wireframe === true ) {
|
|
if ( material.wireframe === true ) {
|
|
|
|
|
|
- index = objects.getWireframeAttribute( geometry );
|
|
|
|
|
|
+ index = geometries.getWireframeAttribute( geometry );
|
|
rangeFactor = 2;
|
|
rangeFactor = 2;
|
|
|
|
|
|
}
|
|
}
|