Enable frustum culling
This commit is contained in:
@@ -8,5 +8,7 @@ import org.joml.Matrix4fc;
|
|||||||
public interface Camera extends Placeable {
|
public interface Camera extends Placeable {
|
||||||
Matrix4fc computeViewModelMatrix(Matrix4fc modelMatrix);
|
Matrix4fc computeViewModelMatrix(Matrix4fc modelMatrix);
|
||||||
|
|
||||||
|
boolean insideFrustum(float x, float y, float radius);
|
||||||
|
|
||||||
void render(Screen screen, ShaderManager shaderManager);
|
void render(Screen screen, ShaderManager shaderManager);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,12 +5,16 @@ import com.bartlomiejpluta.base.api.screen.Screen;
|
|||||||
import com.bartlomiejpluta.base.internal.gc.Disposable;
|
import com.bartlomiejpluta.base.internal.gc.Disposable;
|
||||||
import com.bartlomiejpluta.base.internal.render.Renderable;
|
import com.bartlomiejpluta.base.internal.render.Renderable;
|
||||||
import com.bartlomiejpluta.base.internal.render.ShaderManager;
|
import com.bartlomiejpluta.base.internal.render.ShaderManager;
|
||||||
|
import lombok.Getter;
|
||||||
|
import org.joml.Vector2f;
|
||||||
|
import org.joml.Vector2fc;
|
||||||
import org.lwjgl.opengl.GL15;
|
import org.lwjgl.opengl.GL15;
|
||||||
import org.lwjgl.system.MemoryStack;
|
import org.lwjgl.system.MemoryStack;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static java.lang.Math.abs;
|
||||||
import static org.lwjgl.opengl.GL15.*;
|
import static org.lwjgl.opengl.GL15.*;
|
||||||
import static org.lwjgl.opengl.GL20.*;
|
import static org.lwjgl.opengl.GL20.*;
|
||||||
import static org.lwjgl.opengl.GL30.*;
|
import static org.lwjgl.opengl.GL30.*;
|
||||||
@@ -20,8 +24,14 @@ public class Mesh implements Renderable, Disposable {
|
|||||||
private final List<Integer> vboIds = new ArrayList<>(2);
|
private final List<Integer> vboIds = new ArrayList<>(2);
|
||||||
private final int elementsCount;
|
private final int elementsCount;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private final Vector2fc farthestVertex;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private final Vector2fc primarySize;
|
||||||
|
|
||||||
public Mesh(float[] vertices, float[] texCoords, int[] elements) {
|
public Mesh(float[] vertices, float[] texCoords, int[] elements) {
|
||||||
elementsCount = elements.length;
|
this.elementsCount = elements.length;
|
||||||
|
|
||||||
var vboId = 0;
|
var vboId = 0;
|
||||||
try (var stack = MemoryStack.stackPush()) {
|
try (var stack = MemoryStack.stackPush()) {
|
||||||
@@ -51,6 +61,35 @@ public class Mesh implements Renderable, Disposable {
|
|||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
glBindVertexArray(0);
|
glBindVertexArray(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var minX = Float.MAX_VALUE;
|
||||||
|
var minY = Float.MAX_VALUE;
|
||||||
|
var maxX = 0f;
|
||||||
|
var maxY = 0f;
|
||||||
|
|
||||||
|
for (int i = 0; i < vertices.length / 2; ++i) {
|
||||||
|
var x = vertices[2 * i];
|
||||||
|
var y = vertices[2 * i + 1];
|
||||||
|
|
||||||
|
if (x < minX) {
|
||||||
|
minX = x;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (x > maxX) {
|
||||||
|
maxX = x;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (y < minY) {
|
||||||
|
minY = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (y > maxY) {
|
||||||
|
maxY = y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
farthestVertex = new Vector2f(abs(maxX) > abs(minX) ? maxX : minX, abs(maxY) > abs(minY) ? maxY : minY);
|
||||||
|
primarySize = new Vector2f(maxX - minX, maxY - minY);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -5,18 +5,26 @@ import com.bartlomiejpluta.base.api.screen.Screen;
|
|||||||
import com.bartlomiejpluta.base.engine.core.gl.shader.constant.UniformName;
|
import com.bartlomiejpluta.base.engine.core.gl.shader.constant.UniformName;
|
||||||
import com.bartlomiejpluta.base.engine.world.object.Model;
|
import com.bartlomiejpluta.base.engine.world.object.Model;
|
||||||
import com.bartlomiejpluta.base.internal.render.ShaderManager;
|
import com.bartlomiejpluta.base.internal.render.ShaderManager;
|
||||||
|
import org.joml.FrustumIntersection;
|
||||||
import org.joml.Matrix4f;
|
import org.joml.Matrix4f;
|
||||||
import org.joml.Matrix4fc;
|
import org.joml.Matrix4fc;
|
||||||
|
|
||||||
public class DefaultCamera extends Model implements Camera {
|
public class DefaultCamera extends Model implements Camera {
|
||||||
private final Matrix4f projectionMatrix = new Matrix4f();
|
private final Matrix4f projectionMatrix = new Matrix4f();
|
||||||
private final Matrix4f viewMatrix = new Matrix4f();
|
private final Matrix4f viewMatrix = new Matrix4f();
|
||||||
|
private final Matrix4f projectionViewMatrix = new Matrix4f();
|
||||||
|
private final FrustumIntersection frustum = new FrustumIntersection();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Matrix4fc computeViewModelMatrix(Matrix4fc modelMatrix) {
|
public Matrix4fc computeViewModelMatrix(Matrix4fc modelMatrix) {
|
||||||
return new Matrix4f(viewMatrix).mul(modelMatrix);
|
return new Matrix4f(viewMatrix).mul(modelMatrix);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean insideFrustum(float x, float y, float radius) {
|
||||||
|
return frustum.testSphere(x, y, 0.0f, radius);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void render(Screen screen, ShaderManager shaderManager) {
|
public void render(Screen screen, ShaderManager shaderManager) {
|
||||||
// Update matrices
|
// Update matrices
|
||||||
@@ -28,6 +36,12 @@ public class DefaultCamera extends Model implements Camera {
|
|||||||
.identity()
|
.identity()
|
||||||
.translate(-position.x, -position.y, 0);
|
.translate(-position.x, -position.y, 0);
|
||||||
|
|
||||||
|
projectionViewMatrix
|
||||||
|
.set(projectionMatrix)
|
||||||
|
.mul(viewMatrix);
|
||||||
|
|
||||||
|
frustum.set(projectionViewMatrix);
|
||||||
|
|
||||||
shaderManager.setUniform(UniformName.UNI_PROJECTION_MATRIX, projectionMatrix);
|
shaderManager.setUniform(UniformName.UNI_PROJECTION_MATRIX, projectionMatrix);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,13 +7,15 @@ import com.bartlomiejpluta.base.engine.core.gl.object.mesh.Mesh;
|
|||||||
import com.bartlomiejpluta.base.engine.core.gl.shader.constant.UniformName;
|
import com.bartlomiejpluta.base.engine.core.gl.shader.constant.UniformName;
|
||||||
import com.bartlomiejpluta.base.internal.render.Renderable;
|
import com.bartlomiejpluta.base.internal.render.Renderable;
|
||||||
import com.bartlomiejpluta.base.internal.render.ShaderManager;
|
import com.bartlomiejpluta.base.internal.render.ShaderManager;
|
||||||
import lombok.*;
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NonNull;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
public abstract class Sprite extends Model implements Renderable {
|
public abstract class Sprite extends Model implements Renderable {
|
||||||
|
private final float farthestVertexDistance;
|
||||||
|
|
||||||
@NonNull
|
|
||||||
protected final Mesh mesh;
|
protected final Mesh mesh;
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@@ -21,8 +23,19 @@ public abstract class Sprite extends Model implements Renderable {
|
|||||||
@Getter
|
@Getter
|
||||||
protected Material material;
|
protected Material material;
|
||||||
|
|
||||||
|
public Sprite(Mesh mesh, Material material) {
|
||||||
|
this.mesh = mesh;
|
||||||
|
this.material = material;
|
||||||
|
|
||||||
|
this.farthestVertexDistance = this.mesh.getFarthestVertex().lengthSquared();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void render(Screen screen, Camera camera, ShaderManager shaderManager) {
|
public void render(Screen screen, Camera camera, ShaderManager shaderManager) {
|
||||||
|
if (!camera.insideFrustum(position.x, position.y, farthestVertexDistance * (scaleX > scaleY ? scaleX : scaleY))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
shaderManager.setUniform(UniformName.UNI_VIEW_MODEL_MATRIX, camera.computeViewModelMatrix(getModelMatrix()));
|
shaderManager.setUniform(UniformName.UNI_VIEW_MODEL_MATRIX, camera.computeViewModelMatrix(getModelMatrix()));
|
||||||
material.render(screen, camera, shaderManager);
|
material.render(screen, camera, shaderManager);
|
||||||
mesh.render(screen, camera, shaderManager);
|
mesh.render(screen, camera, shaderManager);
|
||||||
|
|||||||
Reference in New Issue
Block a user