SpriteSheetUVNode.js 961 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import Node, { addNodeClass } from '../core/Node.js';
  2. import { uv } from '../accessors/UVNode.js';
  3. import { nodeProxy, float, vec2 } from '../shadernode/ShaderNode.js';
  4. class SpriteSheetUVNode extends Node {
  5. constructor( countNode, uvNode = uv(), frameNode = float( 0 ) ) {
  6. super( 'vec2' );
  7. this.countNode = countNode;
  8. this.uvNode = uvNode;
  9. this.frameNode = frameNode;
  10. }
  11. setup() {
  12. const { frameNode, uvNode, countNode } = this;
  13. const { width, height } = countNode;
  14. const frameNum = frameNode.mod( width.mul( height ) ).floor();
  15. const column = frameNum.mod( width );
  16. const row = height.sub( frameNum.add( 1 ).div( width ).ceil() );
  17. const scale = countNode.reciprocal();
  18. const uvFrameOffset = vec2( column, row );
  19. return uvNode.add( uvFrameOffset ).mul( scale );
  20. }
  21. }
  22. export default SpriteSheetUVNode;
  23. export const spritesheetUV = nodeProxy( SpriteSheetUVNode );
  24. addNodeClass( 'SpriteSheetUVNode', SpriteSheetUVNode );