From 380d2cd2541ab9a6aa6d4ab952ec38b72520002c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Tue, 15 Jul 2025 23:33:54 +0200 Subject: [PATCH] Add BoundingBox interface to Camera --- .../base/api/camera/Camera.java | 3 ++- .../base/internal/render/BoundingBox.java | 27 +++++++++++++++++++ .../engine/world/camera/DefaultCamera.java | 23 +++++++++++++++- 3 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 api/src/main/java/com/bartlomiejpluta/base/internal/render/BoundingBox.java diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/camera/Camera.java b/api/src/main/java/com/bartlomiejpluta/base/api/camera/Camera.java index 5a2d8ddb..3e56afbe 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/camera/Camera.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/camera/Camera.java @@ -4,10 +4,11 @@ import com.bartlomiejpluta.base.api.context.Context; import com.bartlomiejpluta.base.api.move.Movable; import com.bartlomiejpluta.base.api.screen.Screen; import com.bartlomiejpluta.base.internal.object.Placeable; +import com.bartlomiejpluta.base.internal.render.BoundingBox; import com.bartlomiejpluta.base.internal.render.ShaderManager; import org.joml.Matrix4fc; -public interface Camera extends Placeable { +public interface Camera extends Placeable, BoundingBox { Matrix4fc computeViewModelMatrix(Matrix4fc modelMatrix); boolean insideFrustum(float x, float y, float radius); diff --git a/api/src/main/java/com/bartlomiejpluta/base/internal/render/BoundingBox.java b/api/src/main/java/com/bartlomiejpluta/base/internal/render/BoundingBox.java new file mode 100644 index 00000000..f3b9a9a1 --- /dev/null +++ b/api/src/main/java/com/bartlomiejpluta/base/internal/render/BoundingBox.java @@ -0,0 +1,27 @@ +package com.bartlomiejpluta.base.internal.render; + +import javax.swing.*; + +public interface BoundingBox { + float getMinX(); + + float getMaxX(); + + float getMinY(); + + float getMaxY(); + + default boolean containsBox(float minX, float maxX, float minY, float maxY) { + return !(this.getMaxX() < minX || + this.getMinX() > maxX || + this.getMaxY() < minY || + this.getMinY() > maxY); + } + + default boolean containsBox(BoundingBox box) { + return !(this.getMaxX() < box.getMinX() || + this.getMinX() > box.getMaxX() || + this.getMaxY() < box.getMinY() || + this.getMinY() > box.getMaxY()); + } +} diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/camera/DefaultCamera.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/camera/DefaultCamera.java index 9bcf4fae..61d96bf6 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/camera/DefaultCamera.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/camera/DefaultCamera.java @@ -6,6 +6,7 @@ import com.bartlomiejpluta.base.api.screen.Screen; import com.bartlomiejpluta.base.engine.core.gl.shader.constant.UniformName; import com.bartlomiejpluta.base.engine.world.object.Model; import com.bartlomiejpluta.base.internal.render.ShaderManager; +import lombok.Getter; import org.joml.FrustumIntersection; import org.joml.Matrix4f; import org.joml.Matrix4fc; @@ -16,6 +17,18 @@ public class DefaultCamera extends Model implements Camera { private final Matrix4f projectionViewMatrix = new Matrix4f(); private final FrustumIntersection frustum = new FrustumIntersection(); + @Getter + private float minX = 0f; + + @Getter + private float maxX = 0f; + + @Getter + private float minY = 0f; + + @Getter + private float maxY = 0f; + @Override public Matrix4fc computeViewModelMatrix(Matrix4fc modelMatrix) { return new Matrix4f(viewMatrix).mul(modelMatrix); @@ -35,10 +48,13 @@ public class DefaultCamera extends Model implements Camera { @Override public void render(Screen screen, ShaderManager shaderManager) { + var screenWidth = screen.getWidth(); + var screenHeight = screen.getHeight(); + // Update matrices projectionMatrix .identity() - .setOrtho2D(0, screen.getWidth(), screen.getHeight(), 0); + .setOrtho2D(0, screenWidth, screenHeight, 0); viewMatrix .identity() @@ -51,6 +67,11 @@ public class DefaultCamera extends Model implements Camera { frustum.set(projectionViewMatrix); + this.minX = position.x; + this.maxX = position.x + screenWidth / scaleX; + this.minY = position.y; + this.maxY = position.y + screenHeight / scaleY; + shaderManager.setUniform(UniformName.UNI_PROJECTION_MATRIX, projectionMatrix); } }