3D-Demo/jsm/nodes/accessors/ReflectNode.js

64 lines
1.1 KiB
JavaScript

import Node from '../core/Node.js';
import { nodeObject, normalWorld, positionWorld, cameraPosition, sub, normalize, join, negate, reflect } from '../shadernode/ShaderNodeElements.js';
class ReflectNode extends Node {
static VECTOR = 'vector';
static CUBE = 'cube';
constructor( scope = ReflectNode.CUBE ) {
super( 'vec3' );
this.scope = scope;
}
getHash( /*builder*/ ) {
return `reflect-${this.scope}`;
}
generate( builder ) {
const scope = this.scope;
if ( scope === ReflectNode.VECTOR ) {
const cameraToFrag = normalize( sub( positionWorld, cameraPosition ) );
const reflectVec = reflect( cameraToFrag, normalWorld );
return reflectVec.build( builder );
} else if ( scope === ReflectNode.CUBE ) {
const reflectVec = nodeObject( new ReflectNode( ReflectNode.VECTOR ) );
const cubeUV = join( negate( reflectVec.x ), reflectVec.yz );
return cubeUV.build( builder );
}
}
serialize( data ) {
super.serialize( data );
data.scope = this.scope;
}
deserialize( data ) {
super.deserialize( data );
this.scope = data.scope;
}
}
export default ReflectNode;