42 lines
		
	
	
		
			961 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			42 lines
		
	
	
		
			961 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 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 ); |