提交 52a7137f 编写于 作者: T tschw

ShadowMap: Refactored repetitive code.

Includes more robust handling of custom materials (see #7153).
上级 30a5fb2d
......@@ -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 );
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册