feat: change board cells color

This commit is contained in:
2025-04-28 11:04:41 +02:00
parent b57fa1482b
commit de4ed869ea
6 changed files with 65 additions and 13 deletions

View File

@@ -9,6 +9,7 @@ import chess.controller.event.GameAdaptator;
import chess.model.Color; import chess.model.Color;
import chess.model.Coordinate; import chess.model.Coordinate;
import chess.model.Piece; import chess.model.Piece;
import chess.view.DDDrender.world.BoardEntity;
import chess.view.DDDrender.world.PieceEntity; import chess.view.DDDrender.world.PieceEntity;
import chess.view.DDDrender.world.World; import chess.view.DDDrender.world.World;
@@ -21,15 +22,13 @@ public class DDDView extends GameAdaptator {
private final Window window; private final Window window;
private final Renderer renderer; private final Renderer renderer;
private final World world; private final World world;
private BoardEntity boardEntity;
public DDDView(CommandExecutor commandExecutor) { public DDDView(CommandExecutor commandExecutor) {
this.commandExecutor = commandExecutor; this.commandExecutor = commandExecutor;
this.renderer = new Renderer(); this.renderer = new Renderer();
this.world = new World(new Camera()); this.world = new World(new Camera());
this.window = new Window(this.renderer, this.world); 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 // Invoked when a cell is clicked
@@ -39,7 +38,8 @@ public class DDDView extends GameAdaptator {
// Invoked when a cell is hovered // Invoked when a cell is hovered
private void onCellEnter(Coordinate coordinate) { 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); Piece p = pieceAt(coordinate);
if (p == null) if (p == null)
return; return;
@@ -48,6 +48,7 @@ public class DDDView extends GameAdaptator {
// Invoked when a cell is not hovered anymore // Invoked when a cell is not hovered anymore
private void onCellExit(Coordinate coordinate) { private void onCellExit(Coordinate coordinate) {
this.boardEntity.resetCellColor(coordinate);
Piece p = pieceAt(coordinate); Piece p = pieceAt(coordinate);
if (p == null) if (p == null)
return; return;
@@ -64,6 +65,9 @@ public class DDDView extends GameAdaptator {
public void onGameStart() { public void onGameStart() {
this.window.scheduleTask(() -> { this.window.scheduleTask(() -> {
initBoard(); 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)); piece.getColor() == Color.White ? 0.0f : (float) Math.PI));
} }
} }
this.boardEntity = new BoardEntity();
this.world.addEntity(this.boardEntity);
} }
public void run() { public void run() {

View File

@@ -6,7 +6,6 @@ import org.joml.Matrix4f;
import org.joml.Vector3f; import org.joml.Vector3f;
import org.lwjgl.opengl.GL30; import org.lwjgl.opengl.GL30;
import chess.view.DDDrender.loader.BoardModelLoader;
import chess.view.DDDrender.opengl.VertexArray; import chess.view.DDDrender.opengl.VertexArray;
import chess.view.DDDrender.shader.BoardShader; import chess.view.DDDrender.shader.BoardShader;
import chess.view.DDDrender.shader.PieceShader; import chess.view.DDDrender.shader.PieceShader;
@@ -15,7 +14,6 @@ import chess.view.DDDrender.shader.ShaderProgram;
public class Renderer { public class Renderer {
private BoardShader boardShader; private BoardShader boardShader;
private PieceShader pieceShader; private PieceShader pieceShader;
private VertexArray boardVao;
public Renderer() { public Renderer() {
this.boardShader = new BoardShader(); this.boardShader = new BoardShader();
@@ -25,7 +23,6 @@ public class Renderer {
public void Init() { public void Init() {
boardShader.LoadShader(); boardShader.LoadShader();
pieceShader.LoadShader(); pieceShader.LoadShader();
this.boardVao = BoardModelLoader.GetBoardModel();
} }
public void Update(Camera cam) { public void Update(Camera cam) {
@@ -34,10 +31,6 @@ public class Renderer {
this.pieceShader.Start(); this.pieceShader.Start();
this.pieceShader.SetCamMatrix(cam); this.pieceShader.SetCamMatrix(cam);
} }
public void RenderBoard() {
RenderVao(this.boardShader, this.boardVao);
}
public void Render(DDDModel model, Vector3f color, Vector3f position, float rotation) { public void Render(DDDModel model, Vector3f color, Vector3f position, float rotation) {
this.pieceShader.Start(); this.pieceShader.Start();
@@ -59,4 +52,8 @@ public class Renderer {
GL30.glDrawElements(GL30.GL_TRIANGLES, vertexArray.GetVertexCount(), GL_UNSIGNED_INT, 0); GL30.glDrawElements(GL30.GL_TRIANGLES, vertexArray.GetVertexCount(), GL_UNSIGNED_INT, 0);
vertexArray.Unbind(); vertexArray.Unbind();
} }
public BoardShader getBoardShader() {
return boardShader;
}
} }

View File

@@ -126,9 +126,7 @@ public class Window {
private void render(float delta, float aspectRatio) { private void render(float delta, float aspectRatio) {
cam.setAspectRatio(aspectRatio); cam.setAspectRatio(aspectRatio);
renderer.Update(cam); renderer.Update(cam);
renderer.RenderBoard();
renderWorld(); renderWorld();
// renderPieces();
} }
private void renderWorld() { private void renderWorld() {

View File

@@ -44,4 +44,8 @@ public class VertexArray {
private void BindElementArrayBuffer() { private void BindElementArrayBuffer() {
this.elementBuffer.Bind(); this.elementBuffer.Bind();
} }
public List<VertexBuffer> getVertexBuffers() {
return vertexBuffers;
}
} }

View File

@@ -22,6 +22,12 @@ public class VertexBuffer {
Unbind(); Unbind();
} }
public void UpdateData(int offset, float[] data) {
Bind();
GL30.glBufferSubData(GL30.GL_ARRAY_BUFFER, offset, data);
Unbind();
}
public void Destroy() { public void Destroy() {
GL30.glDeleteBuffers(id); GL30.glDeleteBuffers(id);
} }

View File

@@ -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);
}
}