three
Version:
JavaScript 3D library
83 lines (62 loc) • 2.06 kB
JavaScript
import { Lighting, LightsNode } from 'three/webgpu';
import DynamicLightsNode from '../tsl/lighting/DynamicLightsNode.js';
const _defaultLights = /*@__PURE__*/ new LightsNode();
/**
* A custom lighting implementation that batches supported analytic lights into
* uniform arrays so light count changes do not recompile materials.
*
* ```js
* const lighting = new DynamicLighting( { maxPointLights: 64 } );
* renderer.lighting = lighting;
* ```
*
* @augments Lighting
* @three_import import { DynamicLighting } from 'three/addons/lighting/DynamicLighting.js';
*/
export class DynamicLighting extends Lighting {
/**
* Constructs a new dynamic lighting system.
*
* @param {Object} [options={}] - Dynamic lighting configuration.
* @param {number} [options.maxDirectionalLights=8] - Maximum number of batched directional lights.
* @param {number} [options.maxPointLights=16] - Maximum number of batched point lights.
* @param {number} [options.maxSpotLights=16] - Maximum number of batched spot lights.
* @param {number} [options.maxHemisphereLights=4] - Maximum number of batched hemisphere lights.
*/
constructor( options = {} ) {
super();
this.options = {
maxDirectionalLights: 8,
maxPointLights: 16,
maxSpotLights: 16,
maxHemisphereLights: 4,
...options
};
this._nodes = new WeakMap();
}
/**
* Creates a new dynamic lights node for the given array of lights.
*
* @param {Array<Light>} lights - The lights to bind to the node.
* @return {DynamicLightsNode} The dynamic lights node.
*/
createNode( lights = [] ) {
return new DynamicLightsNode( this.options ).setLights( lights );
}
/**
* Returns a lights node for the given scene.
*
* @param {Scene} scene - The scene.
* @return {LightsNode} The lights node.
*/
getNode( scene ) {
if ( scene.isQuadMesh ) return _defaultLights;
let node = this._nodes.get( scene );
if ( node === undefined ) {
node = this.createNode();
this._nodes.set( scene, node );
}
return node;
}
}
export default DynamicLighting;