105 lines
2.6 KiB
JavaScript
105 lines
2.6 KiB
JavaScript
import Node, { addNodeClass } from '../core/Node.js';
|
|
import { attribute } from '../core/AttributeNode.js';
|
|
import { varying } from '../core/VaryingNode.js';
|
|
import { normalize } from '../math/MathNode.js';
|
|
import { modelWorldMatrix, modelViewMatrix } from './ModelNode.js';
|
|
import { nodeImmutable } from '../shadernode/ShaderNode.js';
|
|
|
|
class PositionNode extends Node {
|
|
|
|
constructor( scope = PositionNode.LOCAL ) {
|
|
|
|
super( 'vec3' );
|
|
|
|
this.scope = scope;
|
|
|
|
}
|
|
|
|
isGlobal() {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
getHash( /*builder*/ ) {
|
|
|
|
return `position-${this.scope}`;
|
|
|
|
}
|
|
|
|
generate( builder ) {
|
|
|
|
const scope = this.scope;
|
|
|
|
let outputNode = null;
|
|
|
|
if ( scope === PositionNode.GEOMETRY ) {
|
|
|
|
outputNode = attribute( 'position', 'vec3' );
|
|
|
|
} else if ( scope === PositionNode.LOCAL ) {
|
|
|
|
outputNode = varying( positionGeometry );
|
|
|
|
} else if ( scope === PositionNode.WORLD ) {
|
|
|
|
const vertexPositionNode = modelWorldMatrix.mul( positionLocal );
|
|
outputNode = varying( vertexPositionNode );
|
|
|
|
} else if ( scope === PositionNode.VIEW ) {
|
|
|
|
const vertexPositionNode = modelViewMatrix.mul( positionLocal );
|
|
outputNode = varying( vertexPositionNode );
|
|
|
|
} else if ( scope === PositionNode.VIEW_DIRECTION ) {
|
|
|
|
const vertexPositionNode = positionView.negate();
|
|
outputNode = normalize( varying( vertexPositionNode ) );
|
|
|
|
} else if ( scope === PositionNode.WORLD_DIRECTION ) {
|
|
|
|
const vertexPositionNode = positionLocal.transformDirection( modelWorldMatrix );
|
|
outputNode = normalize( varying( vertexPositionNode ) );
|
|
|
|
}
|
|
|
|
return outputNode.build( builder, this.getNodeType( builder ) );
|
|
|
|
}
|
|
|
|
serialize( data ) {
|
|
|
|
super.serialize( data );
|
|
|
|
data.scope = this.scope;
|
|
|
|
}
|
|
|
|
deserialize( data ) {
|
|
|
|
super.deserialize( data );
|
|
|
|
this.scope = data.scope;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
PositionNode.GEOMETRY = 'geometry';
|
|
PositionNode.LOCAL = 'local';
|
|
PositionNode.WORLD = 'world';
|
|
PositionNode.WORLD_DIRECTION = 'worldDirection';
|
|
PositionNode.VIEW = 'view';
|
|
PositionNode.VIEW_DIRECTION = 'viewDirection';
|
|
|
|
export default PositionNode;
|
|
|
|
export const positionGeometry = nodeImmutable( PositionNode, PositionNode.GEOMETRY );
|
|
export const positionLocal = nodeImmutable( PositionNode, PositionNode.LOCAL ).temp( 'Position' );
|
|
export const positionWorld = nodeImmutable( PositionNode, PositionNode.WORLD );
|
|
export const positionWorldDirection = nodeImmutable( PositionNode, PositionNode.WORLD_DIRECTION );
|
|
export const positionView = nodeImmutable( PositionNode, PositionNode.VIEW );
|
|
export const positionViewDirection = nodeImmutable( PositionNode, PositionNode.VIEW_DIRECTION );
|
|
|
|
addNodeClass( 'PositionNode', PositionNode );
|