Explorar o código

WebGLShadowMap: Support MeshFaceMaterial.

Mr.doob %!s(int64=10) %!d(string=hai) anos
pai
achega
b9fe0a8fcc
Modificáronse 2 ficheiros con 48 adicións e 28 borrados
  1. 4 2
      src/renderers/WebGLRenderer.js
  2. 44 26
      src/renderers/webgl/WebGLShadowMap.js

+ 4 - 2
src/renderers/WebGLRenderer.js

@@ -1727,9 +1727,11 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 					material = materials[ j ];
 
-					if ( material.visible === false ) continue;
+					if ( material.visible ) {
 
-					_this.renderBufferDirect( camera, lights, fog, geometry, material, object );
+						_this.renderBufferDirect( camera, lights, fog, geometry, material, object );
+
+					}
 
 				}
 

+ 44 - 26
src/renderers/webgl/WebGLShadowMap.js

@@ -199,7 +199,6 @@ THREE.WebGLShadowMap = function ( _renderer, _lights, _objects ) {
 			// render regular objects
 
 			var webglObject, object, geometry, material;
-			var objectMaterial, useMorphing, useSkinning;
 
 			for ( var j = 0, jl = _renderList.length; j < jl; j ++ ) {
 
@@ -207,45 +206,30 @@ THREE.WebGLShadowMap = function ( _renderer, _lights, _objects ) {
 
 				object = webglObject.object;
 				geometry = _objects.update( object );
+				material = object.material;
 
-				objectMaterial = object.material;
+				if ( material instanceof THREE.MeshFaceMaterial ) {
 
-				if ( objectMaterial instanceof THREE.MeshFaceMaterial ) {
+					var materials = material.materials;
 
-					// 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 for shadow maps
+					for ( var k = 0, kl = materials.length; k < kl; k ++ ) {
 
-					objectMaterial = object.material.materials[ 0 ];
+						material = materials[ k ];
 
-					if ( objectMaterial.visible === false ) continue;
+						if ( material.visible ) {
 
-				}
-
-				useMorphing = object.geometry.morphTargets !== undefined && object.geometry.morphTargets.length > 0 && objectMaterial.morphTargets;
-				useSkinning = object instanceof THREE.SkinnedMesh && objectMaterial.skinning;
-
-				if ( object.customDepthMaterial ) {
-
-					material = object.customDepthMaterial;
+							_renderer.renderBufferDirect( shadowCamera, _lights, null, geometry, getDepthMaterial( material ), object );
 
-				} else if ( useSkinning ) {
+						}
 
-					material = useMorphing ? _depthMaterialMorphSkin : _depthMaterialSkin;
-
-				} else if ( useMorphing ) {
-
-					material = _depthMaterialMorph;
+					}
 
 				} else {
 
-					material = _depthMaterial;
+					_renderer.renderBufferDirect( shadowCamera, _lights, null, geometry, getDepthMaterial( material ), object );
 
 				}
 
-				material.wireframe = objectMaterial.wireframe;
-
-				_renderer.renderBufferDirect( shadowCamera, _lights, null, geometry, material, object );
-
 			}
 
 		}
@@ -270,6 +254,40 @@ THREE.WebGLShadowMap = function ( _renderer, _lights, _objects ) {
 
 	};
 
+	function getDepthMaterial( object ) {
+
+		var material;
+
+		var objectGeometry = object.geometry;
+		var objectMaterial = object.material;
+
+		var useMorphing = objectGeometry.morphTargets !== undefined && objectGeometry.morphTargets.length > 0 && objectMaterial.morphTargets;
+		var useSkinning = object instanceof THREE.SkinnedMesh && objectMaterial.skinning;
+
+		if ( object.customDepthMaterial ) {
+
+			material = object.customDepthMaterial;
+
+		} else if ( useSkinning ) {
+
+			material = useMorphing ? _depthMaterialMorphSkin : _depthMaterialSkin;
+
+		} else if ( useMorphing ) {
+
+			material = _depthMaterialMorph;
+
+		} else {
+
+			material = _depthMaterial;
+
+		}
+
+		material.wireframe = objectMaterial.wireframe;
+
+		return material;
+
+	}
+
 	function projectObject( object, camera ) {
 
 		if ( object.visible === false ) return;