소스 검색

ShadowMap: Refactored repetitive code.

Includes more robust handling of custom materials (see #7153).
tschw 10 년 전
부모
커밋
52a7137f0b
1개의 변경된 파일56개의 추가작업 그리고 103개의 파일을 삭제
  1. 56 103
      src/renderers/webgl/WebGLShadowMap.js

+ 56 - 103
src/renderers/webgl/WebGLShadowMap.js

@@ -16,10 +16,15 @@ THREE.WebGLShadowMap = function ( _renderer, _lights, _objects ) {
 	_lookTarget = new THREE.Vector3(),
 	_lightPositionWorld = new THREE.Vector3(),
 
-	_renderList = [];
+	_renderList = [],
 
-	var _depthMaterial, _depthMaterialMorph, _depthMaterialSkin, _depthMaterialMorphSkin,
-	_distanceMaterial, _distanceMaterialMorph, _distanceMaterialSkin, _distanceMaterialMorphSkin;
+	_MorphingFlag = 1,
+	_SkinningFlag = 2,
+
+	_NumberOfMaterialVariants = _MorphingFlag | _SkinningFlag,
+
+	_depthMaterials = new Array( _NumberOfMaterialVariants ),
+	_distanceMaterials = new Array( _NumberOfMaterialVariants );
 
 	var cubeDirections = [ new THREE.Vector3( 1, 0, 0 ), new THREE.Vector3( - 1, 0, 0 ), new THREE.Vector3( 0, 0, 1 ),
 						   new THREE.Vector3( 0, 0, - 1 ), new THREE.Vector3( 0, 1, 0 ), new THREE.Vector3( 0, - 1, 0 ) ];
@@ -37,75 +42,41 @@ THREE.WebGLShadowMap = function ( _renderer, _lights, _objects ) {
 	var depthShader = THREE.ShaderLib[ "depthRGBA" ];
 	var depthUniforms = THREE.UniformsUtils.clone( depthShader.uniforms );
 
-	_depthMaterial = new THREE.ShaderMaterial( {
-		uniforms: depthUniforms,
-		vertexShader: depthShader.vertexShader,
-		fragmentShader: depthShader.fragmentShader
-	 } );
-
-	_depthMaterialMorph = new THREE.ShaderMaterial( {
-		uniforms: depthUniforms,
-		vertexShader: depthShader.vertexShader,
-		fragmentShader: depthShader.fragmentShader,
-		morphTargets: true
-	} );
-
-	_depthMaterialSkin = new THREE.ShaderMaterial( {
-		uniforms: depthUniforms,
-		vertexShader: depthShader.vertexShader,
-		fragmentShader: depthShader.fragmentShader,
-		skinning: true
-	} );
-
-	_depthMaterialMorphSkin = new THREE.ShaderMaterial( {
-		uniforms: depthUniforms,
-		vertexShader: depthShader.vertexShader,
-		fragmentShader: depthShader.fragmentShader,
-		morphTargets: true,
-		skinning: true
-	} );
-
-	_depthMaterial._shadowPass = true;
-	_depthMaterialMorph._shadowPass = true;
-	_depthMaterialSkin._shadowPass = true;
-	_depthMaterialMorphSkin._shadowPass = true;
-
-
 	var distanceShader = THREE.ShaderLib[ "distanceRGBA" ];
 	var distanceUniforms = THREE.UniformsUtils.clone( distanceShader.uniforms );
 
-	_distanceMaterial = new THREE.ShaderMaterial( {
-		uniforms: distanceUniforms,
-		vertexShader: distanceShader.vertexShader,
-		fragmentShader: distanceShader.fragmentShader
-	 } );
-
-	_distanceMaterialMorph = new THREE.ShaderMaterial( {
-		uniforms: distanceUniforms,
-		vertexShader: distanceShader.vertexShader,
-		fragmentShader: distanceShader.fragmentShader,
-		morphTargets: true
-	} );
-
-	_distanceMaterialSkin = new THREE.ShaderMaterial( {
-		uniforms: distanceUniforms,
-		vertexShader: distanceShader.vertexShader,
-		fragmentShader: distanceShader.fragmentShader,
-		skinning: true
-	} );
-
-	_distanceMaterialMorphSkin = new THREE.ShaderMaterial( {
-		uniforms: distanceUniforms,
-		vertexShader: distanceShader.vertexShader,
-		fragmentShader: distanceShader.fragmentShader,
-		morphTargets: true,
-		skinning: true
-	} );
-
-	_distanceMaterial._shadowPass = true;
-	_distanceMaterialMorph._shadowPass = true;
-	_distanceMaterialSkin._shadowPass = true;
-	_distanceMaterialMorphSkin._shadowPass = true;
+	for ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) {
+
+		var useMorphing = ( i & _MorphingFlag ) !== 0;
+	    var useSkinning = ( i & _SkinningFlag ) !== 0;
+
+
+		var depthMaterial = new THREE.ShaderMaterial( {
+			uniforms: depthUniforms,
+			vertexShader: depthShader.vertexShader,
+			fragmentShader: depthShader.fragmentShader,
+			morphTargets: useMorphing,
+			skinning: useSkinning
+		} );
+
+		depthMaterial._shadowPass = true;
+
+		_depthMaterials[ i ] = depthMaterial;
+
+
+		var distanceMaterial = new THREE.ShaderMaterial( {
+			uniforms: distanceUniforms,
+			vertexShader: distanceShader.vertexShader,
+			fragmentShader: distanceShader.fragmentShader,
+			morphTargets: useMorphing,
+			skinning: useSkinning
+		} );
+
+		distanceMaterial._shadowPass = true;
+
+		_distanceMaterials[ i ] = distanceMaterial;
+
+	}
 
 	//
 
@@ -373,48 +344,34 @@ THREE.WebGLShadowMap = function ( _renderer, _lights, _objects ) {
 
 		var geometry = object.geometry;
 
-		var useMorphing = geometry.morphTargets !== undefined && geometry.morphTargets.length > 0 && material.morphTargets;
-		var useSkinning = object instanceof THREE.SkinnedMesh && material.skinning;
-
-		var newMaterial;
+		var newMaterial = null;
 
-		var depthMaterial = _depthMaterial;
-		var depthMaterialMorph = _depthMaterialMorph;
-		var depthMaterialSkin = _depthMaterialSkin;
-		var depthMaterialMorphSkin = _depthMaterialMorphSkin;
+		var materialVariants = _depthMaterials;
+		var customMaterial = object.customDepthMaterial;
 
 		if ( isPointLight ) {
 
-			depthMaterial = _distanceMaterial;
-			depthMaterialMorph = _distanceMaterialMorph;
-			depthMaterialSkin = _distanceMaterialSkin;
-			depthMaterialMorphSkin = _distanceMaterialMorphSkin;
+			materialVariants = _distanceMaterials;
+			customMaterial = object.customDistanceMaterial;
 
 		}
 
-		if ( object.customDepthMaterial || object.customDistanceMaterial ) {
+		if ( ! customMaterial ) {
 
-			if ( isPointLight ) {
+			var useMorphing = geometry.morphTargets !== undefined &&
+					geometry.morphTargets.length > 0 && material.morphTargets;
 
-				newMaterial = object.customDistanceMaterial;
-
-			} else {
-
-				newMaterial = object.customDepthMaterial;
-
-			}
+			var useSkinning = object instanceof THREE.SkinnedMesh && material.skinning;
 
-		} else if ( useSkinning ) {
+			var variantIndex = 0;
+			if ( useMorphing ) variantIndex |= _MorphingFlag;
+			if ( useSkinning ) variantIndex |= _SkinningFlag;
 
-			newMaterial = useMorphing ? depthMaterialMorphSkin : depthMaterialSkin;
-
-		} else if ( useMorphing ) {
-
-			newMaterial = depthMaterialMorph;
+			newMaterial = materialVariants[ variantIndex ];
 
 		} else {
 
-			newMaterial = depthMaterial;
+			newMaterial = customMaterial;
 
 		}
 
@@ -422,13 +379,9 @@ THREE.WebGLShadowMap = function ( _renderer, _lights, _objects ) {
 		newMaterial.wireframe = material.wireframe;
 		newMaterial.wireframeLinewidth = material.wireframeLinewidth;
 
-		if ( isPointLight ) {
-
-			if ( newMaterial.uniforms.lightPos ) {
-
-				newMaterial.uniforms.lightPos.value.copy( lightPositionWorld );
+		if ( isPointLight && newMaterial.uniforms.lightPos !== undefined ) {
 
-			}
+			newMaterial.uniforms.lightPos.value.copy( lightPositionWorld );
 
 		}