|
@@ -18,9 +18,11 @@ THREE.WebGLGeometries = function ( gl, properties, info ) {
|
|
|
|
|
|
geometry.addEventListener( 'dispose', onGeometryDispose );
|
|
|
|
|
|
+ var buffergeometry;
|
|
|
+
|
|
|
if ( geometry instanceof THREE.BufferGeometry ) {
|
|
|
|
|
|
- geometries[ geometry.id ] = geometry;
|
|
|
+ buffergeometry = geometry;
|
|
|
|
|
|
} else if ( geometry instanceof THREE.Geometry ) {
|
|
|
|
|
@@ -30,29 +32,80 @@ THREE.WebGLGeometries = function ( gl, properties, info ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- geometries[ geometry.id ] = geometry._bufferGeometry;
|
|
|
+ buffergeometry = geometry._bufferGeometry;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( object instanceof THREE.Mesh ) {
|
|
|
+
|
|
|
+ buffergeometry.addAttribute( 'wireframe', createWireframeIndexBuffer( buffergeometry ) );
|
|
|
|
|
|
}
|
|
|
|
|
|
+ geometries[ geometry.id ] = buffergeometry;
|
|
|
+
|
|
|
info.memory.geometries ++;
|
|
|
|
|
|
- return geometries[ geometry.id ];
|
|
|
+ return buffergeometry;
|
|
|
|
|
|
};
|
|
|
|
|
|
- function onGeometryDispose( event ) {
|
|
|
+ function createWireframeIndexBuffer( geometry ) {
|
|
|
|
|
|
- var geometry = event.target;
|
|
|
- var buffergeometry = geometries[ geometry.id ];
|
|
|
+ var attributes = geometry.attributes;
|
|
|
|
|
|
- deleteAttributes( buffergeometry.attributes );
|
|
|
+ // create wireframe indices
|
|
|
|
|
|
- if ( buffergeometry._wireframe !== undefined ) {
|
|
|
+ var indices = [];
|
|
|
|
|
|
- deleteAttributes( buffergeometry._wireframe.attributes );
|
|
|
+ var index = attributes.index;
|
|
|
+ var position = attributes.position;
|
|
|
+
|
|
|
+ if ( index !== undefined ) {
|
|
|
+
|
|
|
+ var array = index.array;
|
|
|
+
|
|
|
+ for ( var i = 0, j = 0, l = array.length; i < l; i += 3 ) {
|
|
|
+
|
|
|
+ var a = array[ i + 0 ];
|
|
|
+ var b = array[ i + 1 ];
|
|
|
+ var c = array[ i + 2 ];
|
|
|
+
|
|
|
+ // TODO: Check for duplicates
|
|
|
+
|
|
|
+ indices.push( a, b, b, c, c, a );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ var array = position.array;
|
|
|
+
|
|
|
+ for ( var i = 0, j = 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 );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
+ var TypeArray = position.array.length > 65535 ? Uint32Array : Uint16Array;
|
|
|
+
|
|
|
+ return new THREE.BufferAttribute( new TypeArray( indices ), 1 );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ function onGeometryDispose( event ) {
|
|
|
+
|
|
|
+ var geometry = event.target;
|
|
|
+ var buffergeometry = geometries[ geometry.id ];
|
|
|
+
|
|
|
+ deleteAttributes( buffergeometry.attributes );
|
|
|
+
|
|
|
geometry.removeEventListener( 'dispose', onGeometryDispose );
|
|
|
|
|
|
delete geometries[ geometry.id ];
|