Frustum culling

This commit is contained in:
antopilo
2021-08-25 21:04:25 -04:00
parent eb69e6db0f
commit 96f0cdb4e9
8 changed files with 115 additions and 45 deletions

View File

@@ -16,7 +16,6 @@
#include <GL/glew.h>
#include "Engine.h"
#include "Engine.h"
#include "src/Core/FileSystem.h"
#include "Components/Components.h"
@@ -42,11 +41,10 @@ namespace Nuake {
m_Environement = CreateRef<Environment>();
m_Interfaces = std::vector<Ref<UI::UserInterface>>();
// Adding systems
// Adding systems - Order is important
m_Systems.push_back(CreateRef<TransformSystem>(this));
m_Systems.push_back(CreateRef<ScriptingSystem>(this));
m_Systems.push_back(CreateRef<PhysicsSystem>(this));
}
Scene::~Scene() {}
@@ -95,7 +93,6 @@ namespace Nuake {
{
for (auto& system : m_Systems)
system->Exit();
}
void Scene::Update(Timestep ts)
@@ -123,15 +120,16 @@ namespace Nuake {
void Scene::UpdatePositions()
{
auto transformView = m_Registry.view<ParentComponent, TransformComponent>();
for (auto e : transformView) {
for (auto e : transformView)
{
auto [parent, transform] = transformView.get<ParentComponent, TransformComponent>(e);
Entity currentParent = Entity{ e, this };
Vector3 globalPos = Vector3();
if (parent.HasParent)
{
while (currentParent.GetComponent<ParentComponent>().HasParent) {
while (currentParent.GetComponent<ParentComponent>().HasParent)
{
currentParent = currentParent.GetComponent<ParentComponent>().Parent;
globalPos += currentParent.GetComponent<TransformComponent>().Translation;
}
@@ -186,14 +184,16 @@ namespace Nuake {
continue;
light.CalculateViewProjection(cam->GetTransform(), cam->GetPerspective());
for (int i = 0; i < CSM_AMOUNT; i++)
{
light.m_Framebuffers[i]->Bind();
light.m_Framebuffers[i]->Clear();
Frustum lightFrustum = Frustum(light.mViewProjections[i]);
shadowShader->SetUniformMat4f("u_LightTransform", light.mViewProjections[i]);
for (auto e : meshView)
{
auto [transform, mesh] = meshView.get<TransformComponent, MeshComponent>(e);
@@ -209,8 +209,15 @@ namespace Nuake {
if (model.IsTransparent)
continue;
for (auto& m : model.Meshes)
Renderer::SubmitMesh(m, transform.GetTransform());
for (Ref<Mesh>& m : model.Meshes)
{
AABB modelAABB = m->GetAABB();
modelAABB.Transform(transform.GetTransform());
bool isInFrustum = lightFrustum.IsBoxVisible(modelAABB.Min, modelAABB.Max);
if (isInFrustum)
Renderer::SubmitMesh(m, transform.GetTransform());
}
}
Renderer::Flush(shadowShader, true);
@@ -295,7 +302,12 @@ namespace Nuake {
continue;
for (auto& b : model.Meshes)
Renderer::SubmitMesh(b, transform.GetTransform());
{
AABB aabb = b->GetAABB();
aabb.Transform(transform.GetTransform());
if(cam->BoxFrustumCheck(aabb))
Renderer::SubmitMesh(b, transform.GetTransform());
}
}
Renderer::Flush(pbrShader);
@@ -403,12 +415,16 @@ namespace Nuake {
if (!model.IsTransparent)
continue;
flatShader->SetUniformMat4f("u_Model", transform.GetTransform());
flatShader->SetUniform4f("u_Color", 1.f, 0.0f, 0.1f, 0.5f);
for (auto& e : model.Meshes)
Renderer::SubmitMesh(e, transform.GetTransform());
for (auto& b : model.Meshes)
{
AABB aabb = b->GetAABB();
aabb.Transform(transform.GetTransform());
if (m_EditorCamera->BoxFrustumCheck(aabb))
Renderer::SubmitMesh(b, transform.GetTransform());
}
}
Renderer::Flush(flatShader);
@@ -454,12 +470,6 @@ namespace Nuake {
}
}
Entity Scene::CreateEmptyEntity()
{
Entity entity = { m_Registry.create(), this };
return entity;
}
Entity Scene::CreateEntity(const std::string& name)
{
Entity entity = { m_Registry.create(), this };
@@ -593,7 +603,7 @@ namespace Nuake {
for (json e : j["Entities"])
{
std::string name = e["NameComponent"]["Name"];
Entity ent = CreateEmptyEntity();
Entity ent = { m_Registry.create(), this };
ent.Deserialize(e.dump());
}