Merge remote-tracking branch 'upstream/stabilization/2110' into nvsickle/StabToDevNov21
Signed-off-by: Nicholas Van Sickle <nvsickle@amazon.com>
This commit is contained in:
@@ -608,7 +608,6 @@ namespace AWSClientAuthUnitTest
|
||||
AZ::Entity* FindEntity(const AZ::EntityId&) override { return nullptr; }
|
||||
AZ::BehaviorContext* GetBehaviorContext() override { return nullptr; }
|
||||
const char* GetExecutableFolder() const override { return nullptr; }
|
||||
const char* GetAppRoot() const override { return nullptr; }
|
||||
const char* GetEngineRoot() const override { return nullptr; }
|
||||
void EnumerateEntities(const EntityCallback& /*callback*/) override {}
|
||||
void QueryApplicationType(AZ::ApplicationTypeQuery& /*appType*/) const override {}
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
set(FILES
|
||||
Include/Public/AWSMetricsBus.h
|
||||
Include/Public/MetricsAttribute.h
|
||||
Include/Private/AWSMetricsConstant.h
|
||||
Include/Private/AWSMetricsServiceApi.h
|
||||
Include/Private/AWSMetricsSystemComponent.h
|
||||
@@ -15,7 +16,6 @@ set(FILES
|
||||
Include/Private/DefaultClientIdProvider.h
|
||||
Include/Private/GlobalStatistics.h
|
||||
Include/Private/IdentityProvider.h
|
||||
Include/Private/MetricsAttribute.h
|
||||
Include/Private/MetricsEvent.h
|
||||
Include/Private/MetricsEventBuilder.h
|
||||
Include/Private/MetricsManager.h
|
||||
|
||||
@@ -439,13 +439,6 @@ namespace AssetValidation
|
||||
|
||||
bool GetDefaultSeedListFiles(AZStd::vector<AZStd::string>& defaultSeedListFiles)
|
||||
{
|
||||
const char* engineRoot = nullptr;
|
||||
AzFramework::ApplicationRequests::Bus::BroadcastResult(engineRoot, &AzFramework::ApplicationRequests::GetEngineRoot);
|
||||
|
||||
const char* appRoot = nullptr;
|
||||
AzFramework::ApplicationRequests::Bus::BroadcastResult(appRoot, &AzFramework::ApplicationRequests::GetAppRoot);
|
||||
|
||||
|
||||
auto settingsRegistry = AZ::SettingsRegistry::Get();
|
||||
AZ::SettingsRegistryInterface::FixedValueString gameFolder;
|
||||
auto projectKey = AZ::SettingsRegistryInterface::FixedValueString::format("%s/project_path", AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey);
|
||||
@@ -509,30 +502,28 @@ namespace AssetValidation
|
||||
|
||||
AZ::Outcome<AzFramework::AssetSeedList, AZStd::string> AssetValidationSystemComponent::LoadSeedList(const char* seedPath, AZStd::string& seedListPath)
|
||||
{
|
||||
AZStd::string absoluteSeedPath = seedPath;
|
||||
AZ::IO::Path absoluteSeedPath = seedPath;
|
||||
|
||||
if (AZ::StringFunc::Path::IsRelative(seedPath))
|
||||
{
|
||||
const char* appRoot = nullptr;
|
||||
AzFramework::ApplicationRequests::Bus::BroadcastResult(appRoot, &AzFramework::ApplicationRequests::GetEngineRoot);
|
||||
AZ::IO::FixedMaxPath engineRoot = AZ::Utils::GetEnginePath();
|
||||
|
||||
if (!appRoot)
|
||||
if (engineRoot.empty())
|
||||
{
|
||||
return AZ::Failure(AZStd::string("Couldn't get engine root"));
|
||||
}
|
||||
|
||||
absoluteSeedPath = AZStd::string::format("%s/%s", appRoot, seedPath);
|
||||
absoluteSeedPath = (engineRoot / seedPath).String();
|
||||
}
|
||||
|
||||
AzFramework::StringFunc::Path::Normalize(absoluteSeedPath);
|
||||
AzFramework::AssetSeedList seedList;
|
||||
|
||||
if (!AZ::Utils::LoadObjectFromFileInPlace(absoluteSeedPath, seedList))
|
||||
if (!AZ::Utils::LoadObjectFromFileInPlace(absoluteSeedPath.Native(), seedList))
|
||||
{
|
||||
return AZ::Failure(AZStd::string::format("Failed to load seed list %s", absoluteSeedPath.c_str()));
|
||||
}
|
||||
|
||||
seedListPath = absoluteSeedPath;
|
||||
seedListPath = AZStd::move(absoluteSeedPath.Native());
|
||||
|
||||
return AZ::Success(seedList);
|
||||
}
|
||||
|
||||
@@ -150,13 +150,13 @@ struct AssetValidationTest
|
||||
|
||||
auto projectPathKey = AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey)
|
||||
+ "/project_path";
|
||||
m_registry.Set(projectPathKey, (AZ::IO::FixedMaxPath(GetEngineRoot()) / "AutomatedTesting").Native());
|
||||
m_registry.Set(projectPathKey, (AZ::IO::FixedMaxPath(m_tempDir.GetDirectory()) / "AutomatedTesting").Native());
|
||||
AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(m_registry);
|
||||
|
||||
// Set the engine root to the temporary directory and re-update the runtime file paths
|
||||
auto enginePathKey = AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey)
|
||||
+ "/engine_path";
|
||||
m_registry.Set(enginePathKey, GetEngineRoot());
|
||||
m_registry.Set(enginePathKey, m_tempDir.GetDirectory());
|
||||
AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(m_registry);
|
||||
}
|
||||
}
|
||||
@@ -176,11 +176,6 @@ struct AssetValidationTest
|
||||
AZ_Assert(false, "Not implemented");
|
||||
}
|
||||
|
||||
const char* GetEngineRoot() const override
|
||||
{
|
||||
return m_tempDir.GetDirectory();
|
||||
}
|
||||
|
||||
void SetUp() override
|
||||
{
|
||||
using namespace ::testing;
|
||||
|
||||
@@ -111,7 +111,6 @@ namespace UnitTest
|
||||
AZ::SerializeContext* GetSerializeContext() override { return m_context.get(); }
|
||||
AZ::BehaviorContext* GetBehaviorContext() override { return nullptr; }
|
||||
AZ::JsonRegistrationContext* GetJsonRegistrationContext() override { return m_jsonRegistrationContext.get(); }
|
||||
const char* GetAppRoot() const override { return nullptr; }
|
||||
const char* GetEngineRoot() const override { return nullptr; }
|
||||
const char* GetExecutableFolder() const override { return nullptr; }
|
||||
void EnumerateEntities(const AZ::ComponentApplicationRequests::EntityCallback& /*callback*/) override {}
|
||||
|
||||
@@ -37,6 +37,7 @@ ShaderResourceGroup ObjectSrg : SRG_PerObject
|
||||
float m_padding;
|
||||
bool m_useReflectionProbe;
|
||||
bool m_useParallaxCorrection;
|
||||
float m_exposure;
|
||||
};
|
||||
|
||||
ReflectionProbeData m_reflectionProbeData;
|
||||
|
||||
@@ -85,12 +85,12 @@ void ApplyIBL(Surface surface, inout LightingData lightingData)
|
||||
|
||||
if(useIbl)
|
||||
{
|
||||
float iblExposureFactor = pow(2.0, SceneSrg::m_iblExposure);
|
||||
float globalIblExposure = pow(2.0, SceneSrg::m_iblExposure);
|
||||
|
||||
if(useDiffuseIbl)
|
||||
{
|
||||
float3 iblDiffuse = GetIblDiffuse(surface.normal, surface.albedo, lightingData.diffuseResponse);
|
||||
lightingData.diffuseLighting += (iblDiffuse * iblExposureFactor * lightingData.diffuseAmbientOcclusion);
|
||||
lightingData.diffuseLighting += (iblDiffuse * globalIblExposure * lightingData.diffuseAmbientOcclusion);
|
||||
}
|
||||
|
||||
if(useSpecularIbl)
|
||||
@@ -116,7 +116,8 @@ void ApplyIBL(Surface surface, inout LightingData lightingData)
|
||||
iblSpecular = iblSpecular * (1.0 - clearCoatResponse) * (1.0 - clearCoatResponse) + clearCoatIblSpecular;
|
||||
}
|
||||
|
||||
lightingData.specularLighting += (iblSpecular * iblExposureFactor);
|
||||
float exposure = ObjectSrg::m_reflectionProbeData.m_useReflectionProbe ? pow(2.0, ObjectSrg::m_reflectionProbeData.m_exposure) : globalIblExposure;
|
||||
lightingData.specularLighting += (iblSpecular * exposure);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,6 +46,7 @@ ShaderResourceGroup ObjectSrg : SRG_PerObject
|
||||
float m_padding;
|
||||
bool m_useReflectionProbe;
|
||||
bool m_useParallaxCorrection;
|
||||
float m_exposure;
|
||||
};
|
||||
|
||||
ReflectionProbeData m_reflectionProbeData;
|
||||
|
||||
@@ -81,7 +81,7 @@ PSOutput MainPS(VSOutput IN, in uint sampleIndex : SV_SampleIndex)
|
||||
}
|
||||
|
||||
// apply exposure setting
|
||||
specular *= pow(2.0, SceneSrg::m_iblExposure);
|
||||
specular *= pow(2.0, ObjectSrg::m_exposure);
|
||||
|
||||
PSOutput OUT;
|
||||
OUT.m_color = float4(specular, 1.0f);
|
||||
|
||||
+1
@@ -17,6 +17,7 @@ ShaderResourceGroup ObjectSrg : SRG_PerObject
|
||||
float3 m_outerObbHalfLengths;
|
||||
float3 m_innerObbHalfLengths;
|
||||
bool m_useParallaxCorrection;
|
||||
float m_exposure;
|
||||
TextureCube m_reflectionCubeMap;
|
||||
|
||||
float4x4 GetWorldMatrix()
|
||||
|
||||
@@ -104,7 +104,7 @@ PSOutput MainPS(VSOutput IN, in uint sampleIndex : SV_SampleIndex)
|
||||
blendWeight /= max(1.0f, blendWeightAllProbes);
|
||||
|
||||
// apply exposure setting
|
||||
specular *= pow(2.0, SceneSrg::m_iblExposure);
|
||||
specular *= pow(2.0, ObjectSrg::m_exposure);
|
||||
|
||||
// apply blend weight for additive blending
|
||||
specular *= blendWeight;
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace AZ
|
||||
class TransformServiceFeatureProcessor;
|
||||
class RayTracingFeatureProcessor;
|
||||
|
||||
class MeshDataInstance
|
||||
class ModelDataInstance
|
||||
{
|
||||
friend class MeshFeatureProcessor;
|
||||
friend class MeshLoader;
|
||||
@@ -47,7 +47,7 @@ namespace AZ
|
||||
public:
|
||||
using ModelChangedEvent = MeshFeatureProcessorInterface::ModelChangedEvent;
|
||||
|
||||
MeshLoader(const Data::Asset<RPI::ModelAsset>& modelAsset, MeshDataInstance* parent);
|
||||
MeshLoader(const Data::Asset<RPI::ModelAsset>& modelAsset, ModelDataInstance* parent);
|
||||
~MeshLoader();
|
||||
|
||||
ModelChangedEvent& GetModelChangedEvent();
|
||||
@@ -68,7 +68,7 @@ namespace AZ
|
||||
} };
|
||||
MeshFeatureProcessorInterface::ModelChangedEvent m_modelChangedEvent;
|
||||
Data::Asset<RPI::ModelAsset> m_modelAsset;
|
||||
MeshDataInstance* m_parent = nullptr;
|
||||
ModelDataInstance* m_parent = nullptr;
|
||||
};
|
||||
|
||||
void DeInit();
|
||||
@@ -99,7 +99,8 @@ namespace AZ
|
||||
//! A reference to the original model asset in case it got cloned before creating the model instance.
|
||||
Data::Asset<RPI::ModelAsset> m_originalModelAsset;
|
||||
|
||||
Data::Instance<RPI::ShaderResourceGroup> m_shaderResourceGroup;
|
||||
//! List of object SRGs used by meshes in this model
|
||||
AZStd::vector<Data::Instance<RPI::ShaderResourceGroup>> m_objectSrgList;
|
||||
AZStd::unique_ptr<MeshLoader> m_meshLoader;
|
||||
RPI::Scene* m_scene = nullptr;
|
||||
RHI::DrawItemSortKey m_sortKey;
|
||||
@@ -152,7 +153,7 @@ namespace AZ
|
||||
|
||||
Data::Instance<RPI::Model> GetModel(const MeshHandle& meshHandle) const override;
|
||||
Data::Asset<RPI::ModelAsset> GetModelAsset(const MeshHandle& meshHandle) const override;
|
||||
Data::Instance<RPI::ShaderResourceGroup> GetObjectSrg(const MeshHandle& meshHandle) const override;
|
||||
const AZStd::vector<Data::Instance<RPI::ShaderResourceGroup>>& GetObjectSrgs(const MeshHandle& meshHandle) const override;
|
||||
void QueueObjectSrgForCompile(const MeshHandle& meshHandle) const override;
|
||||
void SetMaterialAssignmentMap(const MeshHandle& meshHandle, const Data::Instance<RPI::Material>& material) override;
|
||||
void SetMaterialAssignmentMap(const MeshHandle& meshHandle, const MaterialAssignmentMap& materials) override;
|
||||
@@ -195,7 +196,7 @@ namespace AZ
|
||||
void OnRenderPipelineRemoved(RPI::RenderPipeline* pipeline) override;
|
||||
|
||||
AZStd::concurrency_checker m_meshDataChecker;
|
||||
StableDynamicArray<MeshDataInstance> m_meshData;
|
||||
StableDynamicArray<ModelDataInstance> m_modelData;
|
||||
TransformServiceFeatureProcessor* m_transformService;
|
||||
RayTracingFeatureProcessor* m_rayTracingFeatureProcessor = nullptr;
|
||||
AZ::RPI::ShaderSystemInterface::GlobalShaderOptionUpdatedEvent::Handler m_handleGlobalShaderOptionUpdate;
|
||||
|
||||
+10
-7
@@ -20,7 +20,7 @@ namespace AZ
|
||||
{
|
||||
namespace Render
|
||||
{
|
||||
class MeshDataInstance;
|
||||
class ModelDataInstance;
|
||||
|
||||
//! Settings to apply to a mesh handle when acquiring it for the first time
|
||||
struct MeshHandleDescriptor
|
||||
@@ -40,7 +40,7 @@ namespace AZ
|
||||
public:
|
||||
AZ_RTTI(AZ::Render::MeshFeatureProcessorInterface, "{975D7F0C-2E7E-4819-94D0-D3C4E2024721}", FeatureProcessor);
|
||||
|
||||
using MeshHandle = StableDynamicArrayHandle<MeshDataInstance>;
|
||||
using MeshHandle = StableDynamicArrayHandle<ModelDataInstance>;
|
||||
using ModelChangedEvent = Event<const Data::Instance<RPI::Model>>;
|
||||
|
||||
//! Acquires a model with an optional collection of material assignments.
|
||||
@@ -61,12 +61,15 @@ namespace AZ
|
||||
virtual Data::Instance<RPI::Model> GetModel(const MeshHandle& meshHandle) const = 0;
|
||||
//! Gets the underlying RPI::ModelAsset for a meshHandle.
|
||||
virtual Data::Asset<RPI::ModelAsset> GetModelAsset(const MeshHandle& meshHandle) const = 0;
|
||||
//! Gets the ObjectSrg for a meshHandle.
|
||||
//! Updating the ObjectSrg should be followed by a call to QueueObjectSrgForCompile,
|
||||
//! instead of compiling the srg directly. This way, if the srg has already been queued for compile,
|
||||
//! it will not be queued twice in the same frame. The ObjectSrg should not be updated during
|
||||
|
||||
//! Gets the ObjectSrgs for a meshHandle.
|
||||
//! Updating the ObjectSrgs should be followed by a call to QueueObjectSrgForCompile,
|
||||
//! instead of compiling the srgs directly. This way, if the srgs have already been queued for compile,
|
||||
//! they will not be queued twice in the same frame. The ObjectSrgs should not be updated during
|
||||
//! Simulate, or it will create a race between updating the data and the call to Compile
|
||||
virtual Data::Instance<RPI::ShaderResourceGroup> GetObjectSrg(const MeshHandle& meshHandle) const = 0;
|
||||
//! Cases where there may be multiple ObjectSrgs: if a model has multiple submeshes and those submeshes use different
|
||||
//! materials with different object SRGs.
|
||||
virtual const AZStd::vector<Data::Instance<RPI::ShaderResourceGroup>>& GetObjectSrgs(const MeshHandle& meshHandle) const = 0;
|
||||
//! Queues the object srg for compile.
|
||||
virtual void QueueObjectSrgForCompile(const MeshHandle& meshHandle) const = 0;
|
||||
//! Sets the MaterialAssignmentMap for a meshHandle, using just a single material for the DefaultMaterialAssignmentId.
|
||||
|
||||
+2
@@ -39,6 +39,8 @@ namespace AZ
|
||||
bool IsCubeMapReferenced(const AZStd::string& relativePath) override;
|
||||
bool IsValidProbeHandle(const ReflectionProbeHandle& probe) const override { return (probe.get() != nullptr); }
|
||||
void ShowProbeVisualization(const ReflectionProbeHandle& probe, bool showVisualization) override;
|
||||
void SetRenderExposure(const ReflectionProbeHandle& probe, float renderExposure) override;
|
||||
void SetBakeExposure(const ReflectionProbeHandle& probe, float bakeExposure) override;
|
||||
|
||||
// FeatureProcessor overrides
|
||||
void Activate() override;
|
||||
|
||||
+2
@@ -50,6 +50,8 @@ namespace AZ
|
||||
virtual bool IsCubeMapReferenced(const AZStd::string& relativePath) = 0;
|
||||
virtual bool IsValidProbeHandle(const ReflectionProbeHandle& probe) const = 0;
|
||||
virtual void ShowProbeVisualization(const ReflectionProbeHandle& probe, bool showVisualization) = 0;
|
||||
virtual void SetRenderExposure(const ReflectionProbeHandle& probe, float renderExposure) = 0;
|
||||
virtual void SetBakeExposure(const ReflectionProbeHandle& probe, float bakeExposure) = 0;
|
||||
};
|
||||
} // namespace Render
|
||||
} // namespace AZ
|
||||
|
||||
@@ -19,7 +19,7 @@ namespace UnitTest
|
||||
MOCK_METHOD1(CloneMesh, MeshHandle(const MeshHandle&));
|
||||
MOCK_CONST_METHOD1(GetModel, AZStd::intrusive_ptr<AZ::RPI::Model>(const MeshHandle&));
|
||||
MOCK_CONST_METHOD1(GetModelAsset, AZ::Data::Asset<AZ::RPI::ModelAsset>(const MeshHandle&));
|
||||
MOCK_CONST_METHOD1(GetObjectSrg, AZStd::intrusive_ptr<AZ::RPI::ShaderResourceGroup>(const MeshHandle&));
|
||||
MOCK_CONST_METHOD1(GetObjectSrgs, const AZStd::vector<AZStd::intrusive_ptr<AZ::RPI::ShaderResourceGroup>>&(const MeshHandle&));
|
||||
MOCK_CONST_METHOD1(QueueObjectSrgForCompile, void(const MeshHandle&));
|
||||
MOCK_CONST_METHOD1(GetMaterialAssignmentMap, const AZ::Render::MaterialAssignmentMap&(const MeshHandle&));
|
||||
MOCK_METHOD2(ConnectModelChangeEventHandler, void(const MeshHandle&, ModelChangedEvent::Handler&));
|
||||
|
||||
+1
-1
@@ -1056,7 +1056,7 @@ namespace AZ
|
||||
// if the shadow is rendering in an EnvironmentCubeMapPass it also needs to be a ReflectiveCubeMap view,
|
||||
// to filter out shadows from objects that are excluded from the cubemap
|
||||
RPI::PassFilter passFilter = RPI::PassFilter::CreateWithPassClass<RPI::EnvironmentCubeMapPass>();
|
||||
passFilter.SetOwenrScene(GetParentScene()); // only handles passes for this scene
|
||||
passFilter.SetOwnerScene(GetParentScene()); // only handles passes for this scene
|
||||
RPI::PassSystemInterface::Get()->ForEachPass(passFilter, [&usageFlags]([[maybe_unused]] RPI::Pass* pass) -> RPI::PassFilterExecutionFlow
|
||||
{
|
||||
usageFlags |= RPI::View::UsageReflectiveCubeMap;
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <AzCore/Component/TransformBus.h>
|
||||
#include <AzFramework/Components/CameraBus.h>
|
||||
#include <AzCore/std/containers/compressed_pair.h>
|
||||
#include <AzCore/Utils/Utils.h>
|
||||
#include <AzFramework/API/ApplicationAPI.h>
|
||||
|
||||
#include <luxcore/luxcore.h>
|
||||
@@ -295,14 +296,12 @@ namespace AZ
|
||||
}
|
||||
|
||||
// Run luxcoreui.exe
|
||||
AZStd::string luxCoreExeFullPath;
|
||||
AzFramework::ApplicationRequests::Bus::BroadcastResult(luxCoreExeFullPath, &AzFramework::ApplicationRequests::GetAppRoot);
|
||||
luxCoreExeFullPath = luxCoreExeFullPath + AZ_TRAIT_LUXCORE_EXEPATH;
|
||||
AzFramework::StringFunc::Path::Normalize(luxCoreExeFullPath);
|
||||
AZ::IO::FixedMaxPath luxCoreExeFullPath = AZ::Utils::GetEnginePath();
|
||||
luxCoreExeFullPath /= AZ_TRAIT_LUXCORE_EXEPATH;
|
||||
|
||||
AZStd::string commandLine = "-o " + AZStd::string(resolvedPath) + "/render.cfg";
|
||||
|
||||
LuxCoreUI::LaunchLuxCoreUI(luxCoreExeFullPath, commandLine);
|
||||
LuxCoreUI::LaunchLuxCoreUI(luxCoreExeFullPath.String(), commandLine);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,7 +67,7 @@ namespace AZ
|
||||
m_handleGlobalShaderOptionUpdate.Disconnect();
|
||||
|
||||
DisableSceneNotification();
|
||||
AZ_Warning("MeshFeatureProcessor", m_meshData.size() == 0,
|
||||
AZ_Warning("MeshFeatureProcessor", m_modelData.size() == 0,
|
||||
"Deactivaing the MeshFeatureProcessor, but there are still outstanding mesh handles.\n"
|
||||
);
|
||||
m_transformService = nullptr;
|
||||
@@ -81,7 +81,7 @@ namespace AZ
|
||||
|
||||
AZStd::concurrency_check_scope scopeCheck(m_meshDataChecker);
|
||||
|
||||
const auto iteratorRanges = m_meshData.GetParallelRanges();
|
||||
const auto iteratorRanges = m_modelData.GetParallelRanges();
|
||||
AZ::JobCompletion jobCompletion;
|
||||
for (const auto& iteratorRange : iteratorRanges)
|
||||
{
|
||||
@@ -125,11 +125,11 @@ namespace AZ
|
||||
m_forceRebuildDrawPackets = false;
|
||||
|
||||
// CullingSystem::RegisterOrUpdateCullable() is not threadsafe, so need to do those updates in a single thread
|
||||
for (MeshDataInstance& meshDataInstance : m_meshData)
|
||||
for (ModelDataInstance& modelDataInstance : m_modelData)
|
||||
{
|
||||
if (meshDataInstance.m_model && meshDataInstance.m_cullBoundsNeedsUpdate)
|
||||
if (modelDataInstance.m_model && modelDataInstance.m_cullBoundsNeedsUpdate)
|
||||
{
|
||||
meshDataInstance.UpdateCullBounds(m_transformService);
|
||||
modelDataInstance.UpdateCullBounds(m_transformService);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -151,14 +151,14 @@ namespace AZ
|
||||
AZ_PROFILE_SCOPE(AzRender, "MeshFeatureProcessor: AcquireMesh");
|
||||
|
||||
// don't need to check the concurrency during emplace() because the StableDynamicArray won't move the other elements during insertion
|
||||
MeshHandle meshDataHandle = m_meshData.emplace();
|
||||
MeshHandle meshDataHandle = m_modelData.emplace();
|
||||
|
||||
meshDataHandle->m_descriptor = descriptor;
|
||||
meshDataHandle->m_scene = GetParentScene();
|
||||
meshDataHandle->m_materialAssignments = materials;
|
||||
meshDataHandle->m_objectId = m_transformService->ReserveObjectId();
|
||||
meshDataHandle->m_originalModelAsset = descriptor.m_modelAsset;
|
||||
meshDataHandle->m_meshLoader = AZStd::make_unique<MeshDataInstance::MeshLoader>(descriptor.m_modelAsset, &*meshDataHandle);
|
||||
meshDataHandle->m_meshLoader = AZStd::make_unique<ModelDataInstance::MeshLoader>(descriptor.m_modelAsset, &*meshDataHandle);
|
||||
|
||||
return meshDataHandle;
|
||||
}
|
||||
@@ -183,7 +183,7 @@ namespace AZ
|
||||
m_transformService->ReleaseObjectId(meshHandle->m_objectId);
|
||||
|
||||
AZStd::concurrency_check_scope scopeCheck(m_meshDataChecker);
|
||||
m_meshData.erase(meshHandle);
|
||||
m_modelData.erase(meshHandle);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -215,9 +215,10 @@ namespace AZ
|
||||
return {};
|
||||
}
|
||||
|
||||
Data::Instance<RPI::ShaderResourceGroup> MeshFeatureProcessor::GetObjectSrg(const MeshHandle& meshHandle) const
|
||||
const AZStd::vector<Data::Instance<RPI::ShaderResourceGroup>>& MeshFeatureProcessor::GetObjectSrgs(const MeshHandle& meshHandle) const
|
||||
{
|
||||
return meshHandle.IsValid() ? meshHandle->m_shaderResourceGroup : nullptr;
|
||||
static AZStd::vector<Data::Instance<RPI::ShaderResourceGroup>> staticEmptyList;
|
||||
return meshHandle.IsValid() ? meshHandle->m_objectSrgList : staticEmptyList;
|
||||
}
|
||||
|
||||
void MeshFeatureProcessor::QueueObjectSrgForCompile(const MeshHandle& meshHandle) const
|
||||
@@ -274,9 +275,9 @@ namespace AZ
|
||||
{
|
||||
if (meshHandle.IsValid())
|
||||
{
|
||||
MeshDataInstance& meshData = *meshHandle;
|
||||
meshData.m_cullBoundsNeedsUpdate = true;
|
||||
meshData.m_objectSrgNeedsUpdate = true;
|
||||
ModelDataInstance& modelData = *meshHandle;
|
||||
modelData.m_cullBoundsNeedsUpdate = true;
|
||||
modelData.m_objectSrgNeedsUpdate = true;
|
||||
|
||||
m_transformService->SetTransformForId(meshHandle->m_objectId, transform, nonUniformScale);
|
||||
|
||||
@@ -292,10 +293,10 @@ namespace AZ
|
||||
{
|
||||
if (meshHandle.IsValid())
|
||||
{
|
||||
MeshDataInstance& meshData = *meshHandle;
|
||||
meshData.m_aabb = localAabb;
|
||||
meshData.m_cullBoundsNeedsUpdate = true;
|
||||
meshData.m_objectSrgNeedsUpdate = true;
|
||||
ModelDataInstance& modelData = *meshHandle;
|
||||
modelData.m_aabb = localAabb;
|
||||
modelData.m_cullBoundsNeedsUpdate = true;
|
||||
modelData.m_objectSrgNeedsUpdate = true;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -465,7 +466,7 @@ namespace AZ
|
||||
void MeshFeatureProcessor::UpdateMeshReflectionProbes()
|
||||
{
|
||||
// we need to rebuild the Srg for any meshes that are using the forward pass IBL specular option
|
||||
for (auto& meshInstance : m_meshData)
|
||||
for (auto& meshInstance : m_modelData)
|
||||
{
|
||||
if (meshInstance.m_descriptor.m_useForwardPassIblSpecular)
|
||||
{
|
||||
@@ -474,14 +475,14 @@ namespace AZ
|
||||
}
|
||||
}
|
||||
|
||||
// MeshDataInstance::MeshLoader...
|
||||
MeshDataInstance::MeshLoader::MeshLoader(const Data::Asset<RPI::ModelAsset>& modelAsset, MeshDataInstance* parent)
|
||||
// ModelDataInstance::MeshLoader...
|
||||
ModelDataInstance::MeshLoader::MeshLoader(const Data::Asset<RPI::ModelAsset>& modelAsset, ModelDataInstance* parent)
|
||||
: m_modelAsset(modelAsset)
|
||||
, m_parent(parent)
|
||||
{
|
||||
if (!m_modelAsset.GetId().IsValid())
|
||||
{
|
||||
AZ_Error("MeshDataInstance::MeshLoader", false, "Invalid model asset Id.");
|
||||
AZ_Error("ModelDataInstance::MeshLoader", false, "Invalid model asset Id.");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -494,19 +495,19 @@ namespace AZ
|
||||
AzFramework::AssetCatalogEventBus::Handler::BusConnect();
|
||||
}
|
||||
|
||||
MeshDataInstance::MeshLoader::~MeshLoader()
|
||||
ModelDataInstance::MeshLoader::~MeshLoader()
|
||||
{
|
||||
AzFramework::AssetCatalogEventBus::Handler::BusDisconnect();
|
||||
Data::AssetBus::Handler::BusDisconnect();
|
||||
}
|
||||
|
||||
MeshFeatureProcessorInterface::ModelChangedEvent& MeshDataInstance::MeshLoader::GetModelChangedEvent()
|
||||
MeshFeatureProcessorInterface::ModelChangedEvent& ModelDataInstance::MeshLoader::GetModelChangedEvent()
|
||||
{
|
||||
return m_modelChangedEvent;
|
||||
}
|
||||
|
||||
//! AssetBus::Handler overrides...
|
||||
void MeshDataInstance::MeshLoader::OnAssetReady(Data::Asset<Data::AssetData> asset)
|
||||
void ModelDataInstance::MeshLoader::OnAssetReady(Data::Asset<Data::AssetData> asset)
|
||||
{
|
||||
Data::Asset<RPI::ModelAsset> modelAsset = asset;
|
||||
|
||||
@@ -527,7 +528,7 @@ namespace AZ
|
||||
}
|
||||
else
|
||||
{
|
||||
AZ_Error("MeshDataInstance", false, "Cannot clone model for '%s'. Cloth simulation results won't be individual per entity.", modelAsset->GetName().GetCStr());
|
||||
AZ_Error("ModelDataInstance", false, "Cannot clone model for '%s'. Cloth simulation results won't be individual per entity.", modelAsset->GetName().GetCStr());
|
||||
model = RPI::Model::FindOrCreate(modelAsset);
|
||||
}
|
||||
}
|
||||
@@ -547,29 +548,29 @@ namespace AZ
|
||||
{
|
||||
//when running with null renderer, the RPI::Model::FindOrCreate(...) is expected to return nullptr, so suppress this error.
|
||||
AZ_Error(
|
||||
"MeshDataInstance::OnAssetReady", RHI::IsNullRenderer(), "Failed to create model instance for '%s'",
|
||||
"ModelDataInstance::OnAssetReady", RHI::IsNullRenderer(), "Failed to create model instance for '%s'",
|
||||
asset.GetHint().c_str());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void MeshDataInstance::MeshLoader::OnModelReloaded(Data::Asset<Data::AssetData> asset)
|
||||
void ModelDataInstance::MeshLoader::OnModelReloaded(Data::Asset<Data::AssetData> asset)
|
||||
{
|
||||
OnAssetReady(asset);
|
||||
}
|
||||
|
||||
void MeshDataInstance::MeshLoader::OnAssetError(Data::Asset<Data::AssetData> asset)
|
||||
void ModelDataInstance::MeshLoader::OnAssetError(Data::Asset<Data::AssetData> asset)
|
||||
{
|
||||
// Note: m_modelAsset and asset represents same asset, but only m_modelAsset contains the file path in its hint from serialization
|
||||
AZ_Error(
|
||||
"MeshDataInstance::MeshLoader", false, "Failed to load asset %s. It may be missing, or not be finished processing",
|
||||
"ModelDataInstance::MeshLoader", false, "Failed to load asset %s. It may be missing, or not be finished processing",
|
||||
m_modelAsset.GetHint().c_str());
|
||||
|
||||
AzFramework::AssetSystemRequestBus::Broadcast(
|
||||
&AzFramework::AssetSystem::AssetSystemRequests::EscalateAssetByUuid, m_modelAsset.GetId().m_guid);
|
||||
}
|
||||
|
||||
void MeshDataInstance::MeshLoader::OnCatalogAssetChanged(const AZ::Data::AssetId& assetId)
|
||||
void ModelDataInstance::MeshLoader::OnCatalogAssetChanged(const AZ::Data::AssetId& assetId)
|
||||
{
|
||||
if (assetId == m_modelAsset.GetId())
|
||||
{
|
||||
@@ -584,7 +585,7 @@ namespace AZ
|
||||
}
|
||||
}
|
||||
|
||||
void MeshDataInstance::MeshLoader::OnCatalogAssetAdded(const AZ::Data::AssetId& assetId)
|
||||
void ModelDataInstance::MeshLoader::OnCatalogAssetAdded(const AZ::Data::AssetId& assetId)
|
||||
{
|
||||
if (assetId == m_modelAsset.GetId())
|
||||
{
|
||||
@@ -599,9 +600,9 @@ namespace AZ
|
||||
}
|
||||
}
|
||||
|
||||
// MeshDataInstance...
|
||||
// ModelDataInstance...
|
||||
|
||||
void MeshDataInstance::DeInit()
|
||||
void ModelDataInstance::DeInit()
|
||||
{
|
||||
m_scene->GetCullingScene()->UnregisterCullable(m_cullable);
|
||||
|
||||
@@ -609,11 +610,11 @@ namespace AZ
|
||||
|
||||
m_drawPacketListsByLod.clear();
|
||||
m_materialAssignments.clear();
|
||||
m_shaderResourceGroup = {};
|
||||
m_objectSrgList = {};
|
||||
m_model = {};
|
||||
}
|
||||
|
||||
void MeshDataInstance::Init(Data::Instance<RPI::Model> model)
|
||||
void ModelDataInstance::Init(Data::Instance<RPI::Model> model)
|
||||
{
|
||||
m_model = model;
|
||||
const size_t modelLodCount = m_model->GetLodCount();
|
||||
@@ -623,11 +624,11 @@ namespace AZ
|
||||
BuildDrawPacketList(modelLodIndex);
|
||||
}
|
||||
|
||||
if (m_shaderResourceGroup)
|
||||
for(auto& objectSrg : m_objectSrgList)
|
||||
{
|
||||
// Set object Id once since it never changes
|
||||
RHI::ShaderInputNameIndex objectIdIndex = "m_objectId";
|
||||
m_shaderResourceGroup->SetConstant(objectIdIndex, m_objectId.GetIndex());
|
||||
objectSrg->SetConstant(objectIdIndex, m_objectId.GetIndex());
|
||||
objectIdIndex.AssertValid();
|
||||
}
|
||||
|
||||
@@ -643,12 +644,12 @@ namespace AZ
|
||||
m_objectSrgNeedsUpdate = true;
|
||||
}
|
||||
|
||||
void MeshDataInstance::BuildDrawPacketList(size_t modelLodIndex)
|
||||
void ModelDataInstance::BuildDrawPacketList(size_t modelLodIndex)
|
||||
{
|
||||
RPI::ModelLod& modelLod = *m_model->GetLods()[modelLodIndex];
|
||||
const size_t meshCount = modelLod.GetMeshes().size();
|
||||
|
||||
MeshDataInstance::DrawPacketList& drawPacketListOut = m_drawPacketListsByLod[modelLodIndex];
|
||||
ModelDataInstance::DrawPacketList& drawPacketListOut = m_drawPacketListsByLod[modelLodIndex];
|
||||
drawPacketListOut.clear();
|
||||
drawPacketListOut.reserve(meshCount);
|
||||
|
||||
@@ -682,27 +683,32 @@ namespace AZ
|
||||
continue;
|
||||
}
|
||||
|
||||
if (m_shaderResourceGroup && m_shaderResourceGroup->GetLayout()->GetHash() != objectSrgLayout->GetHash())
|
||||
Data::Instance<RPI::ShaderResourceGroup> meshObjectSrg;
|
||||
|
||||
// See if the object SRG for this mesh is already in our list of object SRGs
|
||||
for (auto& objectSrgIter : m_objectSrgList)
|
||||
{
|
||||
AZ_Warning("MeshFeatureProcessor", false, "All materials on a model must use the same per-object ShaderResourceGroup. Skipping.");
|
||||
continue;
|
||||
if (objectSrgIter->GetLayout()->GetHash() == objectSrgLayout->GetHash())
|
||||
{
|
||||
meshObjectSrg = objectSrgIter;
|
||||
}
|
||||
}
|
||||
|
||||
// The first time we find the per-surface SRG asset we create an instance and store it
|
||||
// in shaderResourceGroupInOut. All of the Model's draw packets will use this same instance.
|
||||
if (!m_shaderResourceGroup)
|
||||
// If the object SRG for this mesh was not already in the list, create it and add it to the list
|
||||
if (!meshObjectSrg)
|
||||
{
|
||||
auto& shaderAsset = material->GetAsset()->GetMaterialTypeAsset()->GetShaderAssetForObjectSrg();
|
||||
m_shaderResourceGroup = RPI::ShaderResourceGroup::Create(shaderAsset, objectSrgLayout->GetName());
|
||||
if (!m_shaderResourceGroup)
|
||||
meshObjectSrg = RPI::ShaderResourceGroup::Create(shaderAsset, objectSrgLayout->GetName());
|
||||
if (!meshObjectSrg)
|
||||
{
|
||||
AZ_Warning("MeshFeatureProcessor", false, "Failed to create a new shader resource group, skipping.");
|
||||
continue;
|
||||
}
|
||||
m_objectSrgList.push_back(meshObjectSrg);
|
||||
}
|
||||
|
||||
// setup the mesh draw packet
|
||||
RPI::MeshDrawPacket drawPacket(modelLod, meshIndex, material, m_shaderResourceGroup, materialAssignment.m_matModUvOverrides);
|
||||
RPI::MeshDrawPacket drawPacket(modelLod, meshIndex, material, meshObjectSrg, materialAssignment.m_matModUvOverrides);
|
||||
|
||||
// set the shader option to select forward pass IBL specular if necessary
|
||||
if (!drawPacket.SetShaderOption(AZ::Name("o_meshUseForwardPassIBLSpecular"), AZ::RPI::ShaderOptionValue{ m_descriptor.m_useForwardPassIblSpecular }))
|
||||
@@ -726,7 +732,7 @@ namespace AZ
|
||||
}
|
||||
}
|
||||
|
||||
void MeshDataInstance::SetRayTracingData()
|
||||
void ModelDataInstance::SetRayTracingData()
|
||||
{
|
||||
if (!m_model)
|
||||
{
|
||||
@@ -993,7 +999,7 @@ namespace AZ
|
||||
rayTracingFeatureProcessor->SetMesh(m_objectId, m_model->GetModelAsset()->GetId(), subMeshes);
|
||||
}
|
||||
|
||||
void MeshDataInstance::RemoveRayTracingData()
|
||||
void ModelDataInstance::RemoveRayTracingData()
|
||||
{
|
||||
// remove from ray tracing
|
||||
RayTracingFeatureProcessor* rayTracingFeatureProcessor = m_scene->GetFeatureProcessor<RayTracingFeatureProcessor>();
|
||||
@@ -1003,7 +1009,7 @@ namespace AZ
|
||||
}
|
||||
}
|
||||
|
||||
void MeshDataInstance::SetSortKey(RHI::DrawItemSortKey sortKey)
|
||||
void ModelDataInstance::SetSortKey(RHI::DrawItemSortKey sortKey)
|
||||
{
|
||||
m_sortKey = sortKey;
|
||||
for (auto& drawPacketList : m_drawPacketListsByLod)
|
||||
@@ -1015,24 +1021,24 @@ namespace AZ
|
||||
}
|
||||
}
|
||||
|
||||
RHI::DrawItemSortKey MeshDataInstance::GetSortKey() const
|
||||
RHI::DrawItemSortKey ModelDataInstance::GetSortKey() const
|
||||
{
|
||||
return m_sortKey;
|
||||
}
|
||||
|
||||
void MeshDataInstance::SetMeshLodConfiguration(RPI::Cullable::LodConfiguration meshLodConfig)
|
||||
void ModelDataInstance::SetMeshLodConfiguration(RPI::Cullable::LodConfiguration meshLodConfig)
|
||||
{
|
||||
m_cullable.m_lodData.m_lodConfiguration = meshLodConfig;
|
||||
}
|
||||
|
||||
RPI::Cullable::LodConfiguration MeshDataInstance::GetMeshLodConfiguration() const
|
||||
RPI::Cullable::LodConfiguration ModelDataInstance::GetMeshLodConfiguration() const
|
||||
{
|
||||
return m_cullable.m_lodData.m_lodConfiguration;
|
||||
}
|
||||
|
||||
void MeshDataInstance::UpdateDrawPackets(bool forceUpdate /*= false*/)
|
||||
void ModelDataInstance::UpdateDrawPackets(bool forceUpdate /*= false*/)
|
||||
{
|
||||
AZ_PROFILE_SCOPE(AzRender, "MeshDataInstance:: UpdateDrawPackets");
|
||||
AZ_PROFILE_SCOPE(AzRender, "ModelDataInstance:: UpdateDrawPackets");
|
||||
for (auto& drawPacketList : m_drawPacketListsByLod)
|
||||
{
|
||||
for (auto& drawPacket : drawPacketList)
|
||||
@@ -1045,9 +1051,9 @@ namespace AZ
|
||||
}
|
||||
}
|
||||
|
||||
void MeshDataInstance::BuildCullable()
|
||||
void ModelDataInstance::BuildCullable()
|
||||
{
|
||||
AZ_PROFILE_SCOPE(AzRender, "MeshDataInstance: BuildCullable");
|
||||
AZ_PROFILE_SCOPE(AzRender, "ModelDataInstance: BuildCullable");
|
||||
AZ_Assert(m_cullableNeedsRebuild, "This function only needs to be called if the cullable to be rebuilt");
|
||||
AZ_Assert(m_model, "The model has not finished loading yet");
|
||||
|
||||
@@ -1122,9 +1128,9 @@ namespace AZ
|
||||
m_cullBoundsNeedsUpdate = true;
|
||||
}
|
||||
|
||||
void MeshDataInstance::UpdateCullBounds(const TransformServiceFeatureProcessor* transformService)
|
||||
void ModelDataInstance::UpdateCullBounds(const TransformServiceFeatureProcessor* transformService)
|
||||
{
|
||||
AZ_PROFILE_SCOPE(AzRender, "MeshDataInstance: UpdateCullBounds");
|
||||
AZ_PROFILE_SCOPE(AzRender, "ModelDataInstance: UpdateCullBounds");
|
||||
AZ_Assert(m_cullBoundsNeedsUpdate, "This function only needs to be called if the culling bounds need to be rebuilt");
|
||||
AZ_Assert(m_model, "The model has not finished loading yet");
|
||||
|
||||
@@ -1148,70 +1154,74 @@ namespace AZ
|
||||
m_cullBoundsNeedsUpdate = false;
|
||||
}
|
||||
|
||||
void MeshDataInstance::UpdateObjectSrg()
|
||||
void ModelDataInstance::UpdateObjectSrg()
|
||||
{
|
||||
if (!m_shaderResourceGroup)
|
||||
for (auto& objectSrg : m_objectSrgList)
|
||||
{
|
||||
return;
|
||||
ReflectionProbeFeatureProcessor* reflectionProbeFeatureProcessor = m_scene->GetFeatureProcessor<ReflectionProbeFeatureProcessor>();
|
||||
|
||||
if (reflectionProbeFeatureProcessor && (m_descriptor.m_useForwardPassIblSpecular || m_hasForwardPassIblSpecularMaterial))
|
||||
{
|
||||
// retrieve probe constant indices
|
||||
AZ::RHI::ShaderInputConstantIndex modelToWorldConstantIndex = objectSrg->FindShaderInputConstantIndex(Name("m_reflectionProbeData.m_modelToWorld"));
|
||||
AZ_Error("ModelDataInstance", modelToWorldConstantIndex.IsValid(), "Failed to find ReflectionProbe constant index");
|
||||
|
||||
AZ::RHI::ShaderInputConstantIndex modelToWorldInverseConstantIndex = objectSrg->FindShaderInputConstantIndex(Name("m_reflectionProbeData.m_modelToWorldInverse"));
|
||||
AZ_Error("ModelDataInstance", modelToWorldInverseConstantIndex.IsValid(), "Failed to find ReflectionProbe constant index");
|
||||
|
||||
AZ::RHI::ShaderInputConstantIndex outerObbHalfLengthsConstantIndex = objectSrg->FindShaderInputConstantIndex(Name("m_reflectionProbeData.m_outerObbHalfLengths"));
|
||||
AZ_Error("ModelDataInstance", outerObbHalfLengthsConstantIndex.IsValid(), "Failed to find ReflectionProbe constant index");
|
||||
|
||||
AZ::RHI::ShaderInputConstantIndex innerObbHalfLengthsConstantIndex = objectSrg->FindShaderInputConstantIndex(Name("m_reflectionProbeData.m_innerObbHalfLengths"));
|
||||
AZ_Error("ModelDataInstance", innerObbHalfLengthsConstantIndex.IsValid(), "Failed to find ReflectionProbe constant index");
|
||||
|
||||
AZ::RHI::ShaderInputConstantIndex useReflectionProbeConstantIndex = objectSrg->FindShaderInputConstantIndex(Name("m_reflectionProbeData.m_useReflectionProbe"));
|
||||
AZ_Error("ModelDataInstance", useReflectionProbeConstantIndex.IsValid(), "Failed to find ReflectionProbe constant index");
|
||||
|
||||
AZ::RHI::ShaderInputConstantIndex useParallaxCorrectionConstantIndex = objectSrg->FindShaderInputConstantIndex(Name("m_reflectionProbeData.m_useParallaxCorrection"));
|
||||
AZ_Error("ModelDataInstance", useParallaxCorrectionConstantIndex.IsValid(), "Failed to find ReflectionProbe constant index");
|
||||
|
||||
AZ::RHI::ShaderInputConstantIndex exposureConstantIndex = objectSrg->FindShaderInputConstantIndex(Name("m_reflectionProbeData.m_exposure"));
|
||||
AZ_Error("ModelDataInstance", exposureConstantIndex.IsValid(), "Failed to find ReflectionProbe constant index");
|
||||
|
||||
// retrieve probe cubemap index
|
||||
Name reflectionCubeMapImageName = Name("m_reflectionProbeCubeMap");
|
||||
RHI::ShaderInputImageIndex reflectionCubeMapImageIndex = objectSrg->FindShaderInputImageIndex(reflectionCubeMapImageName);
|
||||
AZ_Error("ModelDataInstance", reflectionCubeMapImageIndex.IsValid(), "Failed to find shader image index [%s]", reflectionCubeMapImageName.GetCStr());
|
||||
|
||||
// retrieve the list of probes that contain the centerpoint of the mesh
|
||||
TransformServiceFeatureProcessor* transformServiceFeatureProcessor = m_scene->GetFeatureProcessor<TransformServiceFeatureProcessor>();
|
||||
Transform transform = transformServiceFeatureProcessor->GetTransformForId(m_objectId);
|
||||
|
||||
ReflectionProbeFeatureProcessor::ReflectionProbeVector reflectionProbes;
|
||||
reflectionProbeFeatureProcessor->FindReflectionProbes(transform.GetTranslation(), reflectionProbes);
|
||||
|
||||
if (!reflectionProbes.empty() && reflectionProbes[0])
|
||||
{
|
||||
objectSrg->SetConstant(modelToWorldConstantIndex, reflectionProbes[0]->GetTransform());
|
||||
objectSrg->SetConstant(modelToWorldInverseConstantIndex, Matrix3x4::CreateFromTransform(reflectionProbes[0]->GetTransform()).GetInverseFull());
|
||||
objectSrg->SetConstant(outerObbHalfLengthsConstantIndex, reflectionProbes[0]->GetOuterObbWs().GetHalfLengths());
|
||||
objectSrg->SetConstant(innerObbHalfLengthsConstantIndex, reflectionProbes[0]->GetInnerObbWs().GetHalfLengths());
|
||||
objectSrg->SetConstant(useReflectionProbeConstantIndex, true);
|
||||
objectSrg->SetConstant(useParallaxCorrectionConstantIndex, reflectionProbes[0]->GetUseParallaxCorrection());
|
||||
objectSrg->SetConstant(exposureConstantIndex, reflectionProbes[0]->GetRenderExposure());
|
||||
|
||||
objectSrg->SetImage(reflectionCubeMapImageIndex, reflectionProbes[0]->GetCubeMapImage());
|
||||
}
|
||||
else
|
||||
{
|
||||
objectSrg->SetConstant(useReflectionProbeConstantIndex, false);
|
||||
}
|
||||
}
|
||||
|
||||
objectSrg->Compile();
|
||||
}
|
||||
|
||||
ReflectionProbeFeatureProcessor* reflectionProbeFeatureProcessor = m_scene->GetFeatureProcessor<ReflectionProbeFeatureProcessor>();
|
||||
|
||||
if (reflectionProbeFeatureProcessor && (m_descriptor.m_useForwardPassIblSpecular || m_hasForwardPassIblSpecularMaterial))
|
||||
{
|
||||
// retrieve probe constant indices
|
||||
AZ::RHI::ShaderInputConstantIndex modelToWorldConstantIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_reflectionProbeData.m_modelToWorld"));
|
||||
AZ_Error("MeshDataInstance", modelToWorldConstantIndex.IsValid(), "Failed to find ReflectionProbe constant index");
|
||||
|
||||
AZ::RHI::ShaderInputConstantIndex modelToWorldInverseConstantIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_reflectionProbeData.m_modelToWorldInverse"));
|
||||
AZ_Error("MeshDataInstance", modelToWorldInverseConstantIndex.IsValid(), "Failed to find ReflectionProbe constant index");
|
||||
|
||||
AZ::RHI::ShaderInputConstantIndex outerObbHalfLengthsConstantIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_reflectionProbeData.m_outerObbHalfLengths"));
|
||||
AZ_Error("MeshDataInstance", outerObbHalfLengthsConstantIndex.IsValid(), "Failed to find ReflectionProbe constant index");
|
||||
|
||||
AZ::RHI::ShaderInputConstantIndex innerObbHalfLengthsConstantIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_reflectionProbeData.m_innerObbHalfLengths"));
|
||||
AZ_Error("MeshDataInstance", innerObbHalfLengthsConstantIndex.IsValid(), "Failed to find ReflectionProbe constant index");
|
||||
|
||||
AZ::RHI::ShaderInputConstantIndex useReflectionProbeConstantIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_reflectionProbeData.m_useReflectionProbe"));
|
||||
AZ_Error("MeshDataInstance", useReflectionProbeConstantIndex.IsValid(), "Failed to find ReflectionProbe constant index");
|
||||
|
||||
AZ::RHI::ShaderInputConstantIndex useParallaxCorrectionConstantIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_reflectionProbeData.m_useParallaxCorrection"));
|
||||
AZ_Error("MeshDataInstance", useParallaxCorrectionConstantIndex.IsValid(), "Failed to find ReflectionProbe constant index");
|
||||
|
||||
// retrieve probe cubemap index
|
||||
Name reflectionCubeMapImageName = Name("m_reflectionProbeCubeMap");
|
||||
RHI::ShaderInputImageIndex reflectionCubeMapImageIndex = m_shaderResourceGroup->FindShaderInputImageIndex(reflectionCubeMapImageName);
|
||||
AZ_Error("MeshDataInstance", reflectionCubeMapImageIndex.IsValid(), "Failed to find shader image index [%s]", reflectionCubeMapImageName.GetCStr());
|
||||
|
||||
// retrieve the list of probes that contain the centerpoint of the mesh
|
||||
TransformServiceFeatureProcessor* transformServiceFeatureProcessor = m_scene->GetFeatureProcessor<TransformServiceFeatureProcessor>();
|
||||
Transform transform = transformServiceFeatureProcessor->GetTransformForId(m_objectId);
|
||||
|
||||
ReflectionProbeFeatureProcessor::ReflectionProbeVector reflectionProbes;
|
||||
reflectionProbeFeatureProcessor->FindReflectionProbes(transform.GetTranslation(), reflectionProbes);
|
||||
|
||||
if (!reflectionProbes.empty() && reflectionProbes[0])
|
||||
{
|
||||
m_shaderResourceGroup->SetConstant(modelToWorldConstantIndex, reflectionProbes[0]->GetTransform());
|
||||
m_shaderResourceGroup->SetConstant(modelToWorldInverseConstantIndex, Matrix3x4::CreateFromTransform(reflectionProbes[0]->GetTransform()).GetInverseFull());
|
||||
m_shaderResourceGroup->SetConstant(outerObbHalfLengthsConstantIndex, reflectionProbes[0]->GetOuterObbWs().GetHalfLengths());
|
||||
m_shaderResourceGroup->SetConstant(innerObbHalfLengthsConstantIndex, reflectionProbes[0]->GetInnerObbWs().GetHalfLengths());
|
||||
m_shaderResourceGroup->SetConstant(useReflectionProbeConstantIndex, true);
|
||||
m_shaderResourceGroup->SetConstant(useParallaxCorrectionConstantIndex, reflectionProbes[0]->GetUseParallaxCorrection());
|
||||
|
||||
m_shaderResourceGroup->SetImage(reflectionCubeMapImageIndex, reflectionProbes[0]->GetCubeMapImage());
|
||||
}
|
||||
else
|
||||
{
|
||||
m_shaderResourceGroup->SetConstant(useReflectionProbeConstantIndex, false);
|
||||
}
|
||||
}
|
||||
|
||||
m_shaderResourceGroup->Compile();
|
||||
m_objectSrgNeedsUpdate = false;
|
||||
// Set m_objectSrgNeedsUpdate to false if there are object SRGs in the list
|
||||
m_objectSrgNeedsUpdate = m_objectSrgNeedsUpdate && (m_objectSrgList.size() == 0);
|
||||
}
|
||||
|
||||
bool MeshDataInstance::MaterialRequiresForwardPassIblSpecular(Data::Instance<RPI::Material> material) const
|
||||
bool ModelDataInstance::MaterialRequiresForwardPassIblSpecular(Data::Instance<RPI::Material> material) const
|
||||
{
|
||||
// look for a shader that has the o_materialUseForwardPassIBLSpecular option set
|
||||
// Note: this should be changed to have the material automatically set the forwardPassIBLSpecular
|
||||
@@ -1237,7 +1247,7 @@ namespace AZ
|
||||
return false;
|
||||
}
|
||||
|
||||
void MeshDataInstance::SetVisible(bool isVisible)
|
||||
void ModelDataInstance::SetVisible(bool isVisible)
|
||||
{
|
||||
m_visible = isVisible;
|
||||
m_cullable.m_isHidden = !isVisible;
|
||||
|
||||
@@ -37,6 +37,11 @@ namespace AZ
|
||||
m_currentTime = AZStd::chrono::system_clock::now();
|
||||
}
|
||||
|
||||
void PostProcessFeatureProcessor::Deactivate()
|
||||
{
|
||||
m_viewAliasMap.clear();
|
||||
}
|
||||
|
||||
void PostProcessFeatureProcessor::UpdateTime()
|
||||
{
|
||||
AZStd::chrono::system_clock::time_point now = AZStd::chrono::system_clock::now();
|
||||
@@ -45,6 +50,16 @@ namespace AZ
|
||||
m_deltaTime = deltaTime.count();
|
||||
}
|
||||
|
||||
void PostProcessFeatureProcessor::SetViewAlias(const AZ::RPI::ViewPtr sourceView, const AZ::RPI::ViewPtr targetView)
|
||||
{
|
||||
m_viewAliasMap[sourceView.get()] = targetView.get();
|
||||
}
|
||||
|
||||
void PostProcessFeatureProcessor::RemoveViewAlias(const AZ::RPI::ViewPtr sourceView)
|
||||
{
|
||||
m_viewAliasMap.erase(sourceView.get());
|
||||
}
|
||||
|
||||
void PostProcessFeatureProcessor::Simulate(const FeatureProcessor::SimulatePacket& packet)
|
||||
{
|
||||
AZ_PROFILE_SCOPE(RPI, "PostProcessFeatureProcessor: Simulate");
|
||||
@@ -200,8 +215,12 @@ namespace AZ
|
||||
|
||||
AZ::Render::PostProcessSettings* PostProcessFeatureProcessor::GetLevelSettingsFromView(AZ::RPI::ViewPtr view)
|
||||
{
|
||||
// check for view aliases first
|
||||
auto viewAliasiterator = m_viewAliasMap.find(view.get());
|
||||
|
||||
// Use the view alias if it exists
|
||||
auto settingsIterator = m_blendedPerViewSettings.find(viewAliasiterator != m_viewAliasMap.end() ? viewAliasiterator->second : view.get());
|
||||
// If no settings for the view is found, the global settings is returned.
|
||||
auto settingsIterator = m_blendedPerViewSettings.find(view.get());
|
||||
return settingsIterator != m_blendedPerViewSettings.end()
|
||||
? &settingsIterator->second
|
||||
: m_globalAggregateLevelSettings.get();
|
||||
|
||||
@@ -34,6 +34,7 @@ namespace AZ
|
||||
|
||||
//! FeatureProcessor overrides...
|
||||
void Activate() override;
|
||||
void Deactivate() override;
|
||||
void Simulate(const FeatureProcessor::SimulatePacket& packet) override;
|
||||
|
||||
//! PostProcessFeatureProcessorInterface...
|
||||
@@ -43,6 +44,9 @@ namespace AZ
|
||||
void OnPostProcessSettingsChanged() override;
|
||||
PostProcessSettings* GetLevelSettingsFromView(AZ::RPI::ViewPtr view);
|
||||
|
||||
void SetViewAlias(const AZ::RPI::ViewPtr sourceView, const AZ::RPI::ViewPtr targetView);
|
||||
void RemoveViewAlias(const AZ::RPI::ViewPtr sourceView);
|
||||
|
||||
private:
|
||||
PostProcessFeatureProcessor(const PostProcessFeatureProcessor&) = delete;
|
||||
|
||||
@@ -83,6 +87,8 @@ namespace AZ
|
||||
|
||||
// Each camera/view will have its own PostProcessSettings
|
||||
AZStd::unordered_map<AZ::RPI::View*, PostProcessSettings> m_blendedPerViewSettings;
|
||||
// This is used for mimicking a postfx setting of a different view
|
||||
AZStd::unordered_map<AZ::RPI::View*, AZ::RPI::View*> m_viewAliasMap;
|
||||
};
|
||||
} // namespace Render
|
||||
} // namespace AZ
|
||||
|
||||
@@ -81,7 +81,7 @@ namespace AZ
|
||||
if (scene)
|
||||
{
|
||||
PostProcessFeatureProcessor* fp = scene->GetFeatureProcessor<PostProcessFeatureProcessor>();
|
||||
AZ::RPI::ViewPtr view = GetView();
|
||||
AZ::RPI::ViewPtr view = GetRenderPipeline()->GetDefaultView();
|
||||
if (fp)
|
||||
{
|
||||
PostProcessSettings* postProcessSettings = fp->GetLevelSettingsFromView(view);
|
||||
@@ -110,7 +110,7 @@ namespace AZ
|
||||
PostProcessFeatureProcessor* fp = scene->GetFeatureProcessor<PostProcessFeatureProcessor>();
|
||||
if (fp)
|
||||
{
|
||||
AZ::RPI::ViewPtr view = GetView();
|
||||
AZ::RPI::ViewPtr view = GetRenderPipeline()->GetDefaultView();
|
||||
PostProcessSettings* postProcessSettings = fp->GetLevelSettingsFromView(view);
|
||||
if (postProcessSettings)
|
||||
{
|
||||
|
||||
@@ -120,15 +120,17 @@ namespace AZ
|
||||
m_scene->RemoveRenderPipeline(m_environmentCubeMapPipelineId);
|
||||
m_environmentCubeMapPass = nullptr;
|
||||
|
||||
// restore exposure
|
||||
sceneSrg->SetConstant(m_iblExposureConstantIndex, m_previousExposure);
|
||||
// restore exposures
|
||||
sceneSrg->SetConstant(m_globalIblExposureConstantIndex, m_previousGlobalIblExposure);
|
||||
sceneSrg->SetConstant(m_skyBoxExposureConstantIndex, m_previousSkyBoxExposure);
|
||||
|
||||
m_buildingCubeMap = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// set exposure to 0.0 while baking the cubemap
|
||||
sceneSrg->SetConstant(m_iblExposureConstantIndex, 0.0f);
|
||||
// set exposures to the user specified value while baking the cubemap
|
||||
sceneSrg->SetConstant(m_globalIblExposureConstantIndex, m_bakeExposure);
|
||||
sceneSrg->SetConstant(m_skyBoxExposureConstantIndex, m_bakeExposure);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -162,6 +164,7 @@ namespace AZ
|
||||
m_renderOuterSrg->SetConstant(m_reflectionRenderData->m_outerObbHalfLengthsRenderConstantIndex, m_outerObbWs.GetHalfLengths());
|
||||
m_renderOuterSrg->SetConstant(m_reflectionRenderData->m_innerObbHalfLengthsRenderConstantIndex, m_innerObbWs.GetHalfLengths());
|
||||
m_renderOuterSrg->SetConstant(m_reflectionRenderData->m_useParallaxCorrectionRenderConstantIndex, m_useParallaxCorrection);
|
||||
m_renderOuterSrg->SetConstant(m_reflectionRenderData->m_exposureConstantIndex, m_renderExposure);
|
||||
m_renderOuterSrg->SetImage(m_reflectionRenderData->m_reflectionCubeMapRenderImageIndex, m_cubeMapImage);
|
||||
m_renderOuterSrg->Compile();
|
||||
|
||||
@@ -172,6 +175,7 @@ namespace AZ
|
||||
m_renderInnerSrg->SetConstant(m_reflectionRenderData->m_outerObbHalfLengthsRenderConstantIndex, m_outerObbWs.GetHalfLengths());
|
||||
m_renderInnerSrg->SetConstant(m_reflectionRenderData->m_innerObbHalfLengthsRenderConstantIndex, m_innerObbWs.GetHalfLengths());
|
||||
m_renderInnerSrg->SetConstant(m_reflectionRenderData->m_useParallaxCorrectionRenderConstantIndex, m_useParallaxCorrection);
|
||||
m_renderInnerSrg->SetConstant(m_reflectionRenderData->m_exposureConstantIndex, m_renderExposure);
|
||||
m_renderInnerSrg->SetImage(m_reflectionRenderData->m_reflectionCubeMapRenderImageIndex, m_cubeMapImage);
|
||||
m_renderInnerSrg->Compile();
|
||||
|
||||
@@ -303,9 +307,10 @@ namespace AZ
|
||||
const RPI::Ptr<RPI::ParentPass>& rootPass = environmentCubeMapPipeline->GetRootPass();
|
||||
rootPass->AddChild(m_environmentCubeMapPass);
|
||||
|
||||
// store the current IBL exposure value
|
||||
// store the current IBL exposure values
|
||||
Data::Instance<RPI::ShaderResourceGroup> sceneSrg = m_scene->GetShaderResourceGroup();
|
||||
m_previousExposure = sceneSrg->GetConstant<float>(m_iblExposureConstantIndex);
|
||||
m_previousGlobalIblExposure = sceneSrg->GetConstant<float>(m_globalIblExposureConstantIndex);
|
||||
m_previousSkyBoxExposure = sceneSrg->GetConstant<float>(m_skyBoxExposureConstantIndex);
|
||||
|
||||
m_scene->AddRenderPipeline(environmentCubeMapPipeline);
|
||||
}
|
||||
@@ -326,6 +331,17 @@ namespace AZ
|
||||
m_meshFeatureProcessor->SetVisible(m_visualizationMeshHandle, showVisualization);
|
||||
}
|
||||
|
||||
void ReflectionProbe::SetRenderExposure(float renderExposure)
|
||||
{
|
||||
m_renderExposure = renderExposure;
|
||||
m_updateSrg = true;
|
||||
}
|
||||
|
||||
void ReflectionProbe::SetBakeExposure(float bakeExposure)
|
||||
{
|
||||
m_bakeExposure = bakeExposure;
|
||||
}
|
||||
|
||||
const RHI::DrawPacket* ReflectionProbe::BuildDrawPacket(
|
||||
const Data::Instance<RPI::ShaderResourceGroup>& srg,
|
||||
const RPI::Ptr<RPI::PipelineStateForDraw>& pipelineState,
|
||||
|
||||
@@ -61,6 +61,7 @@ namespace AZ
|
||||
RHI::ShaderInputNameIndex m_outerObbHalfLengthsRenderConstantIndex = "m_outerObbHalfLengths";
|
||||
RHI::ShaderInputNameIndex m_innerObbHalfLengthsRenderConstantIndex = "m_innerObbHalfLengths";
|
||||
RHI::ShaderInputNameIndex m_useParallaxCorrectionRenderConstantIndex = "m_useParallaxCorrection";
|
||||
RHI::ShaderInputNameIndex m_exposureConstantIndex = "m_exposure";
|
||||
RHI::ShaderInputNameIndex m_reflectionCubeMapRenderImageIndex = "m_reflectionCubeMap";
|
||||
};
|
||||
|
||||
@@ -106,6 +107,14 @@ namespace AZ
|
||||
// enables or disables rendering of the visualization sphere
|
||||
void ShowVisualization(bool showVisualization);
|
||||
|
||||
// the exposure to use when rendering meshes with this probe's cubemap
|
||||
void SetRenderExposure(float renderExposure);
|
||||
float GetRenderExposure() const { return m_renderExposure; }
|
||||
|
||||
// the exposure to use when baking the probe cubemap
|
||||
void SetBakeExposure(float bakeExposure);
|
||||
float GetBakeExposure() const { return m_bakeExposure; }
|
||||
|
||||
private:
|
||||
|
||||
AZ_DISABLE_COPY_MOVE(ReflectionProbe);
|
||||
@@ -157,6 +166,8 @@ namespace AZ
|
||||
RHI::ConstPtr<RHI::DrawPacket> m_blendWeightDrawPacket;
|
||||
RHI::ConstPtr<RHI::DrawPacket> m_renderOuterDrawPacket;
|
||||
RHI::ConstPtr<RHI::DrawPacket> m_renderInnerDrawPacket;
|
||||
float m_renderExposure = 0.0f;
|
||||
float m_bakeExposure = 0.0f;
|
||||
bool m_updateSrg = false;
|
||||
|
||||
const RHI::DrawItemSortKey InvalidSortKey = static_cast<RHI::DrawItemSortKey>(-1);
|
||||
@@ -169,8 +180,10 @@ namespace AZ
|
||||
RPI::Ptr<RPI::EnvironmentCubeMapPass> m_environmentCubeMapPass = nullptr;
|
||||
RPI::RenderPipelineId m_environmentCubeMapPipelineId;
|
||||
BuildCubeMapCallback m_callback;
|
||||
RHI::ShaderInputNameIndex m_iblExposureConstantIndex = "m_iblExposure";
|
||||
float m_previousExposure = 0.0f;
|
||||
RHI::ShaderInputNameIndex m_globalIblExposureConstantIndex = "m_iblExposure";
|
||||
RHI::ShaderInputNameIndex m_skyBoxExposureConstantIndex = "m_cubemapExposure";
|
||||
float m_previousGlobalIblExposure = 0.0f;
|
||||
float m_previousSkyBoxExposure = 0.0f;
|
||||
bool m_buildingCubeMap = false;
|
||||
};
|
||||
|
||||
|
||||
+12
@@ -283,6 +283,18 @@ namespace AZ
|
||||
probe->ShowVisualization(showVisualization);
|
||||
}
|
||||
|
||||
void ReflectionProbeFeatureProcessor::SetRenderExposure(const ReflectionProbeHandle& probe, float renderExposure)
|
||||
{
|
||||
AZ_Assert(probe.get(), "SetRenderExposure called with an invalid handle");
|
||||
probe->SetRenderExposure(renderExposure);
|
||||
}
|
||||
|
||||
void ReflectionProbeFeatureProcessor::SetBakeExposure(const ReflectionProbeHandle& probe, float bakeExposure)
|
||||
{
|
||||
AZ_Assert(probe.get(), "SetBakeExposure called with an invalid handle");
|
||||
probe->SetBakeExposure(bakeExposure);
|
||||
}
|
||||
|
||||
void ReflectionProbeFeatureProcessor::FindReflectionProbes(const Vector3& position, ReflectionProbeVector& reflectionProbes)
|
||||
{
|
||||
reflectionProbes.clear();
|
||||
|
||||
@@ -95,13 +95,13 @@ namespace AZ
|
||||
renderProxy.m_instance->m_model->WaitForUpload();
|
||||
}
|
||||
|
||||
//Note: we are creating pointers to the meshDataInstance cullpacket and lod packet here,
|
||||
//Note: we are creating pointers to the modelDataInstance cullpacket and lod packet here,
|
||||
//and holding them until the skinnedMeshDispatchItems are dispatched. There is an assumption that the underlying
|
||||
//data will not move during this phase.
|
||||
MeshDataInstance& meshDataInstance = **renderProxy.m_meshHandle;
|
||||
m_workgroup.m_cullPackets.push_back(&meshDataInstance.GetCullPacket());
|
||||
m_workgroup.m_drawListMask |= meshDataInstance.GetCullPacket().m_drawListMask;
|
||||
m_lodPackets.push_back(&meshDataInstance.GetLodPacket());
|
||||
ModelDataInstance& modelDataInstance = **renderProxy.m_meshHandle;
|
||||
m_workgroup.m_cullPackets.push_back(&modelDataInstance.GetCullPacket());
|
||||
m_workgroup.m_drawListMask |= modelDataInstance.GetCullPacket().m_drawListMask;
|
||||
m_lodPackets.push_back(&modelDataInstance.GetLodPacket());
|
||||
m_potentiallyVisibleProxies.push_back(&renderProxy);
|
||||
}
|
||||
}
|
||||
@@ -187,8 +187,8 @@ namespace AZ
|
||||
renderProxy.m_instance->m_model->WaitForUpload();
|
||||
}
|
||||
|
||||
MeshDataInstance& meshDataInstance = **renderProxy.m_meshHandle;
|
||||
const RPI::Cullable& cullable = meshDataInstance.GetCullable();
|
||||
ModelDataInstance& modelDataInstance = **renderProxy.m_meshHandle;
|
||||
const RPI::Cullable& cullable = modelDataInstance.GetCullable();
|
||||
|
||||
for (const RPI::ViewPtr& viewPtr : packet.m_views)
|
||||
{
|
||||
|
||||
@@ -75,6 +75,9 @@ namespace AZ
|
||||
//! Return True if the swap chain prefers exclusive full screen mode and a transition happened, false otherwise.
|
||||
virtual bool SetExclusiveFullScreenState([[maybe_unused]]bool fullScreenState) { return false; }
|
||||
|
||||
//! Recreate the swapchain if it becomes invalid during presenting. This should happen at the end of the frame
|
||||
//! due to images being used as attachments in the frame graph.
|
||||
virtual void ProcessRecreation() {};
|
||||
protected:
|
||||
SwapChain();
|
||||
|
||||
@@ -98,6 +101,14 @@ namespace AZ
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//! Shutdown and clear all the images.
|
||||
void ShutdownImages();
|
||||
|
||||
//! Initialized all the images.
|
||||
ResultCode InitImages();
|
||||
|
||||
//! Flag indicating if swapchain recreation is needed at the end of the frame.
|
||||
bool m_pendingRecreation = false;
|
||||
private:
|
||||
|
||||
bool ValidateDescriptor(const SwapChainDescriptor& descriptor) const;
|
||||
|
||||
@@ -134,7 +134,6 @@ namespace AZ
|
||||
m_scopeAttachmentLookup.clear();
|
||||
m_imageAttachments.clear();
|
||||
m_bufferAttachments.clear();
|
||||
m_swapChainAttachments.clear();
|
||||
m_importedImageAttachments.clear();
|
||||
m_importedBufferAttachments.clear();
|
||||
m_transientImageAttachments.clear();
|
||||
@@ -153,6 +152,13 @@ namespace AZ
|
||||
delete attachment;
|
||||
}
|
||||
m_attachments.clear();
|
||||
|
||||
for (auto swapchainAttachment : m_swapChainAttachments)
|
||||
{
|
||||
swapchainAttachment->GetSwapChain()->ProcessRecreation();
|
||||
}
|
||||
|
||||
m_swapChainAttachments.clear();
|
||||
}
|
||||
|
||||
ImageDescriptor FrameGraphAttachmentDatabase::GetImageDescriptor(const AttachmentId& attachmentId) const
|
||||
|
||||
@@ -58,43 +58,68 @@ namespace AZ
|
||||
// Overwrite descriptor dimensions with the native ones (the ones assigned by the platform) returned by InitInternal.
|
||||
m_descriptor.m_dimensions = nativeDimensions;
|
||||
|
||||
m_images.reserve(m_descriptor.m_dimensions.m_imageCount);
|
||||
resultCode = InitImages();
|
||||
}
|
||||
|
||||
for (uint32_t imageIdx = 0; imageIdx < m_descriptor.m_dimensions.m_imageCount; ++imageIdx)
|
||||
{
|
||||
m_images.emplace_back(RHI::Factory::Get().CreateImage());
|
||||
}
|
||||
return resultCode;
|
||||
}
|
||||
|
||||
InitImageRequest request;
|
||||
void SwapChain::ShutdownImages()
|
||||
{
|
||||
// Shutdown existing set of images.
|
||||
uint32_t imageSize = aznumeric_cast<uint32_t>(m_images.size());
|
||||
for (uint32_t imageIdx = 0; imageIdx < imageSize; ++imageIdx)
|
||||
{
|
||||
m_images[imageIdx]->Shutdown();
|
||||
}
|
||||
|
||||
RHI::ImageDescriptor& imageDescriptor = request.m_descriptor;
|
||||
imageDescriptor.m_dimension = RHI::ImageDimension::Image2D;
|
||||
imageDescriptor.m_bindFlags = RHI::ImageBindFlags::Color;
|
||||
imageDescriptor.m_size.m_width = m_descriptor.m_dimensions.m_imageWidth;
|
||||
imageDescriptor.m_size.m_height = m_descriptor.m_dimensions.m_imageHeight;
|
||||
imageDescriptor.m_format = m_descriptor.m_dimensions.m_imageFormat;
|
||||
m_images.clear();
|
||||
}
|
||||
|
||||
for (uint32_t imageIdx = 0; imageIdx < m_descriptor.m_dimensions.m_imageCount; ++imageIdx)
|
||||
{
|
||||
request.m_image = m_images[imageIdx].get();
|
||||
request.m_imageIndex = imageIdx;
|
||||
ResultCode SwapChain::InitImages()
|
||||
{
|
||||
ResultCode resultCode = ResultCode::Success;
|
||||
|
||||
resultCode = ImagePoolBase::InitImage(
|
||||
request.m_image,
|
||||
imageDescriptor,
|
||||
[this, &request]()
|
||||
m_images.reserve(m_descriptor.m_dimensions.m_imageCount);
|
||||
|
||||
// If the new display mode has more buffers, add them.
|
||||
for (uint32_t i = 0; i < m_descriptor.m_dimensions.m_imageCount; ++i)
|
||||
{
|
||||
m_images.emplace_back(RHI::Factory::Get().CreateImage());
|
||||
}
|
||||
|
||||
InitImageRequest request;
|
||||
|
||||
RHI::ImageDescriptor& imageDescriptor = request.m_descriptor;
|
||||
imageDescriptor.m_dimension = RHI::ImageDimension::Image2D;
|
||||
imageDescriptor.m_bindFlags = RHI::ImageBindFlags::Color;
|
||||
imageDescriptor.m_size.m_width = m_descriptor.m_dimensions.m_imageWidth;
|
||||
imageDescriptor.m_size.m_height = m_descriptor.m_dimensions.m_imageHeight;
|
||||
imageDescriptor.m_format = m_descriptor.m_dimensions.m_imageFormat;
|
||||
|
||||
for (uint32_t imageIdx = 0; imageIdx < m_descriptor.m_dimensions.m_imageCount; ++imageIdx)
|
||||
{
|
||||
request.m_image = m_images[imageIdx].get();
|
||||
request.m_imageIndex = imageIdx;
|
||||
|
||||
resultCode = ImagePoolBase::InitImage(
|
||||
request.m_image, imageDescriptor,
|
||||
[this, &request]()
|
||||
{
|
||||
return InitImageInternal(request);
|
||||
});
|
||||
|
||||
if (resultCode != ResultCode::Success)
|
||||
{
|
||||
Shutdown();
|
||||
break;
|
||||
}
|
||||
if (resultCode != ResultCode::Success)
|
||||
{
|
||||
AZ_Error("Swapchain", false, "Failed to initialize images.");
|
||||
Shutdown();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Reset the current index back to 0 so we match the platform swap chain.
|
||||
m_currentImageIndex = 0;
|
||||
|
||||
return resultCode;
|
||||
}
|
||||
|
||||
@@ -105,63 +130,15 @@ namespace AZ
|
||||
}
|
||||
|
||||
ResultCode SwapChain::Resize(const RHI::SwapChainDimensions& dimensions)
|
||||
{
|
||||
// Shutdown existing set of images.
|
||||
for (uint32_t imageIdx = 0; imageIdx < GetImageCount(); ++imageIdx)
|
||||
{
|
||||
m_images[imageIdx]->Shutdown();
|
||||
}
|
||||
{
|
||||
ShutdownImages();
|
||||
|
||||
SwapChainDimensions nativeDimensions = dimensions;
|
||||
ResultCode resultCode = ResizeInternal(dimensions, &nativeDimensions);
|
||||
if (resultCode == ResultCode::Success)
|
||||
{
|
||||
m_descriptor.m_dimensions = nativeDimensions;
|
||||
m_images.reserve(m_descriptor.m_dimensions.m_imageCount);
|
||||
|
||||
// If the new display mode has more buffers, add them.
|
||||
while (m_images.size() < static_cast<size_t>(m_descriptor.m_dimensions.m_imageCount))
|
||||
{
|
||||
m_images.emplace_back(RHI::Factory::Get().CreateImage());
|
||||
}
|
||||
|
||||
// If it has fewer, trim down.
|
||||
while (m_images.size() > static_cast<size_t>(m_descriptor.m_dimensions.m_imageCount))
|
||||
{
|
||||
m_images.pop_back();
|
||||
}
|
||||
|
||||
InitImageRequest request;
|
||||
|
||||
RHI::ImageDescriptor& imageDescriptor = request.m_descriptor;
|
||||
imageDescriptor.m_dimension = RHI::ImageDimension::Image2D;
|
||||
imageDescriptor.m_bindFlags = RHI::ImageBindFlags::Color;
|
||||
imageDescriptor.m_size.m_width = m_descriptor.m_dimensions.m_imageWidth;
|
||||
imageDescriptor.m_size.m_height = m_descriptor.m_dimensions.m_imageHeight;
|
||||
imageDescriptor.m_format = m_descriptor.m_dimensions.m_imageFormat;
|
||||
|
||||
for (uint32_t imageIdx = 0; imageIdx < GetImageCount(); ++imageIdx)
|
||||
{
|
||||
request.m_image = m_images[imageIdx].get();
|
||||
request.m_imageIndex = imageIdx;
|
||||
|
||||
resultCode = ImagePoolBase::InitImage(
|
||||
request.m_image,
|
||||
imageDescriptor,
|
||||
[this, &request]()
|
||||
{
|
||||
return InitImageInternal(request);
|
||||
});
|
||||
|
||||
if (resultCode != ResultCode::Success)
|
||||
{
|
||||
Shutdown();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Reset the current index back to 0 so we match the platform swap chain.
|
||||
m_currentImageIndex = 0;
|
||||
resultCode = InitImages();
|
||||
}
|
||||
|
||||
return resultCode;
|
||||
@@ -188,7 +165,7 @@ namespace AZ
|
||||
|
||||
uint32_t SwapChain::GetImageCount() const
|
||||
{
|
||||
return static_cast<uint32_t>(m_images.size());
|
||||
return aznumeric_cast<uint32_t>(m_images.size());
|
||||
}
|
||||
|
||||
uint32_t SwapChain::GetCurrentImageIndex() const
|
||||
@@ -209,8 +186,18 @@ namespace AZ
|
||||
void SwapChain::Present()
|
||||
{
|
||||
AZ_TRACE_METHOD();
|
||||
m_currentImageIndex = PresentInternal();
|
||||
AZ_Assert(m_currentImageIndex < m_images.size(), "Invalid image index");
|
||||
// Due to swapchain recreation, the images are refreshed.
|
||||
// There is no need to present swapchain for this frame.
|
||||
const uint32_t imageCount = aznumeric_cast<uint32_t>(m_images.size());
|
||||
if (imageCount == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_currentImageIndex = PresentInternal();
|
||||
AZ_Assert(m_currentImageIndex < imageCount, "Invalid image index");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,14 +59,26 @@ namespace AZ
|
||||
m_swapChainBarrier.m_isValid = true;
|
||||
}
|
||||
|
||||
void SwapChain::ProcessRecreation()
|
||||
{
|
||||
if (m_pendingRecreation)
|
||||
{
|
||||
ShutdownImages();
|
||||
InvalidateNativeSwapChain();
|
||||
CreateSwapchain();
|
||||
InitImages();
|
||||
|
||||
m_pendingRecreation = false;
|
||||
}
|
||||
}
|
||||
|
||||
void SwapChain::SetVerticalSyncIntervalInternal(uint32_t previousVsyncInterval)
|
||||
{
|
||||
if (GetDescriptor().m_verticalSyncInterval == 0 || previousVsyncInterval == 0)
|
||||
{
|
||||
// The presentation mode may change when transitioning to or from a vsynced presentation mode
|
||||
// In this case, the swapchain must be recreated.
|
||||
InvalidateNativeSwapChain();
|
||||
CreateSwapchain();
|
||||
m_pendingRecreation = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -231,8 +243,7 @@ namespace AZ
|
||||
// VK_SUBOPTIMAL_KHR is treated as success, but we better update the surface info as well.
|
||||
if (result == VK_ERROR_OUT_OF_DATE_KHR || result == VK_SUBOPTIMAL_KHR)
|
||||
{
|
||||
InvalidateNativeSwapChain();
|
||||
CreateSwapchain();
|
||||
m_pendingRecreation = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -246,18 +257,16 @@ namespace AZ
|
||||
}
|
||||
};
|
||||
|
||||
m_presentationQueue->QueueCommand(AZStd::move(presentCommand));
|
||||
|
||||
uint32_t acquiredImageIndex = GetCurrentImageIndex();
|
||||
RHI::ResultCode result = AcquireNewImage(&acquiredImageIndex);
|
||||
if (result == RHI::ResultCode::Fail)
|
||||
{
|
||||
InvalidateNativeSwapChain();
|
||||
CreateSwapchain();
|
||||
m_pendingRecreation = true;
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_presentationQueue->QueueCommand(AZStd::move(presentCommand));
|
||||
return acquiredImageIndex;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,6 +51,7 @@ namespace AZ
|
||||
|
||||
void QueueBarrier(const VkPipelineStageFlags src, const VkPipelineStageFlags dst, const VkImageMemoryBarrier& imageBarrier);
|
||||
|
||||
void ProcessRecreation() override;
|
||||
private:
|
||||
SwapChain() = default;
|
||||
|
||||
|
||||
@@ -56,8 +56,8 @@ namespace AZ
|
||||
OwnerRenderPipeline = AZ_BIT(5)
|
||||
};
|
||||
|
||||
void SetOwenrScene(const Scene* scene);
|
||||
void SetOwenrRenderPipeline(const RenderPipeline* renderPipeline);
|
||||
void SetOwnerScene(const Scene* scene);
|
||||
void SetOwnerRenderPipeline(const RenderPipeline* renderPipeline);
|
||||
void SetPassName(Name passName);
|
||||
void SetTemplateName(Name passTemplateName);
|
||||
void SetPassClass(TypeId passClassTypeId);
|
||||
|
||||
@@ -2088,7 +2088,7 @@ namespace AZ
|
||||
AZ::Vector3 vpos; //note: it seems to be fastest to reuse a local Vector3 rather than constructing new ones each loop iteration
|
||||
for (uint32_t i = 0; i < elementCount; ++i)
|
||||
{
|
||||
vpos.Set(const_cast<float*>(reinterpret_cast<const float*>(&buffer[i])));
|
||||
vpos.Set(reinterpret_cast<const float*>(&buffer[i]));
|
||||
aabb.AddPoint(vpos);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -90,13 +90,13 @@ namespace AZ
|
||||
return filter;
|
||||
}
|
||||
|
||||
void PassFilter::SetOwenrScene(const Scene* scene)
|
||||
void PassFilter::SetOwnerScene(const Scene* scene)
|
||||
{
|
||||
m_ownerScene = scene;
|
||||
UpdateFilterOptions();
|
||||
}
|
||||
|
||||
void PassFilter::SetOwenrRenderPipeline(const RenderPipeline* renderPipeline)
|
||||
void PassFilter::SetOwnerRenderPipeline(const RenderPipeline* renderPipeline)
|
||||
{
|
||||
m_ownerRenderPipeline = renderPipeline;
|
||||
UpdateFilterOptions();
|
||||
|
||||
@@ -201,23 +201,11 @@ namespace AZ
|
||||
AZ::Vector3& normal) const
|
||||
{
|
||||
const BufferAssetView& indexBufferView = mesh.GetIndexBufferAssetView();
|
||||
const AZStd::array_view<ModelLodAsset::Mesh::StreamBufferInfo>& streamBufferList = mesh.GetStreamBufferInfoList();
|
||||
const BufferAssetView* positionBufferView = mesh.GetSemanticBufferAssetView(m_positionName);
|
||||
|
||||
// find position semantic
|
||||
const ModelLodAsset::Mesh::StreamBufferInfo* positionBuffer = nullptr;
|
||||
|
||||
for (const ModelLodAsset::Mesh::StreamBufferInfo& bufferInfo : streamBufferList)
|
||||
if (positionBufferView && positionBufferView->GetBufferAsset().Get())
|
||||
{
|
||||
if (bufferInfo.m_semantic.m_name == m_positionName)
|
||||
{
|
||||
positionBuffer = &bufferInfo;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (positionBuffer && positionBuffer->m_bufferAssetView.GetBufferAsset().Get())
|
||||
{
|
||||
BufferAsset* bufferAssetViewPtr = positionBuffer->m_bufferAssetView.GetBufferAsset().Get();
|
||||
BufferAsset* bufferAssetViewPtr = positionBufferView->GetBufferAsset().Get();
|
||||
BufferAsset* indexAssetViewPtr = indexBufferView.GetBufferAsset().Get();
|
||||
|
||||
if (!bufferAssetViewPtr || !indexAssetViewPtr)
|
||||
@@ -225,7 +213,7 @@ namespace AZ
|
||||
return false;
|
||||
}
|
||||
|
||||
RHI::BufferViewDescriptor positionBufferViewDesc = bufferAssetViewPtr->GetBufferViewDescriptor();
|
||||
RHI::BufferViewDescriptor positionBufferViewDesc = positionBufferView->GetBufferViewDescriptor();
|
||||
AZStd::array_view<uint8_t> positionRawBuffer = bufferAssetViewPtr->GetBuffer();
|
||||
|
||||
const uint32_t positionElementSize = positionBufferViewDesc.m_elementSize;
|
||||
@@ -234,22 +222,28 @@ namespace AZ
|
||||
// Position is 3 floats
|
||||
if (positionElementSize != sizeof(float) * 3)
|
||||
{
|
||||
AZ_Warning("ModelAsset", false, "unsupported mesh posiiton format, only full 3 floats per vertex are supported at the moment");
|
||||
AZ_Warning(
|
||||
"ModelAsset", false, "unsupported mesh posiiton format, only full 3 floats per vertex are supported at the moment");
|
||||
return false;
|
||||
}
|
||||
|
||||
RHI::BufferViewDescriptor indexBufferViewDesc = indexBufferView.GetBufferViewDescriptor();
|
||||
AZStd::array_view<uint8_t> indexRawBuffer = indexAssetViewPtr->GetBuffer();
|
||||
RHI::BufferViewDescriptor indexRawDesc = indexAssetViewPtr->GetBufferViewDescriptor();
|
||||
|
||||
bool anyHit = false;
|
||||
|
||||
const AZ::Vector3 rayEnd = rayStart + rayDir;
|
||||
AZ::Vector3 a, b, c;
|
||||
AZ::Vector3 intersectionNormal;
|
||||
|
||||
bool anyHit = false;
|
||||
float shortestDistanceNormalized = AZStd::numeric_limits<float>::max();
|
||||
const AZ::u32* indexPtr = reinterpret_cast<const AZ::u32*>(indexRawBuffer.data());
|
||||
for (uint32_t indexIter = 0; indexIter <= indexRawDesc.m_elementCount - 3; indexIter += 3, indexPtr += 3)
|
||||
|
||||
const AZ::u32* indexPtr = reinterpret_cast<const AZ::u32*>(
|
||||
indexRawBuffer.data() + (indexBufferViewDesc.m_elementOffset * indexBufferViewDesc.m_elementSize));
|
||||
const float* positionPtr = reinterpret_cast<const float*>(
|
||||
positionRawBuffer.data() + (positionBufferViewDesc.m_elementOffset * positionBufferViewDesc.m_elementSize));
|
||||
|
||||
constexpr int StepSize = 3; // number of values per vertex (x, y, z)
|
||||
for (uint32_t indexIter = 0; indexIter < indexBufferViewDesc.m_elementCount; indexIter += StepSize, indexPtr += StepSize)
|
||||
{
|
||||
AZ::u32 index0 = indexPtr[0];
|
||||
AZ::u32 index1 = indexPtr[1];
|
||||
@@ -261,17 +255,17 @@ namespace AZ
|
||||
return false;
|
||||
}
|
||||
|
||||
const float* p = reinterpret_cast<const float*>(&positionRawBuffer[index0 * positionElementSize]);
|
||||
a.Set(const_cast<float*>(p)); // faster than AZ::Vector3 c-tor
|
||||
|
||||
p = reinterpret_cast<const float*>(&positionRawBuffer[index1 * positionElementSize]);
|
||||
b.Set(const_cast<float*>(p));
|
||||
|
||||
p = reinterpret_cast<const float*>(&positionRawBuffer[index2 * positionElementSize]);
|
||||
c.Set(const_cast<float*>(p));
|
||||
// faster than AZ::Vector3 c-tor
|
||||
const float* aRef = &positionPtr[index0 * StepSize];
|
||||
a.Set(aRef);
|
||||
const float* bRef = &positionPtr[index1 * StepSize];
|
||||
b.Set(bRef);
|
||||
const float* cRef = &positionPtr[index2 * StepSize];
|
||||
c.Set(cRef);
|
||||
|
||||
float currentDistanceNormalized;
|
||||
if (AZ::Intersect::IntersectSegmentTriangleCCW(rayStart, rayEnd, a, b, c, intersectionNormal, currentDistanceNormalized))
|
||||
if (AZ::Intersect::IntersectSegmentTriangleCCW(
|
||||
rayStart, rayEnd, a, b, c, intersectionNormal, currentDistanceNormalized))
|
||||
{
|
||||
anyHit = true;
|
||||
|
||||
|
||||
@@ -46,7 +46,6 @@ namespace UnitTest
|
||||
bool DeleteEntity(const AZ::EntityId&) override { return false; }
|
||||
AZ::Entity* FindEntity(const AZ::EntityId&) override { return nullptr; }
|
||||
AZ::BehaviorContext* GetBehaviorContext() override { return nullptr; }
|
||||
const char* GetAppRoot() const override { return nullptr; }
|
||||
const char* GetEngineRoot() const override { return nullptr; }
|
||||
const char* GetExecutableFolder() const override { return nullptr; }
|
||||
void EnumerateEntities(const EntityCallback& /*callback*/) override {}
|
||||
|
||||
@@ -44,7 +44,6 @@ namespace UnitTest
|
||||
AZ::Entity* FindEntity(const AZ::EntityId&) override { return nullptr; }
|
||||
AZ::BehaviorContext* GetBehaviorContext() override { return nullptr; }
|
||||
AZ::JsonRegistrationContext* GetJsonRegistrationContext() override { return nullptr; }
|
||||
const char* GetAppRoot() const override { return nullptr; }
|
||||
const char* GetEngineRoot() const override { return nullptr; }
|
||||
const char* GetExecutableFolder() const override { return nullptr; }
|
||||
void EnumerateEntities(const EntityCallback& /*callback*/) override {}
|
||||
|
||||
@@ -38,7 +38,7 @@ namespace UnitTest
|
||||
bufferData.resize(bufferSize);
|
||||
|
||||
//The actual data doesn't matter
|
||||
const uint8_t bufferDataSize = static_cast<uint8_t>(bufferData.size());
|
||||
const uint8_t bufferDataSize = aznumeric_cast<uint8_t>(bufferData.size());
|
||||
for (uint8_t i = 0; i < bufferDataSize; ++i)
|
||||
{
|
||||
bufferData[i] = i;
|
||||
@@ -248,7 +248,8 @@ namespace UnitTest
|
||||
return asset;
|
||||
}
|
||||
|
||||
AZ::Data::Asset<AZ::RPI::ModelAsset> BuildTestModel(const uint32_t lodCount, const uint32_t sharedMeshCount, const uint32_t separateMeshCount, ExpectedModel& expectedModel)
|
||||
AZ::Data::Asset<AZ::RPI::ModelAsset> BuildTestModel(
|
||||
const uint32_t lodCount, const uint32_t sharedMeshCount, const uint32_t separateMeshCount, ExpectedModel& expectedModel)
|
||||
{
|
||||
using namespace AZ;
|
||||
|
||||
@@ -989,6 +990,9 @@ namespace UnitTest
|
||||
uint32_t{ 0 }, 2, 1, 1, 2, 3, 4, 5, 6, 5, 7, 6, 0, 4, 2, 4, 6, 2, 1, 3, 5, 5, 3, 7, 0, 1, 4, 4, 1, 5, 2, 6, 3, 6, 7, 3,
|
||||
};
|
||||
|
||||
static constexpr AZStd::array QuadPositions = { -1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f };
|
||||
static constexpr AZStd::array QuadIndices = { uint32_t{ 0 }, 2, 1, 1, 2, 3 };
|
||||
|
||||
// This class creates a Model with one LOD, whose mesh contains 2 planes. Plane 1 is in the XY plane at Z=-0.5, and
|
||||
// plane 2 is in the XY plane at Z=0.5. The two planes each have 9 quads which have been triangulated. It only has
|
||||
// a position and index buffer.
|
||||
@@ -1031,42 +1035,80 @@ namespace UnitTest
|
||||
static constexpr inline auto minmaxElement = AZStd::minmax_element(begin(TwoSeparatedPlanesIndices), end(TwoSeparatedPlanesIndices));
|
||||
static_assert(*minmaxElement.second == (TwoSeparatedPlanesPositions.size() / 3) - 1);
|
||||
|
||||
template<class x> class TD;
|
||||
class TestMesh
|
||||
{
|
||||
public:
|
||||
TestMesh() = default;
|
||||
|
||||
TestMesh(const float* positions, size_t positionCount, const uint32_t* indices, size_t indicesCount)
|
||||
{
|
||||
AZ::RPI::ModelLodAssetCreator lodCreator;
|
||||
lodCreator.Begin(AZ::Data::AssetId(AZ::Uuid::CreateRandom()));
|
||||
Begin(lodCreator);
|
||||
Add(lodCreator, positions, positionCount, /*positionOffset=*/0, indices, indicesCount, /*indexOffset=*/0);
|
||||
End(lodCreator);
|
||||
}
|
||||
|
||||
// initiate the asset lod creation process (note: End must be called after meshes have been added).
|
||||
void Begin(AZ::RPI::ModelLodAssetCreator& lodCreator)
|
||||
{
|
||||
lodCreator.Begin(AZ::Data::AssetId(AZ::Uuid::CreateRandom()));
|
||||
}
|
||||
|
||||
// add a sub mesh and reuse existing position/index buffer (be very careful with the offsets used)
|
||||
void Add(
|
||||
AZ::RPI::ModelLodAssetCreator& lodCreator,
|
||||
const float* positions,
|
||||
size_t positionCount,
|
||||
size_t positionOffset,
|
||||
AZ::Data::Asset<AZ::RPI::BufferAsset> positionBuffer,
|
||||
const uint32_t* indices,
|
||||
size_t indexCount,
|
||||
size_t indexOffset,
|
||||
AZ::Data::Asset<AZ::RPI::BufferAsset> indexBuffer)
|
||||
{
|
||||
lodCreator.BeginMesh();
|
||||
lodCreator.SetMeshAabb(AZ::Aabb::CreateFromMinMax({-1.0f, -1.0f, -0.5f}, {1.0f, 1.0f, 0.5f}));
|
||||
lodCreator.SetMeshAabb(AZ::Aabb::CreateFromMinMax({ -1.0f, -1.0f, -0.5f }, { 1.0f, 1.0f, 0.5f }));
|
||||
lodCreator.SetMeshMaterialSlot(AZ::Sfmt::GetInstance().Rand32());
|
||||
|
||||
{
|
||||
AZ::Data::Asset<AZ::RPI::BufferAsset> indexBuffer = BuildTestBuffer(static_cast<uint32_t>(indicesCount), sizeof(uint32_t));
|
||||
AZStd::copy(indices, indices + indicesCount, reinterpret_cast<uint32_t*>(const_cast<uint8_t*>(indexBuffer->GetBuffer().data())));
|
||||
lodCreator.SetMeshIndexBuffer({
|
||||
indexBuffer,
|
||||
AZ::RHI::BufferViewDescriptor::CreateStructured(0, static_cast<uint32_t>(indicesCount), sizeof(uint32_t))
|
||||
});
|
||||
}
|
||||
AZStd::copy(
|
||||
indices, indices + indexCount,
|
||||
reinterpret_cast<uint32_t*>(const_cast<uint8_t*>(indexBuffer->GetBuffer().data())) + indexOffset);
|
||||
lodCreator.SetMeshIndexBuffer(
|
||||
{ indexBuffer,
|
||||
AZ::RHI::BufferViewDescriptor::CreateStructured(
|
||||
aznumeric_cast<uint32_t>(indexOffset), aznumeric_cast<uint32_t>(indexCount), sizeof(uint32_t)) });
|
||||
AZStd::copy(
|
||||
positions, positions + positionCount,
|
||||
reinterpret_cast<float*>(const_cast<uint8_t*>(positionBuffer->GetBuffer().data())) + positionOffset);
|
||||
lodCreator.AddMeshStreamBuffer(
|
||||
AZ::RHI::ShaderSemantic(AZ::Name("POSITION")), AZ::Name(),
|
||||
{ positionBuffer,
|
||||
AZ::RHI::BufferViewDescriptor::CreateStructured(
|
||||
aznumeric_cast<uint32_t>(positionOffset / 3), aznumeric_cast<uint32_t>(positionCount / 3), sizeof(float) * 3) });
|
||||
|
||||
{
|
||||
AZ::Data::Asset<AZ::RPI::BufferAsset> positionBuffer = BuildTestBuffer(static_cast<uint32_t>(positionCount / 3), sizeof(float) * 3);
|
||||
AZStd::copy(positions, positions + positionCount, reinterpret_cast<float*>(const_cast<uint8_t*>(positionBuffer->GetBuffer().data())));
|
||||
lodCreator.AddMeshStreamBuffer(
|
||||
AZ::RHI::ShaderSemantic(AZ::Name("POSITION")),
|
||||
AZ::Name(),
|
||||
{
|
||||
positionBuffer,
|
||||
AZ::RHI::BufferViewDescriptor::CreateStructured(0, static_cast<uint32_t>(positionCount / 3), sizeof(float) * 3)
|
||||
}
|
||||
);
|
||||
}
|
||||
lodCreator.EndMesh();
|
||||
}
|
||||
|
||||
// overload of Add - here a new index/position buffer is created for the new data instead of potentially reusing an existing buffer
|
||||
void Add(
|
||||
AZ::RPI::ModelLodAssetCreator& lodCreator,
|
||||
const float* positions,
|
||||
size_t positionCount,
|
||||
size_t positionOffset,
|
||||
const uint32_t* indices,
|
||||
size_t indexCount,
|
||||
size_t indexOffset)
|
||||
{
|
||||
AZ::Data::Asset<AZ::RPI::BufferAsset> indexBuffer = BuildTestBuffer(aznumeric_cast<uint32_t>(indexCount), sizeof(uint32_t));
|
||||
AZ::Data::Asset<AZ::RPI::BufferAsset> positionBuffer =
|
||||
BuildTestBuffer(aznumeric_cast<uint32_t>(positionCount / 3), sizeof(float) * 3);
|
||||
|
||||
Add(lodCreator, positions, positionCount, positionOffset, positionBuffer, indices, indexCount, indexOffset, indexBuffer);
|
||||
}
|
||||
|
||||
// complete the asset lod creation process
|
||||
void End(AZ::RPI::ModelLodAssetCreator& lodCreator)
|
||||
{
|
||||
AZ::Data::Asset<AZ::RPI::ModelLodAsset> lodAsset;
|
||||
lodCreator.End(lodAsset);
|
||||
|
||||
@@ -1199,7 +1241,7 @@ namespace UnitTest
|
||||
constexpr float rayLength = 100.0f;
|
||||
EXPECT_THAT(
|
||||
m_kdTree->RayIntersection(
|
||||
AZ::Vector3::CreateZero(), AZ::Vector3::CreateAxisZ(-rayLength), t, normal), testing::Eq(true));
|
||||
AZ::Vector3::CreateZero(), AZ::Vector3::CreateAxisZ(-rayLength), t, normal), testing::IsTrue());
|
||||
EXPECT_THAT(t, testing::FloatEq(0.005f));
|
||||
}
|
||||
|
||||
@@ -1210,7 +1252,7 @@ namespace UnitTest
|
||||
|
||||
constexpr float rayLength = 10.0f;
|
||||
EXPECT_THAT(
|
||||
m_kdTree->RayIntersection(AZ::Vector3::CreateAxisZ(0.75f), AZ::Vector3::CreateAxisZ(-rayLength), t, normal), testing::Eq(true));
|
||||
m_kdTree->RayIntersection(AZ::Vector3::CreateAxisZ(0.75f), AZ::Vector3::CreateAxisZ(-rayLength), t, normal), testing::IsTrue());
|
||||
EXPECT_THAT(t, testing::FloatEq(0.025f));
|
||||
}
|
||||
|
||||
@@ -1288,7 +1330,7 @@ namespace UnitTest
|
||||
EXPECT_THAT(
|
||||
m_mesh->GetModel()->LocalRayIntersectionAgainstModel(
|
||||
AZ::Vector3::CreateAxisZ(5.0f), -AZ::Vector3::CreateAxisZ(10.0f), AllowBruteForce, t, normal),
|
||||
testing::Eq(true));
|
||||
testing::IsTrue());
|
||||
EXPECT_THAT(t, testing::FloatEq(0.4f));
|
||||
}
|
||||
|
||||
@@ -1302,8 +1344,87 @@ namespace UnitTest
|
||||
EXPECT_THAT(
|
||||
m_mesh->GetModel()->LocalRayIntersectionAgainstModel(
|
||||
AZ::Vector3::CreateAxisY(10.0f), -AZ::Vector3::CreateAxisY(9.0f), AllowBruteForce, t, normal),
|
||||
testing::Eq(true));
|
||||
testing::IsTrue());
|
||||
EXPECT_THAT(t, testing::FloatEq(1.0f));
|
||||
EXPECT_THAT(normal, IsClose(AZ::Vector3::CreateAxisY()));
|
||||
}
|
||||
|
||||
// test to verify that each secondary sub meshes are still intersected with correctly when using brute-force
|
||||
// ray intersection
|
||||
class BruteForceMultiModelIntersectsFixture : public ModelTests
|
||||
{
|
||||
public:
|
||||
inline static const float QuadOffsetX = 15.0f;
|
||||
|
||||
void SetUp() override
|
||||
{
|
||||
ModelTests::SetUp();
|
||||
m_mesh = AZStd::make_unique<TestMesh>();
|
||||
|
||||
AZ::RPI::ModelLodAssetCreator lodCreator;
|
||||
m_mesh->Begin(lodCreator);
|
||||
|
||||
// take default quad positions and offset in X by set amount
|
||||
AZStd::vector<float> offsetQuadPositions;
|
||||
offsetQuadPositions.resize(QuadPositions.size());
|
||||
AZStd::copy(QuadPositions.begin(), QuadPositions.end(), offsetQuadPositions.begin());
|
||||
for (size_t xVertIndex = 0; xVertIndex < offsetQuadPositions.size(); xVertIndex += 3)
|
||||
{
|
||||
offsetQuadPositions[xVertIndex] += QuadOffsetX;
|
||||
}
|
||||
|
||||
// create shared buffer to store cube and quad mesh in the same buffer
|
||||
const size_t indicesCount = QuadIndices.size() + CubeIndices.size();
|
||||
const size_t positionCount = QuadPositions.size() + CubePositions.size();
|
||||
AZ::Data::Asset<AZ::RPI::BufferAsset> indexBuffer = BuildTestBuffer(aznumeric_cast<uint32_t>(indicesCount), sizeof(uint32_t));
|
||||
AZ::Data::Asset<AZ::RPI::BufferAsset> positionBuffer =
|
||||
BuildTestBuffer(aznumeric_cast<uint32_t>(positionCount / 3), sizeof(float) * 3);
|
||||
|
||||
// add the cube mesh
|
||||
m_mesh->Add(
|
||||
lodCreator, CubePositions.data(), CubePositions.size(), 0, positionBuffer, CubeIndices.data(), CubeIndices.size(), 0,
|
||||
indexBuffer);
|
||||
// add the quad mesh (offset by the cube position and index data into the same buffer)
|
||||
m_mesh->Add(
|
||||
lodCreator, offsetQuadPositions.data(), offsetQuadPositions.size(), /*offset=*/CubePositions.size(), positionBuffer,
|
||||
QuadIndices.data(), QuadIndices.size(), /*offset=*/CubeIndices.size(), indexBuffer);
|
||||
|
||||
m_mesh->End(lodCreator);
|
||||
}
|
||||
|
||||
void TearDown() override
|
||||
{
|
||||
m_mesh.reset();
|
||||
ModelTests::TearDown();
|
||||
}
|
||||
|
||||
AZStd::unique_ptr<TestMesh> m_mesh;
|
||||
inline static constexpr bool AllowBruteForce = false;
|
||||
};
|
||||
|
||||
TEST_F(BruteForceMultiModelIntersectsFixture, RayIntersectsWithFirstSubMesh)
|
||||
{
|
||||
float t = 0.0f;
|
||||
AZ::Vector3 normal = AZ::Vector3::CreateOne(); // invalid starting normal
|
||||
// fire a ray at the first sub mesh and ensure a successful hit is returned
|
||||
EXPECT_THAT(
|
||||
m_mesh->GetModel()->LocalRayIntersectionAgainstModel(
|
||||
AZ::Vector3(0.0f, 0.0f, 5.0f), -AZ::Vector3::CreateAxisZ(10.0f), AllowBruteForce, t, normal),
|
||||
testing::IsTrue());
|
||||
EXPECT_THAT(t, testing::FloatEq(0.4f));
|
||||
EXPECT_THAT(normal, IsClose(AZ::Vector3::CreateAxisZ()));
|
||||
}
|
||||
|
||||
TEST_F(BruteForceMultiModelIntersectsFixture, RayIntersectsWithSecondSubMesh)
|
||||
{
|
||||
float t = 0.0f;
|
||||
AZ::Vector3 normal = AZ::Vector3::CreateOne(); // invalid starting normal
|
||||
// fire a ray at the second sub mesh and ensure a successful hit is returned
|
||||
EXPECT_THAT(
|
||||
m_mesh->GetModel()->LocalRayIntersectionAgainstModel(
|
||||
AZ::Vector3(QuadOffsetX, 0.0f, 5.0f), -AZ::Vector3::CreateAxisZ(10.0f), AllowBruteForce, t, normal),
|
||||
testing::IsTrue());
|
||||
EXPECT_THAT(t, testing::FloatEq(0.5f));
|
||||
EXPECT_THAT(normal, IsClose(AZ::Vector3::CreateAxisZ()));
|
||||
}
|
||||
} // namespace UnitTest
|
||||
|
||||
+3
-4
@@ -33,7 +33,7 @@
|
||||
},
|
||||
"subsurfaceScattering": {
|
||||
"enableSubsurfaceScattering": true,
|
||||
"influenceMap": "Objects/Lucy/Lucy_thickness.tif",
|
||||
"influenceMap": "TestData/Textures/checker8x8_gray_512.png",
|
||||
"scatterDistance": 15.0,
|
||||
"subsurfaceScatterFactor": 0.4300000071525574,
|
||||
"thicknessMap": "Objects/Lucy/Lucy_thickness.tif",
|
||||
@@ -47,8 +47,7 @@
|
||||
0.3182879388332367,
|
||||
0.16388189792633058,
|
||||
1.0
|
||||
],
|
||||
"useInfluenceMap": false
|
||||
]
|
||||
},
|
||||
"wrinkleLayers": {
|
||||
"baseColorMap1": "TestData/Textures/cc0/Lava004_1K_Color.jpg",
|
||||
@@ -61,4 +60,4 @@
|
||||
"normalMap2": "TestData/Textures/TextureHaven/4k_castle_brick_02_red/4k_castle_brick_02_red_normal.png"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -133,29 +133,12 @@ namespace AtomToolsFramework
|
||||
|
||||
bool LaunchTool(const QString& baseName, const QString& extension, const QStringList& arguments)
|
||||
{
|
||||
const char* engineRoot = nullptr;
|
||||
AzFramework::ApplicationRequests::Bus::BroadcastResult(engineRoot, &AzFramework::ApplicationRequests::GetEngineRoot);
|
||||
AZ_Assert(engineRoot != nullptr, "AzFramework::ApplicationRequests::GetEngineRoot failed");
|
||||
AZ::IO::FixedMaxPath engineRoot = AZ::Utils::GetEnginePath();
|
||||
AZ_Assert(!engineRoot.empty(), "Cannot query Engine Path");
|
||||
|
||||
char binFolderName[AZ_MAX_PATH_LEN] = {};
|
||||
AZ::Utils::GetExecutablePathReturnType ret = AZ::Utils::GetExecutablePath(binFolderName, AZ_MAX_PATH_LEN);
|
||||
AZ::IO::FixedMaxPath launchPath = AZ::IO::FixedMaxPath(AZ::Utils::GetExecutableDirectory())
|
||||
/ (baseName + extension).toUtf8().constData();
|
||||
|
||||
// If it contains the filename, zero out the last path separator character...
|
||||
if (ret.m_pathIncludesFilename)
|
||||
{
|
||||
char* lastSlash = strrchr(binFolderName, AZ_CORRECT_FILESYSTEM_SEPARATOR);
|
||||
if (lastSlash)
|
||||
{
|
||||
*lastSlash = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
const QString path = QString("%1%2%3%4")
|
||||
.arg(binFolderName)
|
||||
.arg(AZ_CORRECT_FILESYSTEM_SEPARATOR_STRING)
|
||||
.arg(baseName)
|
||||
.arg(extension);
|
||||
|
||||
return QProcess::startDetached(path, arguments, engineRoot);
|
||||
return QProcess::startDetached(launchPath.c_str(), arguments, engineRoot.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,11 +19,11 @@
|
||||
|
||||
#include <Atom/Utils/DdsFile.h>
|
||||
|
||||
#include <AzFramework/API/ApplicationAPI.h>
|
||||
|
||||
#include <AzCore/IO/GenericStreams.h>
|
||||
#include <AzCore/IO/SystemFile.h>
|
||||
#include <AzCore/IO/FileIO.h>
|
||||
#include <AzCore/Utils/Utils.h>
|
||||
|
||||
#ifndef SCRIPTABLE_IMGUI
|
||||
#define Scriptable_ImGui ImGui
|
||||
@@ -334,11 +334,10 @@ namespace AZ::Render
|
||||
|
||||
if (m_engineRoot.empty())
|
||||
{
|
||||
const char* engineRoot = nullptr;
|
||||
AzFramework::ApplicationRequests::Bus::BroadcastResult(engineRoot, &AzFramework::ApplicationRequests::GetEngineRoot);
|
||||
if (engineRoot)
|
||||
AZ::IO::FixedMaxPathString engineRoot = AZ::Utils::GetEnginePath();
|
||||
if (!engineRoot.empty())
|
||||
{
|
||||
m_engineRoot = AZStd::string(engineRoot);
|
||||
m_engineRoot = AZStd::string_view(engineRoot);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+20
@@ -40,6 +40,7 @@ namespace AZ
|
||||
->Field("bakedCubeMapQualityLevel", &EditorReflectionProbeComponent::m_bakedCubeMapQualityLevel)
|
||||
->Field("bakedCubeMapRelativePath", &EditorReflectionProbeComponent::m_bakedCubeMapRelativePath)
|
||||
->Field("authoredCubeMapAsset", &EditorReflectionProbeComponent::m_authoredCubeMapAsset)
|
||||
->Field("bakeExposure", &EditorReflectionProbeComponent::m_bakeExposure)
|
||||
;
|
||||
|
||||
if (AZ::EditContext* editContext = serializeContext->GetEditContext())
|
||||
@@ -62,6 +63,13 @@ namespace AZ
|
||||
->Attribute(AZ::Edit::Attributes::ButtonText, "Bake Reflection Probe")
|
||||
->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorReflectionProbeComponent::BakeReflectionProbe)
|
||||
->Attribute(AZ::Edit::Attributes::Visibility, &EditorReflectionProbeComponent::GetBakedCubemapVisibilitySetting)
|
||||
->DataElement(AZ::Edit::UIHandlers::Slider, &EditorReflectionProbeComponent::m_bakeExposure, "Bake Exposure", "Exposure to use when baking the cubemap")
|
||||
->Attribute(AZ::Edit::Attributes::SoftMin, -16.0f)
|
||||
->Attribute(AZ::Edit::Attributes::SoftMax, 16.0f)
|
||||
->Attribute(AZ::Edit::Attributes::Min, -20.0f)
|
||||
->Attribute(AZ::Edit::Attributes::Max, 20.0f)
|
||||
->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorReflectionProbeComponent::OnBakeExposureChanged)
|
||||
->Attribute(AZ::Edit::Attributes::Visibility, &EditorReflectionProbeComponent::GetBakedCubemapVisibilitySetting)
|
||||
->ClassElement(AZ::Edit::ClassElements::Group, "Cubemap")
|
||||
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
|
||||
->DataElement(AZ::Edit::UIHandlers::Default, &EditorReflectionProbeComponent::m_useBakedCubemap, "Use Baked Cubemap", "Selects between a cubemap that captures the environment at location in the scene or a preauthored cubemap")
|
||||
@@ -111,6 +119,11 @@ namespace AZ
|
||||
->Attribute(AZ::Edit::Attributes::ChangeNotify, Edit::PropertyRefreshLevels::ValuesOnly)
|
||||
->DataElement(AZ::Edit::UIHandlers::CheckBox, &ReflectionProbeComponentConfig::m_showVisualization, "Show Visualization", "Show the reflection probe visualization sphere")
|
||||
->Attribute(AZ::Edit::Attributes::ChangeNotify, Edit::PropertyRefreshLevels::ValuesOnly)
|
||||
->DataElement(AZ::Edit::UIHandlers::Slider, &ReflectionProbeComponentConfig::m_renderExposure, "Exposure", "Exposure to use when rendering meshes with the cubemap")
|
||||
->Attribute(AZ::Edit::Attributes::SoftMin, -5.0f)
|
||||
->Attribute(AZ::Edit::Attributes::SoftMax, 5.0f)
|
||||
->Attribute(AZ::Edit::Attributes::Min, -20.0f)
|
||||
->Attribute(AZ::Edit::Attributes::Max, 20.0f)
|
||||
;
|
||||
}
|
||||
}
|
||||
@@ -275,6 +288,13 @@ namespace AZ
|
||||
return AZ::Edit::PropertyRefreshLevels::None;
|
||||
}
|
||||
|
||||
AZ::u32 EditorReflectionProbeComponent::OnBakeExposureChanged()
|
||||
{
|
||||
m_controller.SetBakeExposure(m_bakeExposure);
|
||||
|
||||
return AZ::Edit::PropertyRefreshLevels::None;
|
||||
}
|
||||
|
||||
AZ::u32 EditorReflectionProbeComponent::GetBakedCubemapVisibilitySetting()
|
||||
{
|
||||
// controls specific to baked cubemaps call this to determine their visibility
|
||||
|
||||
+2
@@ -55,6 +55,7 @@ namespace AZ
|
||||
// change notifications
|
||||
AZ::u32 OnUseBakedCubemapChanged();
|
||||
AZ::u32 OnAuthoredCubemapChanged();
|
||||
AZ::u32 OnBakeExposureChanged();
|
||||
|
||||
// retrieves visibility for baked or authored cubemap controls
|
||||
AZ::u32 GetBakedCubemapVisibilitySetting();
|
||||
@@ -77,6 +78,7 @@ namespace AZ
|
||||
AZStd::string m_bakedCubeMapRelativePath;
|
||||
Data::Asset<RPI::StreamingImageAsset> m_bakedCubeMapAsset;
|
||||
Data::Asset<RPI::StreamingImageAsset> m_authoredCubeMapAsset;
|
||||
float m_bakeExposure = 0.0f;
|
||||
|
||||
// flag indicating if a cubemap bake is currently in progress
|
||||
AZStd::atomic_bool m_bakeInProgress = false;
|
||||
|
||||
+17
-2
@@ -35,7 +35,7 @@ namespace AZ
|
||||
if (auto* serializeContext = azrtti_cast<SerializeContext*>(context))
|
||||
{
|
||||
serializeContext->Class<ReflectionProbeComponentConfig>()
|
||||
->Version(0)
|
||||
->Version(1)
|
||||
->Field("OuterHeight", &ReflectionProbeComponentConfig::m_outerHeight)
|
||||
->Field("OuterLength", &ReflectionProbeComponentConfig::m_outerLength)
|
||||
->Field("OuterWidth", &ReflectionProbeComponentConfig::m_outerWidth)
|
||||
@@ -49,7 +49,9 @@ namespace AZ
|
||||
->Field("AuthoredCubeMapAsset", &ReflectionProbeComponentConfig::m_authoredCubeMapAsset)
|
||||
->Field("EntityId", &ReflectionProbeComponentConfig::m_entityId)
|
||||
->Field("UseParallaxCorrection", &ReflectionProbeComponentConfig::m_useParallaxCorrection)
|
||||
->Field("ShowVisualization", &ReflectionProbeComponentConfig::m_showVisualization);
|
||||
->Field("ShowVisualization", &ReflectionProbeComponentConfig::m_showVisualization)
|
||||
->Field("RenderExposure", &ReflectionProbeComponentConfig::m_renderExposure)
|
||||
->Field("BakeExposure", &ReflectionProbeComponentConfig::m_bakeExposure);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -157,6 +159,9 @@ namespace AZ
|
||||
cubeMapAsset.QueueLoad();
|
||||
Data::AssetBus::MultiHandler::BusConnect(cubeMapAsset.GetId());
|
||||
}
|
||||
|
||||
// set cubemap render exposure
|
||||
m_featureProcessor->SetRenderExposure(m_handle, m_configuration.m_renderExposure);
|
||||
}
|
||||
|
||||
void ReflectionProbeComponentController::Deactivate()
|
||||
@@ -284,6 +289,16 @@ namespace AZ
|
||||
m_configuration.m_innerHeight = AZStd::min(m_configuration.m_innerHeight, m_configuration.m_outerHeight);
|
||||
}
|
||||
|
||||
void ReflectionProbeComponentController::SetBakeExposure(float bakeExposure)
|
||||
{
|
||||
if (!m_featureProcessor)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
m_featureProcessor->SetBakeExposure(m_handle, bakeExposure);
|
||||
}
|
||||
|
||||
void ReflectionProbeComponentController::BakeReflectionProbe(BuildCubeMapCallback callback, const AZStd::string& relativePath)
|
||||
{
|
||||
if (!m_featureProcessor)
|
||||
|
||||
+6
@@ -68,6 +68,9 @@ namespace AZ
|
||||
Data::Asset<RPI::StreamingImageAsset> m_bakedCubeMapAsset;
|
||||
Data::Asset<RPI::StreamingImageAsset> m_authoredCubeMapAsset;
|
||||
AZ::u64 m_entityId{ EntityId::InvalidEntityId };
|
||||
|
||||
float m_renderExposure = 0.0f;
|
||||
float m_bakeExposure = 0.0f;
|
||||
};
|
||||
|
||||
class ReflectionProbeComponentController final
|
||||
@@ -99,6 +102,9 @@ namespace AZ
|
||||
// returns the outer extent Aabb for this reflection
|
||||
AZ::Aabb GetAabb() const;
|
||||
|
||||
// set the exposure to use when baking the cubemap
|
||||
void SetBakeExposure(float bakeExposure);
|
||||
|
||||
// initiate the reflection probe bake, invokes callback when complete
|
||||
void BakeReflectionProbe(BuildCubeMapCallback callback, const AZStd::string& relativePath);
|
||||
|
||||
|
||||
@@ -776,12 +776,14 @@ namespace AZ
|
||||
{
|
||||
if (m_meshHandle)
|
||||
{
|
||||
Data::Instance<RPI::ShaderResourceGroup> wrinkleMaskObjectSrg = m_meshFeatureProcessor->GetObjectSrg(*m_meshHandle);
|
||||
if (wrinkleMaskObjectSrg)
|
||||
const AZStd::vector<Data::Instance<RPI::ShaderResourceGroup>>& wrinkleMaskObjectSrgs = m_meshFeatureProcessor->GetObjectSrgs(*m_meshHandle);
|
||||
|
||||
for (auto& wrinkleMaskObjectSrg : wrinkleMaskObjectSrgs)
|
||||
{
|
||||
RHI::ShaderInputImageIndex wrinkleMasksIndex = wrinkleMaskObjectSrg->FindShaderInputImageIndex(Name{ "m_wrinkle_masks" });
|
||||
RHI::ShaderInputConstantIndex wrinkleMaskWeightsIndex = wrinkleMaskObjectSrg->FindShaderInputConstantIndex(Name{ "m_wrinkle_mask_weights" });
|
||||
RHI::ShaderInputConstantIndex wrinkleMaskCountIndex = wrinkleMaskObjectSrg->FindShaderInputConstantIndex(Name{ "m_wrinkle_mask_count" });
|
||||
|
||||
if (wrinkleMasksIndex.IsValid() || wrinkleMaskWeightsIndex.IsValid() || wrinkleMaskCountIndex.IsValid())
|
||||
{
|
||||
AZ_Error("AtomActorInstance", wrinkleMasksIndex.IsValid(), "m_wrinkle_masks not found on the ObjectSrg, but m_wrinkle_mask_weights and/or m_wrinkle_mask_count are being used.");
|
||||
|
||||
@@ -9,8 +9,6 @@
|
||||
|
||||
#include <ImplementationManager.h>
|
||||
|
||||
#include <AzFramework/Application/Application.h>
|
||||
|
||||
#include <ATLControlsModel.h>
|
||||
#include <AudioControlsEditorPlugin.h>
|
||||
#include <IAudioSystemEditor.h>
|
||||
@@ -32,10 +30,6 @@ bool CImplementationManager::LoadImplementation()
|
||||
// release the loaded implementation (if any)
|
||||
Release();
|
||||
|
||||
const char* engineRoot = nullptr;
|
||||
AzFramework::ApplicationRequests::Bus::BroadcastResult(engineRoot, &AzFramework::ApplicationRequests::GetEngineRoot);
|
||||
AZ_Assert(engineRoot != nullptr, "Unable to communicate with AzFramework::ApplicationRequests::Bus");
|
||||
|
||||
AudioControlsEditor::EditorImplPluginEventBus::Broadcast(&AudioControlsEditor::EditorImplPluginEventBus::Events::InitializeEditorImplPlugin);
|
||||
}
|
||||
else
|
||||
|
||||
@@ -597,11 +597,10 @@ namespace EditorPythonBindings
|
||||
{
|
||||
AZStd::unordered_set<AZStd::string> pyPackageSites(pythonPathStack.begin(), pythonPathStack.end());
|
||||
|
||||
const char* engineRoot = nullptr;
|
||||
AzFramework::ApplicationRequests::Bus::BroadcastResult(engineRoot, &AzFramework::ApplicationRequests::GetEngineRoot);
|
||||
AZ::IO::FixedMaxPath engineRoot = AZ::Utils::GetEnginePath();
|
||||
|
||||
// set PYTHON_HOME
|
||||
AZStd::string pyBasePath = Platform::GetPythonHomePath(PY_PACKAGE, engineRoot);
|
||||
AZStd::string pyBasePath = Platform::GetPythonHomePath(PY_PACKAGE, engineRoot.c_str());
|
||||
if (!AZ::IO::SystemFile::Exists(pyBasePath.c_str()))
|
||||
{
|
||||
AZ_Warning("python", false, "Python home path must exist! path:%s", pyBasePath.c_str());
|
||||
|
||||
@@ -135,10 +135,6 @@ namespace UnitTest
|
||||
void NormalizePath(AZStd::string& ) override {}
|
||||
void NormalizePathKeepCase(AZStd::string& ) override {}
|
||||
void CalculateBranchTokenForEngineRoot(AZStd::string& ) const override {}
|
||||
// Gets the engine root path for testing
|
||||
const char* GetEngineRoot() const override { return m_engineRoot.c_str(); }
|
||||
// Retrieves the app root path for testing
|
||||
const char* GetAppRoot() const override { return m_engineRoot.c_str(); }
|
||||
|
||||
AZ::ComponentApplication m_app;
|
||||
AZStd::unique_ptr<FileIOHelper> m_fileIOHelper;
|
||||
|
||||
@@ -753,7 +753,7 @@
|
||||
</Class>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="Sprite" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/button_disabled.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/button_disabled.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -983,7 +983,7 @@
|
||||
</Class>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="Sprite" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/button_disabled.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/button_disabled.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <AzToolsFramework/Commands/EntityStateCommand.h>
|
||||
#include <AzToolsFramework/Entity/EditorEntityInfoBus.h>
|
||||
#include <AzToolsFramework/Entity/EditorEntityHelpers.h>
|
||||
#include <AzToolsFramework/Prefab/PrefabFocusPublicInterface.h>
|
||||
#include <AzToolsFramework/PropertyTreeEditor/PropertyTreeEditor.h>
|
||||
#include <AzToolsFramework/ToolsComponents/EditorDisabledCompositionBus.h>
|
||||
#include <AzToolsFramework/ToolsComponents/EditorPendingCompositionBus.h>
|
||||
@@ -448,6 +449,9 @@ namespace LandscapeCanvasEditor
|
||||
AZ::ComponentApplicationBus::BroadcastResult(m_serializeContext, &AZ::ComponentApplicationRequests::GetSerializeContext);
|
||||
AZ_Assert(m_serializeContext, "Failed to acquire application serialize context.");
|
||||
|
||||
m_prefabFocusPublicInterface = AZ::Interface<AzToolsFramework::Prefab::PrefabFocusPublicInterface>::Get();
|
||||
AZ_Assert(m_prefabFocusPublicInterface, "LandscapeCanvas - could not get PrefabFocusPublicInterface on construction.");
|
||||
|
||||
const GraphCanvas::EditorId& editorId = GetEditorId();
|
||||
|
||||
// Register unique color palettes for our connections (data types)
|
||||
@@ -459,6 +463,7 @@ namespace LandscapeCanvasEditor
|
||||
AzToolsFramework::EditorPickModeNotificationBus::Handler::BusConnect(AzToolsFramework::GetEntityContextId());
|
||||
AzToolsFramework::EntityCompositionNotificationBus::Handler::BusConnect();
|
||||
AzToolsFramework::ToolsApplicationNotificationBus::Handler::BusConnect();
|
||||
AzToolsFramework::Prefab::PrefabFocusNotificationBus::Handler::BusConnect(AzToolsFramework::GetEntityContextId());
|
||||
AzToolsFramework::Prefab::PrefabPublicNotificationBus::Handler::BusConnect();
|
||||
CrySystemEventBus::Handler::BusConnect();
|
||||
AZ::EntitySystemBus::Handler::BusConnect();
|
||||
@@ -484,6 +489,7 @@ namespace LandscapeCanvasEditor
|
||||
AZ::EntitySystemBus::Handler::BusDisconnect();
|
||||
CrySystemEventBus::Handler::BusDisconnect();
|
||||
AzToolsFramework::Prefab::PrefabPublicNotificationBus::Handler::BusDisconnect();
|
||||
AzToolsFramework::Prefab::PrefabFocusNotificationBus::Handler::BusDisconnect();
|
||||
AzToolsFramework::ToolsApplicationNotificationBus::Handler::BusDisconnect();
|
||||
AzToolsFramework::EditorPickModeNotificationBus::Handler::BusDisconnect();
|
||||
AzToolsFramework::EditorEntityContextNotificationBus::Handler::BusDisconnect();
|
||||
@@ -2500,6 +2506,24 @@ namespace LandscapeCanvasEditor
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::OnPrefabFocusChanged()
|
||||
{
|
||||
// Make sure to close any open graphs that aren't currently in prefab focus
|
||||
// to prevent the user from making modifications outside of the allowed focus scope
|
||||
AZStd::vector<GraphCanvas::DockWidgetId> dockWidgetsToClose;
|
||||
for (auto [entityId, dockWidgetId] : m_dockWidgetsByEntity)
|
||||
{
|
||||
if (!m_prefabFocusPublicInterface->IsOwningPrefabBeingFocused(entityId))
|
||||
{
|
||||
dockWidgetsToClose.push_back(dockWidgetId);
|
||||
}
|
||||
}
|
||||
for (auto dockWidgetId : dockWidgetsToClose)
|
||||
{
|
||||
CloseEditor(dockWidgetId);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::OnPrefabInstancePropagationBegin()
|
||||
{
|
||||
// Ignore graph updates during prefab propagation because the entities will be
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#include <AzToolsFramework/API/EntityCompositionNotificationBus.h>
|
||||
#include <AzToolsFramework/API/ToolsApplicationAPI.h>
|
||||
#include <AzToolsFramework/Entity/EditorEntityContextBus.h>
|
||||
#include <AzToolsFramework/Prefab/PrefabFocusNotificationBus.h>
|
||||
#include <AzToolsFramework/Prefab/PrefabPublicNotificationBus.h>
|
||||
#include <AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.hxx>
|
||||
#include <AzToolsFramework/UI/PropertyEditor/PropertyEditorAPI.h>
|
||||
@@ -31,6 +32,14 @@
|
||||
#include <LandscapeCanvas/LandscapeCanvasBus.h>
|
||||
#endif
|
||||
|
||||
namespace AzToolsFramework
|
||||
{
|
||||
namespace Prefab
|
||||
{
|
||||
class PrefabFocusPublicInterface;
|
||||
}
|
||||
}
|
||||
|
||||
namespace LandscapeCanvasEditor
|
||||
{
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
@@ -81,6 +90,7 @@ namespace LandscapeCanvasEditor
|
||||
, private AzToolsFramework::EntityCompositionNotificationBus::Handler
|
||||
, private AzToolsFramework::PropertyEditorEntityChangeNotificationBus::MultiHandler
|
||||
, private AzToolsFramework::ToolsApplicationNotificationBus::Handler
|
||||
, private AzToolsFramework::Prefab::PrefabFocusNotificationBus::Handler
|
||||
, private AzToolsFramework::Prefab::PrefabPublicNotificationBus::Handler
|
||||
, private CrySystemEventBus::Handler
|
||||
{
|
||||
@@ -181,6 +191,9 @@ namespace LandscapeCanvasEditor
|
||||
void EntityParentChanged(AZ::EntityId entityId, AZ::EntityId newParentId, AZ::EntityId oldParentId) override;
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//! PrefabFocusNotificationBus overrides
|
||||
void OnPrefabFocusChanged() override;
|
||||
|
||||
//! PrefabPublicNotificationBus overrides
|
||||
void OnPrefabInstancePropagationBegin() override;
|
||||
void OnPrefabInstancePropagationEnd() override;
|
||||
@@ -248,6 +261,8 @@ namespace LandscapeCanvasEditor
|
||||
|
||||
AZ::SerializeContext* m_serializeContext = nullptr;
|
||||
|
||||
AzToolsFramework::Prefab::PrefabFocusPublicInterface* m_prefabFocusPublicInterface = nullptr;
|
||||
|
||||
bool m_ignoreGraphUpdates = false;
|
||||
bool m_prefabPropagationInProgress = false;
|
||||
bool m_inObjectPickMode = false;
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
<ObjectStream version="3">
|
||||
<Class name="AZStd::vector" type="{82FC5264-88D0-57CD-9307-FC52E4DAD550}">
|
||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
||||
<Class name="AZ::Uuid" field="guid" value="{1AE9C4CB-FF24-594B-BC2F-071268E0D6AB}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
<Class name="AZStd::string" field="pathHint" value="engineassets/geomcaches/defaultgeomcache.cax" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
||||
<Class name="AZ::Uuid" field="guid" value="{E9C38BAA-2A29-532E-AA92-4F66F95E8242}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
<Class name="AZStd::string" field="pathHint" value="engineassets/textures/defaults/spot_default.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
||||
<Class name="AZ::Uuid" field="guid" value="{0BFF7DC2-B7B0-530E-A70E-A082F7AF6678}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
<Class name="AZStd::string" field="pathHint" value="engineassets/materials/decals/default.mtl" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
||||
<Class name="AZ::Uuid" field="guid" value="{1213DEB1-FC2B-566A-86AA-E82D93D8AE2F}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
<Class name="AZStd::string" field="pathHint" value="engineassets/materials/lens_optics.mtl" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
</ObjectStream>
|
||||
|
||||
@@ -311,7 +311,6 @@ namespace UnitTest
|
||||
SerializeContext* GetSerializeContext() override { return m_serializeContext; }
|
||||
BehaviorContext* GetBehaviorContext() override { return nullptr; }
|
||||
JsonRegistrationContext* GetJsonRegistrationContext() override { return nullptr; }
|
||||
const char* GetAppRoot() const override { return nullptr; }
|
||||
const char* GetEngineRoot() const override { return nullptr; }
|
||||
const char* GetExecutableFolder() const override { return nullptr; }
|
||||
void EnumerateEntities(const EntityCallback& /*callback*/) override {}
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
<Class name="AZStd::vector" type="{82FC5264-88D0-57CD-9307-FC52E4DAD550}">
|
||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
||||
<Class name="AZ::Uuid" field="guid" value="{99FDCF74-F290-5367-BAE4-05AB38996ED8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
<Class name="AZ::Uuid" field="guid" value="{44E2934E-9CB7-568F-A59C-D72D83E642F0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
<Class name="AZStd::string" field="pathHint" value="textures/cursor_default.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
|
||||
@@ -257,6 +257,7 @@ BOOL CUiAnimViewDialog::OnInitDialog()
|
||||
m_wndSplitter->addWidget(m_wndDopeSheet);
|
||||
m_wndSplitter->setStretchFactor(0, 1);
|
||||
m_wndSplitter->setStretchFactor(1, 10);
|
||||
m_wndSplitter->setChildrenCollapsible(false);
|
||||
l->addWidget(m_wndSplitter);
|
||||
w->setLayout(l);
|
||||
setCentralWidget(w);
|
||||
@@ -283,6 +284,11 @@ BOOL CUiAnimViewDialog::OnInitDialog()
|
||||
m_wndCurveEditorDock->setVisible(false);
|
||||
m_wndCurveEditorDock->setEnabled(false);
|
||||
|
||||
// In order to prevent the track editor view from collapsing and becoming invisible, we use the
|
||||
// minimum size of the curve editor for the track editor as well. Since both editors use the same
|
||||
// view widget in the UI animation editor when not in 'Both' mode, the sizes can be identical.
|
||||
m_wndDopeSheet->setMinimumSize(m_wndCurveEditor->minimumSizeHint());
|
||||
|
||||
InitSequences();
|
||||
|
||||
m_lazyInitDone = false;
|
||||
|
||||
@@ -855,7 +855,8 @@ bool CSprite::LoadImage(const AZStd::string& nameTex, AZ::Data::Instance<AZ::RPI
|
||||
image = AZ::RPI::StreamingImage::FindOrCreate(streamingImageAsset);
|
||||
if (!image)
|
||||
{
|
||||
AZ_Error("CSprite", false, "Failed to find or create an image instance from image asset '%s'", streamingImageAsset.GetHint().c_str());
|
||||
AZ_Error("CSprite", false, "Failed to find or create an image instance from image asset '%s', ID %s",
|
||||
streamingImageAsset.GetHint().c_str(), streamingImageAsset.GetId().ToString<AZStd::string>().c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
+14
-14
@@ -569,7 +569,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/button.dds" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/button.tif.streamingimage" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="AZStd::string" field="RenderTargetName" value="" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
@@ -591,7 +591,7 @@
|
||||
</Class>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="Sprite" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/button.dds" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/button.tif.streamingimage" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
</Class>
|
||||
@@ -626,7 +626,7 @@
|
||||
</Class>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="Sprite" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/buttonpressed.dds" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/buttonpressed.tif.streamingimage" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
</Class>
|
||||
@@ -650,7 +650,7 @@
|
||||
</Class>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="Sprite" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="Textures/Basic/Button_Sliced_Normal.dds" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="Textures/Basic/Button_Sliced_Normal.tif.streamingimage" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
</Class>
|
||||
@@ -1161,7 +1161,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/button.dds" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/button.tif.streamingimage" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="AZStd::string" field="RenderTargetName" value="" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
@@ -1209,7 +1209,7 @@
|
||||
</Class>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="Sprite" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/buttonpressed.dds" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/buttonpressed.tif.streamingimage" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
</Class>
|
||||
@@ -1227,7 +1227,7 @@
|
||||
</Class>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="Sprite" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/button_disabled.dds" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/button_disabled.tif.streamingimage" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
</Class>
|
||||
@@ -1368,7 +1368,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/scroll_box_icon_1.dds" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/scroll_box_icon_1.tif.streamingimage" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="AZStd::string" field="RenderTargetName" value="" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
@@ -1438,7 +1438,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/button.dds" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/button.tif.streamingimage" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="AZStd::string" field="RenderTargetName" value="" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
@@ -1498,7 +1498,7 @@
|
||||
</Class>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="Sprite" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/buttonpressed.dds" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/buttonpressed.tif.streamingimage" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
</Class>
|
||||
@@ -1516,7 +1516,7 @@
|
||||
</Class>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="Sprite" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/button_disabled.dds" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/button_disabled.tif.streamingimage" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
</Class>
|
||||
@@ -1657,7 +1657,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/scroll_box_icon_6.dds" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/scroll_box_icon_6.tif.streamingimage" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="AZStd::string" field="RenderTargetName" value="" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
@@ -1714,7 +1714,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/scroll_box_icon_7.dds" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/scroll_box_icon_7.tif.streamingimage" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="AZStd::string" field="RenderTargetName" value="" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
@@ -1771,7 +1771,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/scroll_box_icon_8.dds" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/scroll_box_icon_8.tif.streamingimage" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="AZStd::string" field="RenderTargetName" value="" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
|
||||
+6
-6
@@ -370,7 +370,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="textures/basic/button_sliced_normal.dds" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="textures/basic/button_sliced_normal.tif.streamingimage" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="AZStd::string" field="RenderTargetName" value="" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
@@ -475,7 +475,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="textures/basic/button_sliced_normal.dds" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="textures/basic/button_sliced_normal.tif.streamingimage" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="AZStd::string" field="RenderTargetName" value="" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
@@ -616,7 +616,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="textures/basic/button_sliced_normal.dds" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="textures/basic/button_sliced_normal.tif.streamingimage" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="AZStd::string" field="RenderTargetName" value="" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
@@ -757,7 +757,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="textures/basic/button_sliced_normal.dds" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="textures/basic/button_sliced_normal.tif.streamingimage" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="AZStd::string" field="RenderTargetName" value="" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
@@ -898,7 +898,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="textures/basic/button_sliced_normal.dds" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="textures/basic/button_sliced_normal.tif.streamingimage" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="AZStd::string" field="RenderTargetName" value="" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
@@ -1118,7 +1118,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="textures/basic/button_sliced_normal.dds" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="textures/basic/button_sliced_normal.tif.streamingimage" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="AZStd::string" field="RenderTargetName" value="" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
|
||||
+18
-18
@@ -215,7 +215,7 @@
|
||||
</Class>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="Sprite" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/button.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/button.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -240,7 +240,7 @@
|
||||
</Class>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="Sprite" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/buttonpressed.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/buttonpressed.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -265,7 +265,7 @@
|
||||
</Class>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="Sprite" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="Textures/Basic/Button_Sliced_Normal.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="Textures/Basic/Button_Sliced_Normal.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -301,7 +301,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/button.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/button.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -378,7 +378,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="Textures/Basic/CheckBox_Off.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="Textures/Basic/CheckBox_Off.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -455,7 +455,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="Textures/Basic/CheckBox_On.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="Textures/Basic/CheckBox_On.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -645,7 +645,7 @@
|
||||
</Class>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="Sprite" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/buttonslider.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/buttonslider.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -716,7 +716,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/buttonslider.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/buttonslider.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -975,7 +975,7 @@
|
||||
</Class>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="Sprite" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/buttonslider.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/buttonslider.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -1000,7 +1000,7 @@
|
||||
</Class>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="Sprite" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/buttonslider.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/buttonslider.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -1052,7 +1052,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/buttonslider.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/buttonslider.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -1129,7 +1129,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="Textures/Basic/Slider_Fill_Sliced.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="Textures/Basic/Slider_Fill_Sliced.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -1206,7 +1206,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="Textures/Basic/Slider_Manipulator.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="Textures/Basic/Slider_Manipulator.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -1296,7 +1296,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="Textures/Basic/Slider_Track_Sliced.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="Textures/Basic/Slider_Track_Sliced.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -1399,7 +1399,7 @@
|
||||
</Class>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="Sprite" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/buttonslider.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/buttonslider.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -1425,7 +1425,7 @@
|
||||
</Class>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="Sprite" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="Textures/Basic/slider_background_disabled.sprite" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="Textures/Basic/slider_background_disabled.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -1475,7 +1475,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/buttonslider.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/buttonslider.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -1658,7 +1658,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/checkered3.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/lyshineexamples/checkered3.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
|
||||
+2
-2
@@ -475,7 +475,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="textures/basic/checkbox_check.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="textures/basic/checkbox_check.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -854,7 +854,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="textures/basic/checkbox_check.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="textures/basic/checkbox_check.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
|
||||
+1
-1
@@ -1910,7 +1910,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="textures/basic/checkbox_check.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="textures/basic/checkbox_check.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
|
||||
+3
-3
@@ -64,7 +64,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/button_normal.dds" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/button_normal.tif.streamingimage" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="AZStd::string" field="RenderTargetName" value="" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
@@ -102,7 +102,7 @@
|
||||
</Class>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="Sprite" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/button_disabled.dds" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/button_disabled.tif.streamingimage" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
</Class>
|
||||
@@ -422,7 +422,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/button_normal.dds" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/button_normal.tif.streamingimage" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="AZStd::string" field="RenderTargetName" value="" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
|
||||
+1
-1
@@ -174,7 +174,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/button_normal.dds" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/button_normal.tif.streamingimage" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="AZStd::string" field="RenderTargetName" value="" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
|
||||
+2
-2
@@ -61,7 +61,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/button_normal.dds" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/button_normal.tif.streamingimage" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="AZStd::string" field="RenderTargetName" value="" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
@@ -99,7 +99,7 @@
|
||||
</Class>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="Sprite" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/button_disabled.dds" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/button_disabled.tif.streamingimage" type="{EF8FF807-DDEE-4EB0-B678-4CA3A2C490A4}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
</Class>
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/button_normal.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/button_normal.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -118,7 +118,7 @@
|
||||
</Class>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="Sprite" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/button_disabled.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/button_disabled.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
|
||||
@@ -11,10 +11,10 @@
|
||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
||||
<Class name="AZ::Uuid" field="guid" value="{E993215C-FF5F-5891-8475-D4EDBD560807}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
<Class name="AZStd::string" field="pathHint" value="textures/basic/button_sliced_normal.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="pathHint" value="textures/basic/button_sliced_normal.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
||||
@@ -27,10 +27,10 @@
|
||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
||||
<Class name="AZ::Uuid" field="guid" value="{D1276CDC-6211-5A7E-930F-8F0977FB41A6}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
<Class name="AZStd::string" field="pathHint" value="ui/textures/prefab/button_normal.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="pathHint" value="ui/textures/prefab/button_normal.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
||||
@@ -43,10 +43,10 @@
|
||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
||||
<Class name="AZ::Uuid" field="guid" value="{05D7E013-3691-57AE-A712-53476BDD1EE2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
<Class name="AZStd::string" field="pathHint" value="ui/textures/prefab/button_disabled.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="pathHint" value="ui/textures/prefab/button_disabled.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
||||
@@ -59,10 +59,10 @@
|
||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
||||
<Class name="AZ::Uuid" field="guid" value="{5FF31E55-4AE2-5A4B-BA86-CB7177F01F72}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
<Class name="AZStd::string" field="pathHint" value="ui/textures/prefab/textinput_normal.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="pathHint" value="ui/textures/prefab/textinput_normal.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
||||
@@ -75,10 +75,10 @@
|
||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
||||
<Class name="AZ::Uuid" field="guid" value="{561D1ED0-13FC-5CAD-AB7E-ADE4E424028C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
<Class name="AZStd::string" field="pathHint" value="ui/textures/prefab/textinput_hover.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="pathHint" value="ui/textures/prefab/textinput_hover.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
||||
@@ -91,26 +91,26 @@
|
||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
||||
<Class name="AZ::Uuid" field="guid" value="{28AC420F-5A90-5FC5-93AC-5CBDA82131E3}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
<Class name="AZStd::string" field="pathHint" value="ui/textures/prefab/textinput_disabled.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="pathHint" value="ui/textures/prefab/textinput_disabled.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
||||
<Class name="AZ::Uuid" field="guid" value="{8B33DC4A-9DCD-5934-9B1B-161236FC4FBF}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
<Class name="AZStd::string" field="pathHint" value="ui/textures/prefab/checkbox_check.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="pathHint" value="ui/textures/prefab/checkbox_check.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
||||
<Class name="AZ::Uuid" field="guid" value="{07D54B0D-4DAF-54B0-A7D6-790C4D14A490}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
|
||||
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
<Class name="unsigned int" field="subId" value="1000" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="platformFlags" value="127" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
<Class name="AZStd::string" field="pathHint" value="ui/textures/prefab/checkbox_box_normal.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="pathHint" value="ui/textures/prefab/checkbox_box_normal.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
|
||||
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
|
||||
|
||||
@@ -443,35 +443,31 @@ namespace {{ Component.attrib['Namespace'] }}
|
||||
{{ DeclareNetworkPropertyAccessors(Component, 'Autonomous', 'Authority', false)|indent(8) -}}
|
||||
{{ DeclareNetworkPropertyAccessors(Component, 'Autonomous', 'Authority', true)|indent(8) -}}
|
||||
{{ DeclareArchetypePropertyGetters(Component)|indent(8) -}}
|
||||
{{ DeclareRpcInvocations(Component, 'Client', 'Authority', false)|indent(8) -}}
|
||||
{{ DeclareRpcInvocations(Component, 'Client', 'Authority', true)|indent(8) -}}
|
||||
{{ DeclareRpcInvocations(Component, 'Autonomous', 'Authority', false)|indent(8) -}}
|
||||
{{ DeclareRpcInvocations(Component, 'Autonomous', 'Authority', true)|indent(8) -}}
|
||||
{{ DeclareRpcInvocations(Component, 'Authority', 'Autonomous', false)|indent(8) -}}
|
||||
{{ DeclareRpcInvocations(Component, 'Authority', 'Autonomous', true)|indent(8) -}}
|
||||
{{ DeclareRpcInvocations(Component, 'Authority', 'Client', false)|indent(8) -}}
|
||||
{{ DeclareRpcInvocations(Component, 'Authority', 'Client', true)|indent(8) -}}
|
||||
|
||||
//! RPC Handlers: Override handlers in order to implement what happens after receiving an RPC
|
||||
{{ AutoComponentMacros.DeclareRpcHandlers(Component, 'Server', 'Authority', false)|indent(8) -}}
|
||||
{{ AutoComponentMacros.DeclareRpcHandlers(Component, 'Client', 'Authority', false)|indent(8) -}}
|
||||
{{ AutoComponentMacros.DeclareRpcHandlers(Component, 'Autonomous', 'Authority', false)|indent(8) -}}
|
||||
{{ AutoComponentMacros.DeclareRpcHandlers(Component, 'Authority', 'Autonomous', false)|indent(8) -}}
|
||||
{{ AutoComponentMacros.DeclareRpcSignals(Component, 'Server', 'Authority')|indent(8) -}}
|
||||
{{ AutoComponentMacros.DeclareRpcSignals(Component, 'Client', 'Authority')|indent(8) -}}
|
||||
{{ AutoComponentMacros.DeclareRpcSignals(Component, 'Autonomous', 'Authority')|indent(8) -}}
|
||||
{{ AutoComponentMacros.DeclareRpcSignals(Component, 'Authority', 'Autonomous')|indent(8) -}}
|
||||
|
||||
//! RPC Event Getters: Subscribe to these events and get notified when an RPC is received
|
||||
{{ AutoComponentMacros.DeclareRpcEventGetters(Component, 'Server', 'Authority')|indent(8) -}}
|
||||
{{ AutoComponentMacros.DeclareRpcEventGetters(Component, 'Client', 'Authority')|indent(8) -}}
|
||||
{{ AutoComponentMacros.DeclareRpcEventGetters(Component, 'Autonomous', 'Authority')|indent(8) -}}
|
||||
{{ AutoComponentMacros.DeclareRpcEventGetters(Component, 'Authority', 'Autonomous')|indent(8) }}
|
||||
{{ AutoComponentMacros.DeclareRpcEventGetters(Component, 'Authority', 'Autonomous')|indent(8) -}}
|
||||
|
||||
{% for Service in Component.iter('ComponentRelation') %}
|
||||
{% if (Service.attrib['HasController']|booleanTrue) and (Service.attrib['Constraint'] != 'Incompatible') %}
|
||||
{{ Service.attrib['Namespace'] }}::{{ Service.attrib['Name'] }}Controller* Get{{ Service.attrib['Name'] }}Controller();
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
|
||||
protected:
|
||||
{{ AutoComponentMacros.DeclareRpcEvents(Component, 'Server', 'Authority')|indent(8) -}}
|
||||
{{ AutoComponentMacros.DeclareRpcEvents(Component, 'Client', 'Authority')|indent(8) -}}
|
||||
{{ AutoComponentMacros.DeclareRpcEvents(Component, 'Autonomous', 'Authority')|indent(8) -}}
|
||||
{{ AutoComponentMacros.DeclareRpcEvents(Component, 'Authority', 'Autonomous')|indent(8) }}
|
||||
};
|
||||
@@ -517,6 +513,8 @@ namespace {{ Component.attrib['Namespace'] }}
|
||||
{{ DeclareNetworkPropertyGetters(Component, 'Autonomous', 'Authority', false)|indent(8) -}}
|
||||
{{ DeclareArchetypePropertyGetters(Component)|indent(8) -}}
|
||||
{{ DeclareRpcInvocations(Component, 'Server', 'Authority', false)|indent(8) -}}
|
||||
|
||||
//! RPC Event Getters: Subscribe to these events and get notified when this component receives an RPC
|
||||
{{ AutoComponentMacros.DeclareRpcEventGetters(Component, 'Authority', 'Client')|indent(8) -}}
|
||||
|
||||
//! MultiplayerComponent interface
|
||||
@@ -541,9 +539,13 @@ namespace {{ Component.attrib['Namespace'] }}
|
||||
{{ DeclareNetworkPropertyGetters(Component, 'Authority', 'Client', true)|indent(8) -}}
|
||||
{{ DeclareNetworkPropertyGetters(Component, 'Autonomous', 'Authority', true)|indent(8) -}}
|
||||
{{ DeclareRpcInvocations(Component, 'Server', 'Authority', true)|indent(8) -}}
|
||||
|
||||
//! RPC Handlers: Override handlers in order to implement what happens after receiving an RPC
|
||||
{{ AutoComponentMacros.DeclareRpcHandlers(Component, 'Authority', 'Client', false)|indent(8) -}}
|
||||
{{ AutoComponentMacros.DeclareRpcSignals(Component, 'Authority', 'Client')|indent(8) -}}
|
||||
{{ AutoComponentMacros.DeclareRpcEvents(Component, 'Authority', 'Client')|indent(8) }}
|
||||
|
||||
//! RPC Events: Subscribe to these events and get notified when an RPC is received
|
||||
{{ AutoComponentMacros.DeclareRpcEvents(Component, 'Authority', 'Client')|indent(8) -}}
|
||||
|
||||
{% for Service in Component.iter('ComponentRelation') %}
|
||||
{% if Service.attrib['Constraint'] != 'Incompatible' %}
|
||||
const {{ Service.attrib['Namespace'] }}::{{ Service.attrib['Name'] }}* Get{{ Service.attrib['Name'] }}() const;
|
||||
|
||||
@@ -340,27 +340,11 @@ void {{ ClassName }}::{{ UpperFirst(Property.attrib['Name']) }}({{ ', '.join(par
|
||||
{% endmacro %}
|
||||
{#
|
||||
|
||||
#}
|
||||
{% macro DefineRpcSignal(Component, ClassName, Property, InvokeFrom) %}
|
||||
{% set paramNames = [] %}
|
||||
{% set paramTypes = [] %}
|
||||
{% set paramDefines = [] %}
|
||||
{{ AutoComponentMacros.ParseRpcParams(Property, paramNames, paramTypes, paramDefines) }}
|
||||
void {{ ClassName }}::Signal{{ UpperFirst(Property.attrib['Name']) }}({{ ', '.join(paramDefines) }})
|
||||
{
|
||||
m_{{ UpperFirst(Property.attrib['Name']) }}Event.Signal({{ ', '.join(paramNames) }});
|
||||
}
|
||||
{% endmacro %}
|
||||
{#
|
||||
|
||||
#}
|
||||
{% macro DefineRpcInvocations(Component, ClassName, InvokeFrom, HandleOn, IsProtected) %}
|
||||
{% call(Property) AutoComponentMacros.ParseRemoteProcedures(Component, InvokeFrom, HandleOn) %}
|
||||
{% if Property.attrib['IsPublic']|booleanTrue != IsProtected %}
|
||||
{{ DefineRpcInvocation(Component, ClassName, Property, InvokeFrom, HandleOn) -}}
|
||||
{% if Property.attrib['GenerateEventBindings']|booleanTrue == true %}
|
||||
{{ DefineRpcSignal(Component, ClassName, Property, InvokeFrom) -}}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endcall %}
|
||||
{% endmacro %}
|
||||
@@ -374,33 +358,46 @@ void {{ ClassName }}::Signal{{ UpperFirst(Property.attrib['Name']) }}({{ ', '.jo
|
||||
{% set paramTypes = [] %}
|
||||
{% set paramDefines = [] %}
|
||||
{{ AutoComponentMacros.ParseRpcParams(Property, paramNames, paramTypes, paramDefines) }}
|
||||
->Method("{{ UpperFirst(Property.attrib['Name']) }}", [](const {{ ClassName }}* self, {{ ', '.join(paramDefines) }}) {
|
||||
self->m_controller->{{ UpperFirst(Property.attrib['Name']) }}({{ ', '.join(paramNames) }});
|
||||
->Method("{{ UpperFirst(Property.attrib['Name']) }}", []({{ ClassName }}* self, {{ ', '.join(paramDefines) }}) {
|
||||
{% if (InvokeFrom == 'Server') %}
|
||||
self->{{ UpperFirst(Property.attrib['Name']) }}({{ ', '.join(paramNames) }});
|
||||
{% elif (InvokeFrom == 'Authority') or (InvokeFrom == 'Autonomous') %}
|
||||
if (self->m_controller)
|
||||
{
|
||||
self->m_controller->{{ UpperFirst(Property.attrib['Name']) }}({{ ', '.join(paramNames) }});
|
||||
}
|
||||
else
|
||||
{
|
||||
AZ_Warning("Network RPC", false, "{{ ClassName }} {{ UpperFirst(Property.attrib['Name']) }} method failed. Entity '%s' (id: %s) {{ ClassName }} is missing the network controller. This remote-procedure can only be invoked from {{InvokeFrom}} network entities, because this entity doesn't have a controller, it must not be a {{InvokeFrom}} entity. Please check your network context before attempting to call {{ UpperFirst(Property.attrib['Name']) }}.", self->GetEntity()->GetName().c_str(), self->GetEntityId().ToString().c_str())
|
||||
}
|
||||
{% endif %}
|
||||
})
|
||||
->Method("{{ UpperFirst(Property.attrib['Name']) }}ByEntityId", [](AZ::EntityId id, {{ ', '.join(paramDefines) }}) {
|
||||
|
||||
AZ::Entity* entity = AZ::Interface<AZ::ComponentApplicationRequests>::Get()->FindEntity(id);
|
||||
if (!entity)
|
||||
{
|
||||
AZ_Warning("Network Property", false, "{{ ClassName }} {{ UpperFirst(Property.attrib['Name']) }}ByEntityId failed. The entity with id %s doesn't exist, please provide a valid entity id.", id.ToString().c_str())
|
||||
AZ_Warning("Network RPC", false, "{{ ClassName }} {{ UpperFirst(Property.attrib['Name']) }}ByEntityId failed. The entity with id %s doesn't exist, please provide a valid entity id.", id.ToString().c_str())
|
||||
return;
|
||||
}
|
||||
|
||||
{{ ClassName }}* networkComponent = entity->FindComponent<{{ ClassName }}>();
|
||||
if (!networkComponent)
|
||||
{
|
||||
AZ_Warning("Network Property", false, "{{ ClassName }} {{ UpperFirst(Property.attrib['Name']) }}ByEntityId failed. Entity '%s' (id: %s) is missing {{ ClassName }}, be sure to add {{ ClassName }} to this entity.", entity->GetName().c_str(), id.ToString().c_str())
|
||||
AZ_Warning("Network RPC", false, "{{ ClassName }} {{ UpperFirst(Property.attrib['Name']) }}ByEntityId failed. Entity '%s' (id: %s) is missing {{ ClassName }}, be sure to add {{ ClassName }} to this entity.", entity->GetName().c_str(), id.ToString().c_str())
|
||||
return;
|
||||
}
|
||||
|
||||
{% if (InvokeFrom == 'Server') %}
|
||||
networkComponent->{{ UpperFirst(Property.attrib['Name']) }}({{ ', '.join(paramNames) }});
|
||||
{% elif (InvokeFrom == 'Authority') or (InvokeFrom == 'Autonomous') %}
|
||||
{{ ClassName }}Controller* controller = static_cast<{{ ClassName }}Controller*>(networkComponent->GetController());
|
||||
if (!controller)
|
||||
{
|
||||
AZ_Warning("Network Property", false, "{{ ClassName }} {{ UpperFirst(Property.attrib['Name']) }}ByEntityId method failed. Entity '%s' (id: %s) {{ ClassName }} is missing the network controller. This RemoteProcedure can only be invoked from {{InvokeFrom}} network entities, because this entity doesn't have a controller, it must not be a {{InvokeFrom}} entity. Please check your network context before attempting to call {{ UpperFirst(Property.attrib['Name']) }}.", entity->GetName().c_str(), id.ToString().c_str())
|
||||
AZ_Warning("Network RPC", false, "{{ ClassName }} {{ UpperFirst(Property.attrib['Name']) }}ByEntityId method failed. Entity '%s' (id: %s) {{ ClassName }} is missing the network controller. This RemoteProcedure can only be invoked from {{InvokeFrom}} network entities, because this entity doesn't have a controller, it must not be a {{InvokeFrom}} entity. Please check your network context before attempting to call {{ UpperFirst(Property.attrib['Name']) }}.", entity->GetName().c_str(), id.ToString().c_str())
|
||||
return;
|
||||
}
|
||||
|
||||
controller->{{ UpperFirst(Property.attrib['Name']) }}({{ ', '.join(paramNames) }});
|
||||
{% endif %}
|
||||
}, { { { "Source", "The Source containing the {{ ClassName }}Controller" }{% for paramName in paramNames %}, {"{{ paramName }}"}{% endfor %}}})
|
||||
->Attribute(AZ::Script::Attributes::ToolTip, "{{Property.attrib['Description']}}")
|
||||
{% endif %}
|
||||
@@ -436,9 +433,13 @@ void {{ ClassName }}::Signal{{ UpperFirst(Property.attrib['Name']) }}({{ ', '.jo
|
||||
{% set paramTypes = [] %}
|
||||
{% set paramDefines = [] %}
|
||||
{{ AutoComponentMacros.ParseRpcParams(Property, paramNames, paramTypes, paramDefines) }}
|
||||
->Method("Get{{ UpperFirst(Property.attrib['Name']) }}Event", [](const {{ ClassName }}* self) -> AZ::Event<{{ ', '.join(paramTypes) }}>&
|
||||
->Method("Get{{ UpperFirst(Property.attrib['Name']) }}Event", []({{ ClassName }}* self) -> AZ::Event<{{ ', '.join(paramTypes) }}>&
|
||||
{
|
||||
{% if HandleOn == 'Client' %}
|
||||
return self->Get{{ UpperFirst(Property.attrib['Name']) }}Event();
|
||||
{% elif (HandleOn == 'Authority') or (HandleOn == 'Autonomous') %}
|
||||
return self->m_controller->Get{{ UpperFirst(Property.attrib['Name']) }}Event();
|
||||
{% endif %}
|
||||
})
|
||||
->Attribute(AZ::Script::Attributes::AzEventDescription, {{ LowerFirst(Property.attrib['Name']) }}EventDesc)
|
||||
->Method("Get{{ UpperFirst(Property.attrib['Name']) }}EventByEntityId", [](AZ::EntityId id) -> AZ::Event<{{ ', '.join(paramTypes) }}>*
|
||||
@@ -456,7 +457,9 @@ void {{ ClassName }}::Signal{{ UpperFirst(Property.attrib['Name']) }}({{ ', '.jo
|
||||
AZ_Warning("Network Property", false, "{{ ClassName }} Get{{ UpperFirst(Property.attrib['Name']) }}EventByEntityId failed. Entity '%s' (id: %s) is missing {{ ClassName }}, be sure to add {{ ClassName }} to this entity.", entity->GetName().c_str(), id.ToString().c_str())
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
{% if HandleOn == 'Client' %}
|
||||
return &networkComponent->Get{{ UpperFirst(Property.attrib['Name']) }}Event();
|
||||
{% elif (HandleOn == 'Authority') or (HandleOn == 'Autonomous') %}
|
||||
{{ ClassName }}Controller* controller = static_cast<{{ ClassName }}Controller*>(networkComponent->GetController());
|
||||
if (!controller)
|
||||
{
|
||||
@@ -465,6 +468,7 @@ void {{ ClassName }}::Signal{{ UpperFirst(Property.attrib['Name']) }}({{ ', '.jo
|
||||
}
|
||||
|
||||
return &controller->Get{{ UpperFirst(Property.attrib['Name']) }}Event();
|
||||
{% endif %}
|
||||
})
|
||||
->Attribute(AZ::Script::Attributes::AzEventDescription, AZStd::move({{ LowerFirst(Property.attrib['Name']) }}EventDesc))
|
||||
{% endif %}
|
||||
@@ -494,29 +498,31 @@ case {{ UpperFirst(Component.attrib['Name']) }}Internal::RemoteProcedure::{{ Upp
|
||||
{
|
||||
AZ_Assert(GetNetBindComponent()->GetNetEntityRole() == Multiplayer::NetEntityRole::Authority, "Entity proxy does not have authority");
|
||||
m_controller->Handle{{ UpperFirst(Property.attrib['Name']) }}(invokingConnection, {{ ', '.join(rpcParamList) }});
|
||||
{% if Property.attrib['GenerateEventBindings']|booleanTrue == true %}
|
||||
m_controller->Signal{{ UpperFirst(Property.attrib['Name']) }}({{ ', '.join(rpcParamList) }});
|
||||
{% endif %}
|
||||
{% if (Property.attrib['GenerateEventBindings']|booleanTrue == true) %}
|
||||
m_controller->Get{{ UpperFirst(Property.attrib['Name']) }}Event().Signal({{ ', '.join(rpcParamList) }});
|
||||
{% endif %}
|
||||
}
|
||||
{% if Property.attrib['IsReliable']|booleanTrue %}
|
||||
{# if the rpc is not reliable we can simply drop it, also note message reliability type is default reliable in EntityRpcMessage #}
|
||||
else // Note that this rpc is marked reliable, trigger the appropriate rpc event so it can be forwarded
|
||||
{
|
||||
{% if Property.attrib['IsReliable']|booleanTrue %}
|
||||
{# if the rpc is not reliable we can simply drop it, also note message reliability type is default reliable in EntityRpcMessage #}
|
||||
m_netBindComponent->{{ "GetSend" + InvokeFrom + "To" + HandleOn + "RpcEvent" }}().Signal(message);
|
||||
{% endif %}
|
||||
}
|
||||
|
||||
{% endif %}
|
||||
{% elif HandleOn == 'Autonomous' %}
|
||||
if (m_controller)
|
||||
{
|
||||
AZ_Assert(GetNetBindComponent()->GetNetEntityRole() == Multiplayer::NetEntityRole::Autonomous, "Entity proxy does not have autonomy");
|
||||
m_controller->Handle{{ UpperFirst(Property.attrib['Name']) }}(invokingConnection, {{ ', '.join(rpcParamList) }});
|
||||
{% if Property.attrib['GenerateEventBindings']|booleanTrue == true %}
|
||||
m_controller->Signal{{ UpperFirst(Property.attrib['Name']) }}({{ ', '.join(rpcParamList) }});
|
||||
{% endif %}
|
||||
{% if Property.attrib['GenerateEventBindings']|booleanTrue == true %}
|
||||
m_controller->Get{{ UpperFirst(Property.attrib['Name']) }}Event().Signal({{ ', '.join(rpcParamList) }});
|
||||
{% endif %}
|
||||
}
|
||||
{% else %}
|
||||
{% elif HandleOn == 'Client' %}
|
||||
Handle{{ UpperFirst(Property.attrib['Name']) }}(invokingConnection, {{ ', '.join(rpcParamList) }});
|
||||
{% if Property.attrib['GenerateEventBindings']|booleanTrue == true %}
|
||||
m_{{ UpperFirst(Property.attrib['Name']) }}Event.Signal({{ ', '.join(rpcParamList) }});
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
}
|
||||
else if (paramsSerialized)
|
||||
|
||||
@@ -41,7 +41,6 @@ namespace Multiplayer
|
||||
AZ::SerializeContext* GetSerializeContext() override { return {}; }
|
||||
AZ::BehaviorContext* GetBehaviorContext() override { return {}; }
|
||||
AZ::JsonRegistrationContext* GetJsonRegistrationContext() override { return {}; }
|
||||
const char* GetAppRoot() const override { return {}; }
|
||||
const char* GetEngineRoot() const override { return {}; }
|
||||
const char* GetExecutableFolder() const override { return {}; }
|
||||
void QueryApplicationType([[maybe_unused]] AZ::ApplicationTypeQuery& appType) const override {}
|
||||
|
||||
@@ -149,7 +149,6 @@ namespace UnitTest
|
||||
MOCK_METHOD0(GetSerializeContext, AZ::SerializeContext* ());
|
||||
MOCK_METHOD0(GetBehaviorContext, AZ::BehaviorContext* ());
|
||||
MOCK_METHOD0(GetJsonRegistrationContext, AZ::JsonRegistrationContext* ());
|
||||
MOCK_CONST_METHOD0(GetAppRoot, const char* ());
|
||||
MOCK_CONST_METHOD0(GetEngineRoot, const char* ());
|
||||
MOCK_CONST_METHOD0(GetExecutableFolder, const char* ());
|
||||
MOCK_METHOD0(GetDrillerManager, AZ::Debug::DrillerManager* ());
|
||||
|
||||
@@ -69,6 +69,10 @@ namespace UnitTest
|
||||
MOCK_CONST_METHOD1(UpdateHeights, AZStd::vector<float>(const AZ::Aabb& dirtyRegion));
|
||||
MOCK_CONST_METHOD1(UpdateHeightsAndMaterials, AZStd::vector<Physics::HeightMaterialPoint>(const AZ::Aabb& dirtyRegion));
|
||||
MOCK_CONST_METHOD0(GetHeightfieldAabb, AZ::Aabb());
|
||||
MOCK_CONST_METHOD0(GetHeightfieldMinHeight, float());
|
||||
MOCK_CONST_METHOD0(GetHeightfieldMaxHeight, float());
|
||||
MOCK_CONST_METHOD0(GetHeightfieldGridColumns, int32_t());
|
||||
MOCK_CONST_METHOD0(GetHeightfieldGridRows, int32_t());
|
||||
};
|
||||
|
||||
} // namespace UnitTest
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
#include <AzFramework/StringFunc/StringFunc.h>
|
||||
#include <AzCore/std/string/conversions.h>
|
||||
#include <PxPhysicsAPI.h>
|
||||
#include <AzCore/Component/ComponentApplicationBus.h>
|
||||
#include <AzCore/Utils/Utils.h>
|
||||
|
||||
namespace PhysX
|
||||
{
|
||||
@@ -108,8 +108,7 @@ namespace PhysX
|
||||
AzFramework::StringFunc::Append(filename, m_config.m_pvdConfigurationData.m_fileName.c_str());
|
||||
AzFramework::StringFunc::Append(filename, ".pxd2");
|
||||
|
||||
AZStd::string rootDirectory;
|
||||
AZ::ComponentApplicationBus::BroadcastResult(rootDirectory, &AZ::ComponentApplicationRequests::GetAppRoot);
|
||||
AZStd::string rootDirectory{ AZStd::string_view(AZ::Utils::GetEnginePath()) };
|
||||
|
||||
// Create the full filepath.
|
||||
AZStd::string safeFilePath;
|
||||
|
||||
@@ -224,8 +224,22 @@ namespace PhysX {
|
||||
physx::PxJointLimitCone limitCone(swingLimitY, swingLimitZ);
|
||||
joint->setSwingLimit(limitCone);
|
||||
|
||||
const float twistLower = AZ::DegToRad(AZStd::GetMin(configuration.m_twistLimitLower, configuration.m_twistLimitUpper));
|
||||
const float twistUpper = AZ::DegToRad(AZStd::GetMax(configuration.m_twistLimitLower, configuration.m_twistLimitUpper));
|
||||
float twistLower = AZ::DegToRad(AZStd::GetMin(configuration.m_twistLimitLower, configuration.m_twistLimitUpper));
|
||||
float twistUpper = AZ::DegToRad(AZStd::GetMax(configuration.m_twistLimitLower, configuration.m_twistLimitUpper));
|
||||
// make sure there is at least a small difference between the lower and upper limits to avoid problems in PhysX
|
||||
const float minTwistLimitRangeRadians = AZ::DegToRad(JointConstants::MinTwistLimitRangeDegrees);
|
||||
if (const float twistLimitRange = twistUpper - twistLower;
|
||||
twistLimitRange < minTwistLimitRangeRadians)
|
||||
{
|
||||
if (twistUpper > 0.0f)
|
||||
{
|
||||
twistLower -= (minTwistLimitRangeRadians - twistLimitRange);
|
||||
}
|
||||
else
|
||||
{
|
||||
twistUpper += (minTwistLimitRangeRadians - twistLimitRange);
|
||||
}
|
||||
}
|
||||
physx::PxJointAngularLimitPair twistLimitPair(twistLower, twistUpper);
|
||||
joint->setTwistLimit(twistLimitPair);
|
||||
|
||||
|
||||
@@ -18,9 +18,11 @@ namespace PhysX
|
||||
{
|
||||
namespace JointConstants
|
||||
{
|
||||
// Setting swing limits to very small values can cause extreme stability problems, so clamp above a small
|
||||
// Setting joint limits to very small values can cause extreme stability problems, so clamp above a small
|
||||
// threshold.
|
||||
static const float MinSwingLimitDegrees = 1.0f;
|
||||
// Minimum range between lower and upper twist limits.
|
||||
static const float MinTwistLimitRangeDegrees = 1.0f;
|
||||
} // namespace JointConstants
|
||||
|
||||
namespace Utils
|
||||
|
||||
@@ -89,7 +89,6 @@ protected:
|
||||
AZ::SerializeContext* GetSerializeContext() override { return m_serializeContext; }
|
||||
AZ::BehaviorContext* GetBehaviorContext() override { return nullptr; }
|
||||
AZ::JsonRegistrationContext* GetJsonRegistrationContext() override { return nullptr; }
|
||||
const char* GetAppRoot() const override { return nullptr; }
|
||||
const char* GetEngineRoot() const override { return nullptr; }
|
||||
const char* GetExecutableFolder() const override { return nullptr; }
|
||||
void EnumerateEntities(const AZ::ComponentApplicationRequests::EntityCallback& /*callback*/) override {}
|
||||
|
||||
@@ -91,14 +91,6 @@ namespace ScriptCanvasTests
|
||||
AZ::IO::FileIOBase* fileIO = AZ::IO::FileIOBase::GetInstance();
|
||||
AZ_Assert(fileIO, "SC unit tests require filehandling");
|
||||
|
||||
if (!fileIO->GetAlias("@engroot@"))
|
||||
{
|
||||
const char* engineRoot = nullptr;
|
||||
AzFramework::ApplicationRequests::Bus::BroadcastResult(engineRoot, &AzFramework::ApplicationRequests::GetEngineRoot);
|
||||
AZ_Assert(engineRoot, "null engine root");
|
||||
fileIO->SetAlias("@engroot@", engineRoot);
|
||||
}
|
||||
|
||||
s_setupSucceeded = fileIO->GetAlias("@engroot@") != nullptr;
|
||||
|
||||
AZ::TickBus::AllowFunctionQueuing(true);
|
||||
|
||||
-11
@@ -24,17 +24,6 @@ namespace Camera
|
||||
Z_Axis = 2
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
/// These are intended to be used as an index and needs to be implicitly
|
||||
/// convertible to int. See StartingPointCameraUtilities.h for examples
|
||||
enum VectorComponentType : int
|
||||
{
|
||||
X_Component = 0,
|
||||
Y_Component = 1,
|
||||
Z_Component = 2,
|
||||
None = 3,
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
/// These are intended to be used as an index and needs to be implicitly
|
||||
/// convertible to int. See StartingPointCameraUtilities.h for examples
|
||||
|
||||
+5
-13
@@ -16,24 +16,16 @@ namespace Camera
|
||||
{
|
||||
const char* GetNameFromUuid(const AZ::Uuid& uuid);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
/// This methods will 0 out a vector component and re-normalize it
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void MaskComponentFromNormalizedVector(AZ::Vector3& v, VectorComponentType vectorComponentType);
|
||||
//! This methods will 0 out specified vector components and re-normalize it
|
||||
void MaskComponentFromNormalizedVector(AZ::Vector3& v, bool ignoreX, bool ignoreY, bool ignoreZ);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
/// This will calculate the requested Euler angle from a given AZ::Quaternion
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
//! This will calculate the requested Euler angle from a given AZ::Quaternion
|
||||
float GetEulerAngleFromTransform(const AZ::Transform& rotation, EulerAngleType eulerAngleType);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
/// This will calculate an AZ::Transform based on an Euler angle
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
//! This will calculate an AZ::Transform based on an Euler angle
|
||||
AZ::Transform CreateRotationFromEulerAngle(EulerAngleType rotationType, float radians);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
/// Creates the Quaternion representing the rotation looking down the vector
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
//! Creates the Quaternion representing the rotation looking down the vector
|
||||
AZ::Quaternion CreateQuaternionFromViewVector(const AZ::Vector3 lookVector);
|
||||
|
||||
} //namespace Camera
|
||||
|
||||
+12
-9
@@ -20,10 +20,12 @@ namespace Camera
|
||||
if (serializeContext)
|
||||
{
|
||||
serializeContext->Class<SlideAlongAxisBasedOnAngle>()
|
||||
->Version(1)
|
||||
->Version(2)
|
||||
->Field("Axis to slide along", &SlideAlongAxisBasedOnAngle::m_axisToSlideAlong)
|
||||
->Field("Angle Type", &SlideAlongAxisBasedOnAngle::m_angleTypeToChangeFor)
|
||||
->Field("Vector Component To Ignore", &SlideAlongAxisBasedOnAngle::m_vectorComponentToIgnore)
|
||||
->Field("Ignore X Component", &SlideAlongAxisBasedOnAngle::m_ignoreX)
|
||||
->Field("Ignore Y Component", &SlideAlongAxisBasedOnAngle::m_ignoreY)
|
||||
->Field("Ignore Z Component", &SlideAlongAxisBasedOnAngle::m_ignoreZ)
|
||||
->Field("Max Positive Slide Distance", &SlideAlongAxisBasedOnAngle::m_maximumPositiveSlideDistance)
|
||||
->Field("Max Negative Slide Distance", &SlideAlongAxisBasedOnAngle::m_maximumNegativeSlideDistance);
|
||||
|
||||
@@ -40,15 +42,16 @@ namespace Camera
|
||||
->EnumAttribute(EulerAngleType::Pitch, "Pitch")
|
||||
->EnumAttribute(EulerAngleType::Roll, "Roll")
|
||||
->EnumAttribute(EulerAngleType::Yaw, "Yaw")
|
||||
->DataElement(AZ::Edit::UIHandlers::ComboBox, &SlideAlongAxisBasedOnAngle::m_vectorComponentToIgnore, "Vector Component To Ignore", "The Vector Component To Ignore")
|
||||
->EnumAttribute(VectorComponentType::None, "None")
|
||||
->EnumAttribute(VectorComponentType::X_Component, "X")
|
||||
->EnumAttribute(VectorComponentType::Y_Component, "Y")
|
||||
->EnumAttribute(VectorComponentType::Z_Component, "Z")
|
||||
->DataElement(0, &SlideAlongAxisBasedOnAngle::m_maximumPositiveSlideDistance, "Max Positive Slide Distance", "The maximum distance to slide in the positive")
|
||||
->Attribute(AZ::Edit::Attributes::Suffix, "m")
|
||||
->DataElement(0, &SlideAlongAxisBasedOnAngle::m_maximumNegativeSlideDistance, "Max Negative Slide Distance", "The maximum distance to slide in the negative")
|
||||
->Attribute(AZ::Edit::Attributes::Suffix, "m");
|
||||
->Attribute(AZ::Edit::Attributes::Suffix, "m")
|
||||
->ClassElement(AZ::Edit::ClassElements::Group, "Vector Components To Ignore")
|
||||
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
|
||||
->DataElement(0, &SlideAlongAxisBasedOnAngle::m_ignoreX, "X", "When active, the X Component will be ignored.")
|
||||
->DataElement(0, &SlideAlongAxisBasedOnAngle::m_ignoreY, "Y", "When active, the Y Component will be ignored.")
|
||||
->DataElement(0, &SlideAlongAxisBasedOnAngle::m_ignoreZ, "Z", "When active, the Z Component will be ignored.")
|
||||
;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -60,7 +63,7 @@ namespace Camera
|
||||
float slideScale = currentPositionOnRange > 0.0f ? m_maximumPositiveSlideDistance : m_maximumNegativeSlideDistance;
|
||||
|
||||
AZ::Vector3 basis = outLookAtTargetTransform.GetBasis(m_axisToSlideAlong);
|
||||
MaskComponentFromNormalizedVector(basis, m_vectorComponentToIgnore);
|
||||
MaskComponentFromNormalizedVector(basis, m_ignoreX, m_ignoreY, m_ignoreZ);
|
||||
|
||||
outLookAtTargetTransform.SetTranslation(outLookAtTargetTransform.GetTranslation() + basis * currentPositionOnRange * slideScale);
|
||||
}
|
||||
|
||||
+3
-1
@@ -43,8 +43,10 @@ namespace Camera
|
||||
// Reflected data
|
||||
RelativeAxisType m_axisToSlideAlong = ForwardBackward;
|
||||
EulerAngleType m_angleTypeToChangeFor = Pitch;
|
||||
VectorComponentType m_vectorComponentToIgnore = None;
|
||||
float m_maximumPositiveSlideDistance = 0.0f;
|
||||
float m_maximumNegativeSlideDistance = 0.0f;
|
||||
bool m_ignoreX = false;
|
||||
bool m_ignoreY = false;
|
||||
bool m_ignoreZ = false;
|
||||
};
|
||||
} // namespace Camera
|
||||
|
||||
+14
-26
@@ -26,38 +26,32 @@ namespace Camera
|
||||
return "";
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
/// This methods will 0 out a vector component and re-normalize it
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void MaskComponentFromNormalizedVector(AZ::Vector3& v, VectorComponentType vectorComponentType)
|
||||
void MaskComponentFromNormalizedVector(AZ::Vector3& v, bool ignoreX, bool ignoreY, bool ignoreZ)
|
||||
{
|
||||
switch (vectorComponentType)
|
||||
{
|
||||
case X_Component:
|
||||
|
||||
if (ignoreX)
|
||||
{
|
||||
v.SetX(0.f);
|
||||
break;
|
||||
}
|
||||
case Y_Component:
|
||||
|
||||
if (ignoreY)
|
||||
{
|
||||
v.SetY(0.f);
|
||||
break;
|
||||
}
|
||||
case Z_Component:
|
||||
|
||||
if (ignoreZ)
|
||||
{
|
||||
v.SetZ(0.f);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
AZ_Assert(false, "MaskComponentFromNormalizedVector: VectorComponentType - unexpected value");
|
||||
break;
|
||||
|
||||
if (v.IsZero())
|
||||
{
|
||||
AZ_Warning("StartingPointCameraUtilities", false, "MaskComponentFromNormalizedVector: trying to normalize zero vector.")
|
||||
return;
|
||||
}
|
||||
v.Normalize();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
/// This will calculate the requested Euler angle from a given AZ::Quaternion
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
float GetEulerAngleFromTransform(const AZ::Transform& rotation, EulerAngleType eulerAngleType)
|
||||
{
|
||||
AZ::Vector3 angles = rotation.GetEulerDegrees();
|
||||
@@ -70,14 +64,11 @@ namespace Camera
|
||||
case Yaw:
|
||||
return angles.GetZ();
|
||||
default:
|
||||
AZ_Warning("", false, "GetEulerAngleFromRotation: eulerAngleType - value not supported");
|
||||
AZ_Warning("StartingPointCameraUtilities", false, "GetEulerAngleFromRotation: eulerAngleType - value not supported");
|
||||
return 0.f;
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
/// This will calculate an AZ::Transform based on an Euler angle
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
AZ::Transform CreateRotationFromEulerAngle(EulerAngleType rotationType, float radians)
|
||||
{
|
||||
switch (rotationType)
|
||||
@@ -89,14 +80,11 @@ namespace Camera
|
||||
case Yaw:
|
||||
return AZ::Transform::CreateRotationZ(radians);
|
||||
default:
|
||||
AZ_Warning("", false, "CreateRotationFromEulerAngle: rotationType - value not supported");
|
||||
AZ_Warning("StartingPointCameraUtilities", false, "CreateRotationFromEulerAngle: rotationType - value not supported");
|
||||
return AZ::Transform::Identity();
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
/// Creates the Quaternion representing the rotation looking down the vector
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
AZ::Quaternion CreateQuaternionFromViewVector(const AZ::Vector3 lookVector)
|
||||
{
|
||||
float twoDimensionLength = AZ::Vector2(lookVector.GetX(), lookVector.GetY()).GetLength();
|
||||
|
||||
@@ -56,6 +56,7 @@ ShaderResourceGroup ObjectSrg : SRG_PerObject
|
||||
float m_padding;
|
||||
bool m_useReflectionProbe;
|
||||
bool m_useParallaxCorrection;
|
||||
float m_exposure;
|
||||
};
|
||||
|
||||
ReflectionProbeData m_reflectionProbeData;
|
||||
|
||||
@@ -185,12 +185,28 @@ namespace Terrain
|
||||
|
||||
void TerrainPhysicsColliderComponent::GetHeightfieldHeightBounds(float& minHeightBounds, float& maxHeightBounds) const
|
||||
{
|
||||
AZ::Aabb heightfieldAabb = GetHeightfieldAabb();
|
||||
const AZ::Aabb heightfieldAabb = GetHeightfieldAabb();
|
||||
|
||||
// Because our terrain heights are relative to the center of the bounding box, the min and max allowable heights are also
|
||||
// relative to the center. They are also clamped to the size of the bounding box.
|
||||
minHeightBounds = -(heightfieldAabb.GetZExtent() / 2.0f);
|
||||
maxHeightBounds = heightfieldAabb.GetZExtent() / 2.0f;
|
||||
minHeightBounds = -maxHeightBounds;
|
||||
}
|
||||
|
||||
float TerrainPhysicsColliderComponent::GetHeightfieldMinHeight() const
|
||||
{
|
||||
float minHeightBounds{ 0.0f };
|
||||
float maxHeightBounds{ 0.0f };
|
||||
GetHeightfieldHeightBounds(minHeightBounds, maxHeightBounds);
|
||||
return minHeightBounds;
|
||||
}
|
||||
|
||||
float TerrainPhysicsColliderComponent::GetHeightfieldMaxHeight() const
|
||||
{
|
||||
float minHeightBounds{ 0.0f };
|
||||
float maxHeightBounds{ 0.0f };
|
||||
GetHeightfieldHeightBounds(minHeightBounds, maxHeightBounds);
|
||||
return maxHeightBounds;
|
||||
}
|
||||
|
||||
AZ::Transform TerrainPhysicsColliderComponent::GetHeightfieldTransform() const
|
||||
@@ -199,9 +215,7 @@ namespace Terrain
|
||||
AZ::Vector3 translate;
|
||||
AZ::TransformBus::EventResult(translate, GetEntityId(), &AZ::TransformBus::Events::GetWorldTranslation);
|
||||
|
||||
AZ::Transform transform = AZ::Transform::CreateTranslation(translate);
|
||||
|
||||
return transform;
|
||||
return AZ::Transform::CreateTranslation(translate);
|
||||
}
|
||||
|
||||
void TerrainPhysicsColliderComponent::GenerateHeightsInBounds(AZStd::vector<float>& heights) const
|
||||
@@ -298,6 +312,24 @@ namespace Terrain
|
||||
numRows = aznumeric_cast<int32_t>((bounds.GetMax().GetY() - bounds.GetMin().GetY()) / gridResolution.GetY());
|
||||
}
|
||||
|
||||
int32_t TerrainPhysicsColliderComponent::GetHeightfieldGridColumns() const
|
||||
{
|
||||
int32_t numColumns{ 0 };
|
||||
int32_t numRows{ 0 };
|
||||
|
||||
GetHeightfieldGridSize(numColumns, numRows);
|
||||
return numColumns;
|
||||
}
|
||||
|
||||
int32_t TerrainPhysicsColliderComponent::GetHeightfieldGridRows() const
|
||||
{
|
||||
int32_t numColumns{ 0 };
|
||||
int32_t numRows{ 0 };
|
||||
|
||||
GetHeightfieldGridSize(numColumns, numRows);
|
||||
return numRows;
|
||||
}
|
||||
|
||||
AZStd::vector<Physics::MaterialId> TerrainPhysicsColliderComponent::GetMaterialList() const
|
||||
{
|
||||
return AZStd::vector<Physics::MaterialId>();
|
||||
|
||||
@@ -58,7 +58,11 @@ namespace Terrain
|
||||
// HeightfieldProviderRequestsBus
|
||||
AZ::Vector2 GetHeightfieldGridSpacing() const override;
|
||||
void GetHeightfieldGridSize(int32_t& numColumns, int32_t& numRows) const override;
|
||||
int32_t GetHeightfieldGridColumns() const override;
|
||||
int32_t GetHeightfieldGridRows() const override;
|
||||
void GetHeightfieldHeightBounds(float& minHeightBounds, float& maxHeightBounds) const override;
|
||||
float GetHeightfieldMinHeight() const override;
|
||||
float GetHeightfieldMaxHeight() const override;
|
||||
AZ::Aabb GetHeightfieldAabb() const override;
|
||||
AZ::Transform GetHeightfieldTransform() const override;
|
||||
AZStd::vector<Physics::MaterialId> GetMaterialList() const override;
|
||||
|
||||
+3
-3
@@ -74,7 +74,7 @@ namespace Terrain
|
||||
|
||||
->DataElement(
|
||||
AZ::Edit::UIHandlers::Default, &TerrainSurfaceMaterialsListConfig::m_surfaceMaterials,
|
||||
"Gradient to Material Mappings", "Maps surfaces to materials.");
|
||||
"Material Mappings", "Maps surfaces to materials.");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -134,12 +134,12 @@ namespace Terrain
|
||||
void TerrainSurfaceMaterialsListComponent::Deactivate()
|
||||
{
|
||||
TerrainAreaMaterialRequestBus::Handler::BusDisconnect();
|
||||
AZ::Data::AssetBus::MultiHandler::BusDisconnect();
|
||||
|
||||
for (auto& surfaceMaterialMapping : m_configuration.m_surfaceMaterials)
|
||||
{
|
||||
if (surfaceMaterialMapping.m_materialAsset.GetId().IsValid())
|
||||
{
|
||||
AZ::Data::AssetBus::MultiHandler::BusDisconnect(surfaceMaterialMapping.m_materialAsset.GetId());
|
||||
surfaceMaterialMapping.m_materialAsset.Release();
|
||||
surfaceMaterialMapping.m_materialInstance.reset();
|
||||
surfaceMaterialMapping.m_activeMaterialAssetId = AZ::Data::AssetId();
|
||||
@@ -241,7 +241,7 @@ namespace Terrain
|
||||
// All materials have been deactivated, stop listening for requests and notifications.
|
||||
m_cachedAabb = AZ::Aabb::CreateNull();
|
||||
LmbrCentral::ShapeComponentNotificationsBus::Handler::BusDisconnect();
|
||||
TerrainAreaMaterialRequestBus::Handler::BusConnect(GetEntityId());
|
||||
TerrainAreaMaterialRequestBus::Handler::BusDisconnect();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,15 +6,13 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <AzTest/AzTest.h>
|
||||
|
||||
#include <AzCore/Component/ComponentApplication.h>
|
||||
#include <AzCore/Component/TransformBus.h>
|
||||
#include <AzCore/Memory/MemoryComponent.h>
|
||||
|
||||
#include <AzFramework/Terrain/TerrainDataRequestBus.h>
|
||||
|
||||
#include <Components/TerrainLayerSpawnerComponent.h>
|
||||
#include <LmbrCentral/Shape/BoxShapeComponentBus.h>
|
||||
#include <AzTest/AzTest.h>
|
||||
|
||||
#include <Terrain/MockTerrain.h>
|
||||
#include <MockAxisAlignedBoxShapeComponent.h>
|
||||
@@ -23,21 +21,12 @@ using ::testing::NiceMock;
|
||||
using ::testing::AtLeast;
|
||||
using ::testing::_;
|
||||
|
||||
using ::testing::NiceMock;
|
||||
using ::testing::AtLeast;
|
||||
using ::testing::_;
|
||||
|
||||
class LayerSpawnerComponentTest
|
||||
: public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
AZ::ComponentApplication m_app;
|
||||
|
||||
AZStd::unique_ptr<AZ::Entity> m_entity;
|
||||
Terrain::TerrainLayerSpawnerComponent* m_layerSpawnerComponent;
|
||||
UnitTest::MockAxisAlignedBoxShapeComponent* m_shapeComponent;
|
||||
AZStd::unique_ptr<NiceMock<UnitTest::MockTerrainSystemService>> m_terrainSystem;
|
||||
|
||||
void SetUp() override
|
||||
{
|
||||
AZ::ComponentApplication::Descriptor appDesc;
|
||||
@@ -50,78 +39,86 @@ protected:
|
||||
|
||||
void TearDown() override
|
||||
{
|
||||
m_entity.reset();
|
||||
m_terrainSystem.reset();
|
||||
m_app.Destroy();
|
||||
}
|
||||
|
||||
void CreateEntity()
|
||||
AZStd::unique_ptr<AZ::Entity> CreateEntity()
|
||||
{
|
||||
m_entity = AZStd::make_unique<AZ::Entity>();
|
||||
m_entity->Init();
|
||||
auto entity = AZStd::make_unique<AZ::Entity>();
|
||||
entity->Init();
|
||||
|
||||
ASSERT_TRUE(m_entity);
|
||||
return entity;
|
||||
}
|
||||
|
||||
void AddLayerSpawnerAndShapeComponentToEntity()
|
||||
Terrain::TerrainLayerSpawnerComponent* AddLayerSpawnerToEntity(AZ::Entity* entity, const Terrain::TerrainLayerSpawnerConfig& config)
|
||||
{
|
||||
AddLayerSpawnerAndShapeComponentToEntity(Terrain::TerrainLayerSpawnerConfig());
|
||||
auto layerSpawnerComponent = entity->CreateComponent<Terrain::TerrainLayerSpawnerComponent>(config);
|
||||
m_app.RegisterComponentDescriptor(layerSpawnerComponent->CreateDescriptor());
|
||||
|
||||
return layerSpawnerComponent;
|
||||
}
|
||||
|
||||
void AddLayerSpawnerAndShapeComponentToEntity(const Terrain::TerrainLayerSpawnerConfig& config)
|
||||
UnitTest::MockAxisAlignedBoxShapeComponent* AddShapeComponentToEntity(AZ::Entity* entity)
|
||||
{
|
||||
m_layerSpawnerComponent = m_entity->CreateComponent<Terrain::TerrainLayerSpawnerComponent>(config);
|
||||
m_app.RegisterComponentDescriptor(m_layerSpawnerComponent->CreateDescriptor());
|
||||
UnitTest::MockAxisAlignedBoxShapeComponent* shapeComponent = entity->CreateComponent<UnitTest::MockAxisAlignedBoxShapeComponent>();
|
||||
m_app.RegisterComponentDescriptor(shapeComponent->CreateDescriptor());
|
||||
|
||||
m_shapeComponent = m_entity->CreateComponent<UnitTest::MockAxisAlignedBoxShapeComponent>();
|
||||
m_app.RegisterComponentDescriptor(m_shapeComponent->CreateDescriptor());
|
||||
|
||||
ASSERT_TRUE(m_layerSpawnerComponent);
|
||||
ASSERT_TRUE(m_shapeComponent);
|
||||
}
|
||||
|
||||
void CreateMockTerrainSystem()
|
||||
{
|
||||
m_terrainSystem = AZStd::make_unique<NiceMock<UnitTest::MockTerrainSystemService>>();
|
||||
return shapeComponent;
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(LayerSpawnerComponentTest, ActivatEntityActivateSuccess)
|
||||
TEST_F(LayerSpawnerComponentTest, ActivateEntityWithoutShapeFails)
|
||||
{
|
||||
CreateEntity();
|
||||
AddLayerSpawnerAndShapeComponentToEntity();
|
||||
auto entity = CreateEntity();
|
||||
|
||||
m_entity->Activate();
|
||||
EXPECT_EQ(m_entity->GetState(), AZ::Entity::State::Active);
|
||||
|
||||
m_entity->Deactivate();
|
||||
AddLayerSpawnerToEntity(entity.get(), Terrain::TerrainLayerSpawnerConfig());
|
||||
|
||||
const AZ::Entity::DependencySortOutcome sortOutcome = entity->EvaluateDependenciesGetDetails();
|
||||
EXPECT_FALSE(sortOutcome.IsSuccess());
|
||||
|
||||
entity.reset();
|
||||
}
|
||||
|
||||
TEST_F(LayerSpawnerComponentTest, ActivateEntityActivateSuccess)
|
||||
{
|
||||
auto entity = CreateEntity();
|
||||
|
||||
AddLayerSpawnerToEntity(entity.get(), Terrain::TerrainLayerSpawnerConfig());
|
||||
AddShapeComponentToEntity(entity.get());
|
||||
|
||||
entity->Activate();
|
||||
EXPECT_EQ(entity->GetState(), AZ::Entity::State::Active);
|
||||
|
||||
entity.reset();
|
||||
}
|
||||
|
||||
TEST_F(LayerSpawnerComponentTest, LayerSpawnerDefaultValuesCorrect)
|
||||
{
|
||||
CreateEntity();
|
||||
AddLayerSpawnerAndShapeComponentToEntity();
|
||||
auto entity = CreateEntity();
|
||||
AddLayerSpawnerToEntity(entity.get(), Terrain::TerrainLayerSpawnerConfig());
|
||||
AddShapeComponentToEntity(entity.get());
|
||||
|
||||
m_entity->Activate();
|
||||
entity->Activate();
|
||||
|
||||
AZ::u32 priority = 999, layer = 999;
|
||||
Terrain::TerrainSpawnerRequestBus::Event(m_entity->GetId(), &Terrain::TerrainSpawnerRequestBus::Events::GetPriority, layer, priority);
|
||||
Terrain::TerrainSpawnerRequestBus::Event(entity->GetId(), &Terrain::TerrainSpawnerRequestBus::Events::GetPriority, layer, priority);
|
||||
|
||||
EXPECT_EQ(0, priority);
|
||||
EXPECT_EQ(1, layer);
|
||||
|
||||
bool useGroundPlane = false;
|
||||
|
||||
Terrain::TerrainSpawnerRequestBus::EventResult(useGroundPlane, m_entity->GetId(), &Terrain::TerrainSpawnerRequestBus::Events::GetUseGroundPlane);
|
||||
Terrain::TerrainSpawnerRequestBus::EventResult(
|
||||
useGroundPlane, entity->GetId(), &Terrain::TerrainSpawnerRequestBus::Events::GetUseGroundPlane);
|
||||
|
||||
EXPECT_TRUE(useGroundPlane);
|
||||
|
||||
m_entity->Deactivate();
|
||||
entity.reset();
|
||||
}
|
||||
|
||||
TEST_F(LayerSpawnerComponentTest, LayerSpawnerConfigValuesCorrect)
|
||||
{
|
||||
CreateEntity();
|
||||
auto entity = CreateEntity();
|
||||
|
||||
constexpr static AZ::u32 testPriority = 15;
|
||||
constexpr static AZ::u32 testLayer = 0;
|
||||
@@ -131,12 +128,13 @@ TEST_F(LayerSpawnerComponentTest, LayerSpawnerConfigValuesCorrect)
|
||||
config.m_priority = testPriority;
|
||||
config.m_useGroundPlane = false;
|
||||
|
||||
AddLayerSpawnerAndShapeComponentToEntity(config);
|
||||
AddLayerSpawnerToEntity(entity.get(), config);
|
||||
AddShapeComponentToEntity(entity.get());
|
||||
|
||||
m_entity->Activate();
|
||||
entity->Activate();
|
||||
|
||||
AZ::u32 priority = 999, layer = 999;
|
||||
Terrain::TerrainSpawnerRequestBus::Event(m_entity->GetId(), &Terrain::TerrainSpawnerRequestBus::Events::GetPriority, layer, priority);
|
||||
Terrain::TerrainSpawnerRequestBus::Event(entity->GetId(), &Terrain::TerrainSpawnerRequestBus::Events::GetPriority, layer, priority);
|
||||
|
||||
EXPECT_EQ(testPriority, priority);
|
||||
EXPECT_EQ(testLayer, layer);
|
||||
@@ -144,82 +142,86 @@ TEST_F(LayerSpawnerComponentTest, LayerSpawnerConfigValuesCorrect)
|
||||
bool useGroundPlane = true;
|
||||
|
||||
Terrain::TerrainSpawnerRequestBus::EventResult(
|
||||
useGroundPlane, m_entity->GetId(), &Terrain::TerrainSpawnerRequestBus::Events::GetUseGroundPlane);
|
||||
useGroundPlane, entity->GetId(), &Terrain::TerrainSpawnerRequestBus::Events::GetUseGroundPlane);
|
||||
|
||||
EXPECT_FALSE(useGroundPlane);
|
||||
|
||||
m_entity->Deactivate();
|
||||
entity.reset();
|
||||
}
|
||||
|
||||
TEST_F(LayerSpawnerComponentTest, LayerSpawnerRegisterAreaUpdatesTerrainSystem)
|
||||
{
|
||||
CreateEntity();
|
||||
auto entity = CreateEntity();
|
||||
|
||||
CreateMockTerrainSystem();
|
||||
NiceMock<UnitTest::MockTerrainSystemService> terrainSystem;
|
||||
|
||||
// The Activate call should register the area.
|
||||
EXPECT_CALL(*m_terrainSystem, RegisterArea(_)).Times(1);
|
||||
EXPECT_CALL(terrainSystem, RegisterArea(_)).Times(1);
|
||||
|
||||
AddLayerSpawnerAndShapeComponentToEntity();
|
||||
AddLayerSpawnerToEntity(entity.get(), Terrain::TerrainLayerSpawnerConfig());
|
||||
AddShapeComponentToEntity(entity.get());
|
||||
|
||||
m_entity->Activate();
|
||||
entity->Activate();
|
||||
|
||||
m_entity->Deactivate();
|
||||
entity.reset();
|
||||
}
|
||||
|
||||
TEST_F(LayerSpawnerComponentTest, LayerSpawnerUnregisterAreaUpdatesTerrainSystem)
|
||||
{
|
||||
CreateEntity();
|
||||
auto entity = CreateEntity();
|
||||
|
||||
CreateMockTerrainSystem();
|
||||
NiceMock<UnitTest::MockTerrainSystemService> terrainSystem;
|
||||
|
||||
// The Deactivate call should unregister the area.
|
||||
EXPECT_CALL(*m_terrainSystem, UnregisterArea(_)).Times(1);
|
||||
EXPECT_CALL(terrainSystem, UnregisterArea(_)).Times(1);
|
||||
|
||||
AddLayerSpawnerAndShapeComponentToEntity();
|
||||
AddLayerSpawnerToEntity(entity.get(), Terrain::TerrainLayerSpawnerConfig());
|
||||
AddShapeComponentToEntity(entity.get());
|
||||
|
||||
m_entity->Activate();
|
||||
entity->Activate();
|
||||
|
||||
m_entity->Deactivate();
|
||||
entity.reset();
|
||||
}
|
||||
|
||||
TEST_F(LayerSpawnerComponentTest, LayerSpawnerTransformChangedUpdatesTerrainSystem)
|
||||
{
|
||||
CreateEntity();
|
||||
auto entity = CreateEntity();
|
||||
|
||||
CreateMockTerrainSystem();
|
||||
NiceMock<UnitTest::MockTerrainSystemService> terrainSystem;
|
||||
|
||||
// The TransformChanged call should refresh the area.
|
||||
EXPECT_CALL(*m_terrainSystem, RefreshArea(_, _)).Times(1);
|
||||
EXPECT_CALL(terrainSystem, RefreshArea(_, _)).Times(1);
|
||||
|
||||
AddLayerSpawnerAndShapeComponentToEntity();
|
||||
AddLayerSpawnerToEntity(entity.get(), Terrain::TerrainLayerSpawnerConfig());
|
||||
AddShapeComponentToEntity(entity.get());
|
||||
|
||||
m_entity->Activate();
|
||||
entity->Activate();
|
||||
|
||||
// The component gets transform change notifications via the shape bus.
|
||||
LmbrCentral::ShapeComponentNotificationsBus::Event(
|
||||
m_entity->GetId(), &LmbrCentral::ShapeComponentNotificationsBus::Events::OnShapeChanged,
|
||||
entity->GetId(), &LmbrCentral::ShapeComponentNotificationsBus::Events::OnShapeChanged,
|
||||
LmbrCentral::ShapeComponentNotifications::ShapeChangeReasons::TransformChanged);
|
||||
|
||||
m_entity->Deactivate();
|
||||
entity.reset();
|
||||
}
|
||||
|
||||
TEST_F(LayerSpawnerComponentTest, LayerSpawnerShapeChangedUpdatesTerrainSystem)
|
||||
{
|
||||
CreateEntity();
|
||||
auto entity = CreateEntity();
|
||||
|
||||
CreateMockTerrainSystem();
|
||||
NiceMock<UnitTest::MockTerrainSystemService> terrainSystem;
|
||||
|
||||
// The ShapeChanged call should refresh the area.
|
||||
EXPECT_CALL(*m_terrainSystem, RefreshArea(_, _)).Times(1);
|
||||
EXPECT_CALL(terrainSystem, RefreshArea(_, _)).Times(1);
|
||||
|
||||
AddLayerSpawnerAndShapeComponentToEntity();
|
||||
AddLayerSpawnerToEntity(entity.get(), Terrain::TerrainLayerSpawnerConfig());
|
||||
AddShapeComponentToEntity(entity.get());
|
||||
|
||||
m_entity->Activate();
|
||||
entity->Activate();
|
||||
|
||||
LmbrCentral::ShapeComponentNotificationsBus::Event(
|
||||
m_entity->GetId(), &LmbrCentral::ShapeComponentNotificationsBus::Events::OnShapeChanged,
|
||||
LmbrCentral::ShapeComponentNotificationsBus::Event(
|
||||
entity->GetId(), &LmbrCentral::ShapeComponentNotificationsBus::Events::OnShapeChanged,
|
||||
LmbrCentral::ShapeComponentNotifications::ShapeChangeReasons::ShapeChanged);
|
||||
|
||||
m_entity->Deactivate();
|
||||
entity.reset();
|
||||
}
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
#include <Terrain/MockTerrain.h>
|
||||
|
||||
using ::testing::_;
|
||||
using ::testing::AtLeast;
|
||||
using ::testing::Mock;
|
||||
using ::testing::NiceMock;
|
||||
using ::testing::Return;
|
||||
@@ -29,8 +28,6 @@ class TerrainHeightGradientListComponentTest : public ::testing::Test
|
||||
protected:
|
||||
AZ::ComponentApplication m_app;
|
||||
|
||||
AZStd::unique_ptr<AZ::Entity> m_entity;
|
||||
|
||||
void SetUp() override
|
||||
{
|
||||
AZ::ComponentApplication::Descriptor appDesc;
|
||||
@@ -46,47 +43,70 @@ protected:
|
||||
m_app.Destroy();
|
||||
}
|
||||
|
||||
void CreateEntity()
|
||||
AZStd::unique_ptr<AZ::Entity> CreateEntity()
|
||||
{
|
||||
m_entity = AZStd::make_unique<AZ::Entity>();
|
||||
ASSERT_TRUE(m_entity);
|
||||
|
||||
// Create the required box component.
|
||||
UnitTest::MockAxisAlignedBoxShapeComponent* boxComponent = m_entity->CreateComponent<UnitTest::MockAxisAlignedBoxShapeComponent>();
|
||||
m_app.RegisterComponentDescriptor(boxComponent->CreateDescriptor());
|
||||
auto entity = AZStd::make_unique<AZ::Entity>();
|
||||
entity->Init();
|
||||
return entity;
|
||||
}
|
||||
|
||||
Terrain::TerrainHeightGradientListComponent* AddHeightGradientListToEntity(AZ::Entity* entity)
|
||||
{
|
||||
// Create the TerrainHeightGradientListComponent with an entity in its configuration.
|
||||
Terrain::TerrainHeightGradientListConfig config;
|
||||
config.m_gradientEntities.push_back(m_entity->GetId());
|
||||
config.m_gradientEntities.push_back(entity->GetId());
|
||||
|
||||
Terrain::TerrainHeightGradientListComponent* heightGradientListComponent = m_entity->CreateComponent<Terrain::TerrainHeightGradientListComponent>(config);
|
||||
auto heightGradientListComponent = entity->CreateComponent<Terrain::TerrainHeightGradientListComponent>(config);
|
||||
m_app.RegisterComponentDescriptor(heightGradientListComponent->CreateDescriptor());
|
||||
|
||||
// Create a MockTerrainLayerSpawnerComponent to provide the required TerrainAreaService.
|
||||
UnitTest::MockTerrainLayerSpawnerComponent* layerSpawner = m_entity->CreateComponent<UnitTest::MockTerrainLayerSpawnerComponent>();
|
||||
m_app.RegisterComponentDescriptor(layerSpawner->CreateDescriptor());
|
||||
return heightGradientListComponent;
|
||||
}
|
||||
|
||||
m_entity->Init();
|
||||
void AddRequiredComponetsToEntity(AZ::Entity* entity)
|
||||
{
|
||||
// Create the required box component.
|
||||
UnitTest::MockAxisAlignedBoxShapeComponent* boxComponent = entity->CreateComponent<UnitTest::MockAxisAlignedBoxShapeComponent>();
|
||||
m_app.RegisterComponentDescriptor(boxComponent->CreateDescriptor());
|
||||
|
||||
// Create a MockTerrainLayerSpawnerComponent to provide the required TerrainAreaService.
|
||||
UnitTest::MockTerrainLayerSpawnerComponent* layerSpawner = entity->CreateComponent<UnitTest::MockTerrainLayerSpawnerComponent>();
|
||||
m_app.RegisterComponentDescriptor(layerSpawner->CreateDescriptor());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(TerrainHeightGradientListComponentTest, MissingRequiredComponentsActivateFailure)
|
||||
{
|
||||
auto entity = CreateEntity();
|
||||
|
||||
AddHeightGradientListToEntity(entity.get());
|
||||
|
||||
const AZ::Entity::DependencySortOutcome sortOutcome = entity->EvaluateDependenciesGetDetails();
|
||||
EXPECT_FALSE(sortOutcome.IsSuccess());
|
||||
}
|
||||
|
||||
TEST_F(TerrainHeightGradientListComponentTest, ActivateEntityActivateSuccess)
|
||||
{
|
||||
// Check that the entity activates.
|
||||
CreateEntity();
|
||||
auto entity = CreateEntity();
|
||||
|
||||
m_entity->Activate();
|
||||
EXPECT_EQ(m_entity->GetState(), AZ::Entity::State::Active);
|
||||
AddHeightGradientListToEntity(entity.get());
|
||||
|
||||
m_entity.reset();
|
||||
AddRequiredComponetsToEntity(entity.get());
|
||||
|
||||
entity->Activate();
|
||||
EXPECT_EQ(entity->GetState(), AZ::Entity::State::Active);
|
||||
}
|
||||
|
||||
TEST_F(TerrainHeightGradientListComponentTest, TerrainHeightGradientRefreshesTerrainSystem)
|
||||
{
|
||||
// Check that the HeightGradientListComponent informs the TerrainSystem when the composition changes.
|
||||
CreateEntity();
|
||||
auto entity = CreateEntity();
|
||||
|
||||
m_entity->Activate();
|
||||
AddHeightGradientListToEntity(entity.get());
|
||||
|
||||
AddRequiredComponetsToEntity(entity.get());
|
||||
|
||||
entity->Activate();
|
||||
|
||||
NiceMock<UnitTest::MockTerrainSystemService> terrainSystem;
|
||||
|
||||
@@ -95,32 +115,34 @@ TEST_F(TerrainHeightGradientListComponentTest, TerrainHeightGradientRefreshesTer
|
||||
// and once when the HeightGradientListComponent gets the OnCompositionChanged directly through the DependencyNotificationBus.
|
||||
EXPECT_CALL(terrainSystem, RefreshArea(_, _)).Times(2);
|
||||
|
||||
LmbrCentral::DependencyNotificationBus::Event(m_entity->GetId(), &LmbrCentral::DependencyNotificationBus::Events::OnCompositionChanged);
|
||||
LmbrCentral::DependencyNotificationBus::Event(entity->GetId(), &LmbrCentral::DependencyNotificationBus::Events::OnCompositionChanged);
|
||||
|
||||
// Stop the EXPECT_CALL check now, as OnCompositionChanged will get called twice again during the reset.
|
||||
Mock::VerifyAndClearExpectations(&terrainSystem);
|
||||
|
||||
m_entity.reset();
|
||||
}
|
||||
|
||||
TEST_F(TerrainHeightGradientListComponentTest, TerrainHeightGradientListReturnsHeights)
|
||||
{
|
||||
// Check that the HeightGradientListComponent returns expected height values.
|
||||
CreateEntity();
|
||||
auto entity = CreateEntity();
|
||||
|
||||
NiceMock<UnitTest::MockTerrainAreaHeightRequests> heightfieldRequestBus(m_entity->GetId());
|
||||
AddHeightGradientListToEntity(entity.get());
|
||||
|
||||
m_entity->Activate();
|
||||
AddRequiredComponetsToEntity(entity.get());
|
||||
|
||||
NiceMock<UnitTest::MockTerrainAreaHeightRequests> heightfieldRequestBus(entity->GetId());
|
||||
|
||||
entity->Activate();
|
||||
|
||||
const float mockGradientValue = 0.25f;
|
||||
NiceMock<UnitTest::MockGradientRequests> gradientRequests(m_entity->GetId());
|
||||
NiceMock<UnitTest::MockGradientRequests> gradientRequests(entity->GetId());
|
||||
ON_CALL(gradientRequests, GetValue).WillByDefault(Return(mockGradientValue));
|
||||
|
||||
// Setup a mock to provide the encompassing Aabb to the HeightGradientListComponent.
|
||||
const float min = 0.0f;
|
||||
const float max = 1000.0f;
|
||||
const AZ::Aabb aabb = AZ::Aabb::CreateFromMinMax(AZ::Vector3(min), AZ::Vector3(max));
|
||||
NiceMock<UnitTest::MockShapeComponentRequests> mockShapeRequests(m_entity->GetId());
|
||||
NiceMock<UnitTest::MockShapeComponentRequests> mockShapeRequests(entity->GetId());
|
||||
ON_CALL(mockShapeRequests, GetEncompassingAabb).WillByDefault(Return(aabb));
|
||||
|
||||
const float worldMax = 10000.0f;
|
||||
@@ -130,17 +152,16 @@ TEST_F(TerrainHeightGradientListComponentTest, TerrainHeightGradientListReturnsH
|
||||
ON_CALL(mockterrainDataRequests, GetTerrainAabb).WillByDefault(Return(worldAabb));
|
||||
|
||||
// Ensure the cached values in the HeightGradientListComponent are up to date.
|
||||
LmbrCentral::DependencyNotificationBus::Event(m_entity->GetId(), &LmbrCentral::DependencyNotificationBus::Events::OnCompositionChanged);
|
||||
LmbrCentral::DependencyNotificationBus::Event(entity->GetId(), &LmbrCentral::DependencyNotificationBus::Events::OnCompositionChanged);
|
||||
|
||||
const AZ::Vector3 inPosition = AZ::Vector3::CreateZero();
|
||||
AZ::Vector3 outPosition = AZ::Vector3::CreateZero();
|
||||
bool terrainExists = false;
|
||||
Terrain::TerrainAreaHeightRequestBus::Event(m_entity->GetId(), &Terrain::TerrainAreaHeightRequestBus::Events::GetHeight, inPosition, outPosition, terrainExists);
|
||||
Terrain::TerrainAreaHeightRequestBus::Event(
|
||||
entity->GetId(), &Terrain::TerrainAreaHeightRequestBus::Events::GetHeight, inPosition, outPosition, terrainExists);
|
||||
|
||||
const float height = outPosition.GetZ();
|
||||
|
||||
EXPECT_NEAR(height, mockGradientValue * max, 0.01f);
|
||||
|
||||
m_entity.reset();
|
||||
}
|
||||
|
||||
|
||||
@@ -11,8 +11,6 @@
|
||||
#include <GradientSignal/Ebuses/MockGradientRequestBus.h>
|
||||
|
||||
using ::testing::NiceMock;
|
||||
using ::testing::AtLeast;
|
||||
using ::testing::_;
|
||||
using ::testing::Return;
|
||||
|
||||
namespace UnitTest
|
||||
@@ -22,10 +20,6 @@ namespace UnitTest
|
||||
protected:
|
||||
AZ::ComponentApplication m_app;
|
||||
|
||||
AZStd::unique_ptr<AZ::Entity> m_entity;
|
||||
UnitTest::MockTerrainLayerSpawnerComponent* m_layerSpawnerComponent = nullptr;
|
||||
AZStd::unique_ptr<AZ::Entity> m_gradientEntity1, m_gradientEntity2;
|
||||
|
||||
const AZStd::string surfaceTag1 = "testtag1";
|
||||
const AZStd::string surfaceTag2 = "testtag2";
|
||||
|
||||
@@ -37,81 +31,76 @@ namespace UnitTest
|
||||
appDesc.m_stackRecordLevels = 20;
|
||||
|
||||
m_app.Create(appDesc);
|
||||
|
||||
CreateEntities();
|
||||
}
|
||||
|
||||
void TearDown() override
|
||||
{
|
||||
m_gradientEntity2.reset();
|
||||
m_gradientEntity1.reset();
|
||||
m_entity.reset();
|
||||
|
||||
m_app.Destroy();
|
||||
}
|
||||
|
||||
void CreateEntities()
|
||||
AZStd::unique_ptr<AZ::Entity> CreateEntity()
|
||||
{
|
||||
m_entity = AZStd::make_unique<AZ::Entity>();
|
||||
ASSERT_TRUE(m_entity);
|
||||
|
||||
m_entity->Init();
|
||||
|
||||
m_gradientEntity1 = AZStd::make_unique<AZ::Entity>();
|
||||
ASSERT_TRUE(m_gradientEntity1);
|
||||
|
||||
m_gradientEntity1->Init();
|
||||
|
||||
m_gradientEntity2 = AZStd::make_unique<AZ::Entity>();
|
||||
ASSERT_TRUE(m_gradientEntity2);
|
||||
|
||||
m_gradientEntity2->Init();
|
||||
auto entity = AZStd::make_unique<AZ::Entity>();
|
||||
entity->Init();
|
||||
return entity;
|
||||
}
|
||||
|
||||
void AddSurfaceGradientListToEntities()
|
||||
UnitTest::MockTerrainLayerSpawnerComponent* AddRequiredComponentsToEntity(AZ::Entity* entity)
|
||||
{
|
||||
m_layerSpawnerComponent = m_entity->CreateComponent<UnitTest::MockTerrainLayerSpawnerComponent>();
|
||||
m_app.RegisterComponentDescriptor(m_layerSpawnerComponent->CreateDescriptor());
|
||||
auto layerSpawnerComponent = entity->CreateComponent<UnitTest::MockTerrainLayerSpawnerComponent>();
|
||||
m_app.RegisterComponentDescriptor(layerSpawnerComponent->CreateDescriptor());
|
||||
|
||||
Terrain::TerrainSurfaceGradientListConfig config;
|
||||
|
||||
Terrain::TerrainSurfaceGradientMapping mapping1;
|
||||
mapping1.m_gradientEntityId = m_gradientEntity1->GetId();
|
||||
mapping1.m_surfaceTag = SurfaceData::SurfaceTag(surfaceTag1);
|
||||
config.m_gradientSurfaceMappings.emplace_back(mapping1);
|
||||
|
||||
Terrain::TerrainSurfaceGradientMapping mapping2;
|
||||
mapping2.m_gradientEntityId = m_gradientEntity2->GetId();
|
||||
mapping2.m_surfaceTag = SurfaceData::SurfaceTag(surfaceTag2);
|
||||
config.m_gradientSurfaceMappings.emplace_back(mapping2);
|
||||
|
||||
Terrain::TerrainSurfaceGradientListComponent* terrainSurfaceGradientListComponent =
|
||||
m_entity->CreateComponent<Terrain::TerrainSurfaceGradientListComponent>(config);
|
||||
m_app.RegisterComponentDescriptor(terrainSurfaceGradientListComponent->CreateDescriptor());
|
||||
return layerSpawnerComponent;
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(TerrainSurfaceGradientListTest, SurfaceGradientMissingRequirementsActivateFails)
|
||||
{
|
||||
auto entity = CreateEntity();
|
||||
|
||||
auto terrainSurfaceGradientListComponent = entity->CreateComponent<Terrain::TerrainSurfaceGradientListComponent>();
|
||||
m_app.RegisterComponentDescriptor(terrainSurfaceGradientListComponent->CreateDescriptor());
|
||||
|
||||
const AZ::Entity::DependencySortOutcome sortOutcome = entity->EvaluateDependenciesGetDetails();
|
||||
EXPECT_FALSE(sortOutcome.IsSuccess());
|
||||
}
|
||||
|
||||
TEST_F(TerrainSurfaceGradientListTest, SurfaceGradientActivateSuccess)
|
||||
{
|
||||
auto entity = CreateEntity();
|
||||
|
||||
AddRequiredComponentsToEntity(entity.get());
|
||||
|
||||
auto terrainSurfaceGradientListComponent = entity->CreateComponent<Terrain::TerrainSurfaceGradientListComponent>();
|
||||
m_app.RegisterComponentDescriptor(terrainSurfaceGradientListComponent->CreateDescriptor());
|
||||
|
||||
entity->Activate();
|
||||
|
||||
EXPECT_EQ(entity->GetState(), AZ::Entity::State::Active);
|
||||
}
|
||||
|
||||
TEST_F(TerrainSurfaceGradientListTest, SurfaceGradientReturnsSurfaceWeights)
|
||||
{
|
||||
// When there is more than one surface/weight defined and added to the component, they should all
|
||||
// be returned. The component isn't required to return them in descending order.
|
||||
AddSurfaceGradientListToEntities();
|
||||
auto entity = CreateEntity();
|
||||
|
||||
m_entity->Activate();
|
||||
m_gradientEntity1->Activate();
|
||||
m_gradientEntity2->Activate();
|
||||
AddRequiredComponentsToEntity(entity.get());
|
||||
|
||||
auto gradientEntity1 = CreateEntity();
|
||||
auto gradientEntity2 = CreateEntity();
|
||||
|
||||
const float gradient1Value = 0.3f;
|
||||
NiceMock<UnitTest::MockGradientRequests> mockGradientRequests1(m_gradientEntity1->GetId());
|
||||
NiceMock<UnitTest::MockGradientRequests> mockGradientRequests1(gradientEntity1->GetId());
|
||||
ON_CALL(mockGradientRequests1, GetValue).WillByDefault(Return(gradient1Value));
|
||||
|
||||
const float gradient2Value = 1.0f;
|
||||
NiceMock<UnitTest::MockGradientRequests> mockGradientRequests2(m_gradientEntity2->GetId());
|
||||
NiceMock<UnitTest::MockGradientRequests> mockGradientRequests2(gradientEntity2->GetId());
|
||||
ON_CALL(mockGradientRequests2, GetValue).WillByDefault(Return(gradient2Value));
|
||||
|
||||
AzFramework::SurfaceData::SurfaceTagWeightList weightList;
|
||||
Terrain::TerrainAreaSurfaceRequestBus::Event(
|
||||
m_entity->GetId(), &Terrain::TerrainAreaSurfaceRequestBus::Events::GetSurfaceWeights, AZ::Vector3::CreateZero(), weightList);
|
||||
entity->GetId(), &Terrain::TerrainAreaSurfaceRequestBus::Events::GetSurfaceWeights, AZ::Vector3::CreateZero(), weightList);
|
||||
|
||||
AZ::Crc32 expectedCrcList[] = { AZ::Crc32(surfaceTag1), AZ::Crc32(surfaceTag2) };
|
||||
const float expectedWeightList[] = { gradient1Value, gradient2Value };
|
||||
|
||||
@@ -112,7 +112,7 @@
|
||||
</Class>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="Sprite" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/button_disabled.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/button_disabled.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -158,7 +158,7 @@
|
||||
<Class name="AZStd::pair" field="element" type="{FED51EB4-F646-51FF-9646-9852CF90F353}">
|
||||
<Class name="AddressType" field="value1" value="AZStd::vector({21786AF0-2606-5B9A-86EB-0892E2820E6C})::Entities·0/AZ::Entity({75651658-8663-478D-9090-2432DFCAFA44})#17165417810190062216·2/AZStd::vector({13D58FF9-1088-5C69-9A1F-C2A144B57B78})::Components·0/UiImageComponent({BDBEFD23-DBB4-4726-A32D-4FEAC24E51F6})#17217584308910145132·7/AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>({68E92460-5C0C-4031-9620-6F1A08763243})::SpritePath·1/SimpleAssetReferenceBase({E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8})::BaseClass1·1/AZStd::string({03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9})::AssetPath·0/" version="1" type="{90752F2D-CBD3-4EE9-9CDD-447E797C8408}"/>
|
||||
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
|
||||
<Class name="AZStd::string" field="m_data" value="ui/textures/prefab/button_normal.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="m_data" value="ui/textures/prefab/button_normal.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="AZStd::pair" field="element" type="{FED51EB4-F646-51FF-9646-9852CF90F353}">
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
</Class>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="Sprite" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/checkbox_box_hover.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/checkbox_box_hover.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -55,7 +55,7 @@
|
||||
</Class>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="Sprite" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/checkbox_box_hover.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/checkbox_box_hover.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -74,7 +74,7 @@
|
||||
</Class>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="Sprite" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/checkbox_box_disabled.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/checkbox_box_disabled.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -234,7 +234,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/checkbox_box_normal.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/checkbox_box_normal.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -311,7 +311,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/checkbox_check.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/checkbox_check.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
|
||||
@@ -231,7 +231,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="textures/basic/checkbox_check.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="textures/basic/checkbox_check.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -383,7 +383,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="textures/basic/checkbox_check.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="textures/basic/checkbox_check.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -1218,7 +1218,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="textures/basic/checkbox_check.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="textures/basic/checkbox_check.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/textinput_normal.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/textinput_normal.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
@@ -233,7 +233,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/textinput_hover.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/textinput_hover.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
<Class name="int" field="SpriteType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/>
|
||||
<Class name="AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>" field="SpritePath" version="1" type="{68E92460-5C0C-4031-9620-6F1A08763243}">
|
||||
<Class name="SimpleAssetReferenceBase" field="BaseClass1" version="1" type="{E16CA6C5-5C78-4AD9-8E9B-F8C1FB4D1DB8}">
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/tooltip_sliced.dds" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<Class name="AZStd::string" field="AssetPath" value="ui/textures/prefab/tooltip_sliced.tif.streamingimage" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
</Class>
|
||||
</Class>
|
||||
<Class name="unsigned int" field="Index" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
|
||||
|
||||
Reference in New Issue
Block a user