diff --git a/CHANGELOG.md b/CHANGELOG.md index a23731f..da89e9e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ All notable changes to this project will be documented in this file. +## [0.10.2] - 2025-07-21 + +### Fixed +- (Sprite Editor) Fixed Set Raster commands clearing when duplicated +- Proper asset stack texture handling +- Various minor bugfixes + ## [0.10.1] - 2025-04-01 ### Fixed diff --git a/app.properties b/app.properties index c1bf17f..bf54d76 100644 --- a/app.properties +++ b/app.properties @@ -1 +1 @@ -version=0.10.1 +version=0.10.2 diff --git a/src/main/java/game/map/BoundingBox.java b/src/main/java/game/map/BoundingBox.java index 9b0abe1..9e84075 100644 --- a/src/main/java/game/map/BoundingBox.java +++ b/src/main/java/game/map/BoundingBox.java @@ -307,7 +307,7 @@ public class BoundingBox implements XmlSerializable public boolean overlaps(BoundingBox other) { - return (min.getX() <= other.max.getX() && other.min.getX() <= max.getY() && + return (min.getX() <= other.max.getX() && other.min.getX() <= max.getX() && min.getY() <= other.max.getY() && other.min.getY() <= max.getY() && min.getZ() <= other.max.getZ() && other.min.getZ() <= max.getZ()); } diff --git a/src/main/java/game/map/shape/TransformMatrix.java b/src/main/java/game/map/shape/TransformMatrix.java index d1dc9cf..72741e4 100644 --- a/src/main/java/game/map/shape/TransformMatrix.java +++ b/src/main/java/game/map/shape/TransformMatrix.java @@ -328,13 +328,11 @@ public class TransformMatrix implements XmlSerializable double sin = Math.sin(Math.toRadians(angle)); double soc = 1.0 - cos; - //TODO off-diagonal correct? - TransformMatrix rot = TransformMatrix.identity(); rot.mat[0][0] = soc * nx * nx + cos; rot.mat[0][1] = soc * nx * ny - nz * sin; - rot.mat[0][2] = soc * nx * ny + ny * sin; + rot.mat[0][2] = soc * nx * nz + ny * sin; rot.mat[1][0] = soc * nx * ny + nz * sin; rot.mat[1][1] = soc * ny * ny + cos; diff --git a/src/main/java/game/message/StringConstants.java b/src/main/java/game/message/StringConstants.java index b48c980..b14be6d 100644 --- a/src/main/java/game/message/StringConstants.java +++ b/src/main/java/game/message/StringConstants.java @@ -617,6 +617,18 @@ public abstract class StringConstants characterMap.add((byte) sc.id, sc.name.charAt(0)); } + // support for mapping macrons --> umlauts + characterMap.add((byte) StandardCharacter.c7A.id, 'ā'); // ä + characterMap.add((byte) StandardCharacter.c7F.id, 'ē'); // ë + characterMap.add((byte) StandardCharacter.c83.id, 'ī'); // ï + characterMap.add((byte) StandardCharacter.c88.id, 'ō'); // ö + characterMap.add((byte) StandardCharacter.c8C.id, 'ū'); // ü + characterMap.add((byte) StandardCharacter.c63.id, 'Ā'); // Ä + characterMap.add((byte) StandardCharacter.c68.id, 'Ē'); // Ë + characterMap.add((byte) StandardCharacter.c6C.id, 'Ī'); // Ï + characterMap.add((byte) StandardCharacter.c71.id, 'Ō'); // Ö + characterMap.add((byte) StandardCharacter.c75.id, 'Ū'); // Ü + creditsCharacterMap = new DualHashMap<>(); creditsCharacterMap.add((byte) 0x00, 'A'); creditsCharacterMap.add((byte) 0x01, 'B'); diff --git a/src/main/java/game/sprite/editor/animators/command/SetImage.java b/src/main/java/game/sprite/editor/animators/command/SetImage.java index 42e4cab..a939a15 100644 --- a/src/main/java/game/sprite/editor/animators/command/SetImage.java +++ b/src/main/java/game/sprite/editor/animators/command/SetImage.java @@ -49,8 +49,12 @@ public class SetImage extends AnimCommand // FFF is valid, so sign extend (implicit cast to int) int id = (s0 << 20) >> 20; - if (id < 0 || id >= sprite.rasters.size()) + if (id >= 0 && id < sprite.rasters.size()) { imgIndex = id; + // immediate lookup for 'copy/paste' operations. + // loading from XML will also assign this during updateReferences + img = sprite.rasters.get(id); + } } public SetImage(CommandAnimator animator, SpriteRaster img) diff --git a/src/main/java/game/sprite/editor/animators/command/SetPalette.java b/src/main/java/game/sprite/editor/animators/command/SetPalette.java index 7e13f89..190a5a1 100644 --- a/src/main/java/game/sprite/editor/animators/command/SetPalette.java +++ b/src/main/java/game/sprite/editor/animators/command/SetPalette.java @@ -11,6 +11,7 @@ import org.w3c.dom.Element; import app.SwingUtils; import common.commands.AbstractCommand; +import game.sprite.Sprite; import game.sprite.SpritePalette; import game.sprite.editor.CommandComboBox; import game.sprite.editor.Editable; @@ -40,9 +41,14 @@ public class SetPalette extends AnimCommand { super(animator); + Sprite sprite = animator.comp.parentAnimation.parentSprite; + // FFF is valid, so sign extend (implicit cast to int) int id = (s0 << 20) >> 20; - pal = (id < 0) ? null : animator.comp.parentAnimation.parentSprite.palettes.get(id); + + if (id >= 0 && id < sprite.palettes.size()) { + pal = sprite.palettes.get(id); + } } public SetPalette(CommandAnimator animator, SpritePalette pal) diff --git a/src/main/java/game/texture/Texture.java b/src/main/java/game/texture/Texture.java index 9ab91fd..cb5d335 100644 --- a/src/main/java/game/texture/Texture.java +++ b/src/main/java/game/texture/Texture.java @@ -10,6 +10,9 @@ import java.util.List; import org.apache.commons.io.FilenameUtils; import app.input.InputFileException; +import assets.AssetHandle; +import assets.AssetManager; +import assets.AssetSubdir; import game.texture.TextureArchive.JsonTexture; public class Texture @@ -246,7 +249,8 @@ public class Texture public static Texture parseTexture(File source, JsonTexture json) throws IOException { File dir = source.getParentFile(); - File subdir = new File(dir, FilenameUtils.getBaseName(source.getName())); + String texName = FilenameUtils.getBaseName(source.getName()); + //File subdir = new File(dir, FilenameUtils.getBaseName(source.getName())); Texture tx = new Texture(json.name); tx.hWrap = new int[2]; @@ -305,10 +309,14 @@ public class Texture throw new InputFileException(source, "(%s) Texture cannot have both mipmaps and aux.", json.name); } - tx.main = Tile.load(subdir + "/" + tx.name + ".png", imgFormat); + AssetHandle mainAsset = AssetManager.get(AssetSubdir.MAP_TEX, texName + "/" + tx.name + ".png"); - if (tx.hasAux) - tx.aux = Tile.load(subdir + "/" + tx.name + "_AUX.png", auxFormat); + tx.main = Tile.load(mainAsset, imgFormat); + + if (tx.hasAux) { + AssetHandle auxAsset = AssetManager.get(AssetSubdir.MAP_TEX, texName + "/" + tx.name + "_AUX.png"); + tx.aux = Tile.load(auxAsset, auxFormat); + } if (tx.hasMipmaps) { int divisor = 2; @@ -321,7 +329,8 @@ public class Texture int mmWidth = tx.main.width / divisor; String mmName = tx.name + "_MM" + (tx.mipmapList.size() + 1); - Tile mipmap = Tile.load(subdir + "/" + mmName + ".png", imgFormat); + AssetHandle mmAsset = AssetManager.get(AssetSubdir.MAP_TEX, texName + "/" + mmName + ".png"); + Tile mipmap = Tile.load(mmAsset, imgFormat); if (mipmap.height != mmHeight) throw new InputFileException(source, "%s has incorrect height: %s instead of %s", mmName, mipmap.height, mmHeight); diff --git a/src/main/java/game/texture/editor/ImageEditor.java b/src/main/java/game/texture/editor/ImageEditor.java index ad12889..7554484 100644 --- a/src/main/java/game/texture/editor/ImageEditor.java +++ b/src/main/java/game/texture/editor/ImageEditor.java @@ -891,7 +891,7 @@ public class ImageEditor extends BaseEditor implements MouseManagerListener, Col exportFileChooser.setCurrentDirectory(file.getParentFile()); super.incrementDialogsOpen(); if (exportFileChooser.prompt() == ChooseDialogResult.APPROVE) - chosen = importFileChooser.getSelectedFile(); + chosen = exportFileChooser.getSelectedFile(); super.decrementDialogsOpen(); return chosen; diff --git a/src/main/java/renderer/buffers/BufferedMesh.java b/src/main/java/renderer/buffers/BufferedMesh.java index 9f2ee67..42e08c9 100644 --- a/src/main/java/renderer/buffers/BufferedMesh.java +++ b/src/main/java/renderer/buffers/BufferedMesh.java @@ -4,6 +4,7 @@ import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.opengl.GL15.*; import static org.lwjgl.opengl.GL20.glEnableVertexAttribArray; import static org.lwjgl.opengl.GL20.glVertexAttribPointer; +import static org.lwjgl.opengl.GL30.glDeleteVertexArrays; import static org.lwjgl.opengl.GL30.glGenVertexArrays; import java.nio.FloatBuffer; @@ -271,6 +272,10 @@ public class BufferedMesh if (auxVBO != null) glDeleteBuffers(auxVBO.id); + + glDeleteVertexArrays(vao); + RenderState.setVAO(0); + vao = -1; } public void setVAO() diff --git a/src/main/java/renderer/shaders/RenderState.java b/src/main/java/renderer/shaders/RenderState.java index 2da5b88..b1136bb 100644 --- a/src/main/java/renderer/shaders/RenderState.java +++ b/src/main/java/renderer/shaders/RenderState.java @@ -270,11 +270,6 @@ public abstract class RenderState glBindVertexArray(rec.glVertexArray); } - public static final void useDefaultVAO() - { - glBindVertexArray(0); - } - public static final void setVAO(int vao) { if (rec.glVertexArray == vao) @@ -551,7 +546,7 @@ public abstract class RenderState public static void setBlendFunc(int srcFactor, int destFactor) { - if (srcFactor == rec.blendDestFactor && destFactor == rec.blendDestFactor) + if (srcFactor == rec.blendSrcFactor && destFactor == rec.blendDestFactor) return; rec.blendSrcFactor = srcFactor;