소스 검색

fix shadowmapplugin

OpenShift guest 11 년 전
부모
커밋
a237eec339
1개의 변경된 파일61개의 추가작업 그리고 56개의 파일을 삭제
  1. 61 56
      src/extras/renderers/plugins/ShadowMapPlugin.js

+ 61 - 56
src/extras/renderers/plugins/ShadowMapPlugin.js

@@ -14,7 +14,9 @@ THREE.ShadowMapPlugin = function () {
 	_min = new THREE.Vector3(),
 	_min = new THREE.Vector3(),
 	_max = new THREE.Vector3(),
 	_max = new THREE.Vector3(),
 
 
-	_matrixPosition = new THREE.Vector3();
+	_matrixPosition = new THREE.Vector3(),
+	
+	_renderList = [];
 
 
 	this.init = function ( renderer ) {
 	this.init = function ( renderer ) {
 
 
@@ -51,7 +53,6 @@ THREE.ShadowMapPlugin = function () {
 		shadowMap, shadowMatrix, shadowCamera,
 		shadowMap, shadowMatrix, shadowCamera,
 		program, buffer, material,
 		program, buffer, material,
 		webglObject, object, light,
 		webglObject, object, light,
-		renderList,
 
 
 		lights = [],
 		lights = [],
 		k = 0,
 		k = 0,
@@ -230,85 +231,62 @@ THREE.ShadowMapPlugin = function () {
 
 
 			// set object matrices & frustum culling
 			// 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
 			// render regular objects
 
 
 			var objectMaterial, useMorphing, useSkinning;
 			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
 			// set matrices and render immediate objects
 
 
-			renderList = scene.__webglObjectsImmediate;
+			var renderList = scene.__webglObjectsImmediate;
 
 
 			for ( j = 0, jl = renderList.length; j < jl; j ++ ) {
 			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 ) {
 	function createVirtualLight( light, cascade ) {