@@ -17,6 +17,12 @@ import { lightShadowMatrix } from '../accessors/Lights.js';
1717import { resetRendererAndSceneState , restoreRendererAndSceneState } from '../../renderers/common/RendererUtils.js' ;
1818import { getDataFromObject } from '../core/NodeUtils.js' ;
1919import { 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 */
3945export 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