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.render.Renderable;
import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager; import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.ui.Window; import com.bartlomiejpluta.base.core.ui.Window;
import com.bartlomiejpluta.base.core.world.camera.Camera;
import org.lwjgl.opengl.GL15; import org.lwjgl.opengl.GL15;
import org.lwjgl.system.MemoryStack; import org.lwjgl.system.MemoryStack;
@@ -55,7 +56,7 @@ public class Mesh implements Renderable, Disposable {
} }
@Override @Override
public void render(Window window, ShaderManager shaderManager) { public void render(Window window, Camera camera, ShaderManager shaderManager) {
glBindVertexArray(vaoId); glBindVertexArray(vaoId);
glEnableVertexAttribArray(0); glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1); 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.constant.UniformName;
import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager; import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.ui.Window; import com.bartlomiejpluta.base.core.ui.Window;
import com.bartlomiejpluta.base.core.world.camera.Camera;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -33,13 +34,14 @@ public class DefaultRenderer implements Renderer {
} }
@Override @Override
public void render(Window window, Renderable renderable) { public void render(Window window, Camera camera, Renderable renderable) {
clear(); clear();
updateViewport(window); updateViewport(window);
shaderManager.selectShader("default").useSelectedShader(); shaderManager.selectShader("default").useSelectedShader();
renderable.render(window, shaderManager); camera.render(window, shaderManager);
renderable.render(window, camera, shaderManager);
shaderManager.detachCurrentShader(); 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.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.ui.Window; import com.bartlomiejpluta.base.core.ui.Window;
import com.bartlomiejpluta.base.core.world.camera.Camera;
public interface Renderable { 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.gc.Cleanable;
import com.bartlomiejpluta.base.core.ui.Window; import com.bartlomiejpluta.base.core.ui.Window;
import com.bartlomiejpluta.base.core.world.camera.Camera;
public interface Renderer extends Cleanable { public interface Renderer extends Cleanable {
void init(); 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.object.mesh.Mesh;
import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager; import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.ui.Window; import com.bartlomiejpluta.base.core.ui.Window;
import com.bartlomiejpluta.base.core.world.camera.Camera;
import com.bartlomiejpluta.base.core.world.object.RenderableObject; import com.bartlomiejpluta.base.core.world.object.RenderableObject;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.joml.Vector2f; import org.joml.Vector2f;
@@ -34,9 +35,9 @@ public abstract class AnimationableObject extends RenderableObject {
} }
@Override @Override
public void render(Window window, ShaderManager shaderManager) { public void render(Window window, Camera camera, ShaderManager shaderManager) {
animate(); animate();
super.render(window, shaderManager); super.render(window, camera, shaderManager);
} }
private void animate() { private void animate() {

View File

@@ -1,5 +1,8 @@
package com.bartlomiejpluta.base.core.world.camera; 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.ui.Window;
import com.bartlomiejpluta.base.core.world.object.PositionableObject; import com.bartlomiejpluta.base.core.world.object.PositionableObject;
import org.joml.Matrix4f; import org.joml.Matrix4f;
@@ -19,4 +22,9 @@ public class Camera extends PositionableObject {
.identity() .identity()
.translate(-position.x, -position.y, 0); .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; package com.bartlomiejpluta.base.core.world.map;
import com.bartlomiejpluta.base.core.gl.render.Renderable; 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.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.image.Image; import com.bartlomiejpluta.base.core.image.Image;
import com.bartlomiejpluta.base.core.logic.Updatable; import com.bartlomiejpluta.base.core.logic.Updatable;
@@ -19,7 +18,6 @@ import java.util.Arrays;
import java.util.List; import java.util.List;
public class GameMap implements Renderable, Updatable { public class GameMap implements Renderable, Updatable {
private final Camera camera;
private final TileSet tileSet; private final TileSet tileSet;
private final List<Layer> layers = new ArrayList<>(); private final List<Layer> layers = new ArrayList<>();
@@ -34,8 +32,7 @@ public class GameMap implements Renderable, Updatable {
@Getter @Getter
private final Vector2f stepSize; private final Vector2f stepSize;
public GameMap(Camera camera, TileSet tileSet, int rows, int columns, float scale) { public GameMap(TileSet tileSet, int rows, int columns, float scale) {
this.camera = camera;
this.tileSet = tileSet; this.tileSet = tileSet;
this.scale = scale; this.scale = scale;
this.rows = rows; this.rows = rows;
@@ -44,12 +41,9 @@ public class GameMap implements Renderable, Updatable {
} }
@Override @Override
public void render(Window window, ShaderManager shaderManager) { public void render(Window window, Camera camera, ShaderManager shaderManager) {
shaderManager.setUniform(UniformName.UNI_PROJECTION_MATRIX, camera.getProjectionMatrix(window));
shaderManager.setUniform(UniformName.UNI_VIEW_MATRIX, camera.getViewMatrix());
for (var layer : layers) { 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(); var target = movement.getTargetCoordinate();
// Is trying to go beyond the map // 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; 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.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.image.Image; import com.bartlomiejpluta.base.core.image.Image;
import com.bartlomiejpluta.base.core.ui.Window; import com.bartlomiejpluta.base.core.ui.Window;
import com.bartlomiejpluta.base.core.world.camera.Camera;
public class ImageLayer implements Layer { public class ImageLayer implements Layer {
public enum Mode { public enum Mode {
NORMAL, NORMAL,
FIT_SCREEN, FIT_SCREEN,
FIT_MAP; FIT_MAP
} }
private final float mapWidth; private final float mapWidth;
@@ -36,7 +37,7 @@ public class ImageLayer implements Layer {
} }
@Override @Override
public void render(Window window, ShaderManager shaderManager) { public void render(Window window, Camera camera, ShaderManager shaderManager) {
if (image == null) { if (image == null) {
return; return;
} }
@@ -48,7 +49,7 @@ public class ImageLayer implements Layer {
case FIT_MAP -> image.setScale(mapWidth / imageInitialWidth, mapHeight / imageInitialHeight); case FIT_MAP -> image.setScale(mapWidth / imageInitialWidth, mapHeight / imageInitialHeight);
} }
image.render(window, shaderManager); image.render(window, camera, shaderManager);
} }
@Override @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.constant.UniformName;
import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager; import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.ui.Window; 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.Direction;
import com.bartlomiejpluta.base.core.world.movement.MovableObject; import com.bartlomiejpluta.base.core.world.movement.MovableObject;
import org.joml.Vector2i; import org.joml.Vector2i;
@@ -53,10 +54,9 @@ public class ObjectLayer implements Layer {
} }
@Override @Override
public void render(Window window, ShaderManager shaderManager) { public void render(Window window, Camera camera, ShaderManager shaderManager) {
for (var object : objects) { for (var object : objects) {
shaderManager.setUniform(UniformName.UNI_MODEL_MATRIX, object.getModelMatrix()); object.render(window, camera, shaderManager);
object.render(window, shaderManager);
} }
} }

View File

@@ -1,8 +1,8 @@
package com.bartlomiejpluta.base.core.world.map; 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.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.ui.Window; 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 com.bartlomiejpluta.base.core.world.tileset.model.Tile;
import org.joml.Vector2f; import org.joml.Vector2f;
@@ -28,12 +28,11 @@ public class TileLayer implements Layer {
} }
@Override @Override
public void render(Window window, ShaderManager shaderManager) { public void render(Window window, Camera camera, ShaderManager shaderManager) {
for (var row : layer) { for (var row : layer) {
for (var tile : row) { for (var tile : row) {
if (tile != null) { if (tile != null) {
shaderManager.setUniform(UniformName.UNI_MODEL_MATRIX, tile.getModelMatrix()); tile.render(window, camera, shaderManager);
tile.render(window, 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.constant.UniformName;
import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager; import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.ui.Window; import com.bartlomiejpluta.base.core.ui.Window;
import com.bartlomiejpluta.base.core.world.camera.Camera;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@@ -23,16 +24,17 @@ public abstract class RenderableObject extends PositionableObject implements Ren
private Material material; private Material material;
@Override @Override
public void render(Window window, ShaderManager shaderManager) { public void render(Window window, Camera camera, ShaderManager shaderManager) {
material.activateTextureIfExists(); material.activateTextureIfExists();
shaderManager.setUniform(UniformName.UNI_MODEL_MATRIX, getModelMatrix());
shaderManager.setUniform(UniformName.UNI_OBJECT_COLOR, material.getColor()); shaderManager.setUniform(UniformName.UNI_OBJECT_COLOR, material.getColor());
shaderManager.setUniform(UniformName.UNI_HAS_OBJECT_TEXTURE, material.hasTexture()); shaderManager.setUniform(UniformName.UNI_HAS_OBJECT_TEXTURE, material.hasTexture());
shaderManager.setUniform(UniformName.UNI_TEXTURE_SAMPLER, 0); shaderManager.setUniform(UniformName.UNI_TEXTURE_SAMPLER, 0);
shaderManager.setUniform(UniformName.UNI_SPRITE_SIZE, material.getSpriteSize()); shaderManager.setUniform(UniformName.UNI_SPRITE_SIZE, material.getSpriteSize());
shaderManager.setUniform(UniformName.UNI_SPRITE_POSITION, material.getSpritePosition()); shaderManager.setUniform(UniformName.UNI_SPRITE_POSITION, material.getSpritePosition());
mesh.render(window, shaderManager); mesh.render(window, camera, shaderManager);
} }
public void setAlpha(float alpha) { 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.profiling.time.TimeProfilerService;
import com.bartlomiejpluta.base.core.ui.Window; import com.bartlomiejpluta.base.core.ui.Window;
import com.bartlomiejpluta.base.core.util.mesh.MeshManager; 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.map.GameMap;
import com.bartlomiejpluta.base.core.world.tileset.manager.TileSetManager; import com.bartlomiejpluta.base.core.world.tileset.manager.TileSetManager;
import com.bartlomiejpluta.base.game.world.entity.manager.EntityManager; import com.bartlomiejpluta.base.game.world.entity.manager.EntityManager;
@@ -30,6 +31,8 @@ public class DefaultGameLogic implements GameLogic {
private final TimeProfilerService profiler; private final TimeProfilerService profiler;
private final FPSMonitor fpsMonitor; private final FPSMonitor fpsMonitor;
private final Camera camera = new Camera();
private GameMap map; private GameMap map;
@Override @Override
@@ -52,7 +55,7 @@ public class DefaultGameLogic implements GameLogic {
@Override @Override
public void render(Window window) { public void render(Window window) {
renderer.render(window, map); renderer.render(window, camera, map);
} }
@Override @Override