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:
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user