|
|
@@ -1,5 +1,5 @@
|
|
|
import ShadowBaseNode, { shadowPositionWorld } from './ShadowBaseNode.js';
|
|
|
-import { float, vec2, vec3, int, Fn } from '../tsl/TSLBase.js';
|
|
|
+import { float, vec2, vec3, vec4, int, Fn } from '../tsl/TSLBase.js';
|
|
|
import { reference } from '../accessors/ReferenceNode.js';
|
|
|
import { texture, textureLoad } from '../accessors/TextureNode.js';
|
|
|
import { cubeTexture } from '../accessors/CubeTextureNode.js';
|
|
|
@@ -21,6 +21,8 @@ import { getShadowMaterial, disposeShadowMaterial, BasicShadowFilter, PCFShadowF
|
|
|
import ChainMap from '../../renderers/common/ChainMap.js';
|
|
|
import { textureSize } from '../accessors/TextureSizeNode.js';
|
|
|
import { uv } from '../accessors/UV.js';
|
|
|
+import { positionLocal } from '../accessors/Position.js';
|
|
|
+import { uniform } from '../core/UniformNode.js';
|
|
|
|
|
|
//
|
|
|
|
|
|
@@ -506,7 +508,27 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
const shadowIntensity = reference( 'intensity', 'float', shadow ).setGroup( renderGroup );
|
|
|
const normalBias = reference( 'normalBias', 'float', shadow ).setGroup( renderGroup );
|
|
|
|
|
|
- const shadowPosition = lightShadowMatrix( light ).mul( shadowPositionWorld.add( normalWorld.mul( normalBias ) ) );
|
|
|
+ const shadowMatrix = lightShadowMatrix( light );
|
|
|
+ const shadowNormalBias = normalWorld.mul( normalBias );
|
|
|
+
|
|
|
+ let shadowPosition;
|
|
|
+
|
|
|
+ if ( ! renderer.highPrecision || builder.material.receivedShadowPositionNode || builder.context.shadowPositionWorld ) {
|
|
|
+
|
|
|
+ shadowPosition = shadowMatrix.mul( shadowPositionWorld.add( shadowNormalBias ) );
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ const highpShadowModelMatrix = uniform( 'mat4' ).onObjectUpdate( ( { object }, self ) => {
|
|
|
+
|
|
|
+ return self.value.multiplyMatrices( shadowMatrix.value, object.matrixWorld );
|
|
|
+
|
|
|
+ } );
|
|
|
+
|
|
|
+ shadowPosition = highpShadowModelMatrix.mul( positionLocal ).add( shadowMatrix.mul( vec4( shadowNormalBias, 0 ) ) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
const shadowCoord = this.setupShadowCoord( builder, shadowPosition );
|
|
|
|
|
|
//
|