Enable frustum culling

This commit is contained in:
2021-03-30 16:03:16 +02:00
parent cb59434bc7
commit 08694e4e02
4 changed files with 73 additions and 5 deletions

View File

@@ -8,5 +8,7 @@ import org.joml.Matrix4fc;
public interface Camera extends Placeable {
Matrix4fc computeViewModelMatrix(Matrix4fc modelMatrix);
boolean insideFrustum(float x, float y, float radius);
void render(Screen screen, ShaderManager shaderManager);
}

View File

@@ -5,12 +5,16 @@ import com.bartlomiejpluta.base.api.screen.Screen;
import com.bartlomiejpluta.base.internal.gc.Disposable;
import com.bartlomiejpluta.base.internal.render.Renderable;
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.system.MemoryStack;
import java.util.ArrayList;
import java.util.List;
import static java.lang.Math.abs;
import static org.lwjgl.opengl.GL15.*;
import static org.lwjgl.opengl.GL20.*;
import static org.lwjgl.opengl.GL30.*;
@@ -20,11 +24,17 @@ public class Mesh implements Renderable, Disposable {
private final List<Integer> vboIds = new ArrayList<>(2);
private final int elementsCount;
@Getter
private final Vector2fc farthestVertex;
@Getter
private final Vector2fc primarySize;
public Mesh(float[] vertices, float[] texCoords, int[] elements) {
elementsCount = elements.length;
this.elementsCount = elements.length;
var vboId = 0;
try(var stack = MemoryStack.stackPush()) {
try (var stack = MemoryStack.stackPush()) {
vaoId = glGenVertexArrays();
glBindVertexArray(vaoId);
@@ -51,6 +61,35 @@ public class Mesh implements Renderable, Disposable {
glBindBuffer(GL_ARRAY_BUFFER, 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

View File

@@ -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.world.object.Model;
import com.bartlomiejpluta.base.internal.render.ShaderManager;
import org.joml.FrustumIntersection;
import org.joml.Matrix4f;
import org.joml.Matrix4fc;
public class DefaultCamera extends Model implements Camera {
private final Matrix4f projectionMatrix = new Matrix4f();
private final Matrix4f viewMatrix = new Matrix4f();
private final Matrix4f projectionViewMatrix = new Matrix4f();
private final FrustumIntersection frustum = new FrustumIntersection();
@Override
public Matrix4fc computeViewModelMatrix(Matrix4fc 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
public void render(Screen screen, ShaderManager shaderManager) {
// Update matrices
@@ -28,6 +36,12 @@ public class DefaultCamera extends Model implements Camera {
.identity()
.translate(-position.x, -position.y, 0);
projectionViewMatrix
.set(projectionMatrix)
.mul(viewMatrix);
frustum.set(projectionViewMatrix);
shaderManager.setUniform(UniformName.UNI_PROJECTION_MATRIX, projectionMatrix);
}
}

View File

@@ -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.internal.render.Renderable;
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)
public abstract class Sprite extends Model implements Renderable {
private final float farthestVertexDistance;
@NonNull
protected final Mesh mesh;
@NonNull
@@ -21,8 +23,19 @@ public abstract class Sprite extends Model implements Renderable {
@Getter
protected Material material;
public Sprite(Mesh mesh, Material material) {
this.mesh = mesh;
this.material = material;
this.farthestVertexDistance = this.mesh.getFarthestVertex().lengthSquared();
}
@Override
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()));
material.render(screen, camera, shaderManager);
mesh.render(screen, camera, shaderManager);