Move the camera object out of the game map object

TODO: this commit impacts the performance.
FPS decreased from ~60 to ~24, it should be immediately fixed.
This commit is contained in:
2021-02-15 13:12:40 +01:00
parent 15549930e0
commit 499e232e17
12 changed files with 43 additions and 30 deletions

View File

@@ -4,6 +4,7 @@ import com.bartlomiejpluta.base.core.gc.Disposable;
import com.bartlomiejpluta.base.core.gl.render.Renderable;
import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.ui.Window;
import com.bartlomiejpluta.base.core.world.camera.Camera;
import org.lwjgl.opengl.GL15;
import org.lwjgl.system.MemoryStack;
@@ -55,7 +56,7 @@ public class Mesh implements Renderable, Disposable {
}
@Override
public void render(Window window, ShaderManager shaderManager) {
public void render(Window window, Camera camera, ShaderManager shaderManager) {
glBindVertexArray(vaoId);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);

View File

@@ -3,6 +3,7 @@ package com.bartlomiejpluta.base.core.gl.render;
import com.bartlomiejpluta.base.core.gl.shader.constant.UniformName;
import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.ui.Window;
import com.bartlomiejpluta.base.core.world.camera.Camera;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -33,13 +34,14 @@ public class DefaultRenderer implements Renderer {
}
@Override
public void render(Window window, Renderable renderable) {
public void render(Window window, Camera camera, Renderable renderable) {
clear();
updateViewport(window);
shaderManager.selectShader("default").useSelectedShader();
renderable.render(window, shaderManager);
camera.render(window, shaderManager);
renderable.render(window, camera, shaderManager);
shaderManager.detachCurrentShader();
}

View File

@@ -2,7 +2,8 @@ package com.bartlomiejpluta.base.core.gl.render;
import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.ui.Window;
import com.bartlomiejpluta.base.core.world.camera.Camera;
public interface Renderable {
void render(Window window, ShaderManager shaderManager);
void render(Window window, Camera camera, ShaderManager shaderManager);
}

View File

@@ -2,8 +2,9 @@ package com.bartlomiejpluta.base.core.gl.render;
import com.bartlomiejpluta.base.core.gc.Cleanable;
import com.bartlomiejpluta.base.core.ui.Window;
import com.bartlomiejpluta.base.core.world.camera.Camera;
public interface Renderer extends Cleanable {
void init();
void render(Window window, Renderable renderable);
void render(Window window, Camera camera, Renderable renderable);
}

View File

@@ -4,6 +4,7 @@ import com.bartlomiejpluta.base.core.gl.object.material.Material;
import com.bartlomiejpluta.base.core.gl.object.mesh.Mesh;
import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.ui.Window;
import com.bartlomiejpluta.base.core.world.camera.Camera;
import com.bartlomiejpluta.base.core.world.object.RenderableObject;
import lombok.EqualsAndHashCode;
import org.joml.Vector2f;
@@ -34,9 +35,9 @@ public abstract class AnimationableObject extends RenderableObject {
}
@Override
public void render(Window window, ShaderManager shaderManager) {
public void render(Window window, Camera camera, ShaderManager shaderManager) {
animate();
super.render(window, shaderManager);
super.render(window, camera, shaderManager);
}
private void animate() {

View File

@@ -1,5 +1,8 @@
package com.bartlomiejpluta.base.core.world.camera;
import com.bartlomiejpluta.base.core.gl.render.Renderable;
import com.bartlomiejpluta.base.core.gl.shader.constant.UniformName;
import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.ui.Window;
import com.bartlomiejpluta.base.core.world.object.PositionableObject;
import org.joml.Matrix4f;
@@ -19,4 +22,9 @@ public class Camera extends PositionableObject {
.identity()
.translate(-position.x, -position.y, 0);
}
public void render(Window window, ShaderManager shaderManager) {
shaderManager.setUniform(UniformName.UNI_PROJECTION_MATRIX, getProjectionMatrix(window));
shaderManager.setUniform(UniformName.UNI_VIEW_MATRIX, getViewMatrix());
}
}

View File

@@ -1,7 +1,6 @@
package com.bartlomiejpluta.base.core.world.map;
import com.bartlomiejpluta.base.core.gl.render.Renderable;
import com.bartlomiejpluta.base.core.gl.shader.constant.UniformName;
import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.image.Image;
import com.bartlomiejpluta.base.core.logic.Updatable;
@@ -19,7 +18,6 @@ import java.util.Arrays;
import java.util.List;
public class GameMap implements Renderable, Updatable {
private final Camera camera;
private final TileSet tileSet;
private final List<Layer> layers = new ArrayList<>();
@@ -34,8 +32,7 @@ public class GameMap implements Renderable, Updatable {
@Getter
private final Vector2f stepSize;
public GameMap(Camera camera, TileSet tileSet, int rows, int columns, float scale) {
this.camera = camera;
public GameMap(TileSet tileSet, int rows, int columns, float scale) {
this.tileSet = tileSet;
this.scale = scale;
this.rows = rows;
@@ -44,12 +41,9 @@ public class GameMap implements Renderable, Updatable {
}
@Override
public void render(Window window, ShaderManager shaderManager) {
shaderManager.setUniform(UniformName.UNI_PROJECTION_MATRIX, camera.getProjectionMatrix(window));
shaderManager.setUniform(UniformName.UNI_VIEW_MATRIX, camera.getViewMatrix());
public void render(Window window, Camera camera, ShaderManager shaderManager) {
for (var layer : layers) {
layer.render(window, shaderManager);
layer.render(window, camera, shaderManager);
}
}
@@ -120,7 +114,7 @@ public class GameMap implements Renderable, Updatable {
var target = movement.getTargetCoordinate();
// Is trying to go beyond the map
if(target.x < 0 || target.y < 0 || target.x >= columns || target.y >= rows) {
if (target.x < 0 || target.y < 0 || target.x >= columns || target.y >= rows) {
return false;
}

View File

@@ -4,13 +4,14 @@ import com.bartlomiejpluta.base.core.gl.shader.constant.UniformName;
import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.image.Image;
import com.bartlomiejpluta.base.core.ui.Window;
import com.bartlomiejpluta.base.core.world.camera.Camera;
public class ImageLayer implements Layer {
public enum Mode {
NORMAL,
FIT_SCREEN,
FIT_MAP;
FIT_MAP
}
private final float mapWidth;
@@ -36,7 +37,7 @@ public class ImageLayer implements Layer {
}
@Override
public void render(Window window, ShaderManager shaderManager) {
public void render(Window window, Camera camera, ShaderManager shaderManager) {
if (image == null) {
return;
}
@@ -48,7 +49,7 @@ public class ImageLayer implements Layer {
case FIT_MAP -> image.setScale(mapWidth / imageInitialWidth, mapHeight / imageInitialHeight);
}
image.render(window, shaderManager);
image.render(window, camera, shaderManager);
}
@Override

View File

@@ -3,6 +3,7 @@ package com.bartlomiejpluta.base.core.world.map;
import com.bartlomiejpluta.base.core.gl.shader.constant.UniformName;
import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.ui.Window;
import com.bartlomiejpluta.base.core.world.camera.Camera;
import com.bartlomiejpluta.base.core.world.movement.Direction;
import com.bartlomiejpluta.base.core.world.movement.MovableObject;
import org.joml.Vector2i;
@@ -53,10 +54,9 @@ public class ObjectLayer implements Layer {
}
@Override
public void render(Window window, ShaderManager shaderManager) {
public void render(Window window, Camera camera, ShaderManager shaderManager) {
for (var object : objects) {
shaderManager.setUniform(UniformName.UNI_MODEL_MATRIX, object.getModelMatrix());
object.render(window, shaderManager);
object.render(window, camera, shaderManager);
}
}

View File

@@ -1,8 +1,8 @@
package com.bartlomiejpluta.base.core.world.map;
import com.bartlomiejpluta.base.core.gl.shader.constant.UniformName;
import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.ui.Window;
import com.bartlomiejpluta.base.core.world.camera.Camera;
import com.bartlomiejpluta.base.core.world.tileset.model.Tile;
import org.joml.Vector2f;
@@ -28,12 +28,11 @@ public class TileLayer implements Layer {
}
@Override
public void render(Window window, ShaderManager shaderManager) {
public void render(Window window, Camera camera, ShaderManager shaderManager) {
for (var row : layer) {
for (var tile : row) {
if (tile != null) {
shaderManager.setUniform(UniformName.UNI_MODEL_MATRIX, tile.getModelMatrix());
tile.render(window, shaderManager);
tile.render(window, camera, shaderManager);
}
}
}

View File

@@ -6,6 +6,7 @@ import com.bartlomiejpluta.base.core.gl.render.Renderable;
import com.bartlomiejpluta.base.core.gl.shader.constant.UniformName;
import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.ui.Window;
import com.bartlomiejpluta.base.core.world.camera.Camera;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@@ -23,16 +24,17 @@ public abstract class RenderableObject extends PositionableObject implements Ren
private Material material;
@Override
public void render(Window window, ShaderManager shaderManager) {
public void render(Window window, Camera camera, ShaderManager shaderManager) {
material.activateTextureIfExists();
shaderManager.setUniform(UniformName.UNI_MODEL_MATRIX, getModelMatrix());
shaderManager.setUniform(UniformName.UNI_OBJECT_COLOR, material.getColor());
shaderManager.setUniform(UniformName.UNI_HAS_OBJECT_TEXTURE, material.hasTexture());
shaderManager.setUniform(UniformName.UNI_TEXTURE_SAMPLER, 0);
shaderManager.setUniform(UniformName.UNI_SPRITE_SIZE, material.getSpriteSize());
shaderManager.setUniform(UniformName.UNI_SPRITE_POSITION, material.getSpritePosition());
mesh.render(window, shaderManager);
mesh.render(window, camera, shaderManager);
}
public void setAlpha(float alpha) {

View File

@@ -9,6 +9,7 @@ import com.bartlomiejpluta.base.core.profiling.fps.FPSMonitor;
import com.bartlomiejpluta.base.core.profiling.time.TimeProfilerService;
import com.bartlomiejpluta.base.core.ui.Window;
import com.bartlomiejpluta.base.core.util.mesh.MeshManager;
import com.bartlomiejpluta.base.core.world.camera.Camera;
import com.bartlomiejpluta.base.core.world.map.GameMap;
import com.bartlomiejpluta.base.core.world.tileset.manager.TileSetManager;
import com.bartlomiejpluta.base.game.world.entity.manager.EntityManager;
@@ -30,6 +31,8 @@ public class DefaultGameLogic implements GameLogic {
private final TimeProfilerService profiler;
private final FPSMonitor fpsMonitor;
private final Camera camera = new Camera();
private GameMap map;
@Override
@@ -52,7 +55,7 @@ public class DefaultGameLogic implements GameLogic {
@Override
public void render(Window window) {
renderer.render(window, map);
renderer.render(window, camera, map);
}
@Override