|
@@ -673,11 +673,13 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- if ( geometry.geometryGroups !== undefined ) {
|
|
|
+ var geometryGroupsList = geometryGroups[ geometry.id ];
|
|
|
|
|
|
- for ( var i = 0,l = geometry.geometryGroupsList.length; i<l;i++ ) {
|
|
|
+ if ( geometryGroupsList !== undefined ) {
|
|
|
|
|
|
- var geometryGroup = geometry.geometryGroupsList[ i ];
|
|
|
+ for ( var i = 0,l = geometryGroupsList.length; i < l; i ++ ) {
|
|
|
+
|
|
|
+ var geometryGroup = geometryGroupsList[ i ];
|
|
|
|
|
|
if ( geometryGroup.numMorphTargets !== undefined ) {
|
|
|
|
|
@@ -3181,7 +3183,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- };
|
|
|
+ }
|
|
|
|
|
|
// Sorting
|
|
|
|
|
@@ -3201,7 +3203,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- };
|
|
|
+ }
|
|
|
|
|
|
function reversePainterSortStable ( a, b ) {
|
|
|
|
|
@@ -3215,13 +3217,13 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- };
|
|
|
+ }
|
|
|
|
|
|
function numericalSort ( a, b ) {
|
|
|
|
|
|
return b[ 0 ] - a[ 0 ];
|
|
|
|
|
|
- };
|
|
|
+ }
|
|
|
|
|
|
// Rendering
|
|
|
|
|
@@ -3447,7 +3449,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- };
|
|
|
+ }
|
|
|
|
|
|
function renderObjects( renderList, camera, lights, fog, useBlending, overrideMaterial ) {
|
|
|
|
|
@@ -3494,7 +3496,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- };
|
|
|
+ }
|
|
|
|
|
|
function renderObjectsImmediate ( renderList, materialType, camera, lights, fog, useBlending, overrideMaterial ) {
|
|
|
|
|
@@ -3531,7 +3533,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- };
|
|
|
+ }
|
|
|
|
|
|
this.renderImmediateObject = function ( camera, lights, fog, material, object ) {
|
|
|
|
|
@@ -3570,7 +3572,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- };
|
|
|
+ }
|
|
|
|
|
|
function unrollBufferMaterial ( globject ) {
|
|
|
|
|
@@ -3614,7 +3616,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- };
|
|
|
+ }
|
|
|
|
|
|
function initObject( object, scene ) {
|
|
|
|
|
@@ -3688,9 +3690,11 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
} else if ( geometry instanceof THREE.Geometry ) {
|
|
|
|
|
|
- for ( var i = 0,l = geometry.geometryGroupsList.length; i < l; i ++ ) {
|
|
|
+ var geometryGroupsList = geometryGroups[ geometry.id ];
|
|
|
|
|
|
- addBuffer( _webglObjects, geometry.geometryGroupsList[ i ], object );
|
|
|
+ for ( var i = 0,l = geometryGroupsList.length; i < l; i ++ ) {
|
|
|
+
|
|
|
+ addBuffer( _webglObjects, geometryGroupsList[ i ], object );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -3708,26 +3712,106 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- };
|
|
|
+ }
|
|
|
+
|
|
|
+ // Geometry splitting
|
|
|
+
|
|
|
+ var geometryGroups = {};
|
|
|
+ var geometryGroupCounter = 0;
|
|
|
+
|
|
|
+ function makeGroups( geometry, usesFaceMaterial, maxVerticesInGroup ) {
|
|
|
+
|
|
|
+ var groupHash, hash_map = {};
|
|
|
+
|
|
|
+ var numMorphTargets = geometry.morphTargets.length;
|
|
|
+ var numMorphNormals = geometry.morphNormals.length;
|
|
|
+
|
|
|
+ var group;
|
|
|
+ var groups = {};
|
|
|
+ var groupsList = [];
|
|
|
+
|
|
|
+ for ( var f = 0, fl = geometry.faces.length; f < fl; f ++ ) {
|
|
|
+
|
|
|
+ var face = geometry.faces[ f ];
|
|
|
+ var materialIndex = usesFaceMaterial ? face.materialIndex : 0;
|
|
|
+
|
|
|
+ if ( ! ( materialIndex in hash_map ) ) {
|
|
|
+
|
|
|
+ hash_map[ materialIndex ] = { hash: materialIndex, counter: 0 };
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ groupHash = hash_map[ materialIndex ].hash + '_' + hash_map[ materialIndex ].counter;
|
|
|
+
|
|
|
+ if ( ! ( groupHash in groups ) ) {
|
|
|
+
|
|
|
+ group = {
|
|
|
+ id: geometryGroupCounter ++,
|
|
|
+ faces3: [],
|
|
|
+ materialIndex: materialIndex,
|
|
|
+ vertices: 0,
|
|
|
+ numMorphTargets: numMorphTargets,
|
|
|
+ numMorphNormals: numMorphNormals
|
|
|
+ };
|
|
|
+
|
|
|
+ groups[ groupHash ] = group;
|
|
|
+ groupsList.push( group );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( groups[ groupHash ].vertices + 3 > maxVerticesInGroup ) {
|
|
|
+
|
|
|
+ hash_map[ materialIndex ].counter += 1;
|
|
|
+ groupHash = hash_map[ materialIndex ].hash + '_' + hash_map[ materialIndex ].counter;
|
|
|
+
|
|
|
+ if ( ! ( groupHash in groups ) ) {
|
|
|
+
|
|
|
+ group = {
|
|
|
+ id: geometryGroupCounter ++,
|
|
|
+ faces3: [],
|
|
|
+ materialIndex: materialIndex,
|
|
|
+ vertices: 0,
|
|
|
+ numMorphTargets: numMorphTargets,
|
|
|
+ numMorphNormals: numMorphNormals
|
|
|
+ };
|
|
|
+
|
|
|
+ groups[ groupHash ] = group;
|
|
|
+ groupsList.push( group );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ groups[ groupHash ].faces3.push( f );
|
|
|
+ groups[ groupHash ].vertices += 3;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return groupsList;
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
function initGeometryGroups( scene, object, geometry ) {
|
|
|
|
|
|
- var g, geometryGroup, material = object.material, addBuffers = false;
|
|
|
+ var material = object.material, addBuffers = false;
|
|
|
|
|
|
- if ( geometry.geometryGroups === undefined || geometry.groupsNeedUpdate === true ) {
|
|
|
+ if ( geometryGroups[ geometry.id ] === undefined || geometry.groupsNeedUpdate === true ) {
|
|
|
|
|
|
delete _webglObjects[ object.id ];
|
|
|
|
|
|
- geometry.makeGroups( material instanceof THREE.MeshFaceMaterial, _glExtensionElementIndexUint ? 4294967296 : 65535 );
|
|
|
+ geometryGroups[ geometry.id ] = makeGroups( geometry, material instanceof THREE.MeshFaceMaterial, _glExtensionElementIndexUint ? 4294967296 : 65535 );
|
|
|
+
|
|
|
geometry.groupsNeedUpdate = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
+ var geometryGroupsList = geometryGroups[ geometry.id ];
|
|
|
+
|
|
|
// create separate VBOs per geometry chunk
|
|
|
|
|
|
- for ( var i = 0, il = geometry.geometryGroupsList.length; i < il; i ++ ) {
|
|
|
+ for ( var i = 0, il = geometryGroupsList.length; i < il; i ++ ) {
|
|
|
|
|
|
- geometryGroup = geometry.geometryGroupsList[ i ];
|
|
|
+ var geometryGroup = geometryGroupsList[ i ];
|
|
|
|
|
|
// initialise VBO on the first access
|
|
|
|
|
@@ -3798,8 +3882,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
function updateObject( object, scene ) {
|
|
|
|
|
|
- var geometry = object.geometry,
|
|
|
- geometryGroup, customAttributesDirty, material;
|
|
|
+ var geometry = object.geometry, customAttributesDirty, material;
|
|
|
|
|
|
if ( geometry instanceof THREE.BufferGeometry ) {
|
|
|
|
|
@@ -3815,9 +3898,11 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- for ( var i = 0, il = geometry.geometryGroupsList.length; i < il; i ++ ) {
|
|
|
+ var geometryGroupsList = geometryGroups[ geometry.id ];
|
|
|
+
|
|
|
+ for ( var i = 0, il = geometryGroupsList.length; i < il; i ++ ) {
|
|
|
|
|
|
- geometryGroup = geometry.geometryGroupsList[ i ];
|
|
|
+ var geometryGroup = geometryGroupsList[ i ];
|
|
|
|
|
|
material = getBufferMaterial( object, geometryGroup );
|
|
|
|