Terrain Macro Material component improvements (#4930)

* First pass of non-working changes to Terrain Macro Material Component.

Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com>

* Reworked Terrain Macro Material to use properties instead of a material.

Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com>

* Fixed comments.

Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com>

* PR feedback - disable attributes when no normal map selected

Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com>

* Fix linux compile error - unused variables.

Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com>
This commit is contained in:
Mike Balfour
2021-10-25 11:37:32 -05:00
committed by GitHub
parent e970247fc5
commit 91ca986e2a
8 changed files with 141 additions and 282 deletions
@@ -51,13 +51,6 @@ namespace Terrain
{
// Terrain material
static const char* const HeightmapImage("settings.heightmapImage");
// Macro material
static const char* const MacroColorTextureMap("baseColor.textureMap");
static const char* const MacroNormalTextureMap("normal.textureMap");
static const char* const MacroNormalFlipX("normal.flipX");
static const char* const MacroNormalFlipY("normal.flipY");
static const char* const MacroNormalFactor("normal.factor");
}
namespace ShaderInputs
@@ -185,12 +178,11 @@ namespace Terrain
m_areaData.m_heightmapUpdated = true;
}
void TerrainFeatureProcessor::OnTerrainMacroMaterialCreated(AZ::EntityId entityId, MaterialInstance material, const AZ::Aabb& region)
void TerrainFeatureProcessor::OnTerrainMacroMaterialCreated(AZ::EntityId entityId, const MacroMaterialData& newMaterialData)
{
MacroMaterialData& materialData = FindOrCreateMacroMaterial(entityId);
materialData.m_bounds = region;
UpdateMacroMaterialData(materialData, material);
UpdateMacroMaterialData(materialData, newMaterialData);
// Update all sectors in region.
ForOverlappingSectors(materialData.m_bounds,
@@ -203,20 +195,14 @@ namespace Terrain
);
}
void TerrainFeatureProcessor::OnTerrainMacroMaterialChanged(AZ::EntityId entityId, MaterialInstance macroMaterial)
void TerrainFeatureProcessor::OnTerrainMacroMaterialChanged(AZ::EntityId entityId, const MacroMaterialData& newMaterialData)
{
if (macroMaterial)
{
MacroMaterialData& data = FindOrCreateMacroMaterial(entityId);
UpdateMacroMaterialData(data, macroMaterial);
}
else
{
RemoveMacroMaterial(entityId);
}
MacroMaterialData& data = FindOrCreateMacroMaterial(entityId);
UpdateMacroMaterialData(data, newMaterialData);
}
void TerrainFeatureProcessor::OnTerrainMacroMaterialRegionChanged(AZ::EntityId entityId, [[maybe_unused]] const AZ::Aabb& oldRegion, const AZ::Aabb& newRegion)
void TerrainFeatureProcessor::OnTerrainMacroMaterialRegionChanged(
AZ::EntityId entityId, [[maybe_unused]] const AZ::Aabb& oldRegion, const AZ::Aabb& newRegion)
{
MacroMaterialData& materialData = FindOrCreateMacroMaterial(entityId);
for (SectorData& sectorData : m_sectorData)
@@ -269,6 +255,7 @@ namespace Terrain
}
m_areaData.m_macroMaterialsUpdated = true;
RemoveMacroMaterial(entityId);
}
void TerrainFeatureProcessor::UpdateTerrainData()
@@ -382,42 +369,18 @@ namespace Terrain
TerrainMacroMaterialRequestBus::EnumerateHandlers(
[&](TerrainMacroMaterialRequests* handler)
{
MaterialInstance macroMaterial;
AZ::Aabb bounds;
handler->GetTerrainMacroMaterialData(macroMaterial, bounds);
MacroMaterialData macroMaterial = handler->GetTerrainMacroMaterialData();
AZ::EntityId entityId = *(Terrain::TerrainMacroMaterialRequestBus::GetCurrentBusId());
OnTerrainMacroMaterialCreated(entityId, macroMaterial, bounds);
OnTerrainMacroMaterialCreated(entityId, macroMaterial);
return true;
}
);
TerrainMacroMaterialNotificationBus::Handler::BusConnect();
}
void TerrainFeatureProcessor::UpdateMacroMaterialData(MacroMaterialData& macroMaterialData, MaterialInstance material)
void TerrainFeatureProcessor::UpdateMacroMaterialData(MacroMaterialData& macroMaterialData, const MacroMaterialData& newMaterialData)
{
// Since we're using an actual macro material instance for now, get the values from it that we care about.
const auto materialLayout = material->GetMaterialPropertiesLayout();
const AZ::RPI::MaterialPropertyIndex macroColorTextureMapIndex = materialLayout->FindPropertyIndex(AZ::Name(MaterialInputs::MacroColorTextureMap));
AZ_Error(TerrainFPName, macroColorTextureMapIndex.IsValid(), "Failed to find shader input constant %s.", MaterialInputs::MacroColorTextureMap);
const AZ::RPI::MaterialPropertyIndex macroNormalTextureMapIndex = materialLayout->FindPropertyIndex(AZ::Name(MaterialInputs::MacroNormalTextureMap));
AZ_Error(TerrainFPName, macroNormalTextureMapIndex.IsValid(), "Failed to find shader input constant %s.", MaterialInputs::MacroNormalTextureMap);
const AZ::RPI::MaterialPropertyIndex macroNormalFlipXIndex = materialLayout->FindPropertyIndex(AZ::Name(MaterialInputs::MacroNormalFlipX));
AZ_Error(TerrainFPName, macroNormalFlipXIndex.IsValid(), "Failed to find shader input constant %s.", MaterialInputs::MacroNormalFlipX);
const AZ::RPI::MaterialPropertyIndex macroNormalFlipYIndex = materialLayout->FindPropertyIndex(AZ::Name(MaterialInputs::MacroNormalFlipY));
AZ_Error(TerrainFPName, macroNormalFlipYIndex.IsValid(), "Failed to find shader input constant %s.", MaterialInputs::MacroNormalFlipY);
const AZ::RPI::MaterialPropertyIndex macroNormalFactorIndex = materialLayout->FindPropertyIndex(AZ::Name(MaterialInputs::MacroNormalFactor));
AZ_Error(TerrainFPName, macroNormalFactorIndex.IsValid(), "Failed to find shader input constant %s.", MaterialInputs::MacroNormalFactor);
macroMaterialData.m_colorImage = material->GetPropertyValue(macroColorTextureMapIndex).GetValue<AZ::Data::Instance<AZ::RPI::Image>>();
macroMaterialData.m_normalImage = material->GetPropertyValue(macroNormalTextureMapIndex).GetValue<AZ::Data::Instance<AZ::RPI::Image>>();
macroMaterialData.m_normalFlipX = material->GetPropertyValue(macroNormalFlipXIndex).GetValue<bool>();
macroMaterialData.m_normalFlipY = material->GetPropertyValue(macroNormalFlipYIndex).GetValue<bool>();
macroMaterialData.m_normalFactor = material->GetPropertyValue(macroNormalFactorIndex).GetValue<float>();
macroMaterialData = newMaterialData;
if (macroMaterialData.m_bounds.IsValid())
{
@@ -783,7 +746,7 @@ namespace Terrain
// larger but this will limit how much is rendered.
}
TerrainFeatureProcessor::MacroMaterialData* TerrainFeatureProcessor::FindMacroMaterial(AZ::EntityId entityId)
MacroMaterialData* TerrainFeatureProcessor::FindMacroMaterial(AZ::EntityId entityId)
{
for (MacroMaterialData& data : m_macroMaterials.GetDataVector())
{
@@ -795,7 +758,7 @@ namespace Terrain
return nullptr;
}
TerrainFeatureProcessor::MacroMaterialData& TerrainFeatureProcessor::FindOrCreateMacroMaterial(AZ::EntityId entityId)
MacroMaterialData& TerrainFeatureProcessor::FindOrCreateMacroMaterial(AZ::EntityId entityId)
{
MacroMaterialData* dataPtr = FindMacroMaterial(entityId);
if (dataPtr != nullptr)