From 6cec5d9e31f40f3c225d79dd7bef681c5a7c6198 Mon Sep 17 00:00:00 2001 From: "fl.du.pr Grens" Date: Fri, 16 May 2025 16:20:48 +0200 Subject: [PATCH] feat: spinning turn --- .../java/chess/view/DDDrender/DDDView.java | 39 +++++++++++++++++-- .../java/chess/view/DDDrender/Window.java | 11 +++++- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/chess/view/DDDrender/DDDView.java b/app/src/main/java/chess/view/DDDrender/DDDView.java index 0fd0a68..607f804 100644 --- a/app/src/main/java/chess/view/DDDrender/DDDView.java +++ b/app/src/main/java/chess/view/DDDrender/DDDView.java @@ -2,9 +2,11 @@ package chess.view.DDDrender; import java.io.IOException; import java.util.List; +import java.util.function.Consumer; import chess.controller.commands.MoveCommand; import chess.controller.event.GameListener; +import imgui.ImGui; import org.joml.Vector2f; import org.joml.Vector3f; @@ -34,6 +36,9 @@ public class DDDView extends GameAdaptator implements GameListener { private final Camera camera; private Coordinate click = null; + private static final float animationTime = 1.5f; // in seconds + private static final int animationTurns = 1; + public DDDView(CommandExecutor commandExecutor) { this.commandExecutor = commandExecutor; this.world = new World(); @@ -195,9 +200,19 @@ public class DDDView extends GameAdaptator implements GameListener { this.window.OnCellClick.connect(this::onCellClick); this.window.OnCellEnter.connect(this::onCellEnter); this.window.OnCellExit.connect(this::onCellExit); + this.window.OnImGuiTopRender.connect(this::onHeaderRender); + this.window.OnImGuiBottomRender.connect(this::onFooterRender); }); } + private void onHeaderRender() { + ImGui.text("FPS : " + ImGui.getIO().getFramerate()); + } + + private void onFooterRender() { + ImGui.button("Coucou"); + } + private void initBoard() throws IOException { for (int i = 0; i < Coordinate.VALUE_MAX; i++) { for (int j = 0; j < Coordinate.VALUE_MAX; j++) { @@ -229,13 +244,29 @@ public class DDDView extends GameAdaptator implements GameListener { Vector3f pieceWorldPos = new Vector3f(pieceBoardPos.x(), 0, pieceBoardPos.y()); this.world.getPiece(move.getStart()).setPosition(pieceWorldPos); this.world.movePiece(this.world.getPiece(move.getStart()), move); + cameraRotate(); + } + + private void cameraTick(float delta) { + int oddAnimationTurn = (2 * (animationTurns-1)) + 1; + final float angle = (float) Math.PI; + this.camera.setRotateAngle(this.camera.getRotateAngle() + angle * delta * oddAnimationTurn / animationTime); + } + + public void cameraRotate() { + float end = this.camera.getRotateAngle() + (float) Math.PI; + Consumer rotationConsumer = this::cameraTick; + this.window.addRegularTask(rotationConsumer); + try { + Thread.sleep((long) (animationTime * 1000)); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + this.window.removeRegularTask(rotationConsumer); + this.camera.setRotateAngle(end); } public void run() { - // this.window.addRegularTask((delta) -> { - // final float angle = 1f; - // this.camera.setRotateAngle(this.camera.getRotateAngle() + angle * delta); - // }); this.window.run(); // free OpenGL resources diff --git a/app/src/main/java/chess/view/DDDrender/Window.java b/app/src/main/java/chess/view/DDDrender/Window.java index 839042c..4e92982 100644 --- a/app/src/main/java/chess/view/DDDrender/Window.java +++ b/app/src/main/java/chess/view/DDDrender/Window.java @@ -1,5 +1,6 @@ package chess.view.DDDrender; +import common.Signal0; import org.joml.Vector2f; import org.lwjgl.*; import org.lwjgl.glfw.*; @@ -53,6 +54,9 @@ public class Window implements Closeable { public final Signal1 OnCellEnter = new Signal1<>(); public final Signal1 OnCellExit = new Signal1<>(); + public final Signal0 OnImGuiTopRender = new Signal0(); + public final Signal0 OnImGuiBottomRender = new Signal0(); + public Window(Renderer renderer, World world, Camera camera) { this.renderer = new Renderer(); this.cam = camera; @@ -65,6 +69,8 @@ public class Window implements Closeable { this.regularTasks.add(task); } + public void removeRegularTask(Consumer task) {this.regularTasks.remove(task);} + public synchronized void scheduleTask(Runnable runnable) { this.tasks.add(runnable); } @@ -225,12 +231,13 @@ public class Window implements Closeable { private void renderWindow() { ImGui.showDemoWindow(); - ImGui.begin("Hello"); - ImGui.text("FPS : " + ImGui.getIO().getFramerate()); + ImGui.begin("Main Window"); + this.OnImGuiTopRender.emit(); ImVec2 mousePos = ImGui.getIO().getMousePos(); ImVec2 framePos = ImGui.getCursorScreenPos(); checkCursor(mousePos.x - framePos.x, 800 - (mousePos.y - framePos.y), 800, 800); ImGui.image(1, new ImVec2(800, 800)); + this.OnImGuiBottomRender.emit(); ImGui.end(); }