44* @licence: MIT
55*/
66
7-
8-
97#include < OvCore/Helpers/GUIDrawer.h>
108#include < OvCore/Resources/Loaders/MaterialLoader.h>
119
@@ -382,6 +380,11 @@ void OvEditor::Panels::MaterialEditor::GenerateMaterialPropertiesContent()
382380
383381 m_materialPropertiesColumns->RemoveAllWidgets (); // Ensure that the m_shaderSettingsColumns is empty
384382
383+ if (!m_target->HasShader ())
384+ {
385+ return ;
386+ }
387+
385388 std::multimap<
386389 int ,
387390 std::pair<
@@ -390,6 +393,8 @@ void OvEditor::Panels::MaterialEditor::GenerateMaterialPropertiesContent()
390393 >
391394 > sortedProperties;
392395
396+ std::unordered_set<std::string> usedProperties;
397+
393398 auto typeIndexVisitor = [&](auto & arg) -> uint32_t {
394399 using T = std::decay_t <decltype (arg)>;
395400
@@ -405,25 +410,36 @@ void OvEditor::Panels::MaterialEditor::GenerateMaterialPropertiesContent()
405410
406411 for (auto & [name, prop] : m_target->GetProperties ())
407412 {
408- if ( auto program = m_target->GetProgram (); !program || !program-> GetUniformInfo (name ))
413+ for ( const auto & pass : m_target->GetShader ()-> GetPasses ( ))
409414 {
410- // This property isn't used in the shader program, so skip it
411- continue ;
412- }
415+ if (auto variant = m_target->GetVariant (pass); !variant || !variant->GetUniformInfo (name))
416+ {
417+ // This property isn't used in the shader program, so skip it
418+ continue ;
419+ }
413420
414- // Uniforms starting with '_' are internal (private), so not exposed
415- if (name.length () == 0 || name[0 ] == ' _' )
416- {
417- continue ;
418- }
421+ // Uniforms starting with '_' are internal (private), so not exposed
422+ if (name.length () == 0 || name[0 ] == ' _' )
423+ {
424+ continue ;
425+ }
419426
420- sortedProperties.emplace (
421- std::visit (typeIndexVisitor, prop.value ),
422- std::pair<std::string, std::reference_wrapper<OvRendering::Data::MaterialPropertyType>>{
423- name,
424- std::ref (prop.value )
427+ // Skip properties that already got added (e.g. if they are used in multiple passes)
428+ if (usedProperties.contains (name))
429+ {
430+ continue ;
425431 }
426- );
432+
433+ usedProperties.insert (name);
434+
435+ sortedProperties.emplace (
436+ std::visit (typeIndexVisitor, prop.value ),
437+ std::pair<std::string, std::reference_wrapper<OvRendering::Data::MaterialPropertyType>>{
438+ name,
439+ std::ref (prop.value )
440+ }
441+ );
442+ }
427443 }
428444
429445 for (auto & [index, propInfo] : sortedProperties)
0 commit comments