|
@@ -10435,12 +10435,13 @@ THREE.Geometry.prototype = {
|
|
|
return function ( usesFaceMaterial, maxVerticesInGroup ) {
|
|
|
|
|
|
var f, fl, face, materialIndex,
|
|
|
- groupHash, hash_map = {};
|
|
|
+ groupHash, hash_map = {},geometryGroup;
|
|
|
|
|
|
var numMorphTargets = this.morphTargets.length;
|
|
|
var numMorphNormals = this.morphNormals.length;
|
|
|
|
|
|
this.geometryGroups = {};
|
|
|
+ this.geometryGroupsList = [];
|
|
|
|
|
|
for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
|
|
|
|
|
@@ -10457,8 +10458,9 @@ THREE.Geometry.prototype = {
|
|
|
|
|
|
if ( ! ( groupHash in this.geometryGroups ) ) {
|
|
|
|
|
|
- this.geometryGroups[ groupHash ] = { 'faces3': [], 'materialIndex': materialIndex, 'vertices': 0, 'numMorphTargets': numMorphTargets, 'numMorphNormals': numMorphNormals };
|
|
|
-
|
|
|
+ geometryGroup = { 'id': geometryGroupCounter++, 'faces3': [], 'materialIndex': materialIndex, 'vertices': 0, 'numMorphTargets': numMorphTargets, 'numMorphNormals': numMorphNormals };
|
|
|
+ this.geometryGroups[ groupHash ] = geometryGroup;
|
|
|
+ this.geometryGroupsList.push(geometryGroup);
|
|
|
}
|
|
|
|
|
|
if ( this.geometryGroups[ groupHash ].vertices + 3 > maxVerticesInGroup ) {
|
|
@@ -10468,8 +10470,10 @@ THREE.Geometry.prototype = {
|
|
|
|
|
|
if ( ! ( groupHash in this.geometryGroups ) ) {
|
|
|
|
|
|
- this.geometryGroups[ groupHash ] = { 'faces3': [], 'materialIndex': materialIndex, 'vertices': 0, 'numMorphTargets': numMorphTargets, 'numMorphNormals': numMorphNormals };
|
|
|
-
|
|
|
+ geometryGroup = { 'id': geometryGroupCounter++, 'faces3': [], 'materialIndex': materialIndex, 'vertices': 0, 'numMorphTargets': numMorphTargets, 'numMorphNormals': numMorphNormals };
|
|
|
+ this.geometryGroups[ groupHash ] = geometryGroup;
|
|
|
+ this.geometryGroupsList.push(geometryGroup);
|
|
|
+
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -10479,16 +10483,6 @@ THREE.Geometry.prototype = {
|
|
|
|
|
|
}
|
|
|
|
|
|
- this.geometryGroupsList = [];
|
|
|
-
|
|
|
- for ( var g in this.geometryGroups ) {
|
|
|
-
|
|
|
- this.geometryGroups[ g ].id = geometryGroupCounter ++;
|
|
|
-
|
|
|
- this.geometryGroupsList.push( this.geometryGroups[ g ] );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
};
|
|
|
|
|
|
} )(),
|
|
@@ -20200,6 +20194,10 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
_clearColor = new THREE.Color( 0x000000 ),
|
|
|
_clearAlpha = 0;
|
|
|
+
|
|
|
+ var opaqueObjects = [];
|
|
|
+ var transparentObjects = [];
|
|
|
+ var _sortObjects = true;
|
|
|
|
|
|
// public properties
|
|
|
|
|
@@ -20791,9 +20789,9 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( geometry.geometryGroups !== undefined ) {
|
|
|
|
|
|
- for ( var g in geometry.geometryGroups ) {
|
|
|
+ for ( var i = 0,l = geometry.geometryGroupsList.length; i<l;i++ ) {
|
|
|
|
|
|
- var geometryGroup = geometry.geometryGroups[ g ];
|
|
|
+ var geometryGroup = geometry.geometryGroupsList[ i ];
|
|
|
|
|
|
if ( geometryGroup.numMorphTargets !== undefined ) {
|
|
|
|
|
@@ -22902,7 +22900,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- _gl.drawElements( _gl.LINES, index.array.length, type, 0 ); // 2 bytes per Uint16Array
|
|
|
+ _gl.drawElements( mode, index.array.length, type, 0 ); // 2 bytes per Uint16Array
|
|
|
|
|
|
_this.info.render.calls ++;
|
|
|
_this.info.render.vertices += index.array.length; // not really true, here vertices can be shared
|
|
@@ -22928,7 +22926,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
// render indexed lines
|
|
|
|
|
|
- _gl.drawElements( _gl.LINES, offsets[ i ].count, type, offsets[ i ].start * size ); // 2 bytes per Uint16Array
|
|
|
+ _gl.drawElements( mode, offsets[ i ].count, type, offsets[ i ].start * size ); // 2 bytes per Uint16Array
|
|
|
|
|
|
_this.info.render.calls ++;
|
|
|
_this.info.render.vertices += offsets[ i ].count; // not really true, here vertices can be shared
|
|
@@ -23388,6 +23386,20 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
};
|
|
|
|
|
|
+ function reversePainterSortStable ( a, b ) {
|
|
|
+
|
|
|
+ if ( a.z !== b.z ) {
|
|
|
+
|
|
|
+ return a.z - b.z;
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ return a.id - b.id;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
function numericalSort ( a, b ) {
|
|
|
|
|
|
return b[ 0 ] - a[ 0 ];
|
|
@@ -23457,52 +23469,17 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
// set matrices for regular objects (frustum culled)
|
|
|
|
|
|
- renderList = scene.__webglObjects;
|
|
|
-
|
|
|
- for ( i = 0, il = renderList.length; i < il; i ++ ) {
|
|
|
-
|
|
|
- webglObject = renderList[ i ];
|
|
|
- object = webglObject.object;
|
|
|
-
|
|
|
- webglObject.id = i;
|
|
|
- webglObject.render = false;
|
|
|
-
|
|
|
- if ( object.visible ) {
|
|
|
-
|
|
|
- if ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) {
|
|
|
-
|
|
|
- setupMatrices( object, camera );
|
|
|
-
|
|
|
- unrollBufferMaterial( webglObject );
|
|
|
-
|
|
|
- webglObject.render = true;
|
|
|
-
|
|
|
- if ( this.sortObjects === true ) {
|
|
|
-
|
|
|
- if ( object.renderDepth !== null ) {
|
|
|
-
|
|
|
- webglObject.z = object.renderDepth;
|
|
|
-
|
|
|
- } else {
|
|
|
-
|
|
|
- _vector3.setFromMatrixPosition( object.matrixWorld );
|
|
|
- _vector3.applyProjection( _projScreenMatrix );
|
|
|
-
|
|
|
- webglObject.z = _vector3.z;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
+
|
|
|
+ opaqueObjects.length = 0;
|
|
|
+ transparentObjects.length = 0;
|
|
|
+ _sortObjects = this.sortObjects;
|
|
|
+
|
|
|
+ projectObject(scene,scene,camera);
|
|
|
|
|
|
if ( this.sortObjects ) {
|
|
|
|
|
|
- renderList.sort( painterSortStable );
|
|
|
+ opaqueObjects.sort( painterSortStable );
|
|
|
+ transparentObjects.sort( reversePainterSortStable );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -23534,7 +23511,8 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
this.setDepthWrite( material.depthWrite );
|
|
|
setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );
|
|
|
|
|
|
- renderObjects( scene.__webglObjects, false, '', camera, lights, fog, true, material );
|
|
|
+ renderObjects( opaqueObjects, camera, lights, fog, true, material );
|
|
|
+ renderObjects( transparentObjects, camera, lights, fog, true, material );
|
|
|
renderObjectsImmediate( scene.__webglObjectsImmediate, '', camera, lights, fog, false, material );
|
|
|
|
|
|
} else {
|
|
@@ -23545,12 +23523,12 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
this.setBlending( THREE.NoBlending );
|
|
|
|
|
|
- renderObjects( scene.__webglObjects, true, 'opaque', camera, lights, fog, false, material );
|
|
|
+ renderObjects( opaqueObjects, camera, lights, fog, false, material );
|
|
|
renderObjectsImmediate( scene.__webglObjectsImmediate, 'opaque', camera, lights, fog, false, material );
|
|
|
|
|
|
// transparent pass (back-to-front order)
|
|
|
|
|
|
- renderObjects( scene.__webglObjects, false, 'transparent', camera, lights, fog, true, material );
|
|
|
+ renderObjects( transparentObjects, camera, lights, fog, true, material );
|
|
|
renderObjectsImmediate( scene.__webglObjectsImmediate, 'transparent', camera, lights, fog, true, material );
|
|
|
|
|
|
}
|
|
@@ -23576,6 +23554,54 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
// _gl.finish();
|
|
|
|
|
|
};
|
|
|
+
|
|
|
+ function projectObject(scene, object,camera){
|
|
|
+
|
|
|
+ if ( object.visible ) {
|
|
|
+
|
|
|
+ var webglObjects = scene.__webglObjects[object.id];
|
|
|
+
|
|
|
+ if (webglObjects && (object.frustumCulled === false || _frustum.intersectsObject( object ) === true) ) {
|
|
|
+
|
|
|
+ updateObject(scene, object);
|
|
|
+
|
|
|
+ setupMatrices( object, camera );
|
|
|
+
|
|
|
+ for (var i = 0, l = webglObjects.length; i < l; i++){
|
|
|
+
|
|
|
+ var webglObject = webglObjects[i];
|
|
|
+
|
|
|
+ unrollBufferMaterial( webglObject );
|
|
|
+
|
|
|
+
|
|
|
+ webglObject.render = true;
|
|
|
+
|
|
|
+ if ( _sortObjects === true ) {
|
|
|
+
|
|
|
+ if ( object.renderDepth !== null ) {
|
|
|
+
|
|
|
+ webglObject.z = object.renderDepth;
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ _vector3.setFromMatrixPosition( object.matrixWorld );
|
|
|
+ _vector3.applyProjection( _projScreenMatrix );
|
|
|
+
|
|
|
+ webglObject.z = _vector3.z;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for(var i = 0, l = object.children.length; i < l; i++) {
|
|
|
+ projectObject(scene, object.children[i],camera);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
function renderPlugins( plugins, scene, camera ) {
|
|
|
|
|
@@ -23619,61 +23645,44 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
};
|
|
|
|
|
|
- function renderObjects( renderList, reverse, materialType, camera, lights, fog, useBlending, overrideMaterial ) {
|
|
|
+ function renderObjects( renderList, camera, lights, fog, useBlending, overrideMaterial ) {
|
|
|
|
|
|
- var webglObject, object, buffer, material, start, end, delta;
|
|
|
+ var webglObject, object, buffer, material;
|
|
|
|
|
|
- if ( reverse ) {
|
|
|
-
|
|
|
- start = renderList.length - 1;
|
|
|
- end = - 1;
|
|
|
- delta = - 1;
|
|
|
-
|
|
|
- } else {
|
|
|
-
|
|
|
- start = 0;
|
|
|
- end = renderList.length;
|
|
|
- delta = 1;
|
|
|
- }
|
|
|
-
|
|
|
- for ( var i = start; i !== end; i += delta ) {
|
|
|
+ for ( var i = renderList.length - 1; i !== - 1; i -- ) {
|
|
|
|
|
|
webglObject = renderList[ i ];
|
|
|
|
|
|
- if ( webglObject.render ) {
|
|
|
-
|
|
|
- object = webglObject.object;
|
|
|
- buffer = webglObject.buffer;
|
|
|
-
|
|
|
- if ( overrideMaterial ) {
|
|
|
+ object = webglObject.object;
|
|
|
+ buffer = webglObject.buffer;
|
|
|
|
|
|
- material = overrideMaterial;
|
|
|
+ if ( overrideMaterial ) {
|
|
|
|
|
|
- } else {
|
|
|
+ material = overrideMaterial;
|
|
|
|
|
|
- material = webglObject[ materialType ];
|
|
|
+ } else {
|
|
|
|
|
|
- if ( ! material ) continue;
|
|
|
+ material = webglObject.material;
|
|
|
|
|
|
- if ( useBlending ) _this.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst );
|
|
|
+ if ( ! material ) continue;
|
|
|
|
|
|
- _this.setDepthTest( material.depthTest );
|
|
|
- _this.setDepthWrite( material.depthWrite );
|
|
|
- setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );
|
|
|
+ if ( useBlending ) _this.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst );
|
|
|
|
|
|
- }
|
|
|
+ _this.setDepthTest( material.depthTest );
|
|
|
+ _this.setDepthWrite( material.depthWrite );
|
|
|
+ setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );
|
|
|
|
|
|
- _this.setMaterialFaces( material );
|
|
|
+ }
|
|
|
|
|
|
- if ( buffer instanceof THREE.BufferGeometry ) {
|
|
|
+ _this.setMaterialFaces( material );
|
|
|
|
|
|
- _this.renderBufferDirect( camera, lights, fog, material, buffer, object );
|
|
|
+ if ( buffer instanceof THREE.BufferGeometry ) {
|
|
|
|
|
|
- } else {
|
|
|
+ _this.renderBufferDirect( camera, lights, fog, material, buffer, object );
|
|
|
|
|
|
- _this.renderBuffer( camera, lights, fog, material, buffer, object );
|
|
|
+ } else {
|
|
|
|
|
|
- }
|
|
|
+ _this.renderBuffer( camera, lights, fog, material, buffer, object );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -23773,13 +23782,13 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( material.transparent ) {
|
|
|
|
|
|
- globject.transparent = material;
|
|
|
- globject.opaque = null;
|
|
|
+ globject.material = material;
|
|
|
+ transparentObjects.push(globject);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- globject.opaque = material;
|
|
|
- globject.transparent = null;
|
|
|
+ globject.material = material;
|
|
|
+ opaqueObjects.push(globject);
|
|
|
|
|
|
}
|
|
|
|
|
@@ -23789,13 +23798,13 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( material.transparent ) {
|
|
|
|
|
|
- globject.transparent = material;
|
|
|
- globject.opaque = null;
|
|
|
+ globject.material = material;
|
|
|
+ transparentObjects.push(globject);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- globject.opaque = material;
|
|
|
- globject.transparent = null;
|
|
|
+ globject.material = material;
|
|
|
+ opaqueObjects.push(globject);
|
|
|
|
|
|
}
|
|
|
|
|
@@ -23811,7 +23820,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( ! scene.__webglObjects ) {
|
|
|
|
|
|
- scene.__webglObjects = [];
|
|
|
+ scene.__webglObjects = {};
|
|
|
scene.__webglObjectsImmediate = [];
|
|
|
scene.__webglSprites = [];
|
|
|
scene.__webglFlares = [];
|
|
@@ -23832,37 +23841,13 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- // update must be called after objects adding / removal
|
|
|
-
|
|
|
- for ( var o = 0, ol = scene.__webglObjects.length; o < ol; o ++ ) {
|
|
|
-
|
|
|
- var object = scene.__webglObjects[ o ].object;
|
|
|
-
|
|
|
- // TODO: Remove this hack (WebGLRenderer refactoring)
|
|
|
-
|
|
|
- if ( object.__webglInit === undefined ) {
|
|
|
-
|
|
|
- if ( object.__webglActive !== undefined ) {
|
|
|
-
|
|
|
- removeObject( object, scene );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- addObject( object, scene );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- updateObject( object );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
};
|
|
|
|
|
|
// Objects adding
|
|
|
|
|
|
function addObject( object, scene ) {
|
|
|
|
|
|
- var g, geometry, material, geometryGroup;
|
|
|
+ var g, geometry, geometryGroup;
|
|
|
|
|
|
if ( object.__webglInit === undefined ) {
|
|
|
|
|
@@ -23871,80 +23856,55 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
object._modelViewMatrix = new THREE.Matrix4();
|
|
|
object._normalMatrix = new THREE.Matrix3();
|
|
|
|
|
|
- geometry = object.geometry;
|
|
|
-
|
|
|
- if ( geometry === undefined ) {
|
|
|
-
|
|
|
- // ImmediateRenderObject
|
|
|
-
|
|
|
- } else if ( geometry.__webglInit === undefined ) {
|
|
|
-
|
|
|
- geometry.__webglInit = true;
|
|
|
- geometry.addEventListener( 'dispose', onGeometryDispose );
|
|
|
-
|
|
|
- if ( geometry instanceof THREE.BufferGeometry ) {
|
|
|
-
|
|
|
- initDirectBuffers( geometry );
|
|
|
-
|
|
|
- } else if ( object instanceof THREE.Mesh ) {
|
|
|
-
|
|
|
- material = object.material;
|
|
|
-
|
|
|
- if ( geometry.geometryGroups === undefined ) {
|
|
|
-
|
|
|
- geometry.makeGroups( material instanceof THREE.MeshFaceMaterial, _glExtensionElementIndexUint ? 4294967296 : 65535 );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- // create separate VBOs per geometry chunk
|
|
|
-
|
|
|
- for ( g in geometry.geometryGroups ) {
|
|
|
+ }
|
|
|
+
|
|
|
+ geometry = object.geometry;
|
|
|
+
|
|
|
+ if ( geometry === undefined ) {
|
|
|
|
|
|
- geometryGroup = geometry.geometryGroups[ g ];
|
|
|
+ // ImmediateRenderObject
|
|
|
|
|
|
- // initialise VBO on the first access
|
|
|
+ } else if ( geometry.__webglInit === undefined ) {
|
|
|
|
|
|
- if ( ! geometryGroup.__webglVertexBuffer ) {
|
|
|
+ geometry.__webglInit = true;
|
|
|
+ geometry.addEventListener( 'dispose', onGeometryDispose );
|
|
|
|
|
|
- createMeshBuffers( geometryGroup );
|
|
|
- initMeshBuffers( geometryGroup, object );
|
|
|
+ if ( geometry instanceof THREE.BufferGeometry ) {
|
|
|
|
|
|
- geometry.verticesNeedUpdate = true;
|
|
|
- geometry.morphTargetsNeedUpdate = true;
|
|
|
- geometry.elementsNeedUpdate = true;
|
|
|
- geometry.uvsNeedUpdate = true;
|
|
|
- geometry.normalsNeedUpdate = true;
|
|
|
- geometry.tangentsNeedUpdate = true;
|
|
|
- geometry.colorsNeedUpdate = true;
|
|
|
+ initDirectBuffers( geometry );
|
|
|
|
|
|
- }
|
|
|
+ } else if ( object instanceof THREE.Mesh ) {
|
|
|
+
|
|
|
+ if ( object.__webglActive !== undefined ) {
|
|
|
|
|
|
- }
|
|
|
+ removeObject( object, scene );
|
|
|
|
|
|
- } else if ( object instanceof THREE.Line ) {
|
|
|
+ }
|
|
|
+
|
|
|
+ initGeometryGroups(scene, object, geometry);
|
|
|
|
|
|
- if ( ! geometry.__webglVertexBuffer ) {
|
|
|
+ } else if ( object instanceof THREE.Line ) {
|
|
|
|
|
|
- createLineBuffers( geometry );
|
|
|
- initLineBuffers( geometry, object );
|
|
|
+ if ( ! geometry.__webglVertexBuffer ) {
|
|
|
|
|
|
- geometry.verticesNeedUpdate = true;
|
|
|
- geometry.colorsNeedUpdate = true;
|
|
|
- geometry.lineDistancesNeedUpdate = true;
|
|
|
+ createLineBuffers( geometry );
|
|
|
+ initLineBuffers( geometry, object );
|
|
|
|
|
|
- }
|
|
|
+ geometry.verticesNeedUpdate = true;
|
|
|
+ geometry.colorsNeedUpdate = true;
|
|
|
+ geometry.lineDistancesNeedUpdate = true;
|
|
|
|
|
|
- } else if ( object instanceof THREE.PointCloud ) {
|
|
|
+ }
|
|
|
|
|
|
- if ( ! geometry.__webglVertexBuffer ) {
|
|
|
+ } else if ( object instanceof THREE.PointCloud ) {
|
|
|
|
|
|
- createParticleBuffers( geometry );
|
|
|
- initParticleBuffers( geometry, object );
|
|
|
+ if ( ! geometry.__webglVertexBuffer ) {
|
|
|
|
|
|
- geometry.verticesNeedUpdate = true;
|
|
|
- geometry.colorsNeedUpdate = true;
|
|
|
+ createParticleBuffers( geometry );
|
|
|
+ initParticleBuffers( geometry, object );
|
|
|
|
|
|
- }
|
|
|
+ geometry.verticesNeedUpdate = true;
|
|
|
+ geometry.colorsNeedUpdate = true;
|
|
|
|
|
|
}
|
|
|
|
|
@@ -23952,7 +23912,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- if ( object.__webglActive === undefined ) {
|
|
|
+ if ( object.__webglActive === undefined) {
|
|
|
|
|
|
if ( object instanceof THREE.Mesh ) {
|
|
|
|
|
@@ -23964,14 +23924,12 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
} else if ( geometry instanceof THREE.Geometry ) {
|
|
|
|
|
|
- for ( g in geometry.geometryGroups ) {
|
|
|
-
|
|
|
- geometryGroup = geometry.geometryGroups[ g ];
|
|
|
-
|
|
|
+ for ( var i = 0,l = geometry.geometryGroupsList.length; i<l;i++ ) {
|
|
|
+
|
|
|
+ geometryGroup = geometry.geometryGroupsList[ i ];
|
|
|
addBuffer( scene.__webglObjects, geometryGroup, object );
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
} else if ( object instanceof THREE.Line ||
|
|
@@ -23999,16 +23957,65 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
}
|
|
|
|
|
|
};
|
|
|
+
|
|
|
+ function initGeometryGroups(scene,object,geometry) {
|
|
|
+
|
|
|
+ var g, geometryGroup, material,addBuffers = false;
|
|
|
+ material = object.material;
|
|
|
|
|
|
- function addBuffer( objlist, buffer, object ) {
|
|
|
+ if ( geometry.geometryGroups === undefined ) {
|
|
|
+
|
|
|
+ delete scene.__webglObjects[object.id];
|
|
|
+ geometry.makeGroups( material instanceof THREE.MeshFaceMaterial, _glExtensionElementIndexUint ? 4294967296 : 65535 );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
- objlist.push(
|
|
|
+ // create separate VBOs per geometry chunk
|
|
|
+
|
|
|
+ for ( var i = 0, il = geometry.geometryGroupsList.length; i < il; i ++ ) {
|
|
|
+
|
|
|
+ geometryGroup = geometry.geometryGroupsList[ i ];
|
|
|
+
|
|
|
+ // initialise VBO on the first access
|
|
|
+
|
|
|
+ if ( ! geometryGroup.__webglVertexBuffer ) {
|
|
|
+
|
|
|
+ createMeshBuffers( geometryGroup );
|
|
|
+ initMeshBuffers( geometryGroup, object );
|
|
|
+
|
|
|
+ geometry.verticesNeedUpdate = true;
|
|
|
+ geometry.morphTargetsNeedUpdate = true;
|
|
|
+ geometry.elementsNeedUpdate = true;
|
|
|
+ geometry.uvsNeedUpdate = true;
|
|
|
+ geometry.normalsNeedUpdate = true;
|
|
|
+ geometry.tangentsNeedUpdate = true;
|
|
|
+ geometry.colorsNeedUpdate = true;
|
|
|
+
|
|
|
+ addBuffers = true;
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ addBuffers = false;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( addBuffers || object.__webglActive === undefined ) {
|
|
|
+ addBuffer( scene.__webglObjects, geometryGroup, object );
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ object.__webglActive = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ function addBuffer( objlist, buffer, object ) {
|
|
|
+ var id = object.id;
|
|
|
+ objlist[id] = objlist[id] || [];
|
|
|
+ objlist[id].push(
|
|
|
{
|
|
|
id: null,
|
|
|
buffer: buffer,
|
|
|
object: object,
|
|
|
- opaque: null,
|
|
|
- transparent: null,
|
|
|
+ material: null,
|
|
|
z: 0
|
|
|
}
|
|
|
);
|
|
@@ -24031,7 +24038,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
// Objects updates
|
|
|
|
|
|
- function updateObject( object ) {
|
|
|
+ function updateObject(scene, object ) {
|
|
|
|
|
|
var geometry = object.geometry,
|
|
|
geometryGroup, customAttributesDirty, material;
|
|
@@ -24043,6 +24050,19 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
} else if ( object instanceof THREE.Mesh ) {
|
|
|
|
|
|
// check all geometry groups
|
|
|
+ if ( geometry.buffersNeedUpdate ) {
|
|
|
+
|
|
|
+ if ( geometry instanceof THREE.BufferGeometry ) {
|
|
|
+
|
|
|
+ initDirectBuffers( geometry );
|
|
|
+
|
|
|
+ } else if ( object instanceof THREE.Mesh ) {
|
|
|
+
|
|
|
+ initGeometryGroups(scene, object,geometry);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
for ( var i = 0, il = geometry.geometryGroupsList.length; i < il; i ++ ) {
|
|
|
|
|
@@ -24152,7 +24172,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
object instanceof THREE.PointCloud ||
|
|
|
object instanceof THREE.Line ) {
|
|
|
|
|
|
- removeInstances( scene.__webglObjects, object );
|
|
|
+ removeInstancesWebglObjects( scene.__webglObjects, object );
|
|
|
|
|
|
} else if ( object instanceof THREE.Sprite ) {
|
|
|
|
|
@@ -24171,6 +24191,14 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
delete object.__webglActive;
|
|
|
|
|
|
};
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ function removeInstancesWebglObjects( objlist, object ) {
|
|
|
+
|
|
|
+ delete objlist[object];
|
|
|
+
|
|
|
+ };
|
|
|
|
|
|
function removeInstances( objlist, object ) {
|
|
|
|
|
@@ -35789,7 +35817,9 @@ THREE.ShadowMapPlugin = function () {
|
|
|
_min = new THREE.Vector3(),
|
|
|
_max = new THREE.Vector3(),
|
|
|
|
|
|
- _matrixPosition = new THREE.Vector3();
|
|
|
+ _matrixPosition = new THREE.Vector3(),
|
|
|
+
|
|
|
+ _renderList = [];
|
|
|
|
|
|
this.init = function ( renderer ) {
|
|
|
|
|
@@ -35826,7 +35856,6 @@ THREE.ShadowMapPlugin = function () {
|
|
|
shadowMap, shadowMatrix, shadowCamera,
|
|
|
program, buffer, material,
|
|
|
webglObject, object, light,
|
|
|
- renderList,
|
|
|
|
|
|
lights = [],
|
|
|
k = 0,
|
|
@@ -36005,85 +36034,62 @@ THREE.ShadowMapPlugin = function () {
|
|
|
|
|
|
// set object matrices & frustum culling
|
|
|
|
|
|
- renderList = scene.__webglObjects;
|
|
|
-
|
|
|
- for ( j = 0, jl = renderList.length; j < jl; j ++ ) {
|
|
|
+ _renderList.length = 0;
|
|
|
+ projectObject(scene,scene,shadowCamera);
|
|
|
|
|
|
- webglObject = renderList[ j ];
|
|
|
- object = webglObject.object;
|
|
|
-
|
|
|
- webglObject.render = false;
|
|
|
-
|
|
|
- if ( object.visible && object.castShadow ) {
|
|
|
-
|
|
|
- if ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) {
|
|
|
-
|
|
|
- object._modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );
|
|
|
-
|
|
|
- webglObject.render = true;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
|
|
|
// render regular objects
|
|
|
|
|
|
var objectMaterial, useMorphing, useSkinning;
|
|
|
|
|
|
- for ( j = 0, jl = renderList.length; j < jl; j ++ ) {
|
|
|
-
|
|
|
- webglObject = renderList[ j ];
|
|
|
+ for ( j = 0, jl = _renderList.length; j < jl; j ++ ) {
|
|
|
|
|
|
- if ( webglObject.render ) {
|
|
|
+ webglObject = _renderList[ j ];
|
|
|
|
|
|
- object = webglObject.object;
|
|
|
- buffer = webglObject.buffer;
|
|
|
-
|
|
|
- // culling is overriden globally for all objects
|
|
|
- // while rendering depth map
|
|
|
+ object = webglObject.object;
|
|
|
+ buffer = webglObject.buffer;
|
|
|
|
|
|
- // need to deal with MeshFaceMaterial somehow
|
|
|
- // in that case just use the first of material.materials for now
|
|
|
- // (proper solution would require to break objects by materials
|
|
|
- // similarly to regular rendering and then set corresponding
|
|
|
- // depth materials per each chunk instead of just once per object)
|
|
|
+ // culling is overriden globally for all objects
|
|
|
+ // while rendering depth map
|
|
|
|
|
|
- objectMaterial = getObjectMaterial( object );
|
|
|
+ // need to deal with MeshFaceMaterial somehow
|
|
|
+ // in that case just use the first of material.materials for now
|
|
|
+ // (proper solution would require to break objects by materials
|
|
|
+ // similarly to regular rendering and then set corresponding
|
|
|
+ // depth materials per each chunk instead of just once per object)
|
|
|
|
|
|
- useMorphing = object.geometry.morphTargets !== undefined && object.geometry.morphTargets.length > 0 && objectMaterial.morphTargets;
|
|
|
- useSkinning = object instanceof THREE.SkinnedMesh && objectMaterial.skinning;
|
|
|
+ objectMaterial = getObjectMaterial( object );
|
|
|
|
|
|
- if ( object.customDepthMaterial ) {
|
|
|
+ useMorphing = object.geometry.morphTargets !== undefined && object.geometry.morphTargets.length > 0 && objectMaterial.morphTargets;
|
|
|
+ useSkinning = object instanceof THREE.SkinnedMesh && objectMaterial.skinning;
|
|
|
|
|
|
- material = object.customDepthMaterial;
|
|
|
+ if ( object.customDepthMaterial ) {
|
|
|
|
|
|
- } else if ( useSkinning ) {
|
|
|
+ material = object.customDepthMaterial;
|
|
|
|
|
|
- material = useMorphing ? _depthMaterialMorphSkin : _depthMaterialSkin;
|
|
|
+ } else if ( useSkinning ) {
|
|
|
|
|
|
- } else if ( useMorphing ) {
|
|
|
+ material = useMorphing ? _depthMaterialMorphSkin : _depthMaterialSkin;
|
|
|
|
|
|
- material = _depthMaterialMorph;
|
|
|
+ } else if ( useMorphing ) {
|
|
|
|
|
|
- } else {
|
|
|
+ material = _depthMaterialMorph;
|
|
|
|
|
|
- material = _depthMaterial;
|
|
|
+ } else {
|
|
|
|
|
|
- }
|
|
|
+ material = _depthMaterial;
|
|
|
|
|
|
- _renderer.setMaterialFaces( objectMaterial );
|
|
|
+ }
|
|
|
|
|
|
- if ( buffer instanceof THREE.BufferGeometry ) {
|
|
|
+ _renderer.setMaterialFaces( objectMaterial );
|
|
|
|
|
|
- _renderer.renderBufferDirect( shadowCamera, scene.__lights, fog, material, buffer, object );
|
|
|
+ if ( buffer instanceof THREE.BufferGeometry ) {
|
|
|
|
|
|
- } else {
|
|
|
+ _renderer.renderBufferDirect( shadowCamera, scene.__lights, fog, material, buffer, object );
|
|
|
|
|
|
- _renderer.renderBuffer( shadowCamera, scene.__lights, fog, material, buffer, object );
|
|
|
+ } else {
|
|
|
|
|
|
- }
|
|
|
+ _renderer.renderBuffer( shadowCamera, scene.__lights, fog, material, buffer, object );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -36091,7 +36097,7 @@ THREE.ShadowMapPlugin = function () {
|
|
|
|
|
|
// set matrices and render immediate objects
|
|
|
|
|
|
- renderList = scene.__webglObjectsImmediate;
|
|
|
+ var renderList = scene.__webglObjectsImmediate;
|
|
|
|
|
|
for ( j = 0, jl = renderList.length; j < jl; j ++ ) {
|
|
|
|
|
@@ -36125,6 +36131,33 @@ THREE.ShadowMapPlugin = function () {
|
|
|
}
|
|
|
|
|
|
};
|
|
|
+
|
|
|
+ function projectObject(scene, object,shadowCamera){
|
|
|
+
|
|
|
+ if ( object.visible ) {
|
|
|
+
|
|
|
+ var webglObjects = scene.__webglObjects[object.id];
|
|
|
+
|
|
|
+ if (webglObjects && object.castShadow && (object.frustumCulled === false || _frustum.intersectsObject( object ) === true) ) {
|
|
|
+
|
|
|
+
|
|
|
+ for (var i = 0, l = webglObjects.length; i < l; i++){
|
|
|
+
|
|
|
+ var webglObject = webglObjects[i];
|
|
|
+
|
|
|
+ object._modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );
|
|
|
+ _renderList.push(webglObject);
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for(var i = 0, l = object.children.length; i < l; i++) {
|
|
|
+
|
|
|
+ projectObject(scene, object.children[i],shadowCamera);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
function createVirtualLight( light, cascade ) {
|
|
|
|
|
@@ -36651,7 +36684,8 @@ THREE.DepthPassPlugin = function () {
|
|
|
_depthMaterial, _depthMaterialMorph, _depthMaterialSkin, _depthMaterialMorphSkin,
|
|
|
|
|
|
_frustum = new THREE.Frustum(),
|
|
|
- _projScreenMatrix = new THREE.Matrix4();
|
|
|
+ _projScreenMatrix = new THREE.Matrix4(),
|
|
|
+ _renderList = [];
|
|
|
|
|
|
this.init = function ( renderer ) {
|
|
|
|
|
@@ -36715,8 +36749,11 @@ THREE.DepthPassPlugin = function () {
|
|
|
_renderer.clear();
|
|
|
|
|
|
// set object matrices & frustum culling
|
|
|
-
|
|
|
- renderList = scene.__webglObjects;
|
|
|
+
|
|
|
+ _renderList.length = 0;
|
|
|
+ projectObject(scene,scene,camera);
|
|
|
+
|
|
|
+ /*_renderList = scene.__webglObjects;
|
|
|
|
|
|
for ( j = 0, jl = renderList.length; j < jl; j ++ ) {
|
|
|
|
|
@@ -36737,7 +36774,8 @@ THREE.DepthPassPlugin = function () {
|
|
|
|
|
|
}
|
|
|
|
|
|
- }
|
|
|
+ }*/
|
|
|
+
|
|
|
|
|
|
// render regular objects
|
|
|
|
|
@@ -36745,54 +36783,51 @@ THREE.DepthPassPlugin = function () {
|
|
|
|
|
|
for ( j = 0, jl = renderList.length; j < jl; j ++ ) {
|
|
|
|
|
|
- webglObject = renderList[ j ];
|
|
|
-
|
|
|
- if ( webglObject.render ) {
|
|
|
+ webglObject = _renderList[ j ];
|
|
|
|
|
|
- object = webglObject.object;
|
|
|
- buffer = webglObject.buffer;
|
|
|
+ object = webglObject.object;
|
|
|
+ buffer = webglObject.buffer;
|
|
|
|
|
|
- // todo: create proper depth material for particles
|
|
|
+ // todo: create proper depth material for particles
|
|
|
|
|
|
- if ( object instanceof THREE.PointCloud && ! object.customDepthMaterial ) continue;
|
|
|
+ if ( object instanceof THREE.PointCloud && ! object.customDepthMaterial ) continue;
|
|
|
|
|
|
- objectMaterial = getObjectMaterial( object );
|
|
|
+ objectMaterial = getObjectMaterial( object );
|
|
|
|
|
|
- if ( objectMaterial ) _renderer.setMaterialFaces( object.material );
|
|
|
+ if ( objectMaterial ) _renderer.setMaterialFaces( object.material );
|
|
|
|
|
|
- useMorphing = object.geometry.morphTargets !== undefined && object.geometry.morphTargets.length > 0 && objectMaterial.morphTargets;
|
|
|
- useSkinning = object instanceof THREE.SkinnedMesh && objectMaterial.skinning;
|
|
|
+ useMorphing = object.geometry.morphTargets !== undefined && object.geometry.morphTargets.length > 0 && objectMaterial.morphTargets;
|
|
|
+ useSkinning = object instanceof THREE.SkinnedMesh && objectMaterial.skinning;
|
|
|
|
|
|
- if ( object.customDepthMaterial ) {
|
|
|
+ if ( object.customDepthMaterial ) {
|
|
|
|
|
|
- material = object.customDepthMaterial;
|
|
|
+ material = object.customDepthMaterial;
|
|
|
|
|
|
- } else if ( useSkinning ) {
|
|
|
+ } else if ( useSkinning ) {
|
|
|
|
|
|
- material = useMorphing ? _depthMaterialMorphSkin : _depthMaterialSkin;
|
|
|
+ material = useMorphing ? _depthMaterialMorphSkin : _depthMaterialSkin;
|
|
|
|
|
|
- } else if ( useMorphing ) {
|
|
|
+ } else if ( useMorphing ) {
|
|
|
|
|
|
- material = _depthMaterialMorph;
|
|
|
+ material = _depthMaterialMorph;
|
|
|
|
|
|
- } else {
|
|
|
+ } else {
|
|
|
|
|
|
- material = _depthMaterial;
|
|
|
+ material = _depthMaterial;
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- if ( buffer instanceof THREE.BufferGeometry ) {
|
|
|
+ if ( buffer instanceof THREE.BufferGeometry ) {
|
|
|
|
|
|
- _renderer.renderBufferDirect( camera, scene.__lights, fog, material, buffer, object );
|
|
|
+ _renderer.renderBufferDirect( camera, scene.__lights, fog, material, buffer, object );
|
|
|
|
|
|
- } else {
|
|
|
-
|
|
|
- _renderer.renderBuffer( camera, scene.__lights, fog, material, buffer, object );
|
|
|
+ } else {
|
|
|
|
|
|
- }
|
|
|
+ _renderer.renderBuffer( camera, scene.__lights, fog, material, buffer, object );
|
|
|
|
|
|
}
|
|
|
|
|
|
+
|
|
|
}
|
|
|
|
|
|
// set matrices and render immediate objects
|
|
@@ -36823,6 +36858,33 @@ THREE.DepthPassPlugin = function () {
|
|
|
_gl.enable( _gl.BLEND );
|
|
|
|
|
|
};
|
|
|
+
|
|
|
+ function projectObject(scene, object,camera){
|
|
|
+
|
|
|
+ if ( object.visible ) {
|
|
|
+
|
|
|
+ var webglObjects = scene.__webglObjects[object.id];
|
|
|
+
|
|
|
+ if (webglObjects && (object.frustumCulled === false || _frustum.intersectsObject( object ) === true) ) {
|
|
|
+
|
|
|
+
|
|
|
+ for (var i = 0, l = webglObjects.length; i < l; i++){
|
|
|
+
|
|
|
+ var webglObject = webglObjects[i];
|
|
|
+
|
|
|
+ object._modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
|
|
|
+ _renderList.push(webglObject);
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for(var i = 0, l = object.children.length; i < l; i++) {
|
|
|
+
|
|
|
+ projectObject(scene, object.children[i], camera);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
// For the moment just ignore objects that have multiple materials with different animation methods
|
|
|
// Only the first material will be taken into account for deciding which depth material to use
|