You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
42 lines
961 B
42 lines
961 B
6 months ago
|
import Node, { addNodeClass } from '../core/Node.js';
|
||
|
import { uv } from '../accessors/UVNode.js';
|
||
|
import { nodeProxy, float, vec2 } from '../shadernode/ShaderNode.js';
|
||
|
|
||
|
class SpriteSheetUVNode extends Node {
|
||
|
|
||
|
constructor( countNode, uvNode = uv(), frameNode = float( 0 ) ) {
|
||
|
|
||
|
super( 'vec2' );
|
||
|
|
||
|
this.countNode = countNode;
|
||
|
this.uvNode = uvNode;
|
||
|
this.frameNode = frameNode;
|
||
|
|
||
|
}
|
||
|
|
||
|
setup() {
|
||
|
|
||
|
const { frameNode, uvNode, countNode } = this;
|
||
|
|
||
|
const { width, height } = countNode;
|
||
|
|
||
|
const frameNum = frameNode.mod( width.mul( height ) ).floor();
|
||
|
|
||
|
const column = frameNum.mod( width );
|
||
|
const row = height.sub( frameNum.add( 1 ).div( width ).ceil() );
|
||
|
|
||
|
const scale = countNode.reciprocal();
|
||
|
const uvFrameOffset = vec2( column, row );
|
||
|
|
||
|
return uvNode.add( uvFrameOffset ).mul( scale );
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
export default SpriteSheetUVNode;
|
||
|
|
||
|
export const spritesheetUV = nodeProxy( SpriteSheetUVNode );
|
||
|
|
||
|
addNodeClass( 'SpriteSheetUVNode', SpriteSheetUVNode );
|