From de4ed869ea39d5bc3872a5df3c05623fd824b07e Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Mon, 28 Apr 2025 11:04:41 +0200 Subject: [PATCH] feat: change board cells color --- .../java/chess/view/DDDrender/DDDView.java | 14 +++++-- .../java/chess/view/DDDrender/Renderer.java | 11 ++--- .../java/chess/view/DDDrender/Window.java | 2 - .../view/DDDrender/opengl/VertexArray.java | 4 ++ .../view/DDDrender/opengl/VertexBuffer.java | 6 +++ .../view/DDDrender/world/BoardEntity.java | 41 +++++++++++++++++++ 6 files changed, 65 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/chess/view/DDDrender/world/BoardEntity.java diff --git a/app/src/main/java/chess/view/DDDrender/DDDView.java b/app/src/main/java/chess/view/DDDrender/DDDView.java index 2a8a994..510aa75 100644 --- a/app/src/main/java/chess/view/DDDrender/DDDView.java +++ b/app/src/main/java/chess/view/DDDrender/DDDView.java @@ -9,6 +9,7 @@ import chess.controller.event.GameAdaptator; import chess.model.Color; import chess.model.Coordinate; import chess.model.Piece; +import chess.view.DDDrender.world.BoardEntity; import chess.view.DDDrender.world.PieceEntity; import chess.view.DDDrender.world.World; @@ -21,15 +22,13 @@ public class DDDView extends GameAdaptator { private final Window window; private final Renderer renderer; private final World world; + private BoardEntity boardEntity; public DDDView(CommandExecutor commandExecutor) { this.commandExecutor = commandExecutor; this.renderer = new Renderer(); this.world = new World(new Camera()); this.window = new Window(this.renderer, this.world); - this.window.OnCellClick.connect(this::onCellClick); - this.window.OnCellEnter.connect(this::onCellEnter); - this.window.OnCellExit.connect(this::onCellExit); } // Invoked when a cell is clicked @@ -39,7 +38,8 @@ public class DDDView extends GameAdaptator { // Invoked when a cell is hovered private void onCellEnter(Coordinate coordinate) { - // small test turning a piece red when hovered + // small test turning a cell red when hovered + this.boardEntity.setCellColor(coordinate, new Vector3f(1, 0, 0)); Piece p = pieceAt(coordinate); if (p == null) return; @@ -48,6 +48,7 @@ public class DDDView extends GameAdaptator { // Invoked when a cell is not hovered anymore private void onCellExit(Coordinate coordinate) { + this.boardEntity.resetCellColor(coordinate); Piece p = pieceAt(coordinate); if (p == null) return; @@ -64,6 +65,9 @@ public class DDDView extends GameAdaptator { public void onGameStart() { this.window.scheduleTask(() -> { initBoard(); + this.window.OnCellClick.connect(this::onCellClick); + this.window.OnCellEnter.connect(this::onCellEnter); + this.window.OnCellExit.connect(this::onCellExit); }); } @@ -83,6 +87,8 @@ public class DDDView extends GameAdaptator { piece.getColor() == Color.White ? 0.0f : (float) Math.PI)); } } + this.boardEntity = new BoardEntity(); + this.world.addEntity(this.boardEntity); } public void run() { diff --git a/app/src/main/java/chess/view/DDDrender/Renderer.java b/app/src/main/java/chess/view/DDDrender/Renderer.java index 20e402e..1cd2fca 100644 --- a/app/src/main/java/chess/view/DDDrender/Renderer.java +++ b/app/src/main/java/chess/view/DDDrender/Renderer.java @@ -6,7 +6,6 @@ import org.joml.Matrix4f; import org.joml.Vector3f; import org.lwjgl.opengl.GL30; -import chess.view.DDDrender.loader.BoardModelLoader; import chess.view.DDDrender.opengl.VertexArray; import chess.view.DDDrender.shader.BoardShader; import chess.view.DDDrender.shader.PieceShader; @@ -15,7 +14,6 @@ import chess.view.DDDrender.shader.ShaderProgram; public class Renderer { private BoardShader boardShader; private PieceShader pieceShader; - private VertexArray boardVao; public Renderer() { this.boardShader = new BoardShader(); @@ -25,7 +23,6 @@ public class Renderer { public void Init() { boardShader.LoadShader(); pieceShader.LoadShader(); - this.boardVao = BoardModelLoader.GetBoardModel(); } public void Update(Camera cam) { @@ -34,10 +31,6 @@ public class Renderer { this.pieceShader.Start(); this.pieceShader.SetCamMatrix(cam); } - - public void RenderBoard() { - RenderVao(this.boardShader, this.boardVao); - } public void Render(DDDModel model, Vector3f color, Vector3f position, float rotation) { this.pieceShader.Start(); @@ -59,4 +52,8 @@ public class Renderer { GL30.glDrawElements(GL30.GL_TRIANGLES, vertexArray.GetVertexCount(), GL_UNSIGNED_INT, 0); vertexArray.Unbind(); } + + public BoardShader getBoardShader() { + return boardShader; + } } diff --git a/app/src/main/java/chess/view/DDDrender/Window.java b/app/src/main/java/chess/view/DDDrender/Window.java index 208885e..bf4eeb6 100644 --- a/app/src/main/java/chess/view/DDDrender/Window.java +++ b/app/src/main/java/chess/view/DDDrender/Window.java @@ -126,9 +126,7 @@ public class Window { private void render(float delta, float aspectRatio) { cam.setAspectRatio(aspectRatio); renderer.Update(cam); - renderer.RenderBoard(); renderWorld(); - // renderPieces(); } private void renderWorld() { diff --git a/app/src/main/java/chess/view/DDDrender/opengl/VertexArray.java b/app/src/main/java/chess/view/DDDrender/opengl/VertexArray.java index 74ee5d9..d4c8143 100644 --- a/app/src/main/java/chess/view/DDDrender/opengl/VertexArray.java +++ b/app/src/main/java/chess/view/DDDrender/opengl/VertexArray.java @@ -44,4 +44,8 @@ public class VertexArray { private void BindElementArrayBuffer() { this.elementBuffer.Bind(); } + + public List getVertexBuffers() { + return vertexBuffers; + } } diff --git a/app/src/main/java/chess/view/DDDrender/opengl/VertexBuffer.java b/app/src/main/java/chess/view/DDDrender/opengl/VertexBuffer.java index 82439ec..b3add99 100644 --- a/app/src/main/java/chess/view/DDDrender/opengl/VertexBuffer.java +++ b/app/src/main/java/chess/view/DDDrender/opengl/VertexBuffer.java @@ -22,6 +22,12 @@ public class VertexBuffer { Unbind(); } + public void UpdateData(int offset, float[] data) { + Bind(); + GL30.glBufferSubData(GL30.GL_ARRAY_BUFFER, offset, data); + Unbind(); + } + public void Destroy() { GL30.glDeleteBuffers(id); } diff --git a/app/src/main/java/chess/view/DDDrender/world/BoardEntity.java b/app/src/main/java/chess/view/DDDrender/world/BoardEntity.java new file mode 100644 index 0000000..9a20295 --- /dev/null +++ b/app/src/main/java/chess/view/DDDrender/world/BoardEntity.java @@ -0,0 +1,41 @@ +package chess.view.DDDrender.world; + +import org.joml.Vector3f; + +import chess.model.Coordinate; +import chess.view.DDDrender.Renderer; +import chess.view.DDDrender.loader.BoardModelLoader; +import chess.view.DDDrender.opengl.VertexArray; +import chess.view.DDDrender.opengl.VertexBuffer; + +public class BoardEntity extends Entity { + + private final VertexArray vao; + private final VertexBuffer colorVbo; + + private static final Vector3f WHITE = new Vector3f(1, 1, 1); + private static final Vector3f BLACK = new Vector3f(0, 0, 0); + + public BoardEntity() { + this.vao = BoardModelLoader.GetBoardModel(); + this.colorVbo = this.vao.getVertexBuffers().get(1); + } + + public void setCellColor(Coordinate coord, Vector3f color) { + float[] data = { color.x, color.y, color.z, color.x, color.y, color.z, color.x, color.y, color.z, color.x, + color.y, color.z}; + int cellNumber = (Coordinate.VALUE_MAX - 1 - coord.getX()) * Coordinate.VALUE_MAX + Coordinate.VALUE_MAX - 1 - coord.getY(); + int offset = cellNumber * 4 * 4 * 3; + this.colorVbo.UpdateData(offset, data); + } + + public void resetCellColor(Coordinate coord) { + setCellColor(coord, (coord.getX() + coord.getY()) % 2 == 0 ? WHITE : BLACK); + } + + @Override + public void render(Renderer renderer) { + renderer.RenderVao(renderer.getBoardShader(), vao); + } + +}