Skip to content

Commit d2bb954

Browse files
author
Adrien GIVRY
committed
Frustum culling works
1 parent eaa7d5a commit d2bb954

10 files changed

Lines changed: 85 additions & 5 deletions

File tree

Sources/Overload/OvCore/src/OvCore/ECS/Renderer.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,14 @@ void OvCore::ECS::Renderer::FindAndSortDrawables
7474

7575
for (OvCore::ECS::Components::CModelRenderer* modelRenderer : p_scene.GetFastAccessComponents().modelRenderers)
7676
{
77-
auto position = modelRenderer->owner.transform.GetWorldPosition();
77+
const auto& position = modelRenderer->owner.transform.GetWorldPosition();
78+
const auto& scale = modelRenderer->owner.transform.GetWorldScale();
79+
7880
if (modelRenderer->owner.IsActive())
7981
{
8082
if (auto model = modelRenderer->GetModel())
8183
{
82-
if (!p_frustum || p_frustum->PointInFrustum(position.x, position.y, position.z))
84+
if (!p_frustum || p_frustum->SphereInFrustum(position.x, position.y, position.z, model->GetBoundingSphere().radius * std::max(std::max(std::max(scale.x, scale.y), scale.z), 0.0f)))
8385
{
8486
float distanceToActor = OvMaths::FVector3::Distance(modelRenderer->owner.transform.GetWorldPosition(), p_cameraPosition);
8587

Sources/Overload/OvEditor/src/OvEditor/Core/EditorRenderer.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,14 +159,14 @@ void OvEditor::Core::EditorRenderer::RenderSceneForActorPicking(OvRendering::Dat
159159
for (auto modelRenderer : scene.GetFastAccessComponents().modelRenderers)
160160
{
161161
auto& actor = modelRenderer->owner;
162+
const auto& position = actor.transform.GetWorldPosition();
163+
const auto& scale = actor.transform.GetWorldScale();
162164

163165
if (actor.IsActive())
164166
{
165167
if (auto model = modelRenderer->GetModel())
166168
{
167-
const auto& position = actor.transform.GetWorldPosition();
168-
169-
if (!p_frustum || p_frustum->PointInFrustum(position.x, position.y, position.z))
169+
if (!p_frustum || p_frustum->SphereInFrustum(position.x, position.y, position.z, model->GetBoundingSphere().radius * std::max(std::max(std::max(scale.x, scale.y), scale.z), 0.0f)))
170170
{
171171
if (auto materialRenderer = modelRenderer->owner.GetComponent<OvCore::ECS::Components::CMaterialRenderer>())
172172
{

Sources/Overload/OvRendering/OvRendering.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ xcopy "$(SolutionDir)..\..\Dependencies\assimp\bin\*.dll" "$(SolutionDir)..\..\B
139139
<ClInclude Include="include\OvRendering\Core\ShapeDrawer.h" />
140140
<ClInclude Include="include\OvRendering\Data\Frustum.h" />
141141
<ClInclude Include="include\OvRendering\Entities\Light.h" />
142+
<ClInclude Include="include\OvRendering\Geometry\BoundingSphere.h" />
142143
<ClInclude Include="include\OvRendering\Geometry\Vertex.h" />
143144
<ClInclude Include="include\OvRendering\LowRenderer\Camera.h" />
144145
<ClInclude Include="include\OvRendering\Core\Renderer.h" />

Sources/Overload/OvRendering/OvRendering.vcxproj.filters

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,9 @@
123123
<ClInclude Include="include\OvRendering\Data\Frustum.h">
124124
<Filter>Header Files</Filter>
125125
</ClInclude>
126+
<ClInclude Include="include\OvRendering\Geometry\BoundingSphere.h">
127+
<Filter>Header Files</Filter>
128+
</ClInclude>
126129
</ItemGroup>
127130
<ItemGroup>
128131
<ClCompile Include="src\OvRendering\Context\Driver.cpp">
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/**
2+
* @project: Overload
3+
* @author: Overload Tech.
4+
* @restrictions: This software may not be resold, redistributed or otherwise conveyed to a third party.
5+
*/
6+
7+
#pragma once
8+
9+
#include <OvMaths/FVector3.h>
10+
11+
namespace OvRendering::Geometry
12+
{
13+
/**
14+
* Data structure that defines a bounding sphere (Position + radius)
15+
*/
16+
struct BoundingSphere
17+
{
18+
OvMaths::FVector3 position;
19+
float radius;
20+
};
21+
}

Sources/Overload/OvRendering/include/OvRendering/Resources/Mesh.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "OvRendering/Buffers/IndexBuffer.h"
1414
#include "OvRendering/Resources/IMesh.h"
1515
#include "OvRendering/Geometry/Vertex.h"
16+
#include "OvRendering/Geometry/BoundingSphere.h"
1617

1718
namespace OvRendering::Resources
1819
{
@@ -55,8 +56,14 @@ namespace OvRendering::Resources
5556
*/
5657
uint32_t GetMaterialIndex() const;
5758

59+
/**
60+
* Returns the bounding sphere of the mesh
61+
*/
62+
const OvRendering::Geometry::BoundingSphere& GetBoundingSphere() const;
63+
5864
private:
5965
void CreateBuffers(const std::vector<Geometry::Vertex>& p_vertices, const std::vector<uint32_t>& p_indices);
66+
void ComputeBoundingSphere(const std::vector<Geometry::Vertex>& p_vertices);
6067

6168
private:
6269
const uint32_t m_vertexCount;
@@ -66,5 +73,7 @@ namespace OvRendering::Resources
6673
Buffers::VertexArray m_vertexArray;
6774
std::unique_ptr<Buffers::VertexBuffer<float>> m_vertexBuffer;
6875
std::unique_ptr<Buffers::IndexBuffer> m_indexBuffer;
76+
77+
Geometry::BoundingSphere m_boundingSphere;
6978
};
7079
}

Sources/Overload/OvRendering/include/OvRendering/Resources/Model.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,24 @@ namespace OvRendering::Resources
3232
*/
3333
const std::vector<std::string>& GetMaterialNames() const;
3434

35+
/**
36+
* Returns the bounding sphere of the model
37+
*/
38+
const OvRendering::Geometry::BoundingSphere& GetBoundingSphere() const;
39+
3540
private:
3641
Model(const std::string& p_path);
3742
~Model();
3843

44+
void ComputeBoundingSphere();
45+
3946
public:
4047
const std::string path;
4148

4249
private:
4350
std::vector<Mesh*> m_meshes;
4451
std::vector<std::string> m_materialNames;
52+
53+
Geometry::BoundingSphere m_boundingSphere;
4554
};
4655
}

Sources/Overload/OvRendering/src/OvRendering/Resources/Loaders/ModelLoader.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@ OvRendering::Resources::Model* OvRendering::Resources::Loaders::ModelLoader::Cre
1313
Model* result = new Model(p_filepath);
1414

1515
if (__ASSIMP.LoadModel(p_filepath, result->m_meshes, result->m_materialNames, p_parserFlags))
16+
{
17+
result->ComputeBoundingSphere();
1618
return result;
19+
}
1720

1821
delete result;
1922

Sources/Overload/OvRendering/src/OvRendering/Resources/Mesh.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
* @restrictions: This software may not be resold, redistributed or otherwise conveyed to a third party.
55
*/
66

7+
#include <algorithm>
8+
79
#include "OvRendering/Resources/Mesh.h"
810

911
OvRendering::Resources::Mesh::Mesh(const std::vector<Geometry::Vertex>& p_vertices, const std::vector<uint32_t>& p_indices, uint32_t p_materialIndex) :
@@ -12,6 +14,7 @@ OvRendering::Resources::Mesh::Mesh(const std::vector<Geometry::Vertex>& p_vertic
1214
m_materialIndex(p_materialIndex)
1315
{
1416
CreateBuffers(p_vertices, p_indices);
17+
ComputeBoundingSphere(p_vertices);
1518
}
1619

1720
void OvRendering::Resources::Mesh::Bind()
@@ -39,6 +42,11 @@ uint32_t OvRendering::Resources::Mesh::GetMaterialIndex() const
3942
return m_materialIndex;
4043
}
4144

45+
const OvRendering::Geometry::BoundingSphere& OvRendering::Resources::Mesh::GetBoundingSphere() const
46+
{
47+
return m_boundingSphere;
48+
}
49+
4250
void OvRendering::Resources::Mesh::CreateBuffers(const std::vector<Geometry::Vertex>& p_vertices, const std::vector<uint32_t>& p_indices)
4351
{
4452
std::vector<float> vertexData;
@@ -78,3 +86,12 @@ void OvRendering::Resources::Mesh::CreateBuffers(const std::vector<Geometry::Ver
7886
m_vertexArray.BindAttribute(3, *m_vertexBuffer, Buffers::EType::FLOAT, 3, vertexSize, sizeof(float) * 8);
7987
m_vertexArray.BindAttribute(4, *m_vertexBuffer, Buffers::EType::FLOAT, 3, vertexSize, sizeof(float) * 11);
8088
}
89+
90+
void OvRendering::Resources::Mesh::ComputeBoundingSphere(const std::vector<Geometry::Vertex>& p_vertices)
91+
{
92+
for (const auto& vertex : p_vertices)
93+
{
94+
const auto& position = reinterpret_cast<const OvMaths::FVector3&>(vertex.position);
95+
m_boundingSphere.radius = std::max(m_boundingSphere.radius, OvMaths::FVector3::Length(position));
96+
}
97+
}

Sources/Overload/OvRendering/src/OvRendering/Resources/Model.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,15 @@
44
* @restrictions: This software may not be resold, redistributed or otherwise conveyed to a third party.
55
*/
66

7+
#include <algorithm>
8+
79
#include "OvRendering/Resources/Model.h"
810

11+
const OvRendering::Geometry::BoundingSphere& OvRendering::Resources::Model::GetBoundingSphere() const
12+
{
13+
return m_boundingSphere;
14+
}
15+
916
OvRendering::Resources::Model::Model(const std::string & p_path) : path(p_path)
1017
{
1118
}
@@ -16,6 +23,14 @@ OvRendering::Resources::Model::~Model()
1623
delete mesh;
1724
}
1825

26+
void OvRendering::Resources::Model::ComputeBoundingSphere()
27+
{
28+
for (auto mesh : m_meshes)
29+
{
30+
m_boundingSphere.radius = std::max(m_boundingSphere.radius, mesh->GetBoundingSphere().radius);
31+
}
32+
}
33+
1934
const std::vector<OvRendering::Resources::Mesh*>& OvRendering::Resources::Model::GetMeshes() const
2035
{
2136
return m_meshes;

0 commit comments

Comments
 (0)