feat(rendering): added frustum class
This commit is contained in:
parent
51546c320c
commit
99d97b7507
3 changed files with 75 additions and 0 deletions
|
|
@ -57,6 +57,8 @@ set(SOURCES
|
||||||
src/rendering/font.h
|
src/rendering/font.h
|
||||||
src/rendering/defaultmeshes.h
|
src/rendering/defaultmeshes.h
|
||||||
src/rendering/texture3d.cpp
|
src/rendering/texture3d.cpp
|
||||||
|
src/rendering/frustum.h
|
||||||
|
src/rendering/frustum.cpp
|
||||||
src/physics/world.h
|
src/physics/world.h
|
||||||
src/physics/world.cpp
|
src/physics/world.cpp
|
||||||
src/logger.cpp
|
src/logger.cpp
|
||||||
|
|
|
||||||
44
core/src/rendering/frustum.cpp
Normal file
44
core/src/rendering/frustum.cpp
Normal file
|
|
@ -0,0 +1,44 @@
|
||||||
|
#include "frustum.h"
|
||||||
|
#include "datatypes/vector.h"
|
||||||
|
#include <glm/ext/matrix_clip_space.hpp>
|
||||||
|
|
||||||
|
// https://learnopengl.com/Guest-Articles/2021/Scene/Frustum-Culling
|
||||||
|
|
||||||
|
// https://stackoverflow.com/q/66227192/16255372
|
||||||
|
FrustumPlane::FrustumPlane(Vector3 point, Vector3 normal) : normal(normal.Unit()), distance(normal.Unit().Dot(point)) {}
|
||||||
|
|
||||||
|
Frustum::Frustum(const Camera cam, float aspect, float fovY, float zNear, float zFar) {
|
||||||
|
const float halfVSide = zFar * tanf(fovY * 0.5f);
|
||||||
|
const float halfHSide = halfVSide * aspect;
|
||||||
|
const glm::vec3 frontMultFar = zFar * cam.cameraFront;
|
||||||
|
|
||||||
|
// Don't forget to normalize!!!
|
||||||
|
glm::vec3 camRight = glm::normalize(glm::cross(cam.cameraFront, -cam.cameraUp)); // Technically this is left, but whatever
|
||||||
|
glm::vec3 trueCamUp = glm::cross(cam.cameraFront, camRight);
|
||||||
|
near = { cam.cameraPos + zNear * cam.cameraFront, cam.cameraFront };
|
||||||
|
far = { cam.cameraPos + frontMultFar, -cam.cameraFront };
|
||||||
|
right = { cam.cameraPos,
|
||||||
|
glm::cross(frontMultFar - camRight * halfHSide, trueCamUp) };
|
||||||
|
left = { cam.cameraPos,
|
||||||
|
glm::cross(trueCamUp,frontMultFar + camRight * halfHSide) };
|
||||||
|
top = { cam.cameraPos,
|
||||||
|
glm::cross(camRight, frontMultFar - trueCamUp * halfVSide) };
|
||||||
|
bottom = { cam.cameraPos,
|
||||||
|
glm::cross(frontMultFar + trueCamUp * halfVSide, camRight) };
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FrustumPlane::checkPointForward(Vector3 point) {
|
||||||
|
return (normal.Dot(point) - distance) < 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Frustum::checkPoint(Vector3 point) {
|
||||||
|
return true
|
||||||
|
// TODO: Near and far are broken for some reason
|
||||||
|
// && near.checkPointForward(point)
|
||||||
|
// && far.checkPointForward(point)
|
||||||
|
&& left.checkPointForward(point)
|
||||||
|
&& right.checkPointForward(point)
|
||||||
|
&& top.checkPointForward(point)
|
||||||
|
&& bottom.checkPointForward(point)
|
||||||
|
;
|
||||||
|
}
|
||||||
29
core/src/rendering/frustum.h
Normal file
29
core/src/rendering/frustum.h
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "camera.h"
|
||||||
|
#include "datatypes/vector.h"
|
||||||
|
|
||||||
|
// https://learnopengl.com/Guest-Articles/2021/Scene/Frustum-Culling
|
||||||
|
|
||||||
|
struct FrustumPlane {
|
||||||
|
Vector3 normal;
|
||||||
|
float distance; // leastPoint = normal * distance
|
||||||
|
// leastPoint is the closest point to (0,0)
|
||||||
|
|
||||||
|
FrustumPlane(Vector3 point, Vector3 normal);
|
||||||
|
FrustumPlane() = default;
|
||||||
|
|
||||||
|
bool checkPointForward(Vector3);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Frustum {
|
||||||
|
FrustumPlane near;
|
||||||
|
FrustumPlane far;
|
||||||
|
FrustumPlane left;
|
||||||
|
FrustumPlane right;
|
||||||
|
FrustumPlane top;
|
||||||
|
FrustumPlane bottom;
|
||||||
|
|
||||||
|
Frustum(const Camera cam, float aspect, float fovY, float zNear, float zFar);
|
||||||
|
bool checkPoint(Vector3);
|
||||||
|
};
|
||||||
Loading…
Add table
Reference in a new issue