Skip to content

Commit e290cfc

Browse files
authored
Added support for custom picking pass (#508)
1 parent 1abf86c commit e290cfc

File tree

4 files changed

+73
-28
lines changed

4 files changed

+73
-28
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#shader vertex
2+
#version 450 core
3+
4+
layout (location = 0) in vec3 geo_Pos;
5+
6+
layout (std140) uniform EngineUBO
7+
{
8+
mat4 ubo_Model;
9+
mat4 ubo_View;
10+
mat4 ubo_Projection;
11+
vec3 ubo_ViewPos;
12+
float ubo_Time;
13+
};
14+
15+
void main()
16+
{
17+
gl_Position = ubo_Projection * ubo_View * ubo_Model * vec4(geo_Pos, 1.0);
18+
}
19+
20+
#shader fragment
21+
#version 450 core
22+
23+
uniform vec4 _PickingColor = vec4(1.0);
24+
25+
out vec4 FRAGMENT_COLOR;
26+
27+
void main()
28+
{
29+
FRAGMENT_COLOR = _PickingColor;
30+
}

Sources/Overload/OvEditor/include/OvEditor/Rendering/PickingRenderPass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ namespace OvEditor::Rendering
6666

6767
private:
6868
OvRendering::HAL::Framebuffer m_actorPickingFramebuffer;
69-
OvCore::Resources::Material m_actorPickingMaterial;
69+
OvCore::Resources::Material m_actorPickingFallbackMaterial;
7070
OvCore::Resources::Material m_lightMaterial;
7171
OvCore::Resources::Material m_gizmoPickingMaterial;
7272
};

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ OvEditor::Core::EditorResources::EditorResources(const std::string& p_editorAsse
129129
{"Grid", CreateShader(shadersFolder / "Grid.ovfx")},
130130
{"Gizmo", CreateShader(shadersFolder / "Gizmo.ovfx")},
131131
{"Billboard", CreateShader(shadersFolder / "Billboard.ovfx")},
132+
{"PickingFallback", CreateShader(shadersFolder / "PickingFallback.ovfx")}
132133
};
133134

134135
// Ensure that all resources have been loaded successfully

Sources/Overload/OvEditor/src/OvEditor/Rendering/PickingRenderPass.cpp

Lines changed: 41 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,23 @@
1616

1717
#include <OvRendering/HAL/Profiling.h>
1818

19+
namespace
20+
{
21+
void PreparePickingMaterial(
22+
OvCore::ECS::Actor& p_actor,
23+
OvCore::Resources::Material& p_material,
24+
const std::string& p_uniformName = "_PickingColor"
25+
)
26+
{
27+
uint32_t actorID = static_cast<uint32_t>(p_actor.GetID());
28+
29+
auto bytes = reinterpret_cast<uint8_t*>(&actorID);
30+
auto color = OvMaths::FVector4{ bytes[0] / 255.0f, bytes[1] / 255.0f, bytes[2] / 255.0f, 1.0f };
31+
32+
p_material.SetProperty(p_uniformName, color, true);
33+
}
34+
}
35+
1936
OvEditor::Rendering::PickingRenderPass::PickingRenderPass(OvRendering::Core::CompositeRenderer& p_renderer) :
2037
OvRendering::Core::ARenderPass(p_renderer),
2138
m_actorPickingFramebuffer("ActorPicking")
@@ -35,11 +52,7 @@ OvEditor::Rendering::PickingRenderPass::PickingRenderPass(OvRendering::Core::Com
3552
m_gizmoPickingMaterial.SetProperty("u_IsPickable", true);
3653

3754
/* Picking Material */
38-
m_actorPickingMaterial.SetShader(EDITOR_CONTEXT(shaderManager)[":Shaders\\Unlit.ovfx"]);
39-
m_actorPickingMaterial.SetProperty("u_Diffuse", OvMaths::FVector4{ 1.f, 1.f, 1.f, 1.0f });
40-
m_actorPickingMaterial.SetProperty("u_DiffuseMap", static_cast<OvRendering::Resources::Texture*>(nullptr));
41-
m_actorPickingMaterial.SetFrontfaceCulling(false);
42-
m_actorPickingMaterial.SetBackfaceCulling(false);
55+
m_actorPickingFallbackMaterial.SetShader(EDITOR_CONTEXT(editorResources)->GetShader("PickingFallback"));
4356
}
4457

4558
OvEditor::Rendering::PickingRenderPass::PickingResult OvEditor::Rendering::PickingRenderPass::ReadbackPickingResult(
@@ -125,16 +138,6 @@ void OvEditor::Rendering::PickingRenderPass::Draw(OvRendering::Data::PipelineSta
125138
}
126139
}
127140

128-
void PreparePickingMaterial(OvCore::ECS::Actor& p_actor, OvCore::Resources::Material& p_material)
129-
{
130-
uint32_t actorID = static_cast<uint32_t>(p_actor.GetID());
131-
132-
auto bytes = reinterpret_cast<uint8_t*>(&actorID);
133-
auto color = OvMaths::FVector4{ bytes[0] / 255.0f, bytes[1] / 255.0f, bytes[2] / 255.0f, 1.0f };
134-
135-
p_material.SetProperty("u_Diffuse", color);
136-
}
137-
138141
void OvEditor::Rendering::PickingRenderPass::DrawPickableModels(
139142
OvRendering::Data::PipelineState p_pso,
140143
OvCore::SceneSystem::Scene& p_scene
@@ -153,22 +156,33 @@ void OvEditor::Rendering::PickingRenderPass::DrawPickableModels(
153156
const auto& materials = materialRenderer->GetMaterials();
154157
const auto& modelMatrix = actor.transform.GetWorldMatrix();
155158

156-
PreparePickingMaterial(actor, m_actorPickingMaterial);
157-
158159
for (auto mesh : model->GetMeshes())
159160
{
160-
auto stateMask = m_actorPickingMaterial.GenerateStateMask();
161+
const std::string pickingPassName = "PICKING_PASS";
162+
163+
auto customMaterial = materials.at(mesh->GetMaterialIndex());
164+
165+
// If the material has picking pass, use it, otherwise use the picking fallback material
166+
auto& targetMaterial =
167+
(customMaterial && customMaterial->IsValid() && customMaterial->SupportsFeature(pickingPassName)) ?
168+
*customMaterial :
169+
m_actorPickingFallbackMaterial;
170+
171+
PreparePickingMaterial(actor, targetMaterial);
161172

162-
// Override the state mask to use the material state mask (if this one is valid)
163-
if (auto material = materials.at(mesh->GetMaterialIndex()); material && material->IsValid())
164-
{
165-
stateMask = material->GenerateStateMask();
166-
}
173+
// Prioritize using the actual material state mask.
174+
auto stateMask =
175+
customMaterial && customMaterial->IsValid() ?
176+
customMaterial->GenerateStateMask() :
177+
targetMaterial.GenerateStateMask();
167178

168179
OvRendering::Entities::Drawable drawable;
169180
drawable.mesh = *mesh;
170-
drawable.material = m_actorPickingMaterial;
181+
drawable.material = targetMaterial;
171182
drawable.stateMask = stateMask;
183+
drawable.stateMask.frontfaceCulling = false;
184+
drawable.stateMask.backfaceCulling = false;
185+
drawable.featureSetOverride = { pickingPassName };
172186

173187
drawable.AddDescriptor<OvCore::Rendering::EngineDrawableDescriptor>({
174188
modelMatrix
@@ -193,14 +207,14 @@ void OvEditor::Rendering::PickingRenderPass::DrawPickableCameras(
193207

194208
if (actor.IsActive())
195209
{
196-
PreparePickingMaterial(actor, m_actorPickingMaterial);
210+
PreparePickingMaterial(actor, m_actorPickingFallbackMaterial);
197211
auto& cameraModel = *EDITOR_CONTEXT(editorResources)->GetModel("Camera");
198212
auto translation = OvMaths::FMatrix4::Translation(actor.transform.GetWorldPosition());
199213
auto rotation = OvMaths::FQuaternion::ToMatrix4(actor.transform.GetWorldRotation());
200214
auto modelMatrix = translation * rotation;
201215

202216
m_renderer.GetFeature<DebugModelRenderFeature>()
203-
.DrawModelWithSingleMaterial(p_pso, cameraModel, m_actorPickingMaterial, modelMatrix);
217+
.DrawModelWithSingleMaterial(p_pso, cameraModel, m_actorPickingFallbackMaterial, modelMatrix);
204218
}
205219
}
206220
}
@@ -222,7 +236,7 @@ void OvEditor::Rendering::PickingRenderPass::DrawPickableLights(
222236

223237
if (actor.IsActive())
224238
{
225-
PreparePickingMaterial(actor, m_lightMaterial);
239+
PreparePickingMaterial(actor, m_lightMaterial, "u_Diffuse");
226240
auto& lightModel = *EDITOR_CONTEXT(editorResources)->GetModel("Vertical_Plane");
227241
auto modelMatrix = OvMaths::FMatrix4::Translation(actor.transform.GetWorldPosition());
228242

0 commit comments

Comments
 (0)