|
@@ -135,6 +135,7 @@ function WebGLShadowMap( _renderer, _lights, _objects, capabilities ) {
|
|
|
}
|
|
|
|
|
|
var shadowCamera = shadow.camera;
|
|
|
+ var shadowMatrix = shadow.matrix;
|
|
|
|
|
|
_shadowMapSize.copy( shadow.mapSize );
|
|
|
_shadowMapSize.min( _maxShadowMapSize );
|
|
@@ -176,11 +177,31 @@ function WebGLShadowMap( _renderer, _lights, _objects, capabilities ) {
|
|
|
_shadowMapSize.x *= 4.0;
|
|
|
_shadowMapSize.y *= 2.0;
|
|
|
|
|
|
+
|
|
|
+ // for point lights we set the shadow matrix to be a translation-only matrix
|
|
|
+ // equal to inverse of the light's position
|
|
|
+
|
|
|
+ var elements = light.matrixWorld.elements;
|
|
|
+ shadowMatrix.makeTranslation( - elements[ 12 ], - elements[ 13 ], - elements[ 14 ] );
|
|
|
+
|
|
|
} else {
|
|
|
|
|
|
faceCount = 1;
|
|
|
isPointLight = false;
|
|
|
|
|
|
+
|
|
|
+ // compute shadow matrix
|
|
|
+
|
|
|
+ shadowMatrix.set(
|
|
|
+ 0.5, 0.0, 0.0, 0.5,
|
|
|
+ 0.0, 0.5, 0.0, 0.5,
|
|
|
+ 0.0, 0.0, 0.5, 0.5,
|
|
|
+ 0.0, 0.0, 0.0, 1.0
|
|
|
+ );
|
|
|
+
|
|
|
+ shadowMatrix.multiply( shadowCamera.projectionMatrix );
|
|
|
+ shadowMatrix.multiply( shadowCamera.matrixWorldInverse );
|
|
|
+
|
|
|
}
|
|
|
|
|
|
if ( shadow.map === null ) {
|
|
@@ -201,7 +222,6 @@ function WebGLShadowMap( _renderer, _lights, _objects, capabilities ) {
|
|
|
}
|
|
|
|
|
|
var shadowMap = shadow.map;
|
|
|
- var shadowMatrix = shadow.matrix;
|
|
|
|
|
|
_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );
|
|
|
shadowCamera.position.copy( _lightPositionWorld );
|
|
@@ -234,18 +254,6 @@ function WebGLShadowMap( _renderer, _lights, _objects, capabilities ) {
|
|
|
shadowCamera.updateMatrixWorld();
|
|
|
shadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld );
|
|
|
|
|
|
- // compute shadow matrix
|
|
|
-
|
|
|
- shadowMatrix.set(
|
|
|
- 0.5, 0.0, 0.0, 0.5,
|
|
|
- 0.0, 0.5, 0.0, 0.5,
|
|
|
- 0.0, 0.0, 0.5, 0.5,
|
|
|
- 0.0, 0.0, 0.0, 1.0
|
|
|
- );
|
|
|
-
|
|
|
- shadowMatrix.multiply( shadowCamera.projectionMatrix );
|
|
|
- shadowMatrix.multiply( shadowCamera.matrixWorldInverse );
|
|
|
-
|
|
|
// update camera matrices and frustum
|
|
|
|
|
|
_projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );
|