|
@@ -14,7 +14,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 ) {
|
|
|
|
|
@@ -51,7 +53,6 @@ THREE.ShadowMapPlugin = function () {
|
|
|
shadowMap, shadowMatrix, shadowCamera,
|
|
|
program, buffer, material,
|
|
|
webglObject, object, light,
|
|
|
- renderList,
|
|
|
|
|
|
lights = [],
|
|
|
k = 0,
|
|
@@ -230,85 +231,62 @@ THREE.ShadowMapPlugin = function () {
|
|
|
|
|
|
// set object matrices & frustum culling
|
|
|
|
|
|
- renderList = scene.__webglObjects;
|
|
|
+ _renderList.length = 0;
|
|
|
+ projectObject(scene,scene,shadowCamera);
|
|
|
|
|
|
- for ( j = 0, jl = renderList.length; j < jl; j ++ ) {
|
|
|
-
|
|
|
- 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 ];
|
|
|
-
|
|
|
- if ( webglObject.render ) {
|
|
|
+ for ( j = 0, jl = _renderList.length; j < jl; j ++ ) {
|
|
|
|
|
|
- object = webglObject.object;
|
|
|
- buffer = webglObject.buffer;
|
|
|
+ webglObject = _renderList[ j ];
|
|
|
|
|
|
- // 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 );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -316,7 +294,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 ++ ) {
|
|
|
|
|
@@ -350,6 +328,33 @@ THREE.ShadowMapPlugin = function () {
|
|
|
}
|
|
|
|
|
|
};
|
|
|
+
|
|
|
+ function projectObject(scene, object,shadowCamera){
|
|
|
+
|
|
|
+ if ( object.visible ) {
|
|
|
+
|
|
|
+ var webglObjects = scene.__webglObjects[object.uuid];
|
|
|
+
|
|
|
+ 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 ) {
|
|
|
|