CubeTextureNode.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import TextureNode from './TextureNode.js';
  2. import UniformNode from '../core/UniformNode.js';
  3. import ReflectVectorNode from './ReflectVectorNode.js';
  4. import { vec3, nodeObject } from '../shadernode/ShaderNodeBaseElements.js';
  5. let defaultUV;
  6. class CubeTextureNode extends TextureNode {
  7. constructor( value, uvNode = null, levelNode = null ) {
  8. super( value, uvNode, levelNode );
  9. this.isCubeTextureNode = true;
  10. }
  11. getInputType( /*builder*/ ) {
  12. return 'cubeTexture';
  13. }
  14. getDefaultUV() {
  15. return defaultUV || ( defaultUV = new ReflectVectorNode() );
  16. }
  17. generate( builder, output ) {
  18. const { uvNode, levelNode } = builder.getNodeProperties( this );
  19. const texture = this.value;
  20. if ( ! texture || texture.isCubeTexture !== true ) {
  21. throw new Error( 'CubeTextureNode: Need a three.js cube texture.' );
  22. }
  23. const textureProperty = UniformNode.prototype.generate.call( this, builder, 'cubeTexture' );
  24. if ( output === 'sampler' ) {
  25. return textureProperty + '_sampler';
  26. } else if ( builder.isReference( output ) ) {
  27. return textureProperty;
  28. } else {
  29. const nodeData = builder.getDataFromNode( this );
  30. let propertyName = nodeData.propertyName;
  31. if ( propertyName === undefined ) {
  32. const uvNodeObject = nodeObject( uvNode );
  33. const cubeUV = vec3( uvNodeObject.x.negate(), uvNodeObject.yz );
  34. const uvSnippet = cubeUV.build( builder, 'vec3' );
  35. const nodeVar = builder.getVarFromNode( this, 'vec4' );
  36. propertyName = builder.getPropertyName( nodeVar );
  37. let snippet = null;
  38. if ( levelNode && levelNode.isNode === true ) {
  39. const levelSnippet = levelNode.build( builder, 'float' );
  40. snippet = builder.getCubeTextureLevel( textureProperty, uvSnippet, levelSnippet );
  41. } else {
  42. snippet = builder.getCubeTexture( textureProperty, uvSnippet );
  43. }
  44. builder.addFlowCode( `${propertyName} = ${snippet}` );
  45. nodeData.snippet = snippet;
  46. nodeData.propertyName = propertyName;
  47. }
  48. return builder.format( propertyName, 'vec4', output );
  49. }
  50. }
  51. }
  52. export default CubeTextureNode;