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.
68 lines
1.7 KiB
68 lines
1.7 KiB
import AnalyticLightNode from './AnalyticLightNode.js';
|
|
import LightsNode from './LightsNode.js';
|
|
import Object3DNode from '../accessors/Object3DNode.js';
|
|
import getDistanceAttenuation from '../functions/light/getDistanceAttenuation.js';
|
|
import { uniform, mul, normalize, length, sub, positionView } from '../shadernode/ShaderNodeElements.js';
|
|
|
|
import { PointLight } from 'three';
|
|
|
|
class PunctualLightNode 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;
|
|
|
|
}
|
|
|
|
construct( builder ) {
|
|
|
|
const { colorNode, cutoffDistanceNode, decayExponentNode } = this;
|
|
|
|
const lightPositionViewNode = new Object3DNode( Object3DNode.VIEW_POSITION, this.light );
|
|
const lVector = sub( lightPositionViewNode, positionView );
|
|
|
|
const lightDirection = normalize( lVector );
|
|
const lightDistance = length( lVector );
|
|
|
|
const lightAttenuation = getDistanceAttenuation.call( {
|
|
lightDistance,
|
|
cutoffDistance: cutoffDistanceNode,
|
|
decayExponent: decayExponentNode
|
|
} );
|
|
|
|
const lightColor = mul( colorNode, lightAttenuation );
|
|
|
|
const lightingModelFunctionNode = builder.context.lightingModelNode;
|
|
const reflectedLight = builder.context.reflectedLight;
|
|
|
|
if ( lightingModelFunctionNode?.direct ) {
|
|
|
|
lightingModelFunctionNode.direct.call( {
|
|
lightDirection,
|
|
lightColor,
|
|
reflectedLight
|
|
}, builder );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
LightsNode.setReference( PointLight, PunctualLightNode );
|
|
|
|
export default PunctualLightNode;
|
|
|