export class TextureAnimation { /** * @param uniforms {{ * animationFrameHeight: { value: number }, * animationFrameIndex: { value: number }, * animationInterpolationFrameIndex: { value: number }, * animationInterpolation: { value: number } * }} * @param data {{ * interpolate: boolean, * width: number, * height: number, * frametime: number, * frames: { * index: number, * time: number * }[] | undefined * }} */ constructor(uniforms, data) { this.uniforms = uniforms; this.data = { interpolate: false, width: 1, height: 1, frametime: 1, ...data }; this.frameImages = 1; this.frameDelta = 0; this.frameTime = this.data.frametime * 50; this.frames = 1; this.frameIndex = 0; } /** * @param width {number} * @param height {number} */ init(width, height) { this.frameImages = height / width; this.uniforms.animationFrameHeight.value = 1 / this.frameImages; this.frames = this.frameImages; if (this.data.frames) { this.frames = this.data.frames.length; } } /** * @param delta {number} */ step(delta) { this.frameDelta += delta; if (this.frameDelta > this.frameTime) { this.frameDelta -= this.frameTime; this.frameDelta %= this.frameTime; this.frameIndex++; this.frameIndex %= this.frames; if (this.data.frames) { let frame = this.data.frames[this.frameIndex] let nextFrame = this.data.frames[(this.frameIndex + 1) % this.frames]; this.uniforms.animationFrameIndex.value = frame.index; this.uniforms.animationInterpolationFrameIndex.value = nextFrame.index; this.frameTime = frame.time * 50; } else { this.uniforms.animationFrameIndex.value = this.frameIndex; this.uniforms.animationInterpolationFrameIndex.value = (this.frameIndex + 1) % this.frames; } } if (this.data.interpolate) { this.uniforms.animationInterpolation.value = this.frameDelta / this.frameTime; } } }