Texture3DNode.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import TextureNode from './TextureNode.js';
  2. import { addNodeClass } from '../core/Node.js';
  3. import { nodeProxy, vec3, tslFn, If } from '../shadernode/ShaderNode.js';
  4. const normal = tslFn( ( { texture, uv } ) => {
  5. const epsilon = 0.0001;
  6. const ret = vec3().temp();
  7. If( uv.x.lessThan( epsilon ), () => {
  8. ret.assign( vec3( 1, 0, 0 ) );
  9. } ).elseif( uv.y.lessThan( epsilon ), () => {
  10. ret.assign( vec3( 0, 1, 0 ) );
  11. } ).elseif( uv.z.lessThan( epsilon ), () => {
  12. ret.assign( vec3( 0, 0, 1 ) );
  13. } ).elseif( uv.x.greaterThan( 1 - epsilon ), () => {
  14. ret.assign( vec3( - 1, 0, 0 ) );
  15. } ).elseif( uv.y.greaterThan( 1 - epsilon ), () => {
  16. ret.assign( vec3( 0, - 1, 0 ) );
  17. } ).elseif( uv.z.greaterThan( 1 - epsilon ), () => {
  18. ret.assign( vec3( 0, 0, - 1 ) );
  19. } ).else( () => {
  20. const step = 0.01;
  21. const x = texture.uv( uv.add( vec3( - step, 0.0, 0.0 ) ) ).r.sub( texture.uv( uv.add( vec3( step, 0.0, 0.0 ) ) ).r );
  22. const y = texture.uv( uv.add( vec3( 0.0, - step, 0.0 ) ) ).r.sub( texture.uv( uv.add( vec3( 0.0, step, 0.0 ) ) ).r );
  23. const z = texture.uv( uv.add( vec3( 0.0, 0.0, - step ) ) ).r.sub( texture.uv( uv.add( vec3( 0.0, 0.0, step ) ) ).r );
  24. ret.assign( vec3( x, y, z ) );
  25. } );
  26. return ret.normalize();
  27. } );
  28. class Texture3DNode extends TextureNode {
  29. constructor( value, uvNode = null, levelNode = null ) {
  30. super( value, uvNode, levelNode );
  31. this.isTexture3DNode = true;
  32. }
  33. getInputType( /*builder*/ ) {
  34. return 'texture3D';
  35. }
  36. getDefaultUV() {
  37. return vec3( 0.5, 0.5, 0.5 );
  38. }
  39. setUpdateMatrix( /*updateMatrix*/ ) { } // Ignore .updateMatrix for 3d TextureNode
  40. setupUV( builder, uvNode ) {
  41. return uvNode;
  42. }
  43. generateUV( builder, uvNode ) {
  44. return uvNode.build( builder, 'vec3' );
  45. }
  46. normal( uvNode ) {
  47. return normal( { texture: this, uv: uvNode } );
  48. }
  49. }
  50. export default Texture3DNode;
  51. export const texture3D = nodeProxy( Texture3DNode );
  52. addNodeClass( 'Texture3DNode', Texture3DNode );