Enable frustum culling
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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,8 +24,14 @@ 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()) {
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user