From dfc0b0695bca68c9f9bad76fd749e98813f96990 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Tue, 23 Mar 2021 13:13:28 +0100 Subject: [PATCH] Make TileSetManager shares common Mesh 1x1 among all tiles --- .../engine/util/mesh/DefaultMeshManager.java | 2 +- .../manager/DefaultTileSetManager.java | 9 +++- .../world/tileset/manager/TileSetManager.java | 3 +- .../base/engine/world/tileset/model/Tile.java | 45 +++++++++++++++++++ 4 files changed, 55 insertions(+), 4 deletions(-) diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/util/mesh/DefaultMeshManager.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/util/mesh/DefaultMeshManager.java index 2bb84574..bb410e08 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/util/mesh/DefaultMeshManager.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/util/mesh/DefaultMeshManager.java @@ -20,7 +20,7 @@ public class DefaultMeshManager implements MeshManager { var mesh = quads.get(dim); if(mesh == null) { - log.info("Creating [w:{}, h:{} | O:{},{}] and putting it into the cache", width, height, originX, originY); + log.info("Creating [w:{}, h:{} | O:{}, {}] mesh and putting it into the cache", width, height, originX, originY); mesh = Mesh.quad(width, height, originX, originY); quads.put(dim, mesh); } diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/tileset/manager/DefaultTileSetManager.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/tileset/manager/DefaultTileSetManager.java index 070ae615..6254d6b2 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/tileset/manager/DefaultTileSetManager.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/tileset/manager/DefaultTileSetManager.java @@ -1,5 +1,6 @@ package com.bartlomiejpluta.base.engine.world.tileset.manager; +import com.bartlomiejpluta.base.engine.core.gl.object.mesh.Mesh; import com.bartlomiejpluta.base.engine.core.gl.object.texture.TextureManager; import com.bartlomiejpluta.base.engine.error.AppException; import com.bartlomiejpluta.base.engine.project.config.ProjectConfiguration; @@ -23,6 +24,12 @@ public class DefaultTileSetManager implements TileSetManager { private final Map tileSets = new HashMap<>(); private final Map assets = new HashMap<>(); private final ProjectConfiguration configuration; + private Mesh mesh; + + @Override + public void init() { + this.mesh = meshManager.createQuad(1, 1, 0, 0); + } @Override public void registerAsset(TileSetAsset asset) { @@ -43,8 +50,6 @@ public class DefaultTileSetManager implements TileSetManager { var source = configuration.projectFile("tilesets", asset.getSource()); var texture = textureManager.loadTexture(source, asset.getRows(), asset.getColumns()); - var size = texture.getSpriteSize(); - var mesh = meshManager.createQuad(size.x(), size.y(), 0, 0); tileset = new TileSet(texture, mesh); log.info("Loading tile set from assets to cache under the key: [{}]", uid); tileSets.put(uid, tileset); diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/tileset/manager/TileSetManager.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/tileset/manager/TileSetManager.java index 98c8c440..0338eeff 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/tileset/manager/TileSetManager.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/tileset/manager/TileSetManager.java @@ -1,9 +1,10 @@ package com.bartlomiejpluta.base.engine.world.tileset.manager; +import com.bartlomiejpluta.base.engine.common.init.Initianizable; import com.bartlomiejpluta.base.engine.common.manager.AssetManager; import com.bartlomiejpluta.base.engine.world.tileset.asset.TileSetAsset; import com.bartlomiejpluta.base.engine.world.tileset.model.TileSet; import com.bartlomiejpluta.base.internal.gc.Cleanable; -public interface TileSetManager extends AssetManager, Cleanable { +public interface TileSetManager extends Initianizable, AssetManager, Cleanable { } diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/tileset/model/Tile.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/tileset/model/Tile.java index 620ab550..25972f42 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/tileset/model/Tile.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/tileset/model/Tile.java @@ -5,12 +5,16 @@ import com.bartlomiejpluta.base.engine.core.gl.object.mesh.Mesh; import com.bartlomiejpluta.base.engine.core.gl.object.texture.Texture; import com.bartlomiejpluta.base.engine.world.object.Sprite; import lombok.Getter; +import org.joml.Vector2f; +import org.joml.Vector2fc; @Getter public class Tile extends Sprite { private final int id; private final int tileSetRow; private final int tileSetColumn; + private final Vector2f tileScale = new Vector2f(1, 1); + private final Vector2fc tileSpriteSize; public Tile setCoordinates(int row, int column) { var stepSize = material.getTexture().getSpriteSize(); @@ -24,6 +28,9 @@ public class Tile extends Sprite { this.tileSetRow = id / tileSet.getColumns(); this.tileSetColumn = id % tileSet.getColumns(); material.setSpritePosition(tileSetColumn, tileSetRow); + tileSpriteSize = tileSet.getSpriteSize(); + + super.setScale(tileSpriteSize.x() * tileScale.x, tileSpriteSize.y() * tileScale.y); } public Tile(Mesh mesh, Texture tileSet, int row, int column) { @@ -32,5 +39,43 @@ public class Tile extends Sprite { this.tileSetColumn = column; this.id = row * tileSet.getColumns() + column; material.setSpritePosition(tileSetColumn, tileSetRow); + tileSpriteSize = tileSet.getSpriteSize(); + + super.setScale(tileSpriteSize.x() * tileScale.x, tileSpriteSize.y() * tileScale.y); + } + + @Override + public void setScaleX(float scaleX) { + this.tileScale.x = scaleX; + super.setScaleX(tileSpriteSize.x() * scaleX); + } + + @Override + public void setScaleY(float scaleY) { + this.tileScale.y = scaleY; + super.setScaleY(tileSpriteSize.x() * scaleY); + } + + @Override + public void setScale(float scale) { + this.tileScale.x = scale; + this.tileScale.y = scale; + super.setScale(tileSpriteSize.x() * scale, tileSpriteSize.y() * scale); + } + + public void setScale(float scaleX, float scaleY) { + this.tileScale.x = scaleX; + this.tileScale.y = scaleY; + super.setScale(tileSpriteSize.x() * scaleX, tileSpriteSize.y() * scaleY); + } + + @Override + public float getScaleX() { + return tileScale.x; + } + + @Override + public float getScaleY() { + return tileScale.y; } }