Skip to content

Commit d1b4de9

Browse files
committed
Updated material properties to use std::variant
1 parent c6f3b5f commit d1b4de9

23 files changed

+429
-265
lines changed

Sources/Overload/OvCore/src/OvCore/Rendering/PostProcess/AutoExposureEffect.cpp

+10-10
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ void OvCore::Rendering::PostProcess::AutoExposureEffect::Draw(
5555

5656
// Luminance calculation
5757
m_luminanceBuffer.Resize(kLuminanceBufferResolution, kLuminanceBufferResolution);
58-
m_luminanceMaterial.Set("_CenterWeightBias", autoExposureSettings.centerWeightBias, true);
58+
m_luminanceMaterial.SetProperty("_CenterWeightBias", autoExposureSettings.centerWeightBias, true);
5959
m_renderer.Blit(p_pso, p_src, m_luminanceBuffer, m_luminanceMaterial,
6060
OvRendering::Settings::EBlitFlags::DEFAULT & ~OvRendering::Settings::EBlitFlags::RESIZE_DST_TO_MATCH_SRC);
6161
const auto luminanceTex = m_luminanceBuffer.GetAttachment<OvRendering::HAL::Texture>(OvRendering::Settings::EFramebufferAttachment::COLOR);
@@ -76,18 +76,18 @@ void OvCore::Rendering::PostProcess::AutoExposureEffect::Draw(
7676
m_exposurePingPongIndex = (m_exposurePingPongIndex + 1) % 2;
7777

7878
// Exposure adaptation
79-
m_exposureMaterial.Set("_LuminanceTexture", luminanceTex, true);
80-
m_exposureMaterial.Set("_MinLuminanceEV", autoExposureSettings.minLuminanceEV, true);
81-
m_exposureMaterial.Set("_MaxLuminanceEV", autoExposureSettings.maxLuminanceEV, true);
82-
m_exposureMaterial.Set("_ExposureCompensationEV", autoExposureSettings.exposureCompensationEV, true);
83-
m_exposureMaterial.Set("_ElapsedTime", elapsedTime, true);
84-
m_exposureMaterial.Set("_Progressive", static_cast<int>(autoExposureSettings.progressive), true);
85-
m_exposureMaterial.Set("_SpeedUp", autoExposureSettings.speedUp, true);
86-
m_exposureMaterial.Set("_SpeedDown", autoExposureSettings.speedDown, true);
79+
m_exposureMaterial.SetProperty("_LuminanceTexture", &luminanceTex.value(), true);
80+
m_exposureMaterial.SetProperty("_MinLuminanceEV", autoExposureSettings.minLuminanceEV, true);
81+
m_exposureMaterial.SetProperty("_MaxLuminanceEV", autoExposureSettings.maxLuminanceEV, true);
82+
m_exposureMaterial.SetProperty("_ExposureCompensationEV", autoExposureSettings.exposureCompensationEV, true);
83+
m_exposureMaterial.SetProperty("_ElapsedTime", elapsedTime, true);
84+
m_exposureMaterial.SetProperty("_Progressive", static_cast<int>(autoExposureSettings.progressive), true);
85+
m_exposureMaterial.SetProperty("_SpeedUp", autoExposureSettings.speedUp, true);
86+
m_exposureMaterial.SetProperty("_SpeedDown", autoExposureSettings.speedDown, true);
8787
m_renderer.Blit(p_pso, previousExposure, currentExposure, m_exposureMaterial);
8888

8989
// Apply the exposure to the final image
9090
const auto exposureTex = currentExposure.GetAttachment<OvRendering::HAL::Texture>(OvRendering::Settings::EFramebufferAttachment::COLOR);
91-
m_compensationMaterial.Set("_ExposureTexture", exposureTex, true);
91+
m_compensationMaterial.SetProperty("_ExposureTexture", &exposureTex.value(), true);
9292
m_renderer.Blit(p_pso, p_src, p_dst, m_compensationMaterial);
9393
}

Sources/Overload/OvCore/src/OvCore/Rendering/PostProcess/BloomEffect.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ void OvCore::Rendering::PostProcess::BloomEffect::Draw(
4949
const auto& bloomSettings = static_cast<const BloomSettings&>(p_settings);
5050

5151
// Step 1: Extract bright spots from the source
52-
m_brightnessMaterial.Set("_Threshold", bloomSettings.threshold, true);
52+
m_brightnessMaterial.SetProperty("_Threshold", bloomSettings.threshold, true);
5353
m_renderer.Blit(p_pso, p_src, m_bloomPingPong[0], m_brightnessMaterial);
5454

5555
// Step 2: Apply gaussian blur on bright spots (horizontal and vertical)
@@ -60,17 +60,17 @@ void OvCore::Rendering::PostProcess::BloomEffect::Draw(
6060
auto& currentSrc = horizontal ? m_bloomPingPong[0] : m_bloomPingPong[1];
6161
auto& currentDst = horizontal ? m_bloomPingPong[1] : m_bloomPingPong[0];
6262

63-
m_blurMaterial.Set("_Horizontal", horizontal ? true : false, true);
64-
m_blurMaterial.Set("_BlurSize", bloomSettings.radius, true);
65-
m_blurMaterial.Set("_KernelSize", bloomSettings.kernelSize, true);
63+
m_blurMaterial.SetProperty("_Horizontal", horizontal ? true : false, true);
64+
m_blurMaterial.SetProperty("_BlurSize", bloomSettings.radius, true);
65+
m_blurMaterial.SetProperty("_KernelSize", bloomSettings.kernelSize, true);
6666
m_renderer.Blit(p_pso, currentSrc, currentDst, m_blurMaterial);
6767

6868
horizontal = !horizontal;
6969
}
7070

7171
// Step 3: Combine bloom with original framebuffer
7272
const auto bloomTex = m_bloomPingPong[0].GetAttachment<OvRendering::HAL::Texture>(OvRendering::Settings::EFramebufferAttachment::COLOR);
73-
m_bloomMaterial.Set("_BloomTexture", bloomTex, true);
74-
m_bloomMaterial.Set("_BloomIntensity", bloomSettings.intensity, true);
73+
m_bloomMaterial.SetProperty("_BloomTexture", &bloomTex.value(), true);
74+
m_bloomMaterial.SetProperty("_BloomIntensity", bloomSettings.intensity, true);
7575
m_renderer.Blit(p_pso, p_src, p_dst, m_bloomMaterial);
7676
}

Sources/Overload/OvCore/src/OvCore/Rendering/PostProcess/TonemappingEffect.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ void OvCore::Rendering::PostProcess::TonemappingEffect::Draw(
2323
const auto& tonemappingSettings = static_cast<const TonemappingSettings&>(p_settings);
2424

2525
// Tonemapping
26-
m_tonemappingMaterial.Set("_Exposure", tonemappingSettings.exposure, true);
27-
m_tonemappingMaterial.Set("_Mode", static_cast<int>(tonemappingSettings.mode), true);
28-
m_tonemappingMaterial.Set("_GammaCorrection", static_cast<int>(tonemappingSettings.gammaCorrection), true);
26+
m_tonemappingMaterial.SetProperty("_Exposure", tonemappingSettings.exposure, true);
27+
m_tonemappingMaterial.SetProperty("_Mode", static_cast<int>(tonemappingSettings.mode), true);
28+
m_tonemappingMaterial.SetProperty("_GammaCorrection", static_cast<int>(tonemappingSettings.gammaCorrection), true);
2929
m_renderer.Blit(p_pso, p_src, p_dst, m_tonemappingMaterial);
3030
}

Sources/Overload/OvCore/src/OvCore/Rendering/ShadowRenderFeature.cpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,12 @@
44
* @licence: MIT
55
*/
66

7+
78
#include <OvCore/ECS/Components/CMaterialRenderer.h>
89
#include <OvCore/Rendering/ShadowRenderFeature.h>
10+
11+
#include <OvDebug/Logger.h>
12+
913
#include <OvRendering/Features/LightingRenderFeature.h>
1014

1115
constexpr uint8_t kMaxShadowMaps = 1;
@@ -38,8 +42,8 @@ void OvCore::Rendering::ShadowRenderFeature::OnBeforeDraw(OvRendering::Data::Pip
3842
if (light.type == OvRendering::Settings::ELightType::DIRECTIONAL)
3943
{
4044
const auto shadowTex = light.GetShadowBuffer().GetAttachment<OvRendering::HAL::Texture>(OvRendering::Settings::EFramebufferAttachment::DEPTH);
41-
material.Set("_ShadowMap", shadowTex, true); // Single use material property
42-
material.Set("_LightSpaceMatrix", light.GetLightSpaceMatrix());
45+
material.SetProperty("_ShadowMap", &shadowTex.value(), true); // Single use material property
46+
material.SetProperty("_LightSpaceMatrix", light.GetLightSpaceMatrix());
4347
++lightIndex;
4448
}
4549
}

Sources/Overload/OvCore/src/OvCore/Rendering/ShadowRenderPass.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ void OvCore::Rendering::ShadowRenderPass::Draw(OvRendering::Data::PipelineState
5858
light.UpdateShadowData(frameDescriptor.camera.value());
5959
const auto& lightSpaceMatrix = light.GetLightSpaceMatrix();
6060
const auto& shadowBuffer = light.GetShadowBuffer();
61-
m_shadowMaterial.Set("_LightSpaceMatrix", lightSpaceMatrix);
61+
m_shadowMaterial.SetProperty("_LightSpaceMatrix", lightSpaceMatrix);
6262
shadowBuffer.Bind();
6363
m_renderer.SetViewport(0, 0, light.shadowMapResolution, light.shadowMapResolution);
6464
m_renderer.Clear(true, true, true);
@@ -108,7 +108,7 @@ void OvCore::Rendering::ShadowRenderPass::DrawOpaques(
108108
drawable.material = m_shadowMaterial;
109109
drawable.stateMask = m_shadowMaterial.GenerateStateMask();
110110

111-
drawable.material.value().Set("_ModelMatrix", modelMatrix);
111+
drawable.material.value().SetProperty("_ModelMatrix", modelMatrix);
112112

113113
m_renderer.DrawEntity(p_pso, drawable);
114114
}

Sources/Overload/OvCore/src/OvCore/Resources/Loaders/MaterialLoader.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
* @licence: MIT
55
*/
66

7-
#include "OvCore/Resources/Loaders/MaterialLoader.h"
7+
#include <OvCore/Resources/Loaders/MaterialLoader.h>
8+
9+
#include <OvDebug/Logger.h>
810

911
OvCore::Resources::Material * OvCore::Resources::Loaders::MaterialLoader::Create(const std::string & p_path)
1012
{

Sources/Overload/OvCore/src/OvCore/Resources/Material.cpp

+70-66
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* @licence: MIT
55
*/
66

7-
#include "OvCore/Resources/Material.h"
7+
#include <OvCore/Resources/Material.h>
88

99
void OvCore::Resources::Material::OnSerialize(tinyxml2::XMLDocument & p_doc, tinyxml2::XMLNode * p_node)
1010
{
@@ -33,49 +33,75 @@ void OvCore::Resources::Material::OnSerialize(tinyxml2::XMLDocument & p_doc, tin
3333
tinyxml2::XMLNode* uniformsNode = p_doc.NewElement("uniforms");
3434
p_node->InsertEndChild(uniformsNode);
3535

36-
for (const auto&[name, prop] : m_properties)
36+
for (const auto& [name, prop] : m_properties)
3737
{
3838
auto& value = prop.value;
39-
4039
tinyxml2::XMLNode* uniform = p_doc.NewElement("uniform");
41-
uniformsNode->InsertEndChild(uniform); // Instead of p_node, use uniformNode (To create)
40+
uniformsNode->InsertEndChild(uniform);
4241

4342
const auto uniformInfo = m_shader->GetProgram().GetUniformInfo(name);
44-
4543
Serializer::SerializeString(p_doc, uniform, "name", name);
4644

47-
if (uniformInfo && value.has_value())
45+
if (uniformInfo && !std::holds_alternative<std::monostate>(value))
4846
{
49-
switch (uniformInfo->type)
50-
{
51-
case EUniformType::BOOL:
52-
if (value.type() == typeid(bool)) Serializer::SerializeInt(p_doc, uniform, "value", std::any_cast<bool>(value));
53-
break;
54-
55-
case EUniformType::INT:
56-
if (value.type() == typeid(int)) Serializer::SerializeInt(p_doc, uniform, "value", std::any_cast<int>(value));
57-
break;
58-
59-
case EUniformType::FLOAT:
60-
if (value.type() == typeid(float)) Serializer::SerializeFloat(p_doc, uniform, "value", std::any_cast<float>(value));
61-
break;
62-
63-
case EUniformType::FLOAT_VEC2:
64-
if (value.type() == typeid(FVector2)) Serializer::SerializeVec2(p_doc, uniform, "value", std::any_cast<FVector2>(value));
65-
break;
47+
auto visitor = [&](auto&& arg) {
48+
using T = std::decay_t<decltype(arg)>;
49+
using enum EUniformType;
50+
const auto type = uniformInfo->type;
6651

67-
case EUniformType::FLOAT_VEC3:
68-
if (value.type() == typeid(FVector3)) Serializer::SerializeVec3(p_doc, uniform, "value", std::any_cast<FVector3>(value));
69-
break;
70-
71-
case EUniformType::FLOAT_VEC4:
72-
if (value.type() == typeid(FVector4)) Serializer::SerializeVec4(p_doc, uniform, "value", std::any_cast<FVector4>(value));
73-
break;
52+
if constexpr (std::same_as<T, bool>)
53+
{
54+
if (type == BOOL)
55+
{
56+
Serializer::SerializeInt(p_doc, uniform, "value", arg);
57+
}
58+
}
59+
else if constexpr (std::same_as<T, int>)
60+
{
61+
if (type == INT)
62+
{
63+
Serializer::SerializeInt(p_doc, uniform, "value", arg);
64+
}
65+
}
66+
else if constexpr (std::same_as<T, float>)
67+
{
68+
if (type == FLOAT)
69+
{
70+
Serializer::SerializeFloat(p_doc, uniform, "value", arg);
71+
}
72+
}
73+
else if constexpr (std::same_as<T, FVector2>)
74+
{
75+
if (type == FLOAT_VEC2)
76+
{
77+
Serializer::SerializeVec2(p_doc, uniform, "value", arg);
78+
}
79+
}
80+
else if constexpr (std::same_as<T, FVector3>)
81+
{
82+
if (type == FLOAT_VEC3)
83+
{
84+
Serializer::SerializeVec3(p_doc, uniform, "value", arg);
85+
}
86+
}
87+
else if constexpr (std::same_as<T, FVector4>)
88+
{
89+
if (type == FLOAT_VEC4)
90+
{
91+
Serializer::SerializeVec4(p_doc, uniform, "value", arg);
92+
}
93+
}
94+
else if constexpr (std::same_as<T, OvRendering::Resources::Texture*>)
95+
{
96+
if (type == SAMPLER_2D)
97+
{
98+
Serializer::SerializeTexture(p_doc, uniform, "value", arg);
99+
}
100+
}
101+
// No need to handle TextureHandle* here as it's not serializable (only texture assets are)
102+
};
74103

75-
case EUniformType::SAMPLER_2D:
76-
if (value.type() == typeid(Texture*)) Serializer::SerializeTexture(p_doc, uniform, "value", std::any_cast<Texture*>(value));
77-
break;
78-
}
104+
std::visit(visitor, value);
79105
}
80106
}
81107
}
@@ -130,41 +156,19 @@ void OvCore::Resources::Material::OnDeserialize(tinyxml2::XMLDocument & p_doc, t
130156
/* Deserialization of the uniform value depending on the uniform type (Deserialization result to std::any) */
131157
switch (uniformInfo->type)
132158
{
133-
case OvRendering::Settings::EUniformType::BOOL:
134-
m_properties[uniformInfo->name] = OvCore::Helpers::Serializer::DeserializeBoolean(p_doc, uniform, "value");
135-
break;
136-
137-
case OvRendering::Settings::EUniformType::INT:
138-
m_properties[uniformInfo->name] = OvCore::Helpers::Serializer::DeserializeInt(p_doc, uniform, "value");
139-
break;
140-
141-
case OvRendering::Settings::EUniformType::FLOAT:
142-
m_properties[uniformInfo->name] = OvCore::Helpers::Serializer::DeserializeFloat(p_doc, uniform, "value");
143-
break;
144-
145-
case OvRendering::Settings::EUniformType::FLOAT_VEC2:
146-
m_properties[uniformInfo->name] = OvCore::Helpers::Serializer::DeserializeVec2(p_doc, uniform, "value");
147-
break;
148-
149-
case OvRendering::Settings::EUniformType::FLOAT_VEC3:
150-
m_properties[uniformInfo->name] = OvCore::Helpers::Serializer::DeserializeVec3(p_doc, uniform, "value");
151-
break;
152-
153-
case OvRendering::Settings::EUniformType::FLOAT_VEC4:
154-
m_properties[uniformInfo->name] = OvCore::Helpers::Serializer::DeserializeVec4(p_doc, uniform, "value");
155-
break;
156-
157-
case OvRendering::Settings::EUniformType::FLOAT_MAT4:
158-
m_properties[uniformInfo->name] = OvCore::Helpers::Serializer::DeserializeMat4(p_doc, uniform, "value");
159-
break;
160-
161-
case OvRendering::Settings::EUniformType::SAMPLER_2D:
162-
m_properties[uniformInfo->name] = OvCore::Helpers::Serializer::DeserializeTexture(p_doc, uniform, "value");
163-
break;
159+
using enum OvRendering::Settings::EUniformType;
160+
case BOOL: SetProperty(uniformInfo->name, Serializer::DeserializeBoolean(p_doc, uniform, "value")); break;
161+
case INT: SetProperty(uniformInfo->name, Serializer::DeserializeInt(p_doc, uniform, "value")); break;
162+
case FLOAT: SetProperty(uniformInfo->name, Serializer::DeserializeFloat(p_doc, uniform, "value")); break;
163+
case FLOAT_VEC2: SetProperty(uniformInfo->name, Serializer::DeserializeVec2(p_doc, uniform, "value")); break;
164+
case FLOAT_VEC3: SetProperty(uniformInfo->name, Serializer::DeserializeVec3(p_doc, uniform, "value")); break;
165+
case FLOAT_VEC4: SetProperty(uniformInfo->name, Serializer::DeserializeVec4(p_doc, uniform, "value")); break;
166+
case FLOAT_MAT4: SetProperty(uniformInfo->name, Serializer::DeserializeMat4(p_doc, uniform, "value")); break;
167+
case SAMPLER_2D: SetProperty(uniformInfo->name, Serializer::DeserializeTexture(p_doc, uniform, "value")); break;
164168
}
165169
}
166170
}
167171
}
168172
}
169173
}
170-
}
174+
}

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

+14-4
Original file line numberDiff line numberDiff line change
@@ -849,12 +849,22 @@ void OvEditor::Core::EditorActions::PropagateFileRename(std::string p_previousNa
849849
{
850850
if (auto texture = OvCore::Global::ServiceLocator::Get<OvCore::ResourceManagement::TextureManager>().GetResource(p_previousName, false))
851851
{
852-
for (auto[name, instance] : OvCore::Global::ServiceLocator::Get<OvCore::ResourceManagement::MaterialManager>().GetResources())
852+
for (auto [name, instance] : OvCore::Global::ServiceLocator::Get<OvCore::ResourceManagement::MaterialManager>().GetResources())
853+
{
853854
if (instance)
854-
for (auto&[name, prop] : instance->GetProperties())
855-
if (prop.value.has_value() && prop.value.type() == typeid(OvRendering::Resources::Texture*))
856-
if (std::any_cast<OvRendering::Resources::Texture*>(prop.value) == texture)
855+
{
856+
for (auto& [name, prop] : instance->GetProperties())
857+
{
858+
if (const auto pval = std::get_if<OvRendering::Resources::Texture*>(&prop.value); pval && *pval)
859+
{
860+
if (*pval == texture)
861+
{
857862
prop.value = static_cast<OvRendering::Resources::Texture*>(nullptr);
863+
}
864+
}
865+
}
866+
}
867+
}
858868

859869
auto& assetView = EDITOR_PANEL(Panels::AssetView, "Asset View");
860870
auto assetViewRes = assetView.GetResource();

Sources/Overload/OvEditor/src/OvEditor/Panels/AssetView.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -51,16 +51,16 @@ OvEditor::Panels::AssetView::AssetView
5151

5252
/* Default Material */
5353
m_defaultMaterial.SetShader(EDITOR_CONTEXT(shaderManager)[":Shaders\\Standard.ovfx"]);
54-
m_defaultMaterial.Set("u_Diffuse", OvMaths::FVector4(1.f, 1.f, 1.f, 1.f));
55-
m_defaultMaterial.Set("u_Shininess", 100.0f);
56-
m_defaultMaterial.Set<OvRendering::Resources::Texture*>("u_DiffuseMap", nullptr);
54+
m_defaultMaterial.SetProperty("u_Diffuse", OvMaths::FVector4(1.f, 1.f, 1.f, 1.f));
55+
m_defaultMaterial.SetProperty("u_Shininess", 100.0f);
56+
m_defaultMaterial.SetProperty("u_DiffuseMap", static_cast<OvRendering::Resources::Texture*>(nullptr));
5757

5858
/* Texture Material */
5959
m_textureMaterial.SetShader(EDITOR_CONTEXT(shaderManager)[":Shaders\\Unlit.ovfx"]);
60-
m_textureMaterial.Set("u_Diffuse", OvMaths::FVector4(1.f, 1.f, 1.f, 1.f));
60+
m_textureMaterial.SetProperty("u_Diffuse", OvMaths::FVector4(1.f, 1.f, 1.f, 1.f));
6161
m_textureMaterial.SetBackfaceCulling(false);
6262
m_textureMaterial.SetBlendable(true);
63-
m_textureMaterial.Set<OvRendering::Resources::Texture*>("u_DiffuseMap", nullptr);
63+
m_textureMaterial.SetProperty("u_DiffuseMap", static_cast<OvRendering::Resources::Texture*>(nullptr));
6464

6565
m_image->AddPlugin<OvUI::Plugins::DDTarget<std::pair<std::string, OvUI::Widgets::Layout::Group*>>>("File").DataReceivedEvent += [this](auto p_data)
6666
{
@@ -118,7 +118,7 @@ void OvEditor::Panels::AssetView::SetTexture(OvRendering::Resources::Texture& p_
118118
m_assetActor->transform.SetLocalRotation(OvMaths::FQuaternion({ -90.0f, 0.0f, 0.0f }));
119119
m_assetActor->transform.SetLocalScale(OvMaths::FVector3::One * 3.0f);
120120
m_modelRenderer->SetModel(EDITOR_CONTEXT(editorResources)->GetModel("Plane"));
121-
m_textureMaterial.Set<OvRendering::Resources::Texture*>("u_DiffuseMap", &p_texture);
121+
m_textureMaterial.SetProperty("u_DiffuseMap", &p_texture);
122122
m_materialRenderer->FillWithMaterial(m_textureMaterial);
123123

124124
m_cameraController.MoveToTarget(*m_assetActor);

0 commit comments

Comments
 (0)