70 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			70 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								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 );
							 |