16
16
17
17
#include < OvRendering/HAL/Profiling.h>
18
18
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
+
19
36
OvEditor::Rendering::PickingRenderPass::PickingRenderPass (OvRendering::Core::CompositeRenderer& p_renderer) :
20
37
OvRendering::Core::ARenderPass(p_renderer),
21
38
m_actorPickingFramebuffer(" ActorPicking" )
@@ -35,11 +52,7 @@ OvEditor::Rendering::PickingRenderPass::PickingRenderPass(OvRendering::Core::Com
35
52
m_gizmoPickingMaterial.SetProperty (" u_IsPickable" , true );
36
53
37
54
/* 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" ));
43
56
}
44
57
45
58
OvEditor::Rendering::PickingRenderPass::PickingResult OvEditor::Rendering::PickingRenderPass::ReadbackPickingResult (
@@ -125,16 +138,6 @@ void OvEditor::Rendering::PickingRenderPass::Draw(OvRendering::Data::PipelineSta
125
138
}
126
139
}
127
140
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
-
138
141
void OvEditor::Rendering::PickingRenderPass::DrawPickableModels (
139
142
OvRendering::Data::PipelineState p_pso,
140
143
OvCore::SceneSystem::Scene& p_scene
@@ -153,22 +156,33 @@ void OvEditor::Rendering::PickingRenderPass::DrawPickableModels(
153
156
const auto & materials = materialRenderer->GetMaterials ();
154
157
const auto & modelMatrix = actor.transform .GetWorldMatrix ();
155
158
156
- PreparePickingMaterial (actor, m_actorPickingMaterial);
157
-
158
159
for (auto mesh : model->GetMeshes ())
159
160
{
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);
161
172
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 ();
167
178
168
179
OvRendering::Entities::Drawable drawable;
169
180
drawable.mesh = *mesh;
170
- drawable.material = m_actorPickingMaterial ;
181
+ drawable.material = targetMaterial ;
171
182
drawable.stateMask = stateMask;
183
+ drawable.stateMask .frontfaceCulling = false ;
184
+ drawable.stateMask .backfaceCulling = false ;
185
+ drawable.featureSetOverride = { pickingPassName };
172
186
173
187
drawable.AddDescriptor <OvCore::Rendering::EngineDrawableDescriptor>({
174
188
modelMatrix
@@ -193,14 +207,14 @@ void OvEditor::Rendering::PickingRenderPass::DrawPickableCameras(
193
207
194
208
if (actor.IsActive ())
195
209
{
196
- PreparePickingMaterial (actor, m_actorPickingMaterial );
210
+ PreparePickingMaterial (actor, m_actorPickingFallbackMaterial );
197
211
auto & cameraModel = *EDITOR_CONTEXT (editorResources)->GetModel (" Camera" );
198
212
auto translation = OvMaths::FMatrix4::Translation (actor.transform .GetWorldPosition ());
199
213
auto rotation = OvMaths::FQuaternion::ToMatrix4 (actor.transform .GetWorldRotation ());
200
214
auto modelMatrix = translation * rotation;
201
215
202
216
m_renderer.GetFeature <DebugModelRenderFeature>()
203
- .DrawModelWithSingleMaterial (p_pso, cameraModel, m_actorPickingMaterial , modelMatrix);
217
+ .DrawModelWithSingleMaterial (p_pso, cameraModel, m_actorPickingFallbackMaterial , modelMatrix);
204
218
}
205
219
}
206
220
}
@@ -222,7 +236,7 @@ void OvEditor::Rendering::PickingRenderPass::DrawPickableLights(
222
236
223
237
if (actor.IsActive ())
224
238
{
225
- PreparePickingMaterial (actor, m_lightMaterial);
239
+ PreparePickingMaterial (actor, m_lightMaterial, " u_Diffuse " );
226
240
auto & lightModel = *EDITOR_CONTEXT (editorResources)->GetModel (" Vertical_Plane" );
227
241
auto modelMatrix = OvMaths::FMatrix4::Translation (actor.transform .GetWorldPosition ());
228
242
0 commit comments