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

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 );