diff --git a/examples/jsm/nodes/lighting/AnalyticLightNode.js b/examples/jsm/nodes/lighting/AnalyticLightNode.js index bef0f6481b9657..1a18989d8a8ba6 100644 --- a/examples/jsm/nodes/lighting/AnalyticLightNode.js +++ b/examples/jsm/nodes/lighting/AnalyticLightNode.js @@ -167,9 +167,25 @@ class AnalyticLightNode extends LightingNode { light.shadow.updateMatrices( light ); + const currentRenderTarget = renderer.getRenderTarget(); + const currentRenderObjectFunction = renderer.getRenderObjectFunction(); + + renderer.setRenderObjectFunction( ( object, ...params ) => { + + if ( object.castShadow === true ) { + + renderer.renderObject( object, ...params ); + + } + + } ); + renderer.setRenderTarget( rtt ); + renderer.render( scene, light.shadow.camera ); - renderer.setRenderTarget( null ); + + renderer.setRenderTarget( currentRenderTarget ); + renderer.setRenderObjectFunction( currentRenderObjectFunction ); scene.overrideMaterial = null; diff --git a/examples/jsm/renderers/common/Renderer.js b/examples/jsm/renderers/common/Renderer.js index f469ef80f96b43..ab4d9ddac81855 100644 --- a/examples/jsm/renderers/common/Renderer.js +++ b/examples/jsm/renderers/common/Renderer.js @@ -87,6 +87,9 @@ class Renderer { this._activeCubeFace = 0; this._activeMipmapLevel = 0; + this._renderObjectFunction = null; + this._currentRenderObjectFunction = null; + this._initialized = false; this._initPromise = null; @@ -179,7 +182,8 @@ class Renderer { const nodeFrame = this._nodes.nodeFrame; const previousRenderId = nodeFrame.renderId; - const previousRenderState = this._currentRenderContext; + const previousRenderContext = this._currentRenderContext; + const previousRenderObjectFunction = this._currentRenderObjectFunction; // @@ -191,6 +195,7 @@ class Renderer { const activeMipmapLevel = this._activeMipmapLevel; this._currentRenderContext = renderContext; + this._currentRenderObjectFunction = this._renderObjectFunction || this.renderObject; nodeFrame.renderId ++; @@ -332,7 +337,9 @@ class Renderer { // restore render tree nodeFrame.renderId = previousRenderId; - this._currentRenderContext = previousRenderState; + + this._currentRenderContext = previousRenderContext; + this._currentRenderObjectFunction = previousRenderObjectFunction; this._lastRenderContext = renderContext; @@ -642,6 +649,18 @@ class Renderer { } + setRenderObjectFunction( renderObjectFunction ) { + + this._renderObjectFunction = renderObjectFunction; + + } + + getRenderObjectFunction() { + + return this._renderObjectFunction; + + } + async compute( computeNodes ) { if ( this._initialized === false ) await this.init(); @@ -825,7 +844,7 @@ class Renderer { const renderItem = renderList[ i ]; // @TODO: Add support for multiple materials per object. This will require to extract - // the material from the renderItem object and pass it with its group data to _renderObject(). + // the material from the renderItem object and pass it with its group data to renderObject(). const { object, geometry, material, group } = renderItem; @@ -850,7 +869,7 @@ class Renderer { this.backend.updateViewport( this._currentRenderContext ); - this._renderObject( object, scene, camera2, geometry, material, group, lightsNode ); + this._currentRenderObjectFunction( object, scene, camera2, geometry, material, group, lightsNode ); } @@ -858,7 +877,7 @@ class Renderer { } else { - this._renderObject( object, scene, camera, geometry, material, group, lightsNode ); + this._currentRenderObjectFunction( object, scene, camera, geometry, material, group, lightsNode ); } @@ -866,7 +885,7 @@ class Renderer { } - _renderObject( object, scene, camera, geometry, material, group, lightsNode ) { + renderObject( object, scene, camera, geometry, material, group, lightsNode ) { material = scene.overrideMaterial !== null ? scene.overrideMaterial : material; diff --git a/examples/webgpu_compute_particles_rain.html b/examples/webgpu_compute_particles_rain.html index c71fe3c14c7aaf..14027c18317509 100644 --- a/examples/webgpu_compute_particles_rain.html +++ b/examples/webgpu_compute_particles_rain.html @@ -62,7 +62,6 @@ const { innerWidth, innerHeight } = window; camera = new THREE.PerspectiveCamera( 60, innerWidth / innerHeight, .1, 110 ); - camera.layers.enable( 2 ); // @TODO: Fix .castShadow and remove it camera.position.set( 40, 8, 0 ); camera.lookAt( 0, 0, 0 ); @@ -234,8 +233,6 @@ const rainParticles = new THREE.Mesh( new THREE.PlaneGeometry( .1, 2 ), rainMaterial ); rainParticles.isInstancedMesh = true; rainParticles.count = instanceCount; - rainParticles.layers.disableAll(); - rainParticles.layers.enable( 2 ); scene.add( rainParticles ); // ripple @@ -276,8 +273,6 @@ const rippleParticles = new THREE.Mesh( rippleGeometry, rippleMaterial ); rippleParticles.isInstancedMesh = true; rippleParticles.count = instanceCount; - rippleParticles.layers.disableAll(); - rippleParticles.layers.enable( 2 ); scene.add( rippleParticles ); // floor geometry