Extract ImageLayer interface to :api

This commit is contained in:
2021-03-03 20:14:54 +01:00
parent 4f1cef4d43
commit f4b1b388e0
14 changed files with 221 additions and 112 deletions

View File

@@ -2,11 +2,14 @@ package com.bartlomiejpluta.base.api.game.context;
import com.bartlomiejpluta.base.api.game.camera.Camera;
import com.bartlomiejpluta.base.api.game.entity.Entity;
import com.bartlomiejpluta.base.api.game.map.Image;
public interface Context {
void openMap(String mapUid);
Entity createEntity(String entitySetUid);
Image getImage(String imageUid);
Camera getCamera();
}

View File

@@ -5,10 +5,20 @@ import com.bartlomiejpluta.base.api.game.entity.Movement;
import org.joml.Vector2f;
public interface GameMap {
float getWidth();
float getHeight();
int getRows();
int getColumns();
Vector2f getSize();
TileLayer getTileLayer(int layerIndex);
ImageLayer getImageLayer(int layerIndex);
void addEntity(int objectLayerIndex, Entity entity);
void removeEntity(int objectLayerIndex, Entity entity);

View File

@@ -0,0 +1,16 @@
package com.bartlomiejpluta.base.api.game.map;
import com.bartlomiejpluta.base.api.internal.object.Placeable;
import com.bartlomiejpluta.base.api.internal.render.Renderable;
public interface Image extends Placeable, Renderable {
int getPrimaryWidth();
int getPrimaryHeight();
int getFactor();
int getWidth();
int getHeight();
}

View File

@@ -0,0 +1,15 @@
package com.bartlomiejpluta.base.api.game.map;
public interface ImageLayer extends Layer {
void setImage(Image image);
void setOpacity(float opacity);
void setPosition(float x, float y);
void setMode(ImageLayerMode mode);
void setScale(float scaleX, float scaleY);
void setParallax(boolean parallax);
}

View File

@@ -1,4 +1,4 @@
package com.bartlomiejpluta.base.engine.world.map.layer.image;
package com.bartlomiejpluta.base.api.game.map;
public enum ImageLayerMode {
NORMAL,

View File

@@ -3,6 +3,7 @@ package com.bartlomiejpluta.base.engine.project.model;
import com.bartlomiejpluta.base.api.game.camera.Camera;
import com.bartlomiejpluta.base.api.game.context.Context;
import com.bartlomiejpluta.base.api.game.entity.Entity;
import com.bartlomiejpluta.base.api.game.map.Image;
import com.bartlomiejpluta.base.api.game.map.MapHandler;
import com.bartlomiejpluta.base.api.game.window.Window;
import com.bartlomiejpluta.base.api.internal.logic.Updatable;
@@ -57,6 +58,11 @@ public class RenderableContext implements Context, Updatable, Renderable {
return entityManager.createEntity(entitySetUid);
}
@Override
public Image getImage(String imageUid) {
return imageManager.loadObject(imageUid);
}
@Override
public Camera getCamera() {
return camera;

View File

@@ -1,5 +1,6 @@
package com.bartlomiejpluta.base.engine.world.image.manager;
import com.bartlomiejpluta.base.api.game.map.Image;
import com.bartlomiejpluta.base.engine.core.gl.object.material.Material;
import com.bartlomiejpluta.base.engine.core.gl.object.texture.TextureManager;
import com.bartlomiejpluta.base.engine.error.AppException;
@@ -7,7 +8,7 @@ import com.bartlomiejpluta.base.engine.project.config.ProjectConfiguration;
import com.bartlomiejpluta.base.engine.util.math.MathUtil;
import com.bartlomiejpluta.base.engine.util.mesh.MeshManager;
import com.bartlomiejpluta.base.engine.world.image.asset.ImageAsset;
import com.bartlomiejpluta.base.engine.world.image.model.Image;
import com.bartlomiejpluta.base.engine.world.image.model.DefaultImage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -51,7 +52,7 @@ public class DefaultImageManager implements ImageManager {
var material = Material.textured(texture);
log.info("Creating new image on asset with UID: [{}]", uid);
return new Image(mesh, material, initialWidth, initialHeight, gcd);
return new DefaultImage(mesh, material, initialWidth, initialHeight, gcd);
}
@Override

View File

@@ -1,9 +1,9 @@
package com.bartlomiejpluta.base.engine.world.image.manager;
import com.bartlomiejpluta.base.api.game.map.Image;
import com.bartlomiejpluta.base.api.internal.gc.Cleanable;
import com.bartlomiejpluta.base.engine.common.manager.AssetManager;
import com.bartlomiejpluta.base.engine.world.image.asset.ImageAsset;
import com.bartlomiejpluta.base.engine.world.image.model.Image;
public interface ImageManager extends AssetManager<ImageAsset, Image>, Cleanable {
}

View File

@@ -0,0 +1,26 @@
package com.bartlomiejpluta.base.engine.world.image.model;
import com.bartlomiejpluta.base.api.game.map.Image;
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.world.object.Sprite;
import lombok.Getter;
@Getter
public class DefaultImage extends Sprite implements Image {
private final int primaryWidth;
private final int primaryHeight;
private final int factor;
private final int width;
private final int height;
public DefaultImage(Mesh mesh, Material texture, int primaryWidth, int primaryHeight, int factor) {
super(mesh, texture);
this.primaryWidth = primaryWidth;
this.primaryHeight = primaryHeight;
this.factor = factor;
this.width = primaryWidth * factor;
this.height = primaryHeight * factor;
}
}

View File

@@ -1,20 +0,0 @@
package com.bartlomiejpluta.base.engine.world.image.model;
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.world.object.Sprite;
import lombok.Getter;
@Getter
public class Image extends Sprite {
private final int initialWidth;
private final int initialHeight;
private final int gcd;
public Image(Mesh mesh, Material texture, int initialWidth, int initialHeight, int gcd) {
super(mesh, texture);
this.initialWidth = initialWidth;
this.initialHeight = initialHeight;
this.gcd = gcd;
}
}

View File

@@ -0,0 +1,128 @@
package com.bartlomiejpluta.base.engine.world.map.layer.image;
import com.bartlomiejpluta.base.api.game.camera.Camera;
import com.bartlomiejpluta.base.api.game.map.GameMap;
import com.bartlomiejpluta.base.api.game.map.Image;
import com.bartlomiejpluta.base.api.game.map.ImageLayer;
import com.bartlomiejpluta.base.api.game.map.ImageLayerMode;
import com.bartlomiejpluta.base.api.game.window.Window;
import com.bartlomiejpluta.base.api.internal.render.ShaderManager;
import com.bartlomiejpluta.base.engine.world.image.model.DefaultImage;
import lombok.Getter;
import lombok.NonNull;
import lombok.Setter;
public class DefaultImageLayer implements ImageLayer {
private final float mapWidth;
private final float mapHeight;
@NonNull
@Getter
private DefaultImage image;
private float imagePrimaryWidth;
private float imagePrimaryHeight;
private float x;
private float y;
private float scaleX;
private float scaleY;
@NonNull
private ImageLayerMode mode;
@Getter
private float opacity;
@Setter
private boolean parallax;
public DefaultImageLayer(GameMap map, Image image, float opacity, float x, float y, float scaleX, float scaleY, ImageLayerMode mode, boolean parallax) {
this.mapWidth = map.getWidth();
this.mapHeight = map.getHeight();
this.x = x;
this.y = y;
this.scaleX = scaleX;
this.scaleY = scaleY;
this.mode = mode;
this.parallax = parallax;
this.opacity = opacity;
setImage(image);
}
private void recalculate() {
switch (mode) {
case NORMAL -> image.setScale(image.getWidth() * scaleX, image.getHeight() * scaleY);
case FIT_MAP -> image.setScale(mapWidth / imagePrimaryWidth, mapHeight / imagePrimaryHeight);
}
if (mode == ImageLayerMode.NORMAL) {
System.out.printf("%d * %f, %d * %f", image.getWidth(), scaleX, image.getHeight(), scaleY);
}
}
@Override
public void setImage(Image image) {
this.image = (DefaultImage) image;
this.imagePrimaryWidth = image.getPrimaryWidth();
this.imagePrimaryHeight = image.getPrimaryHeight();
this.image.setPosition(x, y);
this.image.getMaterial().setAlpha(opacity);
recalculate();
}
@Override
public void setOpacity(float opacity) {
this.opacity = opacity;
this.image.getMaterial().setAlpha(opacity);
}
@Override
public void setPosition(float x, float y) {
this.x = x;
this.y = y;
}
@Override
public void setMode(ImageLayerMode mode) {
this.mode = mode;
recalculate();
}
@Override
public void setScale(float scaleX, float scaleY) {
this.x = scaleX;
this.y = scaleY;
recalculate();
}
@Override
public void update(float dt) {
// Do nothing
}
@Override
public void render(Window window, Camera camera, ShaderManager shaderManager) {
if (image != null) {
if (parallax) {
var cameraPosition = camera.getPosition();
image.setPosition(cameraPosition.x + x, cameraPosition.y + y);
}
if (mode == ImageLayerMode.FIT_SCREEN) {
image.setScale(window.getWidth() / imagePrimaryWidth, window.getHeight() / imagePrimaryHeight);
}
image.render(window, camera, shaderManager);
}
}
}

View File

@@ -1,77 +0,0 @@
package com.bartlomiejpluta.base.engine.world.map.layer.image;
import com.bartlomiejpluta.base.api.game.camera.Camera;
import com.bartlomiejpluta.base.api.game.map.Layer;
import com.bartlomiejpluta.base.api.game.window.Window;
import com.bartlomiejpluta.base.api.internal.render.ShaderManager;
import com.bartlomiejpluta.base.engine.world.image.model.Image;
import com.bartlomiejpluta.base.engine.world.map.model.DefaultGameMap;
import lombok.NonNull;
public class ImageLayer implements Layer {
private final float mapWidth;
private final float mapHeight;
@NonNull
private Image image;
private float imageInitialWidth;
private float imageInitialHeight;
private float gcd;
private float x;
private float y;
private float scaleX;
private float scaleY;
@NonNull
private ImageLayerMode mode;
private boolean parallax;
public ImageLayer(DefaultGameMap map, Image image, float opacity, float x, float y, float scaleX, float scaleY, ImageLayerMode mode, boolean parallax) {
this.mapWidth = map.getWidth();
this.mapHeight = map.getHeight();
this.image = image;
this.imageInitialWidth = image.getInitialWidth();
this.imageInitialHeight = image.getInitialHeight();
this.gcd = image.getGcd();
this.x = x;
this.y = y;
this.scaleX = scaleX;
this.scaleY = scaleY;
this.mode = mode;
this.parallax = parallax;
this.image.getMaterial().setAlpha(opacity);
this.image.setPosition(x, y);
switch (mode) {
case NORMAL -> image.setScale(mapWidth / imageInitialWidth, mapHeight / imageInitialHeight);
case FIT_MAP -> image.setScale(image.getGcd() * imageInitialWidth * scaleX, image.getGcd() * imageInitialHeight * scaleY);
}
}
@Override
public void render(Window window, Camera camera, ShaderManager shaderManager) {
if (image != null) {
if (parallax) {
var cameraPosition = camera.getPosition();
image.setPosition(cameraPosition.x + x, cameraPosition.y + y);
}
if (mode == ImageLayerMode.FIT_SCREEN) {
image.setScale(window.getWidth() / imageInitialWidth, window.getHeight() / imageInitialHeight);
}
image.render(window, camera, shaderManager);
}
}
@Override
public void update(float dt) {
}
}

View File

@@ -3,20 +3,15 @@ package com.bartlomiejpluta.base.engine.world.map.model;
import com.bartlomiejpluta.base.api.game.camera.Camera;
import com.bartlomiejpluta.base.api.game.entity.Entity;
import com.bartlomiejpluta.base.api.game.entity.Movement;
import com.bartlomiejpluta.base.api.game.map.GameMap;
import com.bartlomiejpluta.base.api.game.map.Layer;
import com.bartlomiejpluta.base.api.game.map.PassageAbility;
import com.bartlomiejpluta.base.api.game.map.TileLayer;
import com.bartlomiejpluta.base.api.game.map.*;
import com.bartlomiejpluta.base.api.game.window.Window;
import com.bartlomiejpluta.base.api.internal.logic.Updatable;
import com.bartlomiejpluta.base.api.internal.render.Renderable;
import com.bartlomiejpluta.base.api.internal.render.ShaderManager;
import com.bartlomiejpluta.base.engine.util.mesh.MeshManager;
import com.bartlomiejpluta.base.engine.world.entity.model.DefaultEntity;
import com.bartlomiejpluta.base.engine.world.image.model.Image;
import com.bartlomiejpluta.base.engine.world.map.layer.color.ColorLayer;
import com.bartlomiejpluta.base.engine.world.map.layer.image.ImageLayer;
import com.bartlomiejpluta.base.engine.world.map.layer.image.ImageLayerMode;
import com.bartlomiejpluta.base.engine.world.map.layer.image.DefaultImageLayer;
import com.bartlomiejpluta.base.engine.world.map.layer.object.ObjectLayer;
import com.bartlomiejpluta.base.engine.world.map.layer.tile.DefaultTileLayer;
import com.bartlomiejpluta.base.engine.world.tileset.model.TileSet;
@@ -88,6 +83,11 @@ public class DefaultGameMap implements Renderable, Updatable, GameMap {
return (TileLayer) layers.get(layerIndex);
}
@Override
public ImageLayer getImageLayer(int layerIndex) {
return (ImageLayer) layers.get(layerIndex);
}
public int createObjectLayer() {
var passageMap = new PassageAbility[rows][columns];
for (int i = 0; i < rows; ++i) {
@@ -112,10 +112,11 @@ public class DefaultGameMap implements Renderable, Updatable, GameMap {
return layers.size() - 1;
}
public int createImageLayer(Image image, float opacity, float x, float y, float scaleX, float scaleY, ImageLayerMode mode, boolean parallax) {
layers.add(new ImageLayer(this, image, opacity, x, y, scaleX, scaleY, mode, parallax));
public ImageLayer createImageLayer(Image image, float opacity, float x, float y, float scaleX, float scaleY, ImageLayerMode mode, boolean parallax) {
var layer = new DefaultImageLayer(this, image, opacity, x, y, scaleX, scaleY, mode, parallax);
layers.add(layer);
return layers.size() - 1;
return layer;
}
@Override

View File

@@ -1,10 +1,10 @@
package com.bartlomiejpluta.base.engine.world.map.serial;
import com.bartlomiejpluta.base.api.game.map.ImageLayerMode;
import com.bartlomiejpluta.base.api.game.map.PassageAbility;
import com.bartlomiejpluta.base.engine.error.AppException;
import com.bartlomiejpluta.base.engine.util.mesh.MeshManager;
import com.bartlomiejpluta.base.engine.world.image.manager.ImageManager;
import com.bartlomiejpluta.base.engine.world.map.layer.image.ImageLayerMode;
import com.bartlomiejpluta.base.engine.world.map.model.DefaultGameMap;
import com.bartlomiejpluta.base.engine.world.tileset.manager.TileSetManager;
import com.bartlomiejpluta.base.proto.GameMapProto;