From 0862da93c5d667231c6a1dad0dbf3f378bc4be83 Mon Sep 17 00:00:00 2001 From: Emanuel Rabina Date: Fri, 28 Jun 2024 17:35:20 +1200 Subject: [PATCH] Move textureUV adjustments for sprites to the shader --- .../ultraq/redhorizon/classic/maps/Map.groovy | 10 +++- .../classic/nodes/PalettedSprite.groovy | 51 +++++++++---------- .../classic/shaders/PalettedSprite.vert.glsl | 11 +++- .../shaders/PalettedSpriteShader.groovy | 6 +++ .../redhorizon/classic/units/Unit.groovy | 4 +- .../engine/graphics/GraphicsRenderer.groovy | 5 +- .../engine/graphics/GraphicsRequests.groovy | 2 +- .../engine/graphics/GraphicsSystem.groovy | 9 +--- .../engine/graphics/Material.groovy | 30 +++++++++++ .../redhorizon/engine/graphics/Shader.groovy | 19 +++---- .../engine/graphics/SpriteSheet.groovy | 11 ++++ .../graphics/opengl/OpenGLRenderer.groovy | 2 +- .../graphics/opengl/OpenGLShader.groovy | 20 ++++++-- .../engine/graphics/opengl/Sprite.vert.glsl | 11 +++- .../graphics/opengl/SpriteShader.groovy | 6 +++ .../engine/scenegraph/nodes/Sprite.groovy | 33 ++++++------ .../scripts/SpriteShowcaseScript.groovy | 4 +- 17 files changed, 152 insertions(+), 82 deletions(-) diff --git a/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/maps/Map.groovy b/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/maps/Map.groovy index cc3aadf4..ae1a0f27 100644 --- a/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/maps/Map.groovy +++ b/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/maps/Map.groovy @@ -376,6 +376,14 @@ class Map extends Node { }, tileSetSpriteSheetFuture.thenApplyAsync { spriteSheet -> material.texture = spriteSheet.texture + material.with { + texture = spriteSheet.texture + framesHorizontal = spriteSheet.framesHorizontal + framesVertical = spriteSheet.framesVertical + frameStepX = spriteSheet.frameStepX + frameStepY = spriteSheet.frameStepY + frame = 0 + } return spriteSheet } ) @@ -469,7 +477,7 @@ class Map extends Node { var overlay = new PalettedSprite(tileFile) overlay.name = "${tile.name} - Variant ${imageVariant}" - overlay.initialFrame = imageVariant + overlay.frame = imageVariant overlay.position = new Vector2f(tilePos).asWorldCoords(1) addChild(overlay) diff --git a/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/nodes/PalettedSprite.groovy b/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/nodes/PalettedSprite.groovy index c490d3e4..db18cdf9 100644 --- a/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/nodes/PalettedSprite.groovy +++ b/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/nodes/PalettedSprite.groovy @@ -18,7 +18,6 @@ package nz.net.ultraq.redhorizon.classic.nodes import nz.net.ultraq.redhorizon.classic.Faction import nz.net.ultraq.redhorizon.classic.shaders.Shaders -import nz.net.ultraq.redhorizon.engine.graphics.GraphicsRenderer import nz.net.ultraq.redhorizon.engine.graphics.GraphicsRequests.ShaderRequest import nz.net.ultraq.redhorizon.engine.graphics.GraphicsRequests.SpriteMeshRequest import nz.net.ultraq.redhorizon.engine.scenegraph.Scene @@ -92,8 +91,19 @@ class PalettedSprite extends Sprite implements FactionColours { CompletableFuture onSceneAddedAsync(Scene scene) { return CompletableFuture.allOf( - scene - .requestCreateOrGet(new SpriteMeshRequest(bounds, region)) + spriteSheetGenerator.generate(scene) + .thenComposeAsync { newSpriteSheet -> + spriteSheet = newSpriteSheet + material.with { + texture = spriteSheet.texture + framesHorizontal = spriteSheet.framesHorizontal + framesVertical = spriteSheet.framesVertical + frameStepX = spriteSheet.frameStepX + frameStepY = spriteSheet.frameStepY + frame = this.frame + } + return scene.requestCreateOrGet(new SpriteMeshRequest(bounds, spriteSheet.textureRegion.scale(repeatX, repeatY))) + } .thenAcceptAsync { newMesh -> mesh = newMesh }, @@ -102,37 +112,12 @@ class PalettedSprite extends Sprite implements FactionColours { .thenAcceptAsync { requestedShader -> shader = requestedShader }, - spriteSheetGenerator.generate(scene) - .thenApplyAsync { newSpriteSheet -> - spriteSheet = newSpriteSheet - material.texture = spriteSheet.texture - - // TODO: Some uses are a repeating tile, others aren't. There should be a unified way of doing this 🤔 - if (repeatX != 1f || repeatY != 1f) { - region.setMax(repeatX, repeatY) - } - else { - region.set(spriteSheet[initialFrame]) - } - }, CompletableFuture.runAsync { -> material.adjustmentMap = buildAdjustmentMap(faction) } ) } - @Override - void render(GraphicsRenderer renderer) { - - if (material.adjustmentMap) { - if (factionChanged) { - material.adjustmentMap = buildAdjustmentMap(faction) - factionChanged = false - } - super.render(renderer) - } - } - /** * Update the faction being applied to this sprite. */ @@ -142,4 +127,14 @@ class PalettedSprite extends Sprite implements FactionColours { FactionColours.super.setFaction(faction) factionChanged = true } + + @Override + void update() { + + if (material.adjustmentMap && factionChanged) { + material.adjustmentMap = buildAdjustmentMap(faction) + factionChanged = false + } + super.update() + } } diff --git a/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/shaders/PalettedSprite.vert.glsl b/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/shaders/PalettedSprite.vert.glsl index d73ad7fa..5589fb17 100644 --- a/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/shaders/PalettedSprite.vert.glsl +++ b/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/shaders/PalettedSprite.vert.glsl @@ -12,6 +12,11 @@ layout (std140) uniform Camera { mat4 view; }; uniform mat4 model; +uniform int framesHorizontal; +uniform int framesVertical; +uniform float frameStepX; +uniform float frameStepY; +uniform int frame; /** * Vertex shader main function, mostly passes geometry information along to the @@ -21,5 +26,9 @@ void main() { gl_Position = projection * view * model * position; v_vertexColour = colour; - v_textureUVs = textureUVs; + + // Adjust textureUVs to the location of the selected frame in the spritesheet + float textureU = (frame % framesHorizontal) * frameStepX; + float textureV = floor(frame / framesHorizontal) * frameStepY; + v_textureUVs = textureUVs + vec2(textureU, textureV); } diff --git a/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/shaders/PalettedSpriteShader.groovy b/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/shaders/PalettedSpriteShader.groovy index 8b2834fc..834b6302 100644 --- a/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/shaders/PalettedSpriteShader.groovy +++ b/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/shaders/PalettedSpriteShader.groovy @@ -17,6 +17,7 @@ package nz.net.ultraq.redhorizon.classic.shaders import nz.net.ultraq.redhorizon.engine.graphics.Attribute +import nz.net.ultraq.redhorizon.engine.graphics.Material import nz.net.ultraq.redhorizon.engine.graphics.ShaderConfig import nz.net.ultraq.redhorizon.engine.graphics.Uniform @@ -37,6 +38,11 @@ class PalettedSpriteShader extends ShaderConfig { }, { shader, material, window -> shader.setUniform('adjustmentMap', material.adjustmentMap) + }, + { shader, material, window -> + Material.KEYS_SPRITES.each { key -> + shader.setUniformGeneric(key, material.attributes[key]) + } } ] } diff --git a/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/units/Unit.groovy b/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/units/Unit.groovy index 56998cca..558daa49 100644 --- a/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/units/Unit.groovy +++ b/redhorizon-classic/source/nz/net/ultraq/redhorizon/classic/units/Unit.groovy @@ -210,7 +210,7 @@ class Unit extends Node implements FactionColours, Rotatable, Temporal { var closestHeading = Math.round(heading / degreesPerHeading) var rotationFrame = closestHeading ? (headings - closestHeading) * frames as int : 0 var animationFrame = frames ? Math.floor((currentTimeMs - animationStartTime) / 1000 * FRAMERATE) % frames as int : 0 - region.set(spriteSheet.getFrame(unitData.shpFile.getStateFramesOffset(currentState) + rotationFrame + animationFrame)) + frame = unitData.shpFile.getStateFramesOffset(currentState) + rotationFrame + animationFrame } super.update() @@ -233,7 +233,7 @@ class Unit extends Node implements FactionColours, Rotatable, Temporal { var turretHeadings = unitData.shpFile.parts.turret.headings var closestTurretHeading = Math.round(heading / degreesPerHeading) var turretRotationFrame = closestTurretHeading ? turretHeadings - closestTurretHeading as int : 0 - region.set(spriteSheet.getFrame(unitData.shpFile.parts.body.headings + turretRotationFrame)) + frame = unitData.shpFile.parts.body.headings + turretRotationFrame } super.update() diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/GraphicsRenderer.groovy b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/GraphicsRenderer.groovy index a33d3c2b..682fd8db 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/GraphicsRenderer.groovy +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/GraphicsRenderer.groovy @@ -87,10 +87,7 @@ interface GraphicsRenderer extends AutoCloseable, EventTarget { * Create a mesh to represent a surface onto which a texture will go. This is * a convenience method for {@link #createMesh}. */ - default Mesh createSpriteMesh(Rectanglef surface) { - - return createSpriteMesh(surface, new Rectanglef(0, 0, 1, 1)) - } + Mesh createSpriteMesh(Rectanglef surface) /** * Create a mesh to represent a surface onto which a texture will go. This is diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/GraphicsRequests.groovy b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/GraphicsRequests.groovy index 322a927b..3fc52320 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/GraphicsRequests.groovy +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/GraphicsRequests.groovy @@ -54,7 +54,7 @@ interface GraphicsRequests { @ImmutableOptions(knownImmutables = ['surface', 'textureUVs']) static record SpriteMeshRequest(Rectanglef surface, Rectanglef textureUVs) implements Request { SpriteMeshRequest(Rectanglef surface) { - this(surface, null) + this(surface, new Rectanglef(0, 0, 1, 1)) } } diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/GraphicsSystem.groovy b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/GraphicsSystem.groovy index 8cd29159..718bd087 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/GraphicsSystem.groovy +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/GraphicsSystem.groovy @@ -137,14 +137,7 @@ class GraphicsSystem extends EngineSystem implements GraphicsRequests { case ShaderRequest -> renderer.createShader(request.shaderConfig()) case MeshRequest -> renderer.createMesh(request.type(), request.layout(), request.vertices(), request.colour(), request.textureUVs(), request.indices(), request.dynamic()) - case SpriteMeshRequest -> { - if (request.textureUVs() != null) { - yield renderer.createSpriteMesh(request.surface(), request.textureUVs()) - } - else { - yield renderer.createSpriteMesh(request.surface()) - } - } + case SpriteMeshRequest -> renderer.createSpriteMesh(request.surface(), request.textureUVs()) case TextureRequest -> renderer.createTexture(request.width(), request.height(), request.format(), request.data()) case SpriteSheetRequest -> renderer.createSpriteSheet(request.width(), request.height(), request.format(), request.data()) case UniformBufferRequest -> renderer.createUniformBuffer(request.name(), request.data()) diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/Material.groovy b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/Material.groovy index 1a1cff34..e1559065 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/Material.groovy +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/Material.groovy @@ -26,6 +26,36 @@ package nz.net.ultraq.redhorizon.engine.graphics */ class Material { + private static final String KEY_FRAME = 'frame' + private static final String KEY_FRAMES_HORIZONTAL = 'framesHorizontal' + private static final String KEY_FRAMES_VERTICAL = 'framesVertical' + private static final String KEY_FRAME_STEP_X = 'frameStepX' + private static final String KEY_FRAME_STEP_Y = 'frameStepY' + + static final String[] KEYS_SPRITES = [ + KEY_FRAME, KEY_FRAMES_HORIZONTAL, KEY_FRAMES_VERTICAL, KEY_FRAME_STEP_X, KEY_FRAME_STEP_Y + ] + final Map attributes = [:] Texture texture + + void setFrame(int frame) { + attributes[KEY_FRAME] = frame + } + + void setFrameStepX(float frameStepX) { + attributes[KEY_FRAME_STEP_X] = frameStepX + } + + void setFrameStepY(float frameStepY) { + attributes[KEY_FRAME_STEP_Y] = frameStepY + } + + void setFramesHorizontal(int framesHorizontal) { + attributes[KEY_FRAMES_HORIZONTAL] = framesHorizontal + } + + void setFramesVertical(int framesVertical) { + attributes[KEY_FRAMES_VERTICAL] = framesVertical + } } diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/Shader.groovy b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/Shader.groovy index 3b1b6c32..5e612471 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/Shader.groovy +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/Shader.groovy @@ -45,38 +45,31 @@ abstract class Shader implements GraphicsResource { uniforms*.apply(this, material, window) } + /** + * Apply a data uniform to the shader. If {@code data} is an array, it can be + * used to determine the shader type (eg: 2 floats = vec2). + */ + abstract void setUniformGeneric(String name, Object data) + /** * Apply a data uniform to the shader. The type of data is determined by the * size of the data array. - * - * @param name - * @param data */ abstract void setUniform(String name, float[] data) /** * Apply a data uniform to the shader. The type of data is determined by the * size of the data array. - * - * @param name - * @param data */ abstract void setUniform(String name, int[] data) /** * Apply a matrix uniform to the shader. - * - * @param name - * @param matrix */ abstract void setUniform(String name, Matrix4f matrix) /** * Apply a texture uniform using the given texture ID. - * - * @param name - * @param textureUnit - * @param textureId */ abstract void setUniformTexture(String name, int textureUnit, Texture texture) diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/SpriteSheet.groovy b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/SpriteSheet.groovy index db7a693e..1f8711df 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/SpriteSheet.groovy +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/SpriteSheet.groovy @@ -53,6 +53,9 @@ class SpriteSheet implements GraphicsResource { /** * Return coordinates on the sprite sheet that would locate the sprite with * the corresponding index from the raw data. + *

+ * Note that with texture adjustments calculated in the shader, there + * shouldn't be a need for this any more. */ Rectanglef getFrame(int index) { @@ -65,4 +68,12 @@ class SpriteSheet implements GraphicsResource { textureV + frameStepY as float ) } + + /** + * Return a texture region for use with this spritesheet. + */ + Rectanglef getTextureRegion() { + + return getFrame(0) + } } diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/OpenGLRenderer.groovy b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/OpenGLRenderer.groovy index 3a051567..5c42aa89 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/OpenGLRenderer.groovy +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/OpenGLRenderer.groovy @@ -221,7 +221,7 @@ class OpenGLRenderer implements GraphicsRenderer { } @Override - Mesh createSpriteMesh(Rectanglef surface, Rectanglef textureUVs) { + Mesh createSpriteMesh(Rectanglef surface, Rectanglef textureUVs = new Rectanglef(0, 0, 1, 1)) { return createMesh( MeshType.TRIANGLES, diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/OpenGLShader.groovy b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/OpenGLShader.groovy index a93d74f6..54f6f16e 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/OpenGLShader.groovy +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/OpenGLShader.groovy @@ -111,9 +111,6 @@ class OpenGLShader extends Shader { /** * Cached function for looking up a uniform location in a shader program. - * - * @param name - * @return */ @Memoized private int getUniformLocation(String name) { @@ -121,6 +118,23 @@ class OpenGLShader extends Shader { return glGetUniformLocation(programId, name) } + @Override + void setUniformGeneric(String name, Object data) { + + if (data == null) { + throw new IllegalArgumentException("Data value for key ${name} was null") + } + + switch (data) { + case float, Float -> setUniform(name, (float)data) + case float[], Float[] -> setUniform(name, (float[])data) + case int, Integer -> setUniform(name, (int)data) + case int[], Integer[] -> setUniform(name, (int[])data) + case Matrix4f -> setUniform(name, data) + default -> throw new UnsupportedOperationException("Data type of ${data.class.simpleName} not supported") + } + } + @Override void setUniform(String name, float[] data) { diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/Sprite.vert.glsl b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/Sprite.vert.glsl index d73ad7fa..5589fb17 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/Sprite.vert.glsl +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/Sprite.vert.glsl @@ -12,6 +12,11 @@ layout (std140) uniform Camera { mat4 view; }; uniform mat4 model; +uniform int framesHorizontal; +uniform int framesVertical; +uniform float frameStepX; +uniform float frameStepY; +uniform int frame; /** * Vertex shader main function, mostly passes geometry information along to the @@ -21,5 +26,9 @@ void main() { gl_Position = projection * view * model * position; v_vertexColour = colour; - v_textureUVs = textureUVs; + + // Adjust textureUVs to the location of the selected frame in the spritesheet + float textureU = (frame % framesHorizontal) * frameStepX; + float textureV = floor(frame / framesHorizontal) * frameStepY; + v_textureUVs = textureUVs + vec2(textureU, textureV); } diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/SpriteShader.groovy b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/SpriteShader.groovy index d8e80688..007cd10d 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/SpriteShader.groovy +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/opengl/SpriteShader.groovy @@ -17,6 +17,7 @@ package nz.net.ultraq.redhorizon.engine.graphics.opengl import nz.net.ultraq.redhorizon.engine.graphics.Attribute +import nz.net.ultraq.redhorizon.engine.graphics.Material import nz.net.ultraq.redhorizon.engine.graphics.ShaderConfig import nz.net.ultraq.redhorizon.engine.graphics.Uniform @@ -34,6 +35,11 @@ class SpriteShader extends ShaderConfig { final Uniform[] uniforms = [ { shader, material, window -> shader.setUniformTexture('mainTexture', 0, material.texture) + }, + { shader, material, window -> + Material.KEYS_SPRITES.each { key -> + shader.setUniformGeneric(key, material[key]) + } } ] } diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/scenegraph/nodes/Sprite.groovy b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/scenegraph/nodes/Sprite.groovy index ae114c46..99351c37 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/scenegraph/nodes/Sprite.groovy +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/scenegraph/nodes/Sprite.groovy @@ -31,9 +31,6 @@ import nz.net.ultraq.redhorizon.engine.scenegraph.Scene import nz.net.ultraq.redhorizon.filetypes.ImageFile import nz.net.ultraq.redhorizon.filetypes.ImagesFile -import org.joml.Vector2f -import org.joml.primitives.Rectanglef - import java.util.concurrent.CompletableFuture /** @@ -47,12 +44,11 @@ class Sprite extends Node implements GraphicsElement { final int numImages final SpriteSheetGenerator spriteSheetGenerator - final Rectanglef region = new Rectanglef(0, 0, 1, 1) /** - * The frame to load from the sprite sheet in {@link #onSceneAddedAsync}. + * The frame to select from the underlying spritesheet. */ - int initialFrame = 0 + int frame = 0 SpriteSheet spriteSheet @@ -97,8 +93,19 @@ class Sprite extends Node implements GraphicsElement { CompletableFuture onSceneAddedAsync(Scene scene) { return CompletableFuture.allOf( - scene - .requestCreateOrGet(new SpriteMeshRequest(bounds, region)) + spriteSheetGenerator.generate(scene) + .thenComposeAsync { newSpriteSheet -> + spriteSheet = newSpriteSheet + material.with { + texture = spriteSheet.texture + framesHorizontal = spriteSheet.framesHorizontal + framesVertical = spriteSheet.framesVertical + frameStepX = spriteSheet.frameStepX + frameStepY = spriteSheet.frameStepY + frame = this.frame + } + return scene.requestCreateOrGet(new SpriteMeshRequest(bounds, spriteSheet.textureRegion)) + } .thenAcceptAsync { newMesh -> mesh = newMesh }, @@ -106,12 +113,6 @@ class Sprite extends Node implements GraphicsElement { .requestCreateOrGet(new ShaderRequest(Shaders.spriteShader)) .thenAcceptAsync { requestedShader -> shader = requestedShader - }, - spriteSheetGenerator.generate(scene) - .thenAcceptAsync { newSpriteSheet -> - spriteSheet = newSpriteSheet - material.texture = spriteSheet.texture - region.set(spriteSheet[initialFrame]) } ) } @@ -133,9 +134,7 @@ class Sprite extends Node implements GraphicsElement { @Override void update() { - if (mesh) { - mesh.updateTextureUvs(region as Vector2f[]) - } + material.frame = frame } /** diff --git a/redhorizon-explorer/source/nz/net/ultraq/redhorizon/explorer/scripts/SpriteShowcaseScript.groovy b/redhorizon-explorer/source/nz/net/ultraq/redhorizon/explorer/scripts/SpriteShowcaseScript.groovy index b602bad1..7ef9fed7 100644 --- a/redhorizon-explorer/source/nz/net/ultraq/redhorizon/explorer/scripts/SpriteShowcaseScript.groovy +++ b/redhorizon-explorer/source/nz/net/ultraq/redhorizon/explorer/scripts/SpriteShowcaseScript.groovy @@ -58,11 +58,11 @@ class SpriteShowcaseScript extends Script { removeControlFunctions << scene.inputEventStream.addControl(new KeyControl(GLFW_KEY_A, 'Previous frame', { -> Math.wrap(currentFrame--, 0, numImages) - region.set(spriteSheet[currentFrame]) + frame = currentFrame }, true)) removeControlFunctions << scene.inputEventStream.addControl(new KeyControl(GLFW_KEY_D, 'Next frame', { -> Math.wrap(currentFrame++, 0, numImages) - region.set(spriteSheet[currentFrame]) + frame = currentFrame }, true)) var Faction[] factions = Faction.values()