Skip to content

Commit eca2d21

Browse files
authored
Added IsDrawable method to properly skip invalid draw calls (#533)
1 parent 403d47f commit eca2d21

File tree

3 files changed

+56
-35
lines changed

3 files changed

+56
-35
lines changed

Sources/Overload/OvRendering/include/OvRendering/Core/ABaseRenderer.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,15 @@ namespace OvRendering::Core
103103
OvRendering::Settings::EBlitFlags p_flags = OvRendering::Settings::EBlitFlags::DEFAULT
104104
);
105105

106+
/**
107+
* Returns true if the entity is drawable. Should be used before submitting an entity.
108+
* @param p_drawable
109+
*/
110+
virtual bool IsDrawable(const Entities::Drawable& p_drawable) const;
111+
106112
/**
107113
* Draw a drawable entity
114+
* @note Any submitted entity should be drawable (Use IsDrawable before)
108115
* @param p_pso
109116
* @param p_drawable
110117
*/

Sources/Overload/OvRendering/src/OvRendering/Core/ABaseRenderer.cpp

Lines changed: 42 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -175,53 +175,60 @@ void OvRendering::Core::ABaseRenderer::Blit(
175175
p_dst.Unbind();
176176
}
177177

178+
bool OvRendering::Core::ABaseRenderer::IsDrawable(const Entities::Drawable& p_drawable) const
179+
{
180+
return
181+
p_drawable.mesh &&
182+
p_drawable.material &&
183+
p_drawable.material->IsValid()&&
184+
p_drawable.material->SupportsProjectionMode(m_frameDescriptor.camera->GetProjectionMode()) &&
185+
p_drawable.material->GetGPUInstances() > 0;
186+
}
187+
178188
void OvRendering::Core::ABaseRenderer::DrawEntity(
179189
OvRendering::Data::PipelineState p_pso,
180190
const Entities::Drawable& p_drawable
181191
)
182192
{
183193
ZoneScoped;
184194

185-
auto material = p_drawable.material;
186-
auto mesh = p_drawable.mesh;
195+
OVASSERT(IsDrawable(p_drawable), "Submitted an entity that isn't properly configured!");
187196

188-
OVASSERT(material.has_value(), "Missing material instance!");
197+
p_pso.depthWriting = p_drawable.stateMask.depthWriting;
198+
p_pso.colorWriting.mask = p_drawable.stateMask.colorWriting ? 0xFF : 0x00;
199+
p_pso.blending = p_drawable.stateMask.blendable;
200+
p_pso.userInterface = p_drawable.stateMask.userInterface;
201+
p_pso.culling = p_drawable.stateMask.frontfaceCulling || p_drawable.stateMask.backfaceCulling;
202+
p_pso.depthTest = p_drawable.stateMask.depthTest;
189203

190-
const auto gpuInstances = material->GetGPUInstances();
191-
const auto projectionMode = m_frameDescriptor.camera->GetProjectionMode();
192-
193-
if (mesh && material->IsValid() && material->SupportsProjectionMode(projectionMode) && gpuInstances > 0)
204+
if (p_pso.culling)
194205
{
195-
p_pso.depthWriting = p_drawable.stateMask.depthWriting;
196-
p_pso.colorWriting.mask = p_drawable.stateMask.colorWriting ? 0xFF : 0x00;
197-
p_pso.blending = p_drawable.stateMask.blendable;
198-
p_pso.userInterface = p_drawable.stateMask.userInterface;
199-
p_pso.culling = p_drawable.stateMask.frontfaceCulling || p_drawable.stateMask.backfaceCulling;
200-
p_pso.depthTest = p_drawable.stateMask.depthTest;
201-
202-
if (p_pso.culling)
206+
if (p_drawable.stateMask.backfaceCulling && p_drawable.stateMask.frontfaceCulling)
207+
{
208+
p_pso.cullFace = Settings::ECullFace::FRONT_AND_BACK;
209+
}
210+
else
203211
{
204-
if (p_drawable.stateMask.backfaceCulling && p_drawable.stateMask.frontfaceCulling)
205-
{
206-
p_pso.cullFace = Settings::ECullFace::FRONT_AND_BACK;
207-
}
208-
else
209-
{
210-
p_pso.cullFace =
211-
p_drawable.stateMask.backfaceCulling ?
212-
Settings::ECullFace::BACK :
213-
Settings::ECullFace::FRONT;
214-
}
212+
p_pso.cullFace =
213+
p_drawable.stateMask.backfaceCulling ?
214+
Settings::ECullFace::BACK :
215+
Settings::ECullFace::FRONT;
215216
}
217+
}
216218

217-
material->Bind(
218-
&m_emptyTexture->GetTexture(),
219-
p_drawable.featureSetOverride.has_value() ?
220-
OvTools::Utils::OptRef<const Data::FeatureSet>(p_drawable.featureSetOverride.value()) :
221-
std::nullopt
222-
);
219+
p_drawable.material->Bind(
220+
&m_emptyTexture->GetTexture(),
221+
p_drawable.featureSetOverride.has_value() ?
222+
OvTools::Utils::OptRef<const Data::FeatureSet>(p_drawable.featureSetOverride.value()) :
223+
std::nullopt
224+
);
223225

224-
m_driver.Draw(p_pso, mesh.value(), p_drawable.primitiveMode, gpuInstances);
225-
material->Unbind();
226-
}
226+
m_driver.Draw(
227+
p_pso,
228+
p_drawable.mesh.value(),
229+
p_drawable.primitiveMode,
230+
p_drawable.material->GetGPUInstances()
231+
);
232+
233+
p_drawable.material->Unbind();
227234
}

Sources/Overload/OvRendering/src/OvRendering/Core/CompositeRenderer.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,13 @@ void OvRendering::Core::CompositeRenderer::DrawEntity(
9191
{
9292
ZoneScoped;
9393

94+
// Ensure the drawable is valid.
95+
// If not, skip the draw call and the attached features.
96+
if (!IsDrawable(p_drawable))
97+
{
98+
return;
99+
}
100+
94101
for (const auto& [_, feature] : m_features)
95102
{
96103
if (feature->IsEnabled())

0 commit comments

Comments
 (0)