Enable mesh manager support for new batched meshes

This commit is contained in:
2025-07-21 15:27:29 +02:00
parent 2c238ead7b
commit 4fede6a0fc
34 changed files with 185 additions and 132 deletions

View File

@@ -0,0 +1,38 @@
package com.bartlomiejpluta.base.engine.core.gl.object.mesh;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.LinkedList;
import java.util.List;
@Slf4j
@Component
public class DefaultMeshManager implements MeshManager {
private final List<Mesh> meshes = new LinkedList<>();
@Override
public Mesh createMesh(int maxQuads) {
log.debug("Creating [maxQuads: {}] mesh", maxQuads);
var mesh = new Mesh(maxQuads);
meshes.add(mesh);
return mesh;
}
@Override
public QuadMesh createQuad(float width, float height, float originX, float originY) {
log.debug("Creating [w:{}, h:{} | O:{}, {}] mesh", width, height, originX, originY);
var quad = new QuadMesh(width, height, originX, originY);
meshes.add(quad);
return quad;
}
@Override
public void cleanUp() {
log.info("Disposing meshes");
meshes.forEach(Mesh::dispose);
log.info("Disposed {} meshes", meshes.size());
}
}

View File

@@ -53,7 +53,7 @@ public class Mesh implements Renderable, Disposable {
@Getter
private int currentQuadCount = 0;
public Mesh(int maxQuads) {
Mesh(int maxQuads) {
this.maxQuads = maxQuads;
this.maxVertices = maxQuads * VERTICES_PER_QUAD * 2;
this.maxIndices = maxQuads * INDICES_PER_QUAD;
@@ -302,8 +302,4 @@ public class Mesh implements Renderable, Disposable {
public boolean isEmpty() {
return currentQuadCount == 0;
}
public static QuadMesh quad(float width, float height, float originX, float originY) {
return new QuadMesh(width, height, originX, originY);
}
}

View File

@@ -0,0 +1,9 @@
package com.bartlomiejpluta.base.engine.core.gl.object.mesh;
import com.bartlomiejpluta.base.internal.gc.Cleanable;
public interface MeshManager extends Cleanable {
Mesh createMesh(int maxQuads);
QuadMesh createQuad(float width, float height, float originX, float originY);
}

View File

@@ -1,10 +1,23 @@
package com.bartlomiejpluta.base.engine.core.gl.object.mesh;
import lombok.Getter;
import lombok.NonNull;
public class QuadMesh extends Mesh {
private final int quadId;
@Getter
private final float width;
@Getter
private final float height;
@Getter
private final float originX;
@Getter
private final float originY;
QuadMesh(float width, float height, float originX, float originY) {
this(new QuadTemplate(width, height, originX, originY));
}
@@ -12,6 +25,11 @@ public class QuadMesh extends Mesh {
QuadMesh(@NonNull QuadTemplate template) {
super(1);
this.width = template.getWidth();
this.height = template.getHeight();
this.originX = template.getOriginX();
this.originY = template.getOriginY();
this.quadId = addQuad(template, 0, 0);
}

View File

@@ -1,15 +0,0 @@
package com.bartlomiejpluta.base.engine.util.mesh;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
// TODO
@Slf4j
@Component
public class DefaultMeshManager implements MeshManager {
@Override
public void cleanUp() {
log.info("Nothing to do for now (todo...)");
}
}

View File

@@ -1,6 +0,0 @@
package com.bartlomiejpluta.base.engine.util.mesh;
import com.bartlomiejpluta.base.internal.gc.Cleanable;
public interface MeshManager extends Cleanable {
}

View File

@@ -5,5 +5,5 @@ import com.bartlomiejpluta.base.engine.common.init.Initializable;
import com.bartlomiejpluta.base.engine.common.manager.AssetManager;
import com.bartlomiejpluta.base.engine.world.animation.asset.AnimationAsset;
public interface AnimationManager extends Initializable, AssetManager<AnimationAsset, Animation> {
public interface AnimationManager extends AssetManager<AnimationAsset, Animation> {
}

View File

@@ -1,11 +1,11 @@
package com.bartlomiejpluta.base.engine.world.animation.manager;
import com.bartlomiejpluta.base.api.animation.Animation;
import com.bartlomiejpluta.base.engine.core.gl.object.material.Material;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.QuadMesh;
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;
import com.bartlomiejpluta.base.engine.util.mesh.MeshManager;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.MeshManager;
import com.bartlomiejpluta.base.engine.world.animation.asset.AnimationAsset;
import com.bartlomiejpluta.base.engine.world.animation.model.DefaultAnimation;
import lombok.RequiredArgsConstructor;
@@ -22,17 +22,17 @@ import java.util.Map;
@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class DefaultAnimationManager implements AnimationManager {
private static final float QUAD_WIDTH = 1;
private static final float QUAD_HEIGHT = 1;
private static final float QUAD_ORIGIN_X = .5f;
private static final float QUAD_ORIGIN_Y = .5f;
private final MeshManager meshManager;
private final TextureManager textureManager;
private final Map<String, AnimationAsset> assets = new HashMap<>();
private final Map<String, Vector2fc[]> frames = new HashMap<>();
private final ProjectConfiguration configuration;
@Override
public void init() {
// TODO mesh = meshManager.createQuad(1, 1, 0.5f, 0.5f);
}
@Override
public void registerAsset(AnimationAsset asset) {
log.info("Registering [{}] animation asset under UID: [{}]", asset.getSource(), asset.getUid());
@@ -59,7 +59,7 @@ public class DefaultAnimationManager implements AnimationManager {
var source = configuration.projectFile("animations", asset.getSource());
var texture = textureManager.loadTexture(source, asset.getRows(), asset.getColumns());
return new DefaultAnimation(texture, animationFrames);
return new DefaultAnimation(meshManager.createQuad(QUAD_WIDTH, QUAD_HEIGHT, QUAD_ORIGIN_X, QUAD_ORIGIN_Y), texture, animationFrames);
}
private Vector2fc[] createFrames(int rows, int columns) {

View File

@@ -3,6 +3,7 @@ package com.bartlomiejpluta.base.engine.world.animation.model;
import com.bartlomiejpluta.base.api.animation.Animated;
import com.bartlomiejpluta.base.engine.core.engine.DefaultGameEngine;
import com.bartlomiejpluta.base.engine.core.gl.object.material.Material;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.QuadMesh;
import com.bartlomiejpluta.base.engine.world.object.Sprite;
import com.bartlomiejpluta.base.util.math.MathUtil;
import lombok.EqualsAndHashCode;
@@ -15,8 +16,8 @@ public abstract class AnimatedSprite extends Sprite implements Animated {
private int intervalInMilliseconds = 100;
protected int currentAnimationFrame;
public AnimatedSprite(Material material) {
super(material);
public AnimatedSprite(QuadMesh mesh, Material material) {
super(mesh, material);
}
protected abstract boolean shouldAnimate();

View File

@@ -6,6 +6,7 @@ import com.bartlomiejpluta.base.api.map.layer.object.ObjectLayer;
import com.bartlomiejpluta.base.api.move.AnimationMovement;
import com.bartlomiejpluta.base.api.move.Direction;
import com.bartlomiejpluta.base.api.move.Movement;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.QuadMesh;
import com.bartlomiejpluta.base.engine.core.gl.object.texture.Texture;
import com.bartlomiejpluta.base.engine.world.movement.MovableSprite;
import com.bartlomiejpluta.base.util.path.Path;
@@ -50,8 +51,8 @@ public class DefaultAnimation extends MovableSprite implements Animation {
@Getter
private final CompletableFuture<Animation> future = new CompletableFuture<>();
public DefaultAnimation(Texture texture, @NonNull Vector2fc[] frames) {
super(texture);
public DefaultAnimation(QuadMesh mesh, Texture texture, @NonNull Vector2fc[] frames) {
super(mesh, texture);
this.frames = frames;
this.lastFrameIndex = frames.length - 1;

View File

@@ -1,9 +1,8 @@
package com.bartlomiejpluta.base.engine.world.autotile.manager;
import com.bartlomiejpluta.base.engine.common.init.Initializable;
import com.bartlomiejpluta.base.engine.common.manager.AssetManager;
import com.bartlomiejpluta.base.engine.world.autotile.asset.AutoTileSetAsset;
import com.bartlomiejpluta.base.engine.world.autotile.model.AutoTileSet;
public interface AutoTileManager extends Initializable, AssetManager<AutoTileSetAsset, AutoTileSet> {
public interface AutoTileManager extends AssetManager<AutoTileSetAsset, AutoTileSet> {
}

View File

@@ -23,10 +23,6 @@ public class DefaultAutoTileSetManager implements AutoTileManager {
private final Map<String, AutoTileSetAsset> assets = new HashMap<>();
private final ProjectConfiguration configuration;
@Override
public void init() {
}
@Override
public void registerAsset(AutoTileSetAsset asset) {
log.info("Registering [{}] auto tile set asset under UID: [{}]", asset.getSource(), asset.getUid());

View File

@@ -4,6 +4,6 @@ import com.bartlomiejpluta.base.api.character.Character;
import com.bartlomiejpluta.base.engine.common.init.Initializable;
import com.bartlomiejpluta.base.internal.gc.Cleanable;
public interface CharacterManager extends Initializable, Cleanable {
public interface CharacterManager extends Cleanable {
Character createCharacter(String characterSetUid);
}

View File

@@ -1,7 +1,8 @@
package com.bartlomiejpluta.base.engine.world.character.manager;
import com.bartlomiejpluta.base.api.character.Character;
import com.bartlomiejpluta.base.engine.util.mesh.MeshManager;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.QuadMesh;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.MeshManager;
import com.bartlomiejpluta.base.engine.world.character.config.CharacterSpriteConfiguration;
import com.bartlomiejpluta.base.engine.world.character.model.DefaultCharacter;
import lombok.RequiredArgsConstructor;
@@ -13,18 +14,18 @@ import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor(onConstructor_ = @__(@Autowired))
public class DefaultCharacterManager implements CharacterManager {
private static final float QUAD_WIDTH = 1;
private static final float QUAD_HEIGHT = 1;
private static final float QUAD_ORIGIN_X = .5f;
private static final float QUAD_ORIGIN_Y = 1;
private final MeshManager meshManager;
private final CharacterSetManager characterSetManager;
private final CharacterSpriteConfiguration configuration;
@Override
public void init() {
// TODO mesh = meshManager.createQuad(1, 1, 0.5f, 1);
}
@Override
public Character createCharacter(String characterSetUid) {
return new DefaultCharacter(characterSetManager, characterSetUid, configuration.getDefaultSpriteColumn());
return new DefaultCharacter(characterSetManager, meshManager.createQuad(QUAD_WIDTH, QUAD_HEIGHT, QUAD_ORIGIN_X, QUAD_ORIGIN_Y), characterSetUid, configuration.getDefaultSpriteColumn());
}
@Override

View File

@@ -7,6 +7,7 @@ import com.bartlomiejpluta.base.api.map.layer.object.ObjectLayer;
import com.bartlomiejpluta.base.api.move.CharacterMovement;
import com.bartlomiejpluta.base.api.move.Direction;
import com.bartlomiejpluta.base.api.move.Movement;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.QuadMesh;
import com.bartlomiejpluta.base.engine.error.AppException;
import com.bartlomiejpluta.base.engine.world.character.manager.CharacterSetManager;
import com.bartlomiejpluta.base.engine.world.movement.MovableSprite;
@@ -53,12 +54,12 @@ public class DefaultCharacter extends MovableSprite implements Character {
private boolean animationEnabled = true;
public DefaultCharacter(CharacterSetManager characterSetManager, @NonNull String characterSetUid, int defaultSpriteColumn) {
this(characterSetManager.loadObject(characterSetUid), characterSetManager, defaultSpriteColumn);
public DefaultCharacter(CharacterSetManager characterSetManager, QuadMesh mesh, @NonNull String characterSetUid, int defaultSpriteColumn) {
this(mesh, characterSetManager.loadObject(characterSetUid), characterSetManager, defaultSpriteColumn);
}
private DefaultCharacter(@NonNull CharacterSet characterSet, @NonNull CharacterSetManager characterSetManager, int defaultSpriteColumn) {
super(characterSet.getTexture());
private DefaultCharacter(QuadMesh mesh, @NonNull CharacterSet characterSet, @NonNull CharacterSetManager characterSetManager, int defaultSpriteColumn) {
super(mesh, characterSet.getTexture());
this.defaultSpriteColumn = defaultSpriteColumn;
this.characterSetManager = characterSetManager;

View File

@@ -1,7 +1,8 @@
package com.bartlomiejpluta.base.engine.world.icon.manager;
import com.bartlomiejpluta.base.api.icon.Icon;
import com.bartlomiejpluta.base.engine.util.mesh.MeshManager;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.QuadMesh;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.MeshManager;
import com.bartlomiejpluta.base.engine.world.icon.model.DefaultIcon;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -12,17 +13,17 @@ import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class DefaultIconManager implements IconManager {
private static final float QUAD_WIDTH = 1;
private static final float QUAD_HEIGHT = 1;
private static final float QUAD_ORIGIN_X = .5f;
private static final float QUAD_ORIGIN_Y = 1;
private final MeshManager meshManager;
private final IconSetManager iconSetManager;
@Override
public void init() {
// TODO: this.mesh = meshManager.createQuad(1, 1, 0.5f, 1);
}
@Override
public Icon createIcon(String iconSetUid, int row, int column) {
return new DefaultIcon(iconSetManager, iconSetUid, row, column);
return new DefaultIcon(iconSetManager, meshManager.createQuad(QUAD_WIDTH, QUAD_HEIGHT, QUAD_ORIGIN_X, QUAD_ORIGIN_Y), iconSetUid, row, column);
}
@Override

View File

@@ -4,6 +4,6 @@ import com.bartlomiejpluta.base.api.icon.Icon;
import com.bartlomiejpluta.base.engine.common.init.Initializable;
import com.bartlomiejpluta.base.internal.gc.Cleanable;
public interface IconManager extends Initializable, Cleanable {
public interface IconManager extends Cleanable {
Icon createIcon(String iconSetUid, int row, int column);
}

View File

@@ -4,6 +4,7 @@ import com.bartlomiejpluta.base.api.event.Event;
import com.bartlomiejpluta.base.api.event.EventType;
import com.bartlomiejpluta.base.api.icon.Icon;
import com.bartlomiejpluta.base.api.map.layer.object.ObjectLayer;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.QuadMesh;
import com.bartlomiejpluta.base.engine.core.gl.object.texture.Texture;
import com.bartlomiejpluta.base.engine.error.AppException;
import com.bartlomiejpluta.base.engine.world.icon.manager.IconSetManager;
@@ -43,12 +44,12 @@ public class DefaultIcon extends Sprite implements Icon {
@Getter
private int zIndex;
public DefaultIcon(IconSetManager iconSetManager, String iconSetUid, int row, int column) {
this(iconSetManager, iconSetManager.loadObject(iconSetUid), iconSetUid, row, column);
public DefaultIcon(IconSetManager iconSetManager, QuadMesh mesh, String iconSetUid, int row, int column) {
this(iconSetManager, mesh, iconSetManager.loadObject(iconSetUid), iconSetUid, row, column);
}
public DefaultIcon(@NonNull IconSetManager iconSetManager, @NonNull Texture texture, @NonNull String iconSetUid, int row, int column) {
super(texture);
private DefaultIcon(@NonNull IconSetManager iconSetManager, QuadMesh mesh, @NonNull Texture texture, @NonNull String iconSetUid, int row, int column) {
super(mesh, texture);
this.iconSetManager = iconSetManager;
setFrame(row, column);

View File

@@ -1,11 +1,11 @@
package com.bartlomiejpluta.base.engine.world.image.manager;
import com.bartlomiejpluta.base.api.image.Image;
import com.bartlomiejpluta.base.engine.core.gl.object.material.Material;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.QuadMesh;
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;
import com.bartlomiejpluta.base.engine.util.mesh.MeshManager;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.MeshManager;
import com.bartlomiejpluta.base.engine.util.res.ResourcesManager;
import com.bartlomiejpluta.base.engine.world.image.asset.ImageAsset;
import com.bartlomiejpluta.base.engine.world.image.model.DefaultImage;
@@ -23,6 +23,11 @@ import java.util.Map;
@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class DefaultImageManager implements ImageManager {
private static final float QUAD_WIDTH = 1;
private static final float QUAD_HEIGHT = 1;
private static final float QUAD_ORIGIN_X = 0;
private static final float QUAD_ORIGIN_Y = 0;
private final MeshManager meshManager;
private final TextureManager textureManager;
private final ResourcesManager resourcesManager;
@@ -30,11 +35,6 @@ public class DefaultImageManager implements ImageManager {
private final Map<String, ByteBuffer> imageBuffers = new HashMap<>();
private final ProjectConfiguration configuration;
@Override
public void init() {
// TODO mesh = meshManager.createQuad(1, 1, 0, 0);
}
@Override
public void registerAsset(ImageAsset asset) {
log.info("Registering [{}] image asset under UID: [{}]", asset.getSource(), asset.getUid());
@@ -63,7 +63,7 @@ public class DefaultImageManager implements ImageManager {
var initialHeight = height / gcd;
log.info("Creating new image on asset with UID: [{}]", uid);
return new DefaultImage(texture, initialWidth, initialHeight, gcd);
return new DefaultImage(meshManager.createQuad(QUAD_WIDTH, QUAD_HEIGHT, QUAD_ORIGIN_X, QUAD_ORIGIN_Y), texture, initialWidth, initialHeight, gcd);
}
@Override

View File

@@ -7,5 +7,5 @@ import com.bartlomiejpluta.base.engine.common.manager.ByteBufferAssetManager;
import com.bartlomiejpluta.base.engine.world.image.asset.ImageAsset;
import com.bartlomiejpluta.base.internal.gc.Cleanable;
public interface ImageManager extends Initializable, AssetManager<ImageAsset, Image>, ByteBufferAssetManager<ImageAsset>, Cleanable {
public interface ImageManager extends AssetManager<ImageAsset, Image>, ByteBufferAssetManager<ImageAsset>, Cleanable {
}

View File

@@ -2,6 +2,7 @@ package com.bartlomiejpluta.base.engine.world.image.model;
import com.bartlomiejpluta.base.api.image.Image;
import com.bartlomiejpluta.base.engine.core.gl.object.material.Material;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.QuadMesh;
import com.bartlomiejpluta.base.engine.world.object.Sprite;
import lombok.Getter;
import lombok.NonNull;
@@ -16,8 +17,8 @@ public class DefaultImage extends Sprite implements Image {
private final int width;
private final int height;
public DefaultImage(@NonNull Material texture, int primaryWidth, int primaryHeight, int factor) {
super(texture);
public DefaultImage(QuadMesh mesh, @NonNull Material texture, int primaryWidth, int primaryHeight, int factor) {
super(mesh, texture);
this.primaryWidth = primaryWidth;
this.primaryHeight = primaryHeight;
this.factor = factor;

View File

@@ -1,6 +1,7 @@
package com.bartlomiejpluta.base.engine.world.map.layer.autotile;
import com.bartlomiejpluta.base.api.map.model.GameMap;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.MeshManager;
import com.bartlomiejpluta.base.engine.core.gl.object.texture.Texture;
import com.bartlomiejpluta.base.engine.world.autotile.model.AutoTileSet;
import lombok.AccessLevel;
@@ -54,8 +55,8 @@ public class AutoTileLayer2x2 extends BaseAutoTileLayer {
private final int tileSetColumns;
public AutoTileLayer2x2(@NonNull GameMap map, @NonNull AutoTileSet tileSet, int rows, int columns, boolean connect, boolean animated, double animationDuration) {
super(map, tileSet, rows, columns, connect, animated, animationDuration);
public AutoTileLayer2x2(MeshManager meshManager, @NonNull GameMap map, @NonNull AutoTileSet tileSet, int rows, int columns, boolean connect, boolean animated, double animationDuration) {
super(meshManager, map, tileSet, rows, columns, connect, animated, animationDuration);
this.tileSetColumns = tileSet.getSetsColumns();
}

View File

@@ -2,6 +2,7 @@ package com.bartlomiejpluta.base.engine.world.map.layer.autotile;
import com.bartlomiejpluta.base.api.map.layer.autotile.AutoTileLayer;
import com.bartlomiejpluta.base.api.map.model.GameMap;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.MeshManager;
import com.bartlomiejpluta.base.engine.core.gl.object.texture.Texture;
import com.bartlomiejpluta.base.engine.world.autotile.model.AutoTileSet;
import lombok.AccessLevel;
@@ -62,8 +63,8 @@ public class AutoTileLayer3x2 extends BaseAutoTileLayer implements AutoTileLayer
private final int tileSetColumns;
public AutoTileLayer3x2(@NonNull GameMap map, @NonNull AutoTileSet tileSet, int rows, int columns, boolean connect, boolean animated, double animationDuration) {
super(map, tileSet, rows, columns, connect, animated, animationDuration);
public AutoTileLayer3x2(MeshManager meshManager, @NonNull GameMap map, @NonNull AutoTileSet tileSet, int rows, int columns, boolean connect, boolean animated, double animationDuration) {
super(meshManager, map, tileSet, rows, columns, connect, animated, animationDuration);
this.tileSetColumns = tileSet.getSetsColumns();
}

View File

@@ -3,6 +3,7 @@ package com.bartlomiejpluta.base.engine.world.map.layer.autotile;
import com.bartlomiejpluta.base.api.camera.Camera;
import com.bartlomiejpluta.base.api.map.model.GameMap;
import com.bartlomiejpluta.base.api.screen.Screen;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.MeshManager;
import com.bartlomiejpluta.base.engine.world.autotile.model.AutoTileSet;
import com.bartlomiejpluta.base.engine.world.map.layer.base.BaseLayer;
import com.bartlomiejpluta.base.engine.world.map.layer.util.ChunkManager;
@@ -27,7 +28,7 @@ public abstract class BaseAutoTileLayer extends BaseLayer {
private float accumulator = 0f;
private boolean dirty = true;
public BaseAutoTileLayer(@NonNull GameMap map, @NonNull AutoTileSet tileSet, int rows, int columns, boolean connect, boolean animated, double animationDuration) {
public BaseAutoTileLayer(MeshManager meshManager, @NonNull GameMap map, @NonNull AutoTileSet tileSet, int rows, int columns, boolean connect, boolean animated, double animationDuration) {
super(map);
this.layer = new int[rows][columns];
this.connect = connect;
@@ -36,6 +37,7 @@ public abstract class BaseAutoTileLayer extends BaseLayer {
this.setsCount = tileSet.getSetsCount();
this.chunkManager = new ChunkManager(
meshManager,
tileSet.getTexture(),
rows * 4,
columns * 4,

View File

@@ -6,7 +6,7 @@ import com.bartlomiejpluta.base.api.map.model.GameMap;
import com.bartlomiejpluta.base.api.screen.Screen;
import com.bartlomiejpluta.base.engine.core.gl.object.color.Color;
import com.bartlomiejpluta.base.engine.core.gl.object.material.Material;
import com.bartlomiejpluta.base.engine.util.mesh.MeshManager;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.MeshManager;
import com.bartlomiejpluta.base.engine.world.map.layer.base.BaseLayer;
import com.bartlomiejpluta.base.engine.world.object.Sprite;
import com.bartlomiejpluta.base.internal.object.Placeable;
@@ -16,6 +16,11 @@ import org.joml.Matrix4fc;
import org.joml.Vector2fc;
public class DefaultColorLayer extends BaseLayer implements ColorLayer {
private static final float QUAD_WIDTH = 1;
private static final float QUAD_HEIGHT = 1;
private static final float QUAD_ORIGIN_X = 0;
private static final float QUAD_ORIGIN_Y = 0;
private final ColorPlane colorPlane;
private final Material material;
@@ -145,8 +150,7 @@ public class DefaultColorLayer extends BaseLayer implements ColorLayer {
private static class ColorPlane extends Sprite {
public ColorPlane(@NonNull MeshManager meshManager, float red, float green, float blue, float alpha) {
// TODO (Custom Mesh): super(meshManager.createQuad(1, 1, 0, 0), Material.colored(red, green, blue, alpha));
super(new Color(red, green, blue, alpha));
super(meshManager.createQuad(QUAD_WIDTH, QUAD_HEIGHT, QUAD_ORIGIN_X, QUAD_ORIGIN_Y), new Color(red, green, blue, alpha));
}
}
}

View File

@@ -4,6 +4,7 @@ import com.bartlomiejpluta.base.api.camera.Camera;
import com.bartlomiejpluta.base.api.map.layer.tile.TileLayer;
import com.bartlomiejpluta.base.api.map.model.GameMap;
import com.bartlomiejpluta.base.api.screen.Screen;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.MeshManager;
import com.bartlomiejpluta.base.engine.world.map.layer.base.BaseLayer;
import com.bartlomiejpluta.base.engine.world.map.layer.util.ChunkManager;
import com.bartlomiejpluta.base.engine.world.tileset.model.TileSet;
@@ -13,10 +14,10 @@ import lombok.NonNull;
public class DefaultTileLayer extends BaseLayer implements TileLayer {
private final ChunkManager chunkManager;
public DefaultTileLayer(@NonNull GameMap map, @NonNull TileSet tileSet, int rows, int columns) {
public DefaultTileLayer(MeshManager meshManager, @NonNull GameMap map, @NonNull TileSet tileSet, int rows, int columns) {
super(map);
this.chunkManager = new ChunkManager(tileSet.texture(), rows, columns);
this.chunkManager = new ChunkManager(meshManager, tileSet.texture(), rows, columns);
}
@Override

View File

@@ -2,6 +2,7 @@ package com.bartlomiejpluta.base.engine.world.map.layer.util;
import com.bartlomiejpluta.base.api.camera.Camera;
import com.bartlomiejpluta.base.api.screen.Screen;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.MeshManager;
import com.bartlomiejpluta.base.engine.core.gl.object.texture.Texture;
import com.bartlomiejpluta.base.internal.gc.Disposable;
import com.bartlomiejpluta.base.internal.render.Renderable;
@@ -14,6 +15,7 @@ import java.util.Map;
public class ChunkManager implements Renderable, Disposable {
private static final int DEFAULT_CHUNK_SIZE = 10;
private final MeshManager meshManager;
private final Map<Long, TileChunk> chunks = new HashMap<>();
private final Map<Long, Map<Integer, Integer>> chunkTileIds = new HashMap<>();
@@ -23,19 +25,20 @@ public class ChunkManager implements Renderable, Disposable {
private final float tileWidth, tileHeight;
private final int mapRows, mapColumns;
public ChunkManager(Texture tileSet, int rows, int columns) {
this(tileSet, rows, columns, DEFAULT_CHUNK_SIZE);
public ChunkManager(MeshManager meshManager, Texture tileSet, int rows, int columns) {
this(meshManager, tileSet, rows, columns, DEFAULT_CHUNK_SIZE);
}
public ChunkManager(Texture tileSet, int rows, int columns, Vector2fc tileSize) {
this(tileSet, rows, columns, tileSize, DEFAULT_CHUNK_SIZE);
public ChunkManager(MeshManager meshManager, Texture tileSet, int rows, int columns, Vector2fc tileSize) {
this(meshManager, tileSet, rows, columns, tileSize, DEFAULT_CHUNK_SIZE);
}
public ChunkManager(Texture tileSet, int rows, int columns, int chunkSize) {
this(tileSet, rows, columns, tileSet.getSpriteSize(), chunkSize);
public ChunkManager(MeshManager meshManager, Texture tileSet, int rows, int columns, int chunkSize) {
this(meshManager, tileSet, rows, columns, tileSet.getSpriteSize(), chunkSize);
}
public ChunkManager(@NonNull Texture tileSet, int rows, int columns, @NonNull Vector2fc tileSize, int chunkSize) {
public ChunkManager(MeshManager meshManager, @NonNull Texture tileSet, int rows, int columns, @NonNull Vector2fc tileSize, int chunkSize) {
this.meshManager = meshManager;
this.tileSet = tileSet;
this.mapRows = rows;
this.mapColumns = columns;
@@ -64,7 +67,7 @@ public class ChunkManager implements Renderable, Disposable {
int chunkX = (column / chunkSize) * (int) tileWidth * chunkSize;
int chunkY = (row / chunkSize) * (int) tileHeight * chunkSize;
chunk = new TileChunk(tileSet, chunkSize);
chunk = new TileChunk(meshManager, tileSet, chunkSize);
chunk.setPosition(chunkX, chunkY);
chunks.put(chunkKey, chunk);
chunkTileIds.put(chunkKey, new HashMap<>());

View File

@@ -4,6 +4,7 @@ import com.bartlomiejpluta.base.api.camera.Camera;
import com.bartlomiejpluta.base.api.screen.Screen;
import com.bartlomiejpluta.base.engine.core.gl.object.material.Material;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.Mesh;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.MeshManager;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.QuadTemplate;
import com.bartlomiejpluta.base.engine.core.gl.object.texture.Texture;
import com.bartlomiejpluta.base.engine.core.gl.shader.constant.Shader;
@@ -14,6 +15,7 @@ import com.bartlomiejpluta.base.internal.object.Placeable;
import com.bartlomiejpluta.base.internal.render.BoundingBox;
import com.bartlomiejpluta.base.internal.render.Renderable;
import com.bartlomiejpluta.base.internal.render.ShaderManager;
import lombok.NonNull;
public class TileChunk extends Model implements Placeable, Renderable, Disposable, BoundingBox {
private final Texture tileSet;
@@ -23,14 +25,14 @@ public class TileChunk extends Model implements Placeable, Renderable, Disposabl
private final float originX;
private final float originY;
public TileChunk(Texture tileSet, int chunkSize) {
this(tileSet, chunkSize, 0, 0);
public TileChunk(MeshManager meshManager, Texture tileSet, int chunkSize) {
this(meshManager, tileSet, chunkSize, 0, 0);
}
public TileChunk(Texture tileSet, int chunkSize, float originX, float originY) {
public TileChunk(@NonNull MeshManager meshManager, @NonNull Texture tileSet, int chunkSize, float originX, float originY) {
this.tileSet = tileSet;
this.chunkSize = chunkSize;
this.mesh = new Mesh(chunkSize * chunkSize);
this.mesh = meshManager.createMesh(chunkSize * chunkSize);
this.template = new QuadTemplate(tileSet.getSpriteSize().x(), tileSet.getSpriteSize().y(), originX, originY);
this.originX = originX;
this.originY = originY;

View File

@@ -12,9 +12,8 @@ import com.bartlomiejpluta.base.api.map.layer.object.PassageAbility;
import com.bartlomiejpluta.base.api.map.layer.tile.TileLayer;
import com.bartlomiejpluta.base.api.map.model.GameMap;
import com.bartlomiejpluta.base.api.screen.Screen;
import com.bartlomiejpluta.base.engine.core.gl.object.texture.Texture;
import com.bartlomiejpluta.base.engine.core.gl.shader.constant.UniformName;
import com.bartlomiejpluta.base.engine.util.mesh.MeshManager;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.MeshManager;
import com.bartlomiejpluta.base.engine.world.autotile.model.AutoTileSet;
import com.bartlomiejpluta.base.engine.world.map.layer.autotile.AutoTileLayer2x2;
import com.bartlomiejpluta.base.engine.world.map.layer.autotile.AutoTileLayer3x2;
@@ -37,6 +36,7 @@ import java.util.Arrays;
import java.util.List;
public class DefaultGameMap implements Renderable, Updatable, GameMap {
private final MeshManager meshManager;
@Getter
private final List<Layer> layers = new ArrayList<>();
@@ -65,7 +65,8 @@ public class DefaultGameMap implements Renderable, Updatable, GameMap {
@Getter
private final Vector3f ambientColor = new Vector3f(1, 1, 1);
public DefaultGameMap(int tileWidth, int tileHeight, int rows, int columns, String handler) {
public DefaultGameMap(MeshManager meshManager, int tileWidth, int tileHeight, int rows, int columns, String handler) {
this.meshManager = meshManager;
this.rows = rows;
this.columns = columns;
this.stepSize = new Vector2f(tileWidth, tileHeight);
@@ -135,21 +136,21 @@ public class DefaultGameMap implements Renderable, Updatable, GameMap {
}
public TileLayer createTileLayer(@NonNull TileSet tileSet) {
var layer = new DefaultTileLayer(this, tileSet, rows, columns);
var layer = new DefaultTileLayer(meshManager, this, tileSet, rows, columns);
layers.add(layer);
return layer;
}
public AutoTileLayer3x2 createAutoTileLayer3x2(@NonNull AutoTileSet tileSet, boolean animated, double animationDuration, boolean connect) {
var layer = new AutoTileLayer3x2(this, tileSet, rows, columns, connect, animated, animationDuration);
var layer = new AutoTileLayer3x2(meshManager, this, tileSet, rows, columns, connect, animated, animationDuration);
layers.add(layer);
return layer;
}
public AutoTileLayer2x2 createAutoTileLayer2x2(@NonNull AutoTileSet tileSet, boolean animated, double animationDuration, boolean connect) {
var layer = new AutoTileLayer2x2(this, tileSet, rows, columns, connect, animated, animationDuration);
var layer = new AutoTileLayer2x2(meshManager, this, tileSet, rows, columns, connect, animated, animationDuration);
layers.add(layer);
return layer;

View File

@@ -3,7 +3,7 @@ package com.bartlomiejpluta.base.engine.world.map.serial;
import com.bartlomiejpluta.base.api.map.layer.image.ImageLayerMode;
import com.bartlomiejpluta.base.api.map.layer.object.PassageAbility;
import com.bartlomiejpluta.base.engine.error.AppException;
import com.bartlomiejpluta.base.engine.util.mesh.MeshManager;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.MeshManager;
import com.bartlomiejpluta.base.engine.world.autotile.manager.AutoTileManager;
import com.bartlomiejpluta.base.engine.world.image.manager.ImageManager;
import com.bartlomiejpluta.base.engine.world.map.model.DefaultGameMap;
@@ -28,7 +28,7 @@ public class ProtobufMapDeserializer extends MapDeserializer {
@Override
protected DefaultGameMap parse(InputStream input) throws Exception {
var proto = GameMapProto.GameMap.parseFrom(input);
var map = new DefaultGameMap(proto.getTileWidth(), proto.getTileHeight(), proto.getRows(), proto.getColumns(), proto.getHandler());
var map = new DefaultGameMap(meshManager, proto.getTileWidth(), proto.getTileHeight(), proto.getRows(), proto.getColumns(), proto.getHandler());
proto.getLayersList().forEach(layer -> deserializeLayer(map, layer));

View File

@@ -4,6 +4,7 @@ import com.bartlomiejpluta.base.api.move.Movable;
import com.bartlomiejpluta.base.api.move.Movement;
import com.bartlomiejpluta.base.engine.core.engine.DefaultGameEngine;
import com.bartlomiejpluta.base.engine.core.gl.object.material.Material;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.QuadMesh;
import com.bartlomiejpluta.base.engine.world.animation.model.AnimatedSprite;
import com.bartlomiejpluta.base.internal.program.Updatable;
import com.bartlomiejpluta.base.util.math.MathUtil;
@@ -20,8 +21,8 @@ public abstract class MovableSprite extends AnimatedSprite implements Movable, U
@Getter
private Movement movement;
public MovableSprite(Material material) {
super(material);
public MovableSprite(QuadMesh mesh, Material material) {
super(mesh, material);
}
@Override

View File

@@ -3,9 +3,7 @@ package com.bartlomiejpluta.base.engine.world.object;
import com.bartlomiejpluta.base.api.camera.Camera;
import com.bartlomiejpluta.base.api.screen.Screen;
import com.bartlomiejpluta.base.engine.core.gl.object.material.Material;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.Mesh;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.QuadMesh;
import com.bartlomiejpluta.base.engine.core.gl.shader.constant.Shader;
import com.bartlomiejpluta.base.engine.core.gl.shader.constant.UniformName;
import com.bartlomiejpluta.base.engine.world.location.LocationableModel;
import com.bartlomiejpluta.base.internal.render.BoundingBox;
@@ -21,18 +19,23 @@ public abstract class Sprite extends LocationableModel implements Renderable, Bo
@Getter
private Material material;
private final QuadMesh quad;
private final float width = 1f;
private final float height = 1f;
private final float originX = .5f;
private final float originY = 1f;
private final QuadMesh mesh;
private final float width;
private final float height;
private final float originX;
private final float originY;
@Getter
private float[][] textureCoordinates;
public Sprite(Material material) {
public Sprite(@NonNull QuadMesh mesh, @NonNull Material material) {
this.material = material;
this.quad = Mesh.quad(width, height, originX, originY);
this.mesh = mesh;
this.width = mesh.getWidth();
this.height = mesh.getHeight();
this.originX = mesh.getOriginX();
this.originY = mesh.getOriginY();
updateTextureCoordinates();
}
@@ -51,7 +54,7 @@ public abstract class Sprite extends LocationableModel implements Renderable, Bo
}
public void setFrame(int id) {
quad.setTextureCoordinates(textureCoordinates[id]);
mesh.setTextureCoordinates(textureCoordinates[id]);
}
@Override
@@ -92,6 +95,6 @@ public abstract class Sprite extends LocationableModel implements Renderable, Bo
shaderManager.setUniform(UniformName.UNI_PROJECTION_MATRIX, camera.getProjectionMatrix());
shaderManager.setUniform(UniformName.UNI_VIEW_MODEL_MATRIX, camera.computeViewModelMatrix(getModelMatrix()));
quad.render(screen, camera, shaderManager);
mesh.render(screen, camera, shaderManager);
}
}

View File

@@ -3,7 +3,6 @@ package com.bartlomiejpluta.base.engine.world.tileset.manager;
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;
import com.bartlomiejpluta.base.engine.util.mesh.MeshManager;
import com.bartlomiejpluta.base.engine.world.tileset.asset.TileSetAsset;
import com.bartlomiejpluta.base.engine.world.tileset.model.TileSet;
import lombok.RequiredArgsConstructor;
@@ -19,16 +18,10 @@ import java.util.Map;
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class DefaultTileSetManager implements TileSetManager {
private final TextureManager textureManager;
private final MeshManager meshManager;
private final Map<String, TileSet> tileSets = new HashMap<>();
private final Map<String, TileSetAsset> assets = new HashMap<>();
private final ProjectConfiguration configuration;
@Override
public void init() {
// TODO this.mesh = meshManager.createQuad(1, 1, 0, 0);
}
@Override
public void registerAsset(TileSetAsset asset) {
log.info("Registering [{}] tile set asset under UID: [{}]", asset.getSource(), asset.getUid());

View File

@@ -1,10 +1,9 @@
package com.bartlomiejpluta.base.engine.world.tileset.manager;
import com.bartlomiejpluta.base.engine.common.init.Initializable;
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 Initializable, AssetManager<TileSetAsset, TileSet>, Cleanable {
public interface TileSetManager extends AssetManager<TileSetAsset, TileSet>, Cleanable {
}