55*/
66
77#include < OvRendering/Resources/Loaders/TextureLoader.h>
8+ #include < OvRendering/Data/Frustum.h>
89
910#include " OvCore/ECS/Renderer.h"
1011#include " OvCore/ECS/Components/CModelRenderer.h"
@@ -45,12 +46,12 @@ void OvCore::ECS::Renderer::FindLightMatrices(const OvCore::SceneSystem::Scene&
4546 p_out.push_back (light->GetData ().GenerateMatrix ());
4647}
4748
48- void OvCore::ECS::Renderer::RenderScene (OvCore::SceneSystem::Scene& p_scene, const OvMaths::FVector3& p_cameraPosition, Resources::Material* p_defaultMaterial)
49+ void OvCore::ECS::Renderer::RenderScene (OvCore::SceneSystem::Scene& p_scene, const OvMaths::FVector3& p_cameraPosition, OvRendering::Data::Frustum const * p_frustum, Resources::Material* p_defaultMaterial)
4950{
5051 OpaqueDrawables opaqueMeshes;
5152 TransparentDrawables transparentMeshes;
5253
53- FindAndSortDrawables (opaqueMeshes, transparentMeshes, p_scene, p_cameraPosition, p_defaultMaterial);
54+ FindAndSortDrawables (opaqueMeshes, transparentMeshes, p_scene, p_cameraPosition, p_frustum, p_defaultMaterial);
5455
5556 for (const auto &[distance, drawable] : opaqueMeshes)
5657 DrawDrawable (drawable);
@@ -59,39 +60,53 @@ void OvCore::ECS::Renderer::RenderScene(OvCore::SceneSystem::Scene& p_scene, con
5960 DrawDrawable (drawable);
6061}
6162
62- void OvCore::ECS::Renderer::FindAndSortDrawables (OpaqueDrawables& p_opaques, TransparentDrawables& p_transparents, const OvCore::SceneSystem::Scene& p_scene, const OvMaths::FVector3& p_cameraPosition, Resources::Material* p_defaultMaterial)
63+ void OvCore::ECS::Renderer::FindAndSortDrawables
64+ (
65+ OpaqueDrawables& p_opaques,
66+ TransparentDrawables& p_transparents,
67+ const OvCore::SceneSystem::Scene& p_scene,
68+ const OvMaths::FVector3& p_cameraPosition,
69+ OvRendering::Data::Frustum const * p_frustum,
70+ Resources::Material* p_defaultMaterial
71+ )
6372{
73+ auto camera = FindMainCamera (p_scene);
74+
6475 for (OvCore::ECS::Components::CModelRenderer* modelRenderer : p_scene.GetFastAccessComponents ().modelRenderers )
6576 {
77+ auto position = modelRenderer->owner .transform .GetWorldPosition ();
6678 if (modelRenderer->owner .IsActive ())
6779 {
6880 if (auto model = modelRenderer->GetModel ())
6981 {
70- float distanceToActor = OvMaths::FVector3::Distance (modelRenderer->owner .transform .GetWorldPosition (), p_cameraPosition);
71-
72- if (auto materialRenderer = modelRenderer->owner .GetComponent <OvCore::ECS::Components::CMaterialRenderer>())
82+ if (!p_frustum || p_frustum->PointInFrustum (position.x , position.y , position.z ))
7383 {
74- const OvCore::ECS::Components::CMaterialRenderer::MaterialList& materials = materialRenderer-> GetMaterials ( );
84+ float distanceToActor = OvMaths::FVector3::Distance (modelRenderer-> owner . transform . GetWorldPosition (), p_cameraPosition );
7585
76- for (auto mesh : model-> GetMeshes ())
86+ if (auto materialRenderer = modelRenderer-> owner . GetComponent <OvCore::ECS::Components::CMaterialRenderer> ())
7787 {
78- OvCore::Resources::Material* material = nullptr ;
79-
80- if (mesh->GetMaterialIndex () < MAX_MATERIAL_COUNT)
81- {
82- material = materials.at (mesh->GetMaterialIndex ());
83- if (!material || !material->GetShader ())
84- material = p_defaultMaterial;
85- }
88+ const OvCore::ECS::Components::CMaterialRenderer::MaterialList& materials = materialRenderer->GetMaterials ();
8689
87- if (material )
90+ for ( auto mesh : model-> GetMeshes () )
8891 {
89- Drawable element = { modelRenderer->owner .transform .GetWorldMatrix (), mesh, material, materialRenderer->GetUserMatrix () };
90-
91- if (material->IsBlendable ())
92- p_transparents.emplace (distanceToActor, element);
93- else
94- p_opaques.emplace (distanceToActor, element);
92+ OvCore::Resources::Material* material = nullptr ;
93+
94+ if (mesh->GetMaterialIndex () < MAX_MATERIAL_COUNT)
95+ {
96+ material = materials.at (mesh->GetMaterialIndex ());
97+ if (!material || !material->GetShader ())
98+ material = p_defaultMaterial;
99+ }
100+
101+ if (material)
102+ {
103+ Drawable element = { modelRenderer->owner .transform .GetWorldMatrix (), mesh, material, materialRenderer->GetUserMatrix () };
104+
105+ if (material->IsBlendable ())
106+ p_transparents.emplace (distanceToActor, element);
107+ else
108+ p_opaques.emplace (distanceToActor, element);
109+ }
95110 }
96111 }
97112 }
0 commit comments