|
@@ -16,15 +16,20 @@ 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,
|
|
|
|
|
|
- var cubeDirections = [ new THREE.Vector3( 1, 0, 0 ), new THREE.Vector3( - 1, 0, 0 ), new THREE.Vector3( 0, 0, 1 ),
|
|
|
+ _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 ) ];
|
|
|
|
|
|
- var cubeUps = [ new THREE.Vector3( 0, 1, 0 ), new THREE.Vector3( 0, 1, 0 ), new THREE.Vector3( 0, 1, 0 ),
|
|
|
+ var cubeUps = [ new THREE.Vector3( 0, 1, 0 ), new THREE.Vector3( 0, 1, 0 ), new THREE.Vector3( 0, 1, 0 ),
|
|
|
new THREE.Vector3( 0, 1, 0 ), new THREE.Vector3( 0, 0, 1 ), new THREE.Vector3( 0, 0, - 1 ) ];
|
|
|
|
|
|
var cube2DViewPorts = [ new THREE.Vector4(), new THREE.Vector4(), new THREE.Vector4(),
|
|
@@ -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;
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
//
|
|
|
|
|
@@ -160,22 +131,18 @@ THREE.WebGLShadowMap = function ( _renderer, _lights, _objects ) {
|
|
|
var vpWidth = light.shadowMapWidth / 4.0;
|
|
|
var vpHeight = light.shadowMapHeight / 2.0;
|
|
|
|
|
|
- /*
|
|
|
- *
|
|
|
- * These viewports map a cube-map onto a 2D texture with the
|
|
|
- * following orientation:
|
|
|
- *
|
|
|
- * xzXZ
|
|
|
- * y Y
|
|
|
- *
|
|
|
- * Y - Positive y direction
|
|
|
- * y - Negative y direction
|
|
|
- * X - Positive x direction
|
|
|
- * x - Negative x direction
|
|
|
- * Z - Positive z direction
|
|
|
- * z - Negative z direction
|
|
|
- *
|
|
|
- */
|
|
|
+ // These viewports map a cube-map onto a 2D texture with the
|
|
|
+ // following orientation:
|
|
|
+ //
|
|
|
+ // xzXZ
|
|
|
+ // y Y
|
|
|
+ //
|
|
|
+ // X - Positive x direction
|
|
|
+ // x - Negative x direction
|
|
|
+ // Y - Positive y direction
|
|
|
+ // y - Negative y direction
|
|
|
+ // Z - Positive z direction
|
|
|
+ // z - Negative z direction
|
|
|
|
|
|
// positive X
|
|
|
cube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight );
|
|
@@ -203,7 +170,7 @@ THREE.WebGLShadowMap = function ( _renderer, _lights, _objects ) {
|
|
|
|
|
|
var shadowFilter = THREE.LinearFilter;
|
|
|
|
|
|
- if ( scope.type === THREE.PCFSoftShadowMap) {
|
|
|
+ if ( scope.type === THREE.PCFSoftShadowMap ) {
|
|
|
|
|
|
shadowFilter = THREE.NearestFilter;
|
|
|
|
|
@@ -258,7 +225,7 @@ THREE.WebGLShadowMap = function ( _renderer, _lights, _objects ) {
|
|
|
_renderer.getViewport( _vector4 );
|
|
|
|
|
|
_renderer.setRenderTarget( shadowMap );
|
|
|
- _renderer.clear();
|
|
|
+ _renderer.clear();
|
|
|
|
|
|
// render shadow map for each cube face (if omni-directional) or
|
|
|
// run a single pass if not
|
|
@@ -377,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;
|
|
|
|
|
|
}
|
|
|
|
|
@@ -426,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 );
|
|
|
|
|
|
}
|
|
|
|