Added DiffuseProbeGrid Visualization passes, shaders, and editor controls.

Changed the DiffuseGI passes to override IsEnabled() instead of exiting early from FrameBeginInternal.

Signed-off-by: dmcdiarmid-ly <63674186+dmcdiarmid-ly@users.noreply.github.com>
This commit is contained in:
dmcdiarmid-ly
2022-01-29 19:37:46 -07:00
parent 117cb11505
commit 5f7a30f8da
80 changed files with 2185 additions and 155 deletions
@@ -20,5 +20,6 @@ namespace AZ
static constexpr float DefaultDiffuseProbeGridViewBias = 0.2f;
static constexpr float DefaultDiffuseProbeGridNormalBias = 0.1f;
static constexpr DiffuseProbeGridNumRaysPerProbe DefaultDiffuseProbeGridNumRaysPerProbe = DiffuseProbeGridNumRaysPerProbe::NumRaysPerProbe_288;
static constexpr float DefaultVisualizationSphereRadius = 0.5f;
} // namespace Render
} // namespace AZ
@@ -34,7 +34,7 @@ namespace AZ
if (auto* serializeContext = azrtti_cast<SerializeContext*>(context))
{
serializeContext->Class<DiffuseProbeGridComponentConfig>()
->Version(2) // Added NumRaysPerProbe setting
->Version(3) // Added probe visualization
->Field("ProbeSpacing", &DiffuseProbeGridComponentConfig::m_probeSpacing)
->Field("Extents", &DiffuseProbeGridComponentConfig::m_extents)
->Field("AmbientMultiplier", &DiffuseProbeGridComponentConfig::m_ambientMultiplier)
@@ -49,6 +49,9 @@ namespace AZ
->Field("BakedIrradianceTextureAsset", &DiffuseProbeGridComponentConfig::m_bakedIrradianceTextureAsset)
->Field("BakedDistanceTextureAsset", &DiffuseProbeGridComponentConfig::m_bakedDistanceTextureAsset)
->Field("BakedProbeDataTextureAsset", &DiffuseProbeGridComponentConfig::m_bakedProbeDataTextureAsset)
->Field("VisualizationEnabled", &DiffuseProbeGridComponentConfig::m_visualizationEnabled)
->Field("VisualizationShowInactiveProbes", &DiffuseProbeGridComponentConfig::m_visualizationShowInactiveProbes)
->Field("VisualizationSphereRadius", &DiffuseProbeGridComponentConfig::m_visualizationSphereRadius)
;
}
}
@@ -140,6 +143,9 @@ namespace AZ
m_featureProcessor->SetViewBias(m_handle, m_configuration.m_viewBias);
m_featureProcessor->SetNormalBias(m_handle, m_configuration.m_normalBias);
m_featureProcessor->SetNumRaysPerProbe(m_handle, m_configuration.m_numRaysPerProbe);
m_featureProcessor->SetVisualizationEnabled(m_handle, m_configuration.m_visualizationEnabled);
m_featureProcessor->SetVisualizationShowInactiveProbes(m_handle, m_configuration.m_visualizationShowInactiveProbes);
m_featureProcessor->SetVisualizationSphereRadius(m_handle, m_configuration.m_visualizationSphereRadius);
// load the baked texture assets, but only if they are all valid
if (m_configuration.m_bakedIrradianceTextureAsset.GetId().IsValid() &&
@@ -356,6 +362,39 @@ namespace AZ
m_configuration.m_runtimeMode = runtimeMode;
}
void DiffuseProbeGridComponentController::SetVisualizationEnabled(bool visualizationEnabled)
{
if (!m_featureProcessor)
{
return;
}
m_configuration.m_visualizationEnabled = visualizationEnabled;
m_featureProcessor->SetVisualizationEnabled(m_handle, m_configuration.m_visualizationEnabled);
}
void DiffuseProbeGridComponentController::SetVisualizationShowInactiveProbes(bool visualizationShowInactiveProbes)
{
if (!m_featureProcessor)
{
return;
}
m_configuration.m_visualizationShowInactiveProbes = visualizationShowInactiveProbes;
m_featureProcessor->SetVisualizationShowInactiveProbes(m_handle, m_configuration.m_visualizationShowInactiveProbes);
}
void DiffuseProbeGridComponentController::SetVisualizationSphereRadius(float visualizationSphereRadius)
{
if (!m_featureProcessor)
{
return;
}
m_configuration.m_visualizationSphereRadius = visualizationSphereRadius;
m_featureProcessor->SetVisualizationSphereRadius(m_handle, m_configuration.m_visualizationSphereRadius);
}
void DiffuseProbeGridComponentController::BakeTextures(DiffuseProbeGridBakeTexturesCallback callback)
{
if (!m_featureProcessor)
@@ -48,6 +48,10 @@ namespace AZ
Data::Asset<RPI::StreamingImageAsset> m_bakedDistanceTextureAsset;
Data::Asset<RPI::StreamingImageAsset> m_bakedProbeDataTextureAsset;
bool m_visualizationEnabled = false;
bool m_visualizationShowInactiveProbes = false;
float m_visualizationSphereRadius = DefaultVisualizationSphereRadius;
AZ::u64 m_entityId{ EntityId::InvalidEntityId };
};
@@ -102,6 +106,9 @@ namespace AZ
void SetNumRaysPerProbe(const DiffuseProbeGridNumRaysPerProbe& numRaysPerProbe);
void SetEditorMode(DiffuseProbeGridMode editorMode);
void SetRuntimeMode(DiffuseProbeGridMode runtimeMode);
void SetVisualizationEnabled(bool visualizationEnabled);
void SetVisualizationShowInactiveProbes(bool visualizationShowInactiveProbes);
void SetVisualizationSphereRadius(float visualizationSphereRadius);
// Bake the diffuse probe grid textures to assets
void BakeTextures(DiffuseProbeGridBakeTexturesCallback callback);
@@ -43,6 +43,9 @@ namespace AZ
->Field("numRaysPerProbe", &EditorDiffuseProbeGridComponent::m_numRaysPerProbe)
->Field("editorMode", &EditorDiffuseProbeGridComponent::m_editorMode)
->Field("runtimeMode", &EditorDiffuseProbeGridComponent::m_runtimeMode)
->Field("showVisualization", &EditorDiffuseProbeGridComponent::m_showVisualization)
->Field("showInactiveProbes", &EditorDiffuseProbeGridComponent::m_showInactiveProbes)
->Field("visualizationSphereRadius", &EditorDiffuseProbeGridComponent::m_visualizationSphereRadius)
;
if (AZ::EditContext* editContext = serializeContext->GetEditContext())
@@ -94,10 +97,22 @@ namespace AZ
->Attribute(Edit::Attributes::Step, 0.1f)
->Attribute(Edit::Attributes::Min, 0.0f)
->Attribute(Edit::Attributes::Max, 1.0f)
->DataElement(AZ::Edit::UIHandlers::ComboBox, &EditorDiffuseProbeGridComponent::m_numRaysPerProbe, "Number of Rays Per Probe", "Number of rays cast by each probe to detect lighting in its surroundings")
->DataElement(AZ::Edit::UIHandlers::ComboBox, &EditorDiffuseProbeGridComponent::m_numRaysPerProbe, "Number of Rays Per Probe", "Number of rays cast by each probe to detect lighting in its surroundings")
->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorDiffuseProbeGridComponent::OnNumRaysPerProbeChanged)
->Attribute(AZ::Edit::Attributes::EnumValues, &EditorDiffuseProbeGridComponent::GetNumRaysPerProbeEnumList)
->ClassElement(AZ::Edit::ClassElements::EditorData, "Grid mode")
->ClassElement(AZ::Edit::ClassElements::Group, "Visualization")
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
->DataElement(AZ::Edit::UIHandlers::CheckBox, &EditorDiffuseProbeGridComponent::m_showVisualization, "Show Visualization", "Show the probe grid visualization")
->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorDiffuseProbeGridComponent::OnShowVisualizationChanged)
->DataElement(AZ::Edit::UIHandlers::CheckBox, &EditorDiffuseProbeGridComponent::m_showInactiveProbes, "Show Inactive Probes", "Show inactive probes in the probe grid visualization")
->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorDiffuseProbeGridComponent::OnShowInactiveProbesChanged)
->DataElement(AZ::Edit::UIHandlers::Slider, &EditorDiffuseProbeGridComponent::m_visualizationSphereRadius, "Visualization Sphere Radius", "Radius of the spheres in the probe grid visualization")
->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorDiffuseProbeGridComponent::OnVisualizationSphereRadiusChanged)
->Attribute(Edit::Attributes::Decimals, 2)
->Attribute(Edit::Attributes::Step, 0.25f)
->Attribute(Edit::Attributes::Min, 0.25f)
->Attribute(Edit::Attributes::Max, 2.0f)
->ClassElement(AZ::Edit::ClassElements::Group, "Grid mode")
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
->DataElement(Edit::UIHandlers::ComboBox, &EditorDiffuseProbeGridComponent::m_editorMode, "Editor Mode", "Controls whether the editor uses RealTime or Baked diffuse GI. RealTime requires a ray-tracing capable GPU. Auto-Select will fallback to Baked if ray-tracing is not available")
->Attribute(AZ::Edit::Attributes::ChangeValidate, &EditorDiffuseProbeGridComponent::OnModeChangeValidate)
@@ -350,6 +365,24 @@ namespace AZ
return AZ::Edit::PropertyRefreshLevels::None;
}
AZ::u32 EditorDiffuseProbeGridComponent::OnShowVisualizationChanged()
{
m_controller.SetVisualizationEnabled(m_showVisualization);
return AZ::Edit::PropertyRefreshLevels::None;
}
AZ::u32 EditorDiffuseProbeGridComponent::OnShowInactiveProbesChanged()
{
m_controller.SetVisualizationShowInactiveProbes(m_showInactiveProbes);
return AZ::Edit::PropertyRefreshLevels::None;
}
AZ::u32 EditorDiffuseProbeGridComponent::OnVisualizationSphereRadiusChanged()
{
m_controller.SetVisualizationSphereRadius(m_visualizationSphereRadius);
return AZ::Edit::PropertyRefreshLevels::None;
}
AZ::Outcome<void, AZStd::string> EditorDiffuseProbeGridComponent::OnModeChangeValidate([[maybe_unused]] void* newValue, [[maybe_unused]] const AZ::Uuid& valueType)
{
DiffuseProbeGridMode newMode = (*(reinterpret_cast<DiffuseProbeGridMode*>(newValue)));
@@ -69,6 +69,9 @@ namespace AZ
AZ::u32 OnNumRaysPerProbeChanged();
AZ::u32 OnEditorModeChanged();
AZ::u32 OnRuntimeModeChanged();
AZ::u32 OnShowVisualizationChanged();
AZ::u32 OnShowInactiveProbesChanged();
AZ::u32 OnVisualizationSphereRadiusChanged();
AZ::Outcome<void, AZStd::string> OnModeChangeValidate(void* newValue, const AZ::Uuid& valueType);
// Button handler
@@ -85,6 +88,9 @@ namespace AZ
DiffuseProbeGridNumRaysPerProbe m_numRaysPerProbe = DefaultDiffuseProbeGridNumRaysPerProbe;
DiffuseProbeGridMode m_editorMode = DiffuseProbeGridMode::RealTime;
DiffuseProbeGridMode m_runtimeMode = DiffuseProbeGridMode::RealTime;
bool m_showVisualization = false;
bool m_showInactiveProbes = false;
float m_visualizationSphereRadius = DefaultVisualizationSphereRadius;
// flags
bool m_editorModeSet = false;