64 lines
1.1 KiB
JavaScript
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;
|