e8b7bba0f2
* Adding support for blending the terain detail material with the macro material. Also includes several bug fixes - The detail materail manager wasn't querying for default terrain region materials when it initializes, so it was missing some creation events that it would later get destruction events for and explode. - Change the way the default material weights against other surface weights to avoid some discontinuities - Fixed an issue where a default material id wouldn't initialize as invalid. Signed-off-by: Ken Pruiksma <pruiksma@amazon.com> * Several improvements and bug fixes - Adding explicit creation / destruction events for material regions. - Material regions will no longer try to "hide" when they don't have any materials - Default detail materials will now only be used in areas where there are no other material assignments - Fixed a bug where materials might not show up on surfaces when they were assigned to multiple regions or surface tags. Signed-off-by: Ken Pruiksma <pruiksma@amazon.com> * Simplified loop that assigns materials based on surface tags. Slightly simplified shader code regarding detail material id coordinates. Signed-off-by: Ken Pruiksma <pruiksma@amazon.com> * Fixes from PR review Signed-off-by: Ken Pruiksma <pruiksma@amazon.com> * Making sure region changed doesn't get announced in the case where the old and new regions are both invalid. Signed-off-by: Ken Pruiksma <pruiksma@amazon.com>
116 lines
4.7 KiB
C++
116 lines
4.7 KiB
C++
/*
|
|
* Copyright (c) Contributors to the Open 3D Engine Project.
|
|
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
|
*
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AzCore/Asset/AssetCommon.h>
|
|
#include <AzCore/Component/Component.h>
|
|
#include <AzCore/Serialization/EditContext.h>
|
|
|
|
#include <Atom/Feature/Material/MaterialAssignment.h>
|
|
#include <Atom/RPI.Reflect/Material/MaterialAsset.h>
|
|
|
|
#include <LmbrCentral/Shape/ShapeComponentBus.h>
|
|
|
|
#include <SurfaceData/SurfaceDataTypes.h>
|
|
#include <TerrainRenderer/TerrainAreaMaterialRequestBus.h>
|
|
|
|
namespace LmbrCentral
|
|
{
|
|
template<typename, typename>
|
|
class EditorWrappedComponentBase;
|
|
}
|
|
|
|
namespace Terrain
|
|
{
|
|
struct TerrainSurfaceMaterialMapping final
|
|
{
|
|
AZ_CLASS_ALLOCATOR(TerrainSurfaceMaterialMapping, AZ::SystemAllocator, 0);
|
|
AZ_RTTI(TerrainSurfaceMaterialMapping, "{37D2A586-CDDD-4FB7-A7D6-0B4CC575AB8C}");
|
|
static void Reflect(AZ::ReflectContext* context);
|
|
|
|
AZ::Data::Asset<AZ::RPI::MaterialAsset> m_materialAsset;
|
|
AZ::Data::Instance<AZ::RPI::Material> m_materialInstance;
|
|
|
|
AZ::Data::AssetId m_activeMaterialAssetId;
|
|
AZ::RPI::Material::ChangeId m_previousChangeId = AZ::RPI::Material::DEFAULT_CHANGE_ID;
|
|
|
|
// Surface tags not used by default material
|
|
SurfaceData::SurfaceTag m_surfaceTag;
|
|
SurfaceData::SurfaceTag m_previousTag;
|
|
|
|
bool m_active = false;
|
|
};
|
|
|
|
class TerrainSurfaceMaterialsListConfig : public AZ::ComponentConfig
|
|
{
|
|
public:
|
|
AZ_CLASS_ALLOCATOR(TerrainSurfaceMaterialsListConfig, AZ::SystemAllocator, 0);
|
|
AZ_RTTI(TerrainSurfaceMaterialsListConfig, "{68A1CB1B-C835-4C3A-8D1C-08692E07711A}", AZ::ComponentConfig);
|
|
static void Reflect(AZ::ReflectContext* context);
|
|
|
|
TerrainSurfaceMaterialsListConfig();
|
|
|
|
TerrainSurfaceMaterialMapping m_defaultSurfaceMaterial;
|
|
AZStd::vector<TerrainSurfaceMaterialMapping> m_surfaceMaterials;
|
|
private:
|
|
static const AZ::Edit::ElementData* GetDynamicData(const void* handlerPtr, const void* elementPtr, const AZ::Uuid& elementType);
|
|
AZ::Edit::ElementData m_hideSurfaceTagData;
|
|
};
|
|
|
|
class TerrainSurfaceMaterialsListComponent
|
|
: public AZ::Component
|
|
, private TerrainAreaMaterialRequestBus::Handler
|
|
, private AZ::Data::AssetBus::MultiHandler
|
|
, private LmbrCentral::ShapeComponentNotificationsBus::Handler
|
|
{
|
|
public:
|
|
template<typename, typename>
|
|
friend class LmbrCentral::EditorWrappedComponentBase;
|
|
AZ_COMPONENT(TerrainSurfaceMaterialsListComponent, "{93CF3938-FBC3-4E55-B825-27BA94A5CD35}");
|
|
static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& services);
|
|
static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& services);
|
|
static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& services);
|
|
static void Reflect(AZ::ReflectContext* context);
|
|
|
|
TerrainSurfaceMaterialsListComponent(const TerrainSurfaceMaterialsListConfig& configuration);
|
|
TerrainSurfaceMaterialsListComponent() = default;
|
|
~TerrainSurfaceMaterialsListComponent() = default;
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// AZ::Component interface implementation
|
|
void Activate() override;
|
|
void Deactivate() override;
|
|
bool ReadInConfig(const AZ::ComponentConfig* baseConfig) override;
|
|
bool WriteOutConfig(AZ::ComponentConfig* outBaseConfig) const override;
|
|
|
|
private:
|
|
void HandleMaterialStateChanges();
|
|
int CountMaterialIdInstances(AZ::Data::AssetId id) const;
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
// ShapeComponentNotificationsBus
|
|
void OnShapeChanged(ShapeComponentNotifications::ShapeChangeReasons reasons) override;
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// TerrainAreaMaterialRequestBus
|
|
const AZ::Aabb& GetTerrainSurfaceMaterialRegion() const override;
|
|
const AZStd::vector<TerrainSurfaceMaterialMapping>& GetSurfaceMaterialMappings() const override;
|
|
const TerrainSurfaceMaterialMapping& GetDefaultMaterial() const override;
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// AZ::Data::AssetBus::Handler
|
|
void OnAssetReady(AZ::Data::Asset<AZ::Data::AssetData> asset) override;
|
|
void OnAssetReloaded(AZ::Data::Asset<AZ::Data::AssetData> asset) override;
|
|
|
|
TerrainSurfaceMaterialsListConfig m_configuration;
|
|
|
|
AZ::Aabb m_cachedAabb{ AZ::Aabb::CreateNull() };
|
|
};
|
|
} // namespace Terrain
|