Skip to content

Commit 214ae88

Browse files
sunagRuthySheffi
authored andcommitted
TSL: Cache getShadowRenderObjectFunction() (mrdoob#30969)
1 parent 6f201db commit 214ae88

File tree

1 file changed

+34
-9
lines changed

1 file changed

+34
-9
lines changed

src/nodes/lighting/ShadowNode.js

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ import { lightShadowMatrix } from '../accessors/Lights.js';
1717
import { resetRendererAndSceneState, restoreRendererAndSceneState } from '../../renderers/common/RendererUtils.js';
1818
import { getDataFromObject } from '../core/NodeUtils.js';
1919
import { getShadowMaterial, BasicShadowFilter, PCFShadowFilter, PCFSoftShadowFilter, VSMShadowFilter } from './ShadowFilterNode.js';
20+
import ChainMap from '../../renderers/common/ChainMap.js';
21+
22+
//
23+
24+
const _shadowRenderObjectLibrary = /*@__PURE__*/ new ChainMap();
25+
const _shadowRenderObjectKeys = [];
2026

2127
/**
2228
* Creates a function to render shadow objects in a scene.
@@ -38,25 +44,44 @@ import { getShadowMaterial, BasicShadowFilter, PCFShadowFilter, PCFSoftShadowFil
3844
*/
3945
export const getShadowRenderObjectFunction = ( renderer, shadow, shadowType, useVelocity ) => {
4046

41-
return ( object, scene, _camera, geometry, material, group, ...params ) => {
47+
_shadowRenderObjectKeys[ 0 ] = renderer;
48+
_shadowRenderObjectKeys[ 1 ] = shadow;
49+
50+
let renderObjectFunction = _shadowRenderObjectLibrary.get( _shadowRenderObjectKeys );
51+
52+
if ( renderObjectFunction === undefined || ( renderObjectFunction.shadowType !== shadowType || renderObjectFunction.useVelocity !== useVelocity ) ) {
53+
54+
renderObjectFunction = ( object, scene, _camera, geometry, material, group, ...params ) => {
55+
56+
if ( object.castShadow === true || ( object.receiveShadow && shadowType === VSMShadowMap ) ) {
4257

43-
if ( object.castShadow === true || ( object.receiveShadow && shadowType === VSMShadowMap ) ) {
58+
if ( useVelocity ) {
4459

45-
if ( useVelocity ) {
60+
getDataFromObject( object ).useVelocity = true;
4661

47-
getDataFromObject( object ).useVelocity = true;
62+
}
63+
64+
object.onBeforeShadow( renderer, object, _camera, shadow.camera, geometry, scene.overrideMaterial, group );
65+
66+
renderer.renderObject( object, scene, _camera, geometry, material, group, ...params );
67+
68+
object.onAfterShadow( renderer, object, _camera, shadow.camera, geometry, scene.overrideMaterial, group );
4869

4970
}
5071

51-
object.onBeforeShadow( renderer, object, _camera, shadow.camera, geometry, scene.overrideMaterial, group );
72+
};
5273

53-
renderer.renderObject( object, scene, _camera, geometry, material, group, ...params );
74+
renderObjectFunction.shadowType = shadowType;
75+
renderObjectFunction.useVelocity = useVelocity;
5476

55-
object.onAfterShadow( renderer, object, _camera, shadow.camera, geometry, scene.overrideMaterial, group );
77+
_shadowRenderObjectLibrary.set( _shadowRenderObjectKeys, renderObjectFunction );
5678

57-
}
79+
}
80+
81+
_shadowRenderObjectKeys[ 0 ] = null;
82+
_shadowRenderObjectKeys[ 1 ] = null;
5883

59-
};
84+
return renderObjectFunction;
6085

6186
};
6287

0 commit comments

Comments
 (0)