ReflectNode.js 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import Node from '../core/Node.js';
  2. import {
  3. nodeObject, transformedNormalView, positionViewDirection,
  4. transformDirection, negate, reflect, vec3, cameraViewMatrix
  5. } from '../shadernode/ShaderNodeBaseElements.js';
  6. class ReflectNode extends Node {
  7. static VECTOR = 'vector';
  8. static CUBE = 'cube';
  9. constructor( scope = ReflectNode.CUBE ) {
  10. super( 'vec3' );
  11. this.scope = scope;
  12. }
  13. getHash( /*builder*/ ) {
  14. return `reflect-${this.scope}`;
  15. }
  16. generate( builder ) {
  17. const scope = this.scope;
  18. if ( scope === ReflectNode.VECTOR ) {
  19. const reflectView = reflect( negate( positionViewDirection ), transformedNormalView );
  20. const reflectVec = transformDirection( reflectView, cameraViewMatrix );
  21. return reflectVec.build( builder );
  22. } else if ( scope === ReflectNode.CUBE ) {
  23. const reflectVec = nodeObject( new ReflectNode( ReflectNode.VECTOR ) );
  24. const cubeUV = vec3( negate( reflectVec.x ), reflectVec.yz );
  25. return cubeUV.build( builder );
  26. }
  27. }
  28. serialize( data ) {
  29. super.serialize( data );
  30. data.scope = this.scope;
  31. }
  32. deserialize( data ) {
  33. super.deserialize( data );
  34. this.scope = data.scope;
  35. }
  36. }
  37. export default ReflectNode;