You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
1.6 KiB
70 lines
1.6 KiB
6 months ago
|
import AnalyticLightNode from './AnalyticLightNode.js';
|
||
|
import { addLightNode } from './LightsNode.js';
|
||
|
import { getDistanceAttenuation } from './LightUtils.js';
|
||
|
import { uniform } from '../core/UniformNode.js';
|
||
|
import { objectViewPosition } from '../accessors/Object3DNode.js';
|
||
|
import { positionView } from '../accessors/PositionNode.js';
|
||
|
import { addNodeClass } from '../core/Node.js';
|
||
|
|
||
|
import { PointLight } from 'three';
|
||
|
|
||
|
class PointLightNode extends AnalyticLightNode {
|
||
|
|
||
|
constructor( light = null ) {
|
||
|
|
||
|
super( light );
|
||
|
|
||
|
this.cutoffDistanceNode = uniform( 0 );
|
||
|
this.decayExponentNode = uniform( 0 );
|
||
|
|
||
|
}
|
||
|
|
||
|
update( frame ) {
|
||
|
|
||
|
const { light } = this;
|
||
|
|
||
|
super.update( frame );
|
||
|
|
||
|
this.cutoffDistanceNode.value = light.distance;
|
||
|
this.decayExponentNode.value = light.decay;
|
||
|
|
||
|
}
|
||
|
|
||
|
setup( builder ) {
|
||
|
|
||
|
const { colorNode, cutoffDistanceNode, decayExponentNode, light } = this;
|
||
|
|
||
|
const lightingModel = builder.context.lightingModel;
|
||
|
|
||
|
const lVector = objectViewPosition( light ).sub( positionView ); // @TODO: Add it into LightNode
|
||
|
|
||
|
const lightDirection = lVector.normalize();
|
||
|
const lightDistance = lVector.length();
|
||
|
|
||
|
const lightAttenuation = getDistanceAttenuation( {
|
||
|
lightDistance,
|
||
|
cutoffDistance: cutoffDistanceNode,
|
||
|
decayExponent: decayExponentNode
|
||
|
} );
|
||
|
|
||
|
const lightColor = colorNode.mul( lightAttenuation );
|
||
|
|
||
|
const reflectedLight = builder.context.reflectedLight;
|
||
|
|
||
|
lightingModel.direct( {
|
||
|
lightDirection,
|
||
|
lightColor,
|
||
|
reflectedLight,
|
||
|
shadowMask: this.shadowMaskNode
|
||
|
}, builder.stack, builder );
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
export default PointLightNode;
|
||
|
|
||
|
addNodeClass( 'PointLightNode', PointLightNode );
|
||
|
|
||
|
addLightNode( PointLight, PointLightNode );
|