CubeTextureNode.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import TextureNode from './TextureNode.js';
  2. import UniformNode from '../core/UniformNode.js';
  3. import ReflectNode from './ReflectNode.js';
  4. class CubeTextureNode extends TextureNode {
  5. constructor( value, uvNode = null, levelNode = null ) {
  6. super( value, uvNode, levelNode );
  7. this.isCubeTextureNode = true;
  8. }
  9. getInputType( /*builder*/ ) {
  10. return 'cubeTexture';
  11. }
  12. getConstructHash( builder ) {
  13. return `${ this.uuid }-${ builder.context.environmentContext?.uuid || '' }`;
  14. }
  15. construct( builder ) {
  16. const properties = builder.getNodeProperties( this );
  17. const uvNode = this.uvNode || builder.context.uvNode || new ReflectNode();
  18. let levelNode = this.levelNode || builder.context.levelNode;
  19. if ( levelNode?.isNode === true ) {
  20. const texture = this.value;
  21. levelNode = builder.context.levelShaderNode ? builder.context.levelShaderNode.call( { texture, levelNode }, builder ) : levelNode;
  22. }
  23. properties.uvNode = uvNode;
  24. properties.levelNode = levelNode;
  25. }
  26. generate( builder, output ) {
  27. const { uvNode, levelNode } = builder.getNodeProperties( this );
  28. const texture = this.value;
  29. if ( ! texture || texture.isCubeTexture !== true ) {
  30. throw new Error( 'CubeTextureNode: Need a three.js cube texture.' );
  31. }
  32. const textureProperty = UniformNode.prototype.generate.call( this, builder, 'cubeTexture' );
  33. if ( output === 'sampler' ) {
  34. return textureProperty + '_sampler';
  35. } else if ( builder.isReference( output ) ) {
  36. return textureProperty;
  37. } else {
  38. const nodeData = builder.getDataFromNode( this );
  39. let snippet = nodeData.snippet;
  40. if ( builder.context.tempRead === false || snippet === undefined ) {
  41. const uvSnippet = uvNode.build( builder, 'vec3' );
  42. if ( levelNode ) {
  43. const levelSnippet = levelNode.build( builder, 'float' );
  44. snippet = builder.getCubeTextureLevel( textureProperty, uvSnippet, levelSnippet );
  45. } else {
  46. snippet = builder.getCubeTexture( textureProperty, uvSnippet );
  47. }
  48. nodeData.snippet = snippet;
  49. }
  50. return builder.format( snippet, 'vec4', output );
  51. }
  52. }
  53. }
  54. export default CubeTextureNode;