|
@@ -9160,6 +9160,10 @@ function WebGLShadowMap( _renderer, _lights, _objects, capabilities ) {
|
|
|
}
|
|
|
|
|
|
var shadowCamera = shadow.camera;
|
|
|
+ var shadowMatrix = shadow.matrix;
|
|
|
+
|
|
|
+ _lightPositionWorld.setFromMatrixPosition( light.matrixWorld );
|
|
|
+ shadowCamera.position.copy( _lightPositionWorld );
|
|
|
|
|
|
_shadowMapSize.copy( shadow.mapSize );
|
|
|
_shadowMapSize.min( _maxShadowMapSize );
|
|
@@ -9201,11 +9205,34 @@ 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
|
|
|
+
|
|
|
+ shadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );
|
|
|
+
|
|
|
} else {
|
|
|
|
|
|
faceCount = 1;
|
|
|
isPointLight = false;
|
|
|
|
|
|
+ _lookTarget.setFromMatrixPosition( light.target.matrixWorld );
|
|
|
+ shadowCamera.lookAt( _lookTarget );
|
|
|
+ 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 );
|
|
|
+
|
|
|
}
|
|
|
|
|
|
if ( shadow.map === null ) {
|
|
@@ -9226,10 +9253,6 @@ function WebGLShadowMap( _renderer, _lights, _objects, capabilities ) {
|
|
|
}
|
|
|
|
|
|
var shadowMap = shadow.map;
|
|
|
- var shadowMatrix = shadow.matrix;
|
|
|
-
|
|
|
- _lightPositionWorld.setFromMatrixPosition( light.matrixWorld );
|
|
|
- shadowCamera.position.copy( _lightPositionWorld );
|
|
|
|
|
|
_renderer.setRenderTarget( shadowMap );
|
|
|
_renderer.clear();
|
|
@@ -9245,32 +9268,14 @@ function WebGLShadowMap( _renderer, _lights, _objects, capabilities ) {
|
|
|
_lookTarget.add( cubeDirections[ face ] );
|
|
|
shadowCamera.up.copy( cubeUps[ face ] );
|
|
|
shadowCamera.lookAt( _lookTarget );
|
|
|
+ shadowCamera.updateMatrixWorld();
|
|
|
+ shadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld );
|
|
|
|
|
|
var vpDimensions = cube2DViewPorts[ face ];
|
|
|
_state.viewport( vpDimensions );
|
|
|
|
|
|
- } else {
|
|
|
-
|
|
|
- _lookTarget.setFromMatrixPosition( light.target.matrixWorld );
|
|
|
- shadowCamera.lookAt( _lookTarget );
|
|
|
-
|
|
|
}
|
|
|
|
|
|
- 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 );
|
|
@@ -21123,73 +21128,79 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
if ( ! object.visible ) return;
|
|
|
|
|
|
- if ( object.isLight ) {
|
|
|
+ var visible = object.layers.test( camera.layers );
|
|
|
|
|
|
- lights.push( object );
|
|
|
+ if ( visible ) {
|
|
|
|
|
|
- } else if ( object.isSprite ) {
|
|
|
+ if ( object.isLight ) {
|
|
|
|
|
|
- if ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {
|
|
|
+ lights.push( object );
|
|
|
|
|
|
- sprites.push( object );
|
|
|
+ } else if ( object.isSprite ) {
|
|
|
|
|
|
- }
|
|
|
+ if ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {
|
|
|
|
|
|
- } else if ( object.isLensFlare ) {
|
|
|
+ sprites.push( object );
|
|
|
|
|
|
- lensFlares.push( object );
|
|
|
+ }
|
|
|
|
|
|
- } else if ( object.isImmediateRenderObject ) {
|
|
|
+ } else if ( object.isLensFlare ) {
|
|
|
|
|
|
- if ( sortObjects ) {
|
|
|
+ lensFlares.push( object );
|
|
|
|
|
|
- _vector3.setFromMatrixPosition( object.matrixWorld )
|
|
|
- .applyMatrix4( _projScreenMatrix );
|
|
|
+ } else if ( object.isImmediateRenderObject ) {
|
|
|
|
|
|
- }
|
|
|
+ if ( sortObjects ) {
|
|
|
|
|
|
- currentRenderList.push( object, null, object.material, _vector3.z, null );
|
|
|
+ _vector3.setFromMatrixPosition( object.matrixWorld )
|
|
|
+ .applyMatrix4( _projScreenMatrix );
|
|
|
|
|
|
- } else if ( object.isMesh || object.isLine || object.isPoints ) {
|
|
|
+ }
|
|
|
|
|
|
- if ( object.isSkinnedMesh ) {
|
|
|
+ currentRenderList.push( object, null, object.material, _vector3.z, null );
|
|
|
|
|
|
- object.skeleton.update();
|
|
|
+ } else if ( object.isMesh || object.isLine || object.isPoints ) {
|
|
|
|
|
|
- }
|
|
|
+ if ( object.isSkinnedMesh ) {
|
|
|
|
|
|
- if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {
|
|
|
+ object.skeleton.update();
|
|
|
|
|
|
- if ( sortObjects ) {
|
|
|
+ }
|
|
|
|
|
|
- _vector3.setFromMatrixPosition( object.matrixWorld )
|
|
|
- .applyMatrix4( _projScreenMatrix );
|
|
|
+ if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {
|
|
|
|
|
|
- }
|
|
|
+ if ( sortObjects ) {
|
|
|
|
|
|
- var geometry = objects.update( object );
|
|
|
- var material = object.material;
|
|
|
+ _vector3.setFromMatrixPosition( object.matrixWorld )
|
|
|
+ .applyMatrix4( _projScreenMatrix );
|
|
|
|
|
|
- if ( Array.isArray( material ) ) {
|
|
|
+ }
|
|
|
|
|
|
- var groups = geometry.groups;
|
|
|
+ var geometry = objects.update( object );
|
|
|
+ var material = object.material;
|
|
|
|
|
|
- for ( var i = 0, l = groups.length; i < l; i ++ ) {
|
|
|
+ if ( Array.isArray( material ) ) {
|
|
|
|
|
|
- var group = groups[ i ];
|
|
|
- var groupMaterial = material[ group.materialIndex ];
|
|
|
+ var groups = geometry.groups;
|
|
|
|
|
|
- if ( groupMaterial && groupMaterial.visible ) {
|
|
|
+ for ( var i = 0, l = groups.length; i < l; i ++ ) {
|
|
|
+
|
|
|
+ var group = groups[ i ];
|
|
|
+ var groupMaterial = material[ group.materialIndex ];
|
|
|
|
|
|
- currentRenderList.push( object, geometry, groupMaterial, _vector3.z, group );
|
|
|
+ if ( groupMaterial && groupMaterial.visible ) {
|
|
|
+
|
|
|
+ currentRenderList.push( object, geometry, groupMaterial, _vector3.z, group );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
- }
|
|
|
+ } else if ( material.visible ) {
|
|
|
|
|
|
- } else if ( material.visible ) {
|
|
|
+ currentRenderList.push( object, geometry, material, _vector3.z, null );
|
|
|
|
|
|
- currentRenderList.push( object, geometry, material, _vector3.z, null );
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
@@ -21257,8 +21268,6 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
function renderObject( object, scene, camera, geometry, material, group ) {
|
|
|
|
|
|
- if ( object.layers.test( camera.layers ) === false ) return;
|
|
|
-
|
|
|
object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
|
|
|
object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
|
|
|
|
|
@@ -22235,18 +22244,7 @@ function WebGLRenderer( parameters ) {
|
|
|
}
|
|
|
|
|
|
_lights.pointShadowMap[ pointLength ] = shadowMap;
|
|
|
-
|
|
|
- if ( _lights.pointShadowMatrix[ pointLength ] === undefined ) {
|
|
|
-
|
|
|
- _lights.pointShadowMatrix[ pointLength ] = new Matrix4();
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- // for point lights we set the shadow matrix to be a translation-only matrix
|
|
|
- // equal to inverse of the light's position
|
|
|
- _vector3.setFromMatrixPosition( light.matrixWorld ).negate();
|
|
|
- _lights.pointShadowMatrix[ pointLength ].identity().setPosition( _vector3 );
|
|
|
-
|
|
|
+ _lights.pointShadowMatrix[ pointLength ] = light.shadow.matrix;
|
|
|
_lights.point[ pointLength ] = uniforms;
|
|
|
|
|
|
pointLength ++;
|