Merge remote-tracking branch 'upstream/development' into hultonha_LYN-2348_tube_render_crash

Signed-off-by: hultonha <hultonha@amazon.co.uk>
This commit is contained in:
hultonha
2021-07-16 12:56:20 +01:00
200 changed files with 2280 additions and 5004 deletions
@@ -1,42 +0,0 @@
/*
* Copyright (c) Contributors to the Open 3D Engine Project. For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#pragma once
namespace AZ
{
class BehaviorContext;
class EditContext;
class SerializeContext;
} // namespace AZ
// this just provides a convenient template to avoid the necessary boilerplate when you derive from AWSScriptBehaviorBase
#define AWS_SCRIPT_BEHAVIOR_DEFINITION(className, guidString) \
AZ_TYPE_INFO(className, guidString) \
AZ_CLASS_ALLOCATOR(className, AZ::SystemAllocator, 0) \
void ReflectSerialization(AZ::SerializeContext* serializeContext) override; \
void ReflectBehaviors(AZ::BehaviorContext* behaviorContext) override; \
void ReflectEditParameters(AZ::EditContext* editContext) override; \
className(); \
namespace AWSCore
{
//! An interface for AWS ScriptCanvas Behaviors to inherit from
class AWSScriptBehaviorBase
{
public:
virtual ~AWSScriptBehaviorBase() = default;
virtual void ReflectSerialization(AZ::SerializeContext* reflectContext) = 0;
virtual void ReflectBehaviors(AZ::BehaviorContext* behaviorContext) = 0;
virtual void ReflectEditParameters(AZ::EditContext* editContext) = 0;
virtual void Init() {}
virtual void Activate() {}
virtual void Deactivate() {}
};
} // namespace AWSCore
@@ -10,8 +10,6 @@
#include <AzCore/EBus/EBus.h>
#include <AzCore/std/string/string.h>
#include <ScriptCanvas/AWSScriptBehaviorBase.h>
namespace AWSCore
{
using DynamoDBAttributeValueMap = AZStd::unordered_map<AZStd::string, AZStd::string>;
@@ -55,10 +53,14 @@ namespace AWSCore
};
class AWSScriptBehaviorDynamoDB
: public AWSScriptBehaviorBase
{
public:
AWS_SCRIPT_BEHAVIOR_DEFINITION(AWSScriptBehaviorDynamoDB, "{569E74F6-1268-4199-9653-A3B603FC9F4F}");
AZ_RTTI(AWSScriptBehaviorDynamoDB, "{569E74F6-1268-4199-9653-A3B603FC9F4F}");
AWSScriptBehaviorDynamoDB() = default;
virtual ~AWSScriptBehaviorDynamoDB() = default;
static void Reflect(AZ::ReflectContext* context);
static void GetItem(const AZStd::string& tableResourceKey, const DynamoDBAttributeValueMap& keyMap);
static void GetItemRaw(const AZStd::string& table, const DynamoDBAttributeValueMap& keyMap, const AZStd::string& region);
@@ -10,8 +10,6 @@
#include <AzCore/EBus/EBus.h>
#include <AzCore/std/string/string.h>
#include <ScriptCanvas/AWSScriptBehaviorBase.h>
namespace AWSCore
{
//! AWS Script Behavior notifications for ScriptCanvas behaviors that interact with AWS Lambda
@@ -53,10 +51,14 @@ namespace AWSCore
};
class AWSScriptBehaviorLambda
: public AWSScriptBehaviorBase
{
public:
AWS_SCRIPT_BEHAVIOR_DEFINITION(AWSScriptBehaviorLambda, "{9E71534D-34B3-4723-B180-2552513DDA3D}");
AZ_RTTI(AWSScriptBehaviorLambda, "{9E71534D-34B3-4723-B180-2552513DDA3D}");
AWSScriptBehaviorLambda() = default;
virtual ~AWSScriptBehaviorLambda() = default;
static void Reflect(AZ::ReflectContext* context);
static void Invoke(const AZStd::string& functionResourceKey, const AZStd::string& payload);
static void InvokeRaw(const AZStd::string& functionName, const AZStd::string& payload, const AZStd::string& region);
@@ -10,8 +10,6 @@
#include <AzCore/EBus/EBus.h>
#include <AzCore/std/string/string.h>
#include <ScriptCanvas/AWSScriptBehaviorBase.h>
namespace AWSCore
{
//! AWS Script Behavior notifications for ScriptCanvas behaviors that interact with AWS S3
@@ -68,7 +66,6 @@ namespace AWSCore
};
class AWSScriptBehaviorS3
: public AWSScriptBehaviorBase
{
static constexpr const char AWSScriptBehaviorS3Name[] = "AWSScriptBehaviorS3";
static constexpr const char OutputFileIsEmptyErrorMessage[] = "Request validation failed, output file is empty.";
@@ -81,7 +78,12 @@ namespace AWSCore
static constexpr const char RegionNameIsEmptyErrorMessage[] = "Request validation failed, region name is empty.";
public:
AWS_SCRIPT_BEHAVIOR_DEFINITION(AWSScriptBehaviorS3, "{7F4E956C-7463-4236-B320-C992D36A9C6E}");
AZ_RTTI(AWSScriptBehaviorS3, "{7F4E956C-7463-4236-B320-C992D36A9C6E}");
AWSScriptBehaviorS3() = default;
virtual ~AWSScriptBehaviorS3() = default;
static void Reflect(AZ::ReflectContext* context);
static void GetObject(const AZStd::string& bucketResourceKey, const AZStd::string& objectKey, const AZStd::string& outFile);
static void GetObjectRaw(const AZStd::string& bucket, const AZStd::string& objectKey, const AZStd::string& region, const AZStd::string& outFile);
@@ -10,7 +10,6 @@
#include <AzCore/Component/Component.h>
#include <AzCore/RTTI/BehaviorContext.h>
#include <AzCore/Serialization/EditContext.h>
#include <AzCore/std/containers/vector.h>
namespace AWSCore
{
@@ -30,23 +29,8 @@ namespace AWSCore
static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required);
static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent);
static bool AddedBehaviours()
{
return m_alreadyAddedBehaviors;
}
protected:
////////////////////////////////////////////////////////////////////////
// AZ::Component interface implementation
void Init() override;
void Activate() override;
void Deactivate() override;
////////////////////////////////////////////////////////////////////////
static void AddBehaviors(); // Add any behaviors you derived from AWSScriptBehaviorBase to the implementation of this function
static AZStd::vector<AZStd::unique_ptr<AWSScriptBehaviorBase>> m_behaviors;
static bool m_alreadyAddedBehaviors;
};
} // namespace AWSCore
@@ -20,39 +20,30 @@
namespace AWSCore
{
AWSScriptBehaviorDynamoDB::AWSScriptBehaviorDynamoDB()
void AWSScriptBehaviorDynamoDB::Reflect(AZ::ReflectContext* context)
{
}
void AWSScriptBehaviorDynamoDB::ReflectSerialization(AZ::SerializeContext* serializeContext)
{
if (serializeContext)
if (AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
{
serializeContext->Class<AWSScriptBehaviorDynamoDB>()
->Version(0);
}
}
void AWSScriptBehaviorDynamoDB::ReflectBehaviors(AZ::BehaviorContext* behaviorContext)
{
behaviorContext->Class<AWSScriptBehaviorDynamoDB>("AWSScriptBehaviorDynamoDB")
->Attribute(AZ::Script::Attributes::Category, "AWSCore")
->Method("GetItem", &AWSScriptBehaviorDynamoDB::GetItem,
{{{"Table Resource KeyName", "The name of the table containing the requested item."},
{"Key Map", "A map of attribute names to AttributeValue objects, representing the primary key of the item to retrieve."}}})
->Method("GetItemRaw", &AWSScriptBehaviorDynamoDB::GetItemRaw,
{{{"Table Name", "The name of the table containing the requested item."},
{"Key Map", "A map of attribute names to AttributeValue objects, representing the primary key of the item to retrieve."},
{"Region Name", "The region of the table located in."}}});
if (AZ::BehaviorContext* behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context))
{
behaviorContext->Class<AWSScriptBehaviorDynamoDB>("AWSScriptBehaviorDynamoDB")
->Attribute(AZ::Script::Attributes::Category, "AWSCore")
->Method("GetItem", &AWSScriptBehaviorDynamoDB::GetItem,
{{{"Table Resource KeyName", "The name of the table containing the requested item."},
{"Key Map", "A map of attribute names to AttributeValue objects, representing the primary key of the item to retrieve."}}})
->Method("GetItemRaw", &AWSScriptBehaviorDynamoDB::GetItemRaw,
{{{"Table Name", "The name of the table containing the requested item."},
{"Key Map", "A map of attribute names to AttributeValue objects, representing the primary key of the item to retrieve."},
{"Region Name", "The region of the table located in."}}});
behaviorContext->EBus<AWSScriptBehaviorDynamoDBNotificationBus>("AWSDynamoDBBehaviorNotificationBus")
->Attribute(AZ::Script::Attributes::Category, "AWSCore")
->Handler<AWSScriptBehaviorDynamoDBNotificationBusHandler>();
}
void AWSScriptBehaviorDynamoDB::ReflectEditParameters(AZ::EditContext* editContext)
{
AZ_UNUSED(editContext);
behaviorContext->EBus<AWSScriptBehaviorDynamoDBNotificationBus>("AWSDynamoDBBehaviorNotificationBus")
->Attribute(AZ::Script::Attributes::Category, "AWSCore")
->Handler<AWSScriptBehaviorDynamoDBNotificationBusHandler>();
}
}
void AWSScriptBehaviorDynamoDB::GetItem(const AZStd::string& tableResourceKey, const DynamoDBAttributeValueMap& keyMap)
@@ -21,39 +21,30 @@
namespace AWSCore
{
AWSScriptBehaviorLambda::AWSScriptBehaviorLambda()
void AWSScriptBehaviorLambda::Reflect(AZ::ReflectContext* context)
{
}
void AWSScriptBehaviorLambda::ReflectSerialization(AZ::SerializeContext* serializeContext)
{
if (serializeContext)
if (AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
{
serializeContext->Class<AWSScriptBehaviorLambda>()
->Version(0);
}
}
void AWSScriptBehaviorLambda::ReflectBehaviors(AZ::BehaviorContext* behaviorContext)
{
behaviorContext->Class<AWSScriptBehaviorLambda>("AWSScriptBehaviorLambda")
->Attribute(AZ::Script::Attributes::Category, "AWSCore")
->Method("Invoke", &AWSScriptBehaviorLambda::Invoke,
{{{"Function Resource KeyName", "The resource key name of the lambda function in resource mapping config file."},
{"Payload", "The JSON that you want to provide to your Lambda function as input."}}})
->Method("InvokeRaw", &AWSScriptBehaviorLambda::InvokeRaw,
{{{"Function Name", "The name of the Lambda function, version, or alias."},
{"Payload", "The JSON that you want to provide to your Lambda function as input."},
{"Region Name", "The region of the lambda function located in."}}});
if (AZ::BehaviorContext* behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context))
{
behaviorContext->Class<AWSScriptBehaviorLambda>("AWSScriptBehaviorLambda")
->Attribute(AZ::Script::Attributes::Category, "AWSCore")
->Method("Invoke", &AWSScriptBehaviorLambda::Invoke,
{{{"Function Resource KeyName", "The resource key name of the lambda function in resource mapping config file."},
{"Payload", "The JSON that you want to provide to your Lambda function as input."}}})
->Method("InvokeRaw", &AWSScriptBehaviorLambda::InvokeRaw,
{{{"Function Name", "The name of the Lambda function, version, or alias."},
{"Payload", "The JSON that you want to provide to your Lambda function as input."},
{"Region Name", "The region of the lambda function located in."}}});
behaviorContext->EBus<AWSScriptBehaviorLambdaNotificationBus>("AWSLambdaBehaviorNotificationBus")
->Attribute(AZ::Script::Attributes::Category, "AWSCore")
->Handler<AWSScriptBehaviorLambdaNotificationBusHandler>();
}
void AWSScriptBehaviorLambda::ReflectEditParameters(AZ::EditContext* editContext)
{
AZ_UNUSED(editContext);
behaviorContext->EBus<AWSScriptBehaviorLambdaNotificationBus>("AWSLambdaBehaviorNotificationBus")
->Attribute(AZ::Script::Attributes::Category, "AWSCore")
->Handler<AWSScriptBehaviorLambdaNotificationBusHandler>();
}
}
void AWSScriptBehaviorLambda::Invoke(const AZStd::string& functionResourceKey, const AZStd::string& payload)
@@ -24,49 +24,39 @@
namespace AWSCore
{
AWSScriptBehaviorS3::AWSScriptBehaviorS3()
void AWSScriptBehaviorS3::Reflect(AZ::ReflectContext* context)
{
}
void AWSScriptBehaviorS3::ReflectSerialization(AZ::SerializeContext* serializeContext)
{
if (serializeContext)
if (AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
{
serializeContext->Class<AWSScriptBehaviorS3>()
->Version(0);
}
}
void AWSScriptBehaviorS3::ReflectBehaviors(AZ::BehaviorContext* behaviorContext)
{
behaviorContext->Class<AWSScriptBehaviorS3>(AWSScriptBehaviorS3Name)
->Attribute(AZ::Script::Attributes::Category, "AWSCore")
->Method("GetObject", &AWSScriptBehaviorS3::GetObject,
{{{"Bucket Resource KeyName", "The resource key name of the bucket in resource mapping config file."},
{"Object KeyName", "The object key."},
{"Outfile Name", "Filename where the content will be saved."}}})
->Method("GetObjectRaw", &AWSScriptBehaviorS3::GetObjectRaw,
{{{"Bucket Name", "The name of the bucket containing the object."},
{"Object KeyName", "The object key."},
{"Region Name", "The region of the bucket located in."},
{"Outfile Name", "Filename where the content will be saved."}}})
->Method("HeadObject", &AWSScriptBehaviorS3::HeadObject,
{{{"Bucket Resource KeyName", "The resource key name of the bucket in resource mapping config file."},
{"Object KeyName", "The object key."}}})
->Method("HeadObjectRaw", &AWSScriptBehaviorS3::HeadObjectRaw,
{{{"Bucket Name", "The name of the bucket containing the object."},
{"Object KeyName", "The object key."},
{"Region Name", "The region of the bucket located in."}}})
;
if (AZ::BehaviorContext* behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context))
{
behaviorContext->Class<AWSScriptBehaviorS3>(AWSScriptBehaviorS3Name)
->Attribute(AZ::Script::Attributes::Category, "AWSCore")
->Method("GetObject", &AWSScriptBehaviorS3::GetObject,
{{{"Bucket Resource KeyName", "The resource key name of the bucket in resource mapping config file."},
{"Object KeyName", "The object key."},
{"Outfile Name", "Filename where the content will be saved."}}})
->Method("GetObjectRaw", &AWSScriptBehaviorS3::GetObjectRaw,
{{{"Bucket Name", "The name of the bucket containing the object."},
{"Object KeyName", "The object key."},
{"Region Name", "The region of the bucket located in."},
{"Outfile Name", "Filename where the content will be saved."}}})
->Method("HeadObject", &AWSScriptBehaviorS3::HeadObject,
{{{"Bucket Resource KeyName", "The resource key name of the bucket in resource mapping config file."},
{"Object KeyName", "The object key."}}})
->Method("HeadObjectRaw", &AWSScriptBehaviorS3::HeadObjectRaw,
{{{"Bucket Name", "The name of the bucket containing the object."},
{"Object KeyName", "The object key."},
{"Region Name", "The region of the bucket located in."}}});
behaviorContext->EBus<AWSScriptBehaviorS3NotificationBus>("AWSS3BehaviorNotificationBus")
->Attribute(AZ::Script::Attributes::Category, "AWSCore")
->Handler<AWSScriptBehaviorS3NotificationBusHandler>();
}
void AWSScriptBehaviorS3::ReflectEditParameters(AZ::EditContext* editContext)
{
AZ_UNUSED(editContext);
behaviorContext->EBus<AWSScriptBehaviorS3NotificationBus>("AWSS3BehaviorNotificationBus")
->Attribute(AZ::Script::Attributes::Category, "AWSCore")
->Handler<AWSScriptBehaviorS3NotificationBusHandler>();
}
}
void AWSScriptBehaviorS3::GetObject(
@@ -12,35 +12,17 @@
namespace AWSCore
{
AZStd::vector<AZStd::unique_ptr<AWSScriptBehaviorBase>> AWSScriptBehaviorsComponent::m_behaviors;
bool AWSScriptBehaviorsComponent::m_alreadyAddedBehaviors = false;
void AWSScriptBehaviorsComponent::AddBehaviors()
{
if (!m_alreadyAddedBehaviors)
{
// Add new script behaviors here
m_behaviors.push_back(AZStd::make_unique<AWSScriptBehaviorDynamoDB>());
m_behaviors.push_back(AZStd::make_unique<AWSScriptBehaviorLambda>());
m_behaviors.push_back(AZStd::make_unique<AWSScriptBehaviorS3>());
m_alreadyAddedBehaviors = true;
}
}
void AWSScriptBehaviorsComponent::Reflect(AZ::ReflectContext* context)
{
AddBehaviors();
AWSScriptBehaviorDynamoDB::Reflect(context);
AWSScriptBehaviorLambda::Reflect(context);
AWSScriptBehaviorS3::Reflect(context);
if (AZ::SerializeContext* serialize = azrtti_cast<AZ::SerializeContext*>(context))
{
serialize->Class<AWSScriptBehaviorsComponent, AZ::Component>()
->Version(0);
for (auto&& behavior : m_behaviors)
{
behavior->ReflectSerialization(serialize);
}
if (AZ::EditContext* editContext = serialize->GetEditContext())
{
editContext->Class<AWSScriptBehaviorsComponent>("AWSScriptBehaviors", "Provides ScriptCanvas functions for calling AWS")
@@ -49,19 +31,6 @@ namespace AWSCore
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("AWS"))
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
;
for (auto&& behavior : m_behaviors)
{
behavior->ReflectEditParameters(editContext);
}
}
}
if (AZ::BehaviorContext* behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context))
{
for (auto&& behavior : m_behaviors)
{
behavior->ReflectBehaviors(behaviorContext);
}
}
}
@@ -86,31 +55,12 @@ namespace AWSCore
AZ_UNUSED(dependent);
}
void AWSScriptBehaviorsComponent::Init()
{
for (auto&& behavior : m_behaviors)
{
behavior->Init();
}
}
void AWSScriptBehaviorsComponent::Activate()
{
for (auto&& behavior : m_behaviors)
{
behavior->Activate();
}
}
void AWSScriptBehaviorsComponent::Deactivate()
{
for (auto&& behavior : m_behaviors)
{
behavior->Deactivate();
}
// this forces the vector to release its capacity, clear/shrink_to_fit is not
m_behaviors.swap(AZStd::vector<AZStd::unique_ptr<AWSScriptBehaviorBase>>());
}
}
@@ -15,18 +15,6 @@
using namespace AWSCore;
class AWSScriptBehaviorsComponentMock
: public AWSScriptBehaviorsComponent
{
public:
AZ_COMPONENT(AWSScriptBehaviorsComponentMock, "{78579706-E1B2-4788-A34D-A58D3F273FF9}");
int GetBehaviorsNum()
{
return m_behaviors.size();
}
};
class AWSScriptBehaviorsComponentTest
: public UnitTest::ScopedAllocatorSetupFixture
{
@@ -38,7 +26,7 @@ public:
m_behaviorContext = AZStd::make_unique<AZ::BehaviorContext>();
m_entity = AZStd::make_unique<AZ::Entity>();
m_scriptBehaviorsComponent.reset(m_entity->CreateComponent<AWSScriptBehaviorsComponentMock>());
m_scriptBehaviorsComponent.reset(m_entity->CreateComponent<AWSScriptBehaviorsComponent>());
}
void TearDown() override
@@ -56,20 +44,16 @@ protected:
AZStd::unique_ptr<AZ::SerializeContext> m_serializeContext;
AZStd::unique_ptr<AZ::BehaviorContext> m_behaviorContext;
AZStd::unique_ptr<AZ::ComponentDescriptor> m_componentDescriptor;
AZStd::unique_ptr<AWSScriptBehaviorsComponentMock> m_scriptBehaviorsComponent;
AZStd::unique_ptr<AWSScriptBehaviorsComponent> m_scriptBehaviorsComponent;
AZStd::unique_ptr<AZ::Entity> m_entity;
};
TEST_F(AWSScriptBehaviorsComponentTest, InitActivateDeactivate_Call_GetExpectedNumOfAddedBehaviors)
TEST_F(AWSScriptBehaviorsComponentTest, Reflect)
{
m_componentDescriptor.reset(AWSScriptBehaviorsComponentMock::CreateDescriptor());
int oldEBusNum = m_behaviorContext->m_ebuses.size();
m_componentDescriptor.reset(AWSScriptBehaviorsComponent::CreateDescriptor());
m_componentDescriptor->Reflect(m_serializeContext.get());
m_componentDescriptor->Reflect(m_behaviorContext.get());
EXPECT_TRUE(AWSScriptBehaviorsComponentMock::AddedBehaviours());
EXPECT_TRUE(m_scriptBehaviorsComponent->GetBehaviorsNum() == 3);
m_entity->Init();
m_entity->Activate();
m_entity->Deactivate();
EXPECT_TRUE(m_scriptBehaviorsComponent->GetBehaviorsNum() == 0);
EXPECT_TRUE(m_behaviorContext->m_ebuses.size() - oldEBusNum == 3);
}
-1
View File
@@ -32,7 +32,6 @@ set(FILES
Include/Public/Framework/ServiceRequestJobConfig.h
Include/Public/Framework/Util.h
Include/Public/ResourceMapping/AWSResourceMappingBus.h
Include/Public/ScriptCanvas/AWSScriptBehaviorBase.h
Include/Public/ScriptCanvas/AWSScriptBehaviorDynamoDB.h
Include/Public/ScriptCanvas/AWSScriptBehaviorLambda.h
Include/Public/ScriptCanvas/AWSScriptBehaviorS3.h
@@ -95,7 +95,7 @@ namespace AZ
shaderVariantAssetBuilderDescriptor.m_name = "Shader Variant Asset Builder";
// Both "Shader Variant Asset Builder" and "Shader Asset Builder" produce ShaderVariantAsset products. If you update
// ShaderVariantAsset you will need to update BOTH version numbers, not just "Shader Variant Asset Builder".
shaderVariantAssetBuilderDescriptor.m_version = 23; // ATOM-15472
shaderVariantAssetBuilderDescriptor.m_version = 24; // ATOM-15978
shaderVariantAssetBuilderDescriptor.m_patterns.push_back(AssetBuilderSDK::AssetBuilderPattern(AZStd::string::format("*.%s", RPI::ShaderVariantListSourceData::Extension), AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard));
shaderVariantAssetBuilderDescriptor.m_busId = azrtti_typeid<ShaderVariantAssetBuilder>();
shaderVariantAssetBuilderDescriptor.m_createJobFunction = AZStd::bind(&ShaderVariantAssetBuilder::CreateJobs, &m_shaderVariantAssetBuilder, AZStd::placeholders::_1, AZStd::placeholders::_2);
@@ -48,6 +48,7 @@
#include "ShaderAssetBuilder.h"
#include "ShaderBuilderUtility.h"
#include "SrgLayoutUtility.h"
#include "AzslData.h"
#include "AzslCompiler.h"
#include <CommonFiles/Preprocessor.h>
@@ -520,6 +521,96 @@ namespace AZ
return;
}
}
static bool LoadSrgLayoutListFromShaderAssetBuilder(
const RHI::ShaderPlatformInterface* shaderPlatformInterface,
const AssetBuilderSDK::PlatformInfo& platformInfo,
const AzslCompiler& azslCompiler, const AZStd::string& shaderSourceFileFullPath,
const RPI::SupervariantIndex supervariantIndex,
const bool platformUsesRegisterSpaces,
RPI::ShaderResourceGroupLayoutList& srgLayoutList,
RootConstantData& rootConstantData)
{
auto srgJsonPathOutcome = ShaderBuilderUtility::ObtainBuildArtifactPathFromShaderAssetBuilder(
shaderPlatformInterface->GetAPIUniqueIndex(), platformInfo.m_identifier, shaderSourceFileFullPath, supervariantIndex.GetIndex(), AZ::RPI::ShaderAssetSubId::SrgJson);
if (!srgJsonPathOutcome.IsSuccess())
{
AZ_Error(ShaderVariantAssetBuilderName, false, "%s", srgJsonPathOutcome.GetError().c_str());
return false;
}
auto srgJsonPath = srgJsonPathOutcome.TakeValue();
auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(srgJsonPath);
if (!jsonOutcome.IsSuccess())
{
AZ_Error(ShaderVariantAssetBuilderName, false, "%s", jsonOutcome.GetError().c_str());
return false;
}
SrgDataContainer srgData;
if (!azslCompiler.ParseSrgPopulateSrgData(jsonOutcome.GetValue(), srgData))
{
AZ_Error(ShaderVariantAssetBuilderName, false, "Failed to parse srg data");
return false;
}
// Add all Shader Resource Group Assets that were defined in the shader code to the shader asset
if (!SrgLayoutUtility::LoadShaderResourceGroupLayouts(ShaderVariantAssetBuilderName, srgData, platformUsesRegisterSpaces, srgLayoutList))
{
AZ_Error(ShaderVariantAssetBuilderName, false, "Failed to load ShaderResourceGroupLayouts");
return false;
}
for (auto srgLayout : srgLayoutList)
{
if (!srgLayout->Finalize())
{
AZ_Error(ShaderVariantAssetBuilderName, false,
"Failed to finalize SrgLayout %s", srgLayout->GetName().GetCStr());
return false;
}
}
// Access the root constants reflection
if (!azslCompiler.ParseSrgPopulateRootConstantData(
jsonOutcome.GetValue(),
rootConstantData)) // consuming data from --srg ("InlineConstantBuffer" subjson section)
{
AZ_Error(ShaderVariantAssetBuilderName, false, "Failed to obtain root constant data reflection");
return false;
}
return true;
}
static bool LoadBindingDependenciesFromShaderAssetBuilder(
const RHI::ShaderPlatformInterface* shaderPlatformInterface,
const AssetBuilderSDK::PlatformInfo& platformInfo,
const AzslCompiler& azslCompiler, const AZStd::string& shaderSourceFileFullPath,
const RPI::SupervariantIndex supervariantIndex,
BindingDependencies& bindingDependencies)
{
auto bindingsJsonPathOutcome = ShaderBuilderUtility::ObtainBuildArtifactPathFromShaderAssetBuilder(
shaderPlatformInterface->GetAPIUniqueIndex(), platformInfo.m_identifier, shaderSourceFileFullPath, supervariantIndex.GetIndex(), AZ::RPI::ShaderAssetSubId::BindingdepJson);
if (!bindingsJsonPathOutcome.IsSuccess())
{
AZ_Error(ShaderVariantAssetBuilderName, false, "%s", bindingsJsonPathOutcome.GetError().c_str());
return false;
}
auto bindingsJsonPath = bindingsJsonPathOutcome.TakeValue();
auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(bindingsJsonPath);
if (!jsonOutcome.IsSuccess())
{
AZ_Error(ShaderVariantAssetBuilderName, false, "%s", jsonOutcome.GetError().c_str());
return false;
}
if (!azslCompiler.ParseBindingdepPopulateBindingDependencies(jsonOutcome.GetValue(), bindingDependencies))
{
AZ_Error(ShaderVariantAssetBuilderName, false, "Failed to parse binding dependencies data");
return false;
}
return true;
}
// Returns the content of the hlsl file for the given supervariant as produced by ShaderAsssetBuilder.
@@ -773,6 +864,50 @@ namespace AZ
response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Failed;
return;
}
//! It is important to keep this refcounted pointer outside of the if block to prevent it from being destroyed.
RHI::Ptr<RHI::PipelineLayoutDescriptor> pipelineLayoutDescriptor;
if (shaderPlatformInterface->VariantCompilationRequiresSrgLayoutData())
{
AZStd::string azslcCompilerParameters =
shaderPlatformInterface->GetAzslCompilerParameters(buildOptions.m_compilerArguments);
const bool platformUsesRegisterSpaces =
(AzFramework::StringFunc::Find(azslcCompilerParameters, "--use-spaces") != AZStd::string::npos);
RPI::ShaderResourceGroupLayoutList srgLayoutList;
RootConstantData rootConstantData;
if (!LoadSrgLayoutListFromShaderAssetBuilder(
shaderPlatformInterface, request.m_platformInfo, azslc, shaderSourceFileFullPath, supervariantIndex,
platformUsesRegisterSpaces,
srgLayoutList,
rootConstantData))
{
response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Failed;
return;
}
BindingDependencies bindingDependencies;
if (!LoadBindingDependenciesFromShaderAssetBuilder(
shaderPlatformInterface, request.m_platformInfo, azslc, shaderSourceFileFullPath, supervariantIndex,
bindingDependencies))
{
response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Failed;
return;
}
pipelineLayoutDescriptor =
ShaderBuilderUtility::BuildPipelineLayoutDescriptorForApi(
ShaderVariantAssetBuilderName, srgLayoutList, shaderEntryPoints, buildOptions.m_compilerArguments, rootConstantData,
shaderPlatformInterface, bindingDependencies);
if (!pipelineLayoutDescriptor)
{
AZ_Error(
ShaderVariantAssetBuilderName, false, "Failed to build pipeline layout descriptor for api=[%s]",
shaderPlatformInterface->GetAPIName().GetCStr());
response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Failed;
return;
}
}
// Setup the shader variant creation context:
ShaderVariantCreationContext shaderVariantCreationContext =
@@ -144,6 +144,12 @@ namespace AZ
const ShaderResourceGroupInfoList& srgInfoList,
const RootConstantsInfo& rootConstantsInfo,
const ShaderCompilerArguments& shaderCompilerArguments) = 0;
//! In general, shader compilation doesn't require SRG Layout data, but RHIs like
//! Metal don't do well if unused resources (descriptors) are not bound. If this function returns TRUE
//! the ShaderVariantAssetBuilder will invoke BuildPipelineLayoutDescriptor() so the RHI gets the chance to
//! build SRG Layout data which will be useful when compiling MetalISL to Metal byte code.
virtual bool VariantCompilationRequiresSrgLayoutData() const { return false; }
//! See AZ::RHI::Factory::GetAPIUniqueIndex() for details.
//! See AZ::RHI::Limits::APIType::PerPlatformApiUniqueIndexMax.
@@ -159,7 +159,13 @@ namespace AZ
arguments += " -Zi"; // Generate debug information
arguments += " -Zss"; // Compute Shader Hash considering source information
}
arguments += " " + m_dxcAdditionalFreeArguments;
// strip spaces at both sides
AZStd::string dxcAdditionalFreeArguments = m_dxcAdditionalFreeArguments;
AzFramework::StringFunc::TrimWhiteSpace(dxcAdditionalFreeArguments, true, true);
if (!dxcAdditionalFreeArguments.empty())
{
arguments += " " + dxcAdditionalFreeArguments;
}
return arguments;
}
}
@@ -43,11 +43,36 @@ namespace Platform
}
return physicalDeviceList;
}
void PresentInternal(id <MTLCommandBuffer> mtlCommandBuffer, id<CAMetalDrawable> drawable, float syncInterval)
float GetRefreshRate()
{
AZ_UNUSED(syncInterval);
[mtlCommandBuffer presentDrawable:drawable];
CGDirectDisplayID display = CGMainDisplayID();
CGDisplayModeRef currentMode = CGDisplayCopyDisplayMode(display);
return CGDisplayModeGetRefreshRate(currentMode);
}
void PresentInternal(id <MTLCommandBuffer> mtlCommandBuffer, id<CAMetalDrawable> drawable, float syncInterval, float refreshRate)
{
bool framePresented = false;
//seconds per frame (1/refreshrate) * num frames (sync interval)
float presentAfterMinimumDuration = syncInterval / refreshRate;
#if defined(__MAC_10_15_4)
if(@available(macOS 10.15.4, *))
{
if(presentAfterMinimumDuration > 0.0f)
{
[mtlCommandBuffer presentDrawable:drawable afterMinimumDuration:presentAfterMinimumDuration];
framePresented = true;
}
}
#endif
if(!framePresented)
{
[mtlCommandBuffer presentDrawable:drawable];
}
}
CGRect GetScreenBounds(NativeWindowType* nativeWindow)
@@ -29,13 +29,19 @@ namespace Platform
return physicalDeviceList;
}
void PresentInternal(id <MTLCommandBuffer> mtlCommandBuffer, id<CAMetalDrawable> drawable, float syncInterval)
float GetRefreshRate()
{
bool hasPresentAfterMinimumDuration = [drawable respondsToSelector:@selector(presentAfterMinimumDuration:)];
if (hasPresentAfterMinimumDuration && syncInterval > 0.0f)
NativeScreenType* nativeScreen = [NativeScreenType mainScreen];
return [nativeScreen maximumFramesPerSecond];
}
void PresentInternal(id <MTLCommandBuffer> mtlCommandBuffer, id<CAMetalDrawable> drawable, float syncInterval, float refreshRate)
{
//seconds per frame (1/refreshrate) * num frames (sync interval)
float presentAfterMinimumDuration = syncInterval / refreshRate;
if (hasPresentAfterMinimumDuration > 0.0f)
{
[mtlCommandBuffer presentDrawable:drawable afterMinimumDuration:syncInterval];
[mtlCommandBuffer presentDrawable:drawable afterMinimumDuration:presentAfterMinimumDuration];
}
else
{
@@ -40,6 +40,8 @@ namespace AZ
const ShaderResourceGroupInfoList& srgInfoList,
const RootConstantsInfo& rootConstantsInfo,
const RHI::ShaderCompilerArguments& shaderCompilerArguments) override;
bool VariantCompilationRequiresSrgLayoutData() const override { return true; }
bool CompilePlatformInternal(
const AssetBuilderSDK::PlatformInfo& platform,
@@ -30,6 +30,7 @@ namespace AZ
{
AZ_UNUSED(device);
m_hardwareQueueClass = hardwareQueueClass;
m_supportsInterDrawTimestamps = AZ::RHI::QueryTypeFlags::Timestamp == (device->GetFeatures().m_queryTypesMask[static_cast<uint32_t>(hardwareQueueClass)] & AZ::RHI::QueryTypeFlags::Timestamp);
}
void CommandListBase::Reset()
@@ -64,7 +65,10 @@ namespace AZ
[m_encoder endEncoding];
m_encoder = nil;
#if AZ_TRAIT_ATOM_METAL_COUNTER_SAMPLING
m_timeStampQueue.clear();
if (m_supportsInterDrawTimestamps)
{
m_timeStampQueue.clear();
}
#endif
}
}
@@ -144,9 +148,12 @@ namespace AZ
m_isEncoded = true;
#if AZ_TRAIT_ATOM_METAL_COUNTER_SAMPLING
for(auto& timeStamp: m_timeStampQueue)
if (m_supportsInterDrawTimestamps)
{
SampleCounters(timeStamp.m_counterSampleBuffer, timeStamp.m_timeStampIndex);
for(auto& timeStamp: m_timeStampQueue)
{
SampleCounters(timeStamp.m_counterSampleBuffer, timeStamp.m_timeStampIndex);
}
}
#endif
}
@@ -195,6 +202,11 @@ namespace AZ
#if AZ_TRAIT_ATOM_METAL_COUNTER_SAMPLING
void CommandListBase::SampleCounters(id<MTLCounterSampleBuffer> counterSampleBuffer, uint32_t sampleIndex)
{
if (!m_supportsInterDrawTimestamps)
{
return;
}
AZ_Assert(sampleIndex >= 0, "Invalid sample index");
//useBarrier - Inserting a barrier ensures that encoded work is complete before the GPU samples the hardware counters.
//If it is true there is a performance penalty but you will get consistent results
@@ -231,6 +243,11 @@ namespace AZ
void CommandListBase::SamplePassCounters(id<MTLCounterSampleBuffer> counterSampleBuffer, uint32_t sampleIndex)
{
if (!m_supportsInterDrawTimestamps)
{
return;
}
if(m_encoder == nil)
{
//Queue the query to be activated upon encoder creation. Applies to timestamp queries
@@ -101,6 +101,8 @@ namespace AZ
const AZStd::set<id<MTLHeap>>* m_residentHeaps = nullptr;
bool m_supportsInterDrawTimestamps = AZ_TRAIT_ATOM_METAL_COUNTER_SAMPLING; // iOS/TVOS = false, MacOS = defaults to true
#if AZ_TRAIT_ATOM_METAL_COUNTER_SAMPLING
struct TimeStampData
{
+19 -5
View File
@@ -328,14 +328,28 @@ namespace AZ
m_features.m_indirectDrawSupport = false;
RHI::QueryTypeFlags counterSamplingFlags = RHI::QueryTypeFlags::None;
#if AZ_TRAIT_ATOM_METAL_COUNTER_SAMPLING
counterSamplingFlags |= (RHI::QueryTypeFlags::Timestamp | RHI::QueryTypeFlags::PipelineStatistics);
m_features.m_queryTypesMask[static_cast<uint32_t>(RHI::HardwareQueueClass::Copy)] = RHI::QueryTypeFlags::Timestamp;
bool supportsInterDrawTimestamps = true;
#if defined(__IPHONE_14_0) || defined(__MAC_11_0) || defined(__TVOS_14_0)
if (@available(macOS 11.0, iOS 14, tvOS 14, *))
{
supportsInterDrawTimestamps = [m_metalDevice supportsCounterSampling:MTLCounterSamplingPointAtDrawBoundary];
}
else
#endif
{
supportsInterDrawTimestamps = ![m_metalDevice.name containsString:@"Apple"]; // Apple GPU's don't support inter draw timestamps at the M1/A14 generation
}
if (supportsInterDrawTimestamps)
{
counterSamplingFlags |= (RHI::QueryTypeFlags::Timestamp | RHI::QueryTypeFlags::PipelineStatistics);
m_features.m_queryTypesMask[static_cast<uint32_t>(RHI::HardwareQueueClass::Copy)] = RHI::QueryTypeFlags::Timestamp;
}
m_features.m_queryTypesMask[static_cast<uint32_t>(RHI::HardwareQueueClass::Graphics)] = RHI::QueryTypeFlags::Occlusion | counterSamplingFlags;
//Compute queue can do gfx work
m_features.m_queryTypesMask[static_cast<uint32_t>(RHI::HardwareQueueClass::Compute)] = RHI::QueryTypeFlags::Occlusion |counterSamplingFlags;
m_features.m_queryTypesMask[static_cast<uint32_t>(RHI::HardwareQueueClass::Compute)] = RHI::QueryTypeFlags::Occlusion | counterSamplingFlags;
m_features.m_occlusionQueryPrecise = true;
//Values taken from https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf
@@ -19,8 +19,9 @@ namespace Platform
CGFloat GetScreenScale();
void AttachViewController(NativeWindowType* nativeWindow, NativeViewControllerType* viewController, RHIMetalView* metalView);
void UnAttachViewController(NativeWindowType* nativeWindow, NativeViewControllerType* viewController);
void PresentInternal(id <MTLCommandBuffer> mtlCommandBuffer, id<CAMetalDrawable> drawable, float syncInterval);
void PresentInternal(id <MTLCommandBuffer> mtlCommandBuffer, id<CAMetalDrawable> drawable, float syncInterval, float refreshRate);
void ResizeInternal(RHIMetalView* metalView, CGSize viewSize);
float GetRefreshRate();
RHIMetalView* GetMetalView(NativeWindowType* nativeWindow);
}
@@ -73,6 +74,15 @@ namespace AZ
AddSubView();
}
m_refreshRate = Platform::GetRefreshRate();
//Assume 60hz if 0 is returned.
//Internal OSX displays have 'flexible' refresh rates, with a max of 60Hz - but report 0hz
if (m_refreshRate < 0.1f)
{
m_refreshRate = 60.0f;
}
m_drawables.resize(descriptor.m_dimensions.m_imageCount);
if (nativeDimensions)
@@ -148,10 +158,9 @@ namespace AZ
uint32_t SwapChain::PresentInternal()
{
const uint32_t currentImageIndex = GetCurrentImageIndex();
//GFX TODO][ATOM-432] - Hardcoding to 30fps for now. Only used by ios. This needs to be driven by higher level code.
float syncInterval = 1.0f/30.0f;
//Preset the drawable
Platform::PresentInternal(m_mtlCommandBuffer, m_drawables[currentImageIndex], syncInterval);
Platform::PresentInternal(m_mtlCommandBuffer, m_drawables[currentImageIndex], GetDescriptor().m_verticalSyncInterval, m_refreshRate);
[m_drawables[currentImageIndex] release];
m_drawables[currentImageIndex] = nil;
@@ -52,6 +52,7 @@ namespace AZ
id<MTLDevice> m_mtlDevice = nil;
NativeWindowType* m_nativeWindow = nullptr;
AZStd::vector<id<CAMetalDrawable>> m_drawables;
float m_refreshRate = 0.0f;
};
}
}
@@ -218,7 +218,8 @@ namespace AZ
createInfo.extent = extent;
createInfo.mipLevels = AZStd::min<uint32_t>(descriptor.m_mipLevels, formatProps.maxMipLevels);
createInfo.arrayLayers = AZStd::min<uint32_t>(descriptor.m_arraySize, formatProps.maxArrayLayers);
createInfo.samples = static_cast<VkSampleCountFlagBits>(RHI::FilterBits(static_cast<VkSampleCountFlags>(ConvertSampleCount(descriptor.m_multisampleState.m_samples)), formatProps.sampleCounts));
VkSampleCountFlagBits sampleCountFlagBits = static_cast<VkSampleCountFlagBits>(RHI::FilterBits(static_cast<VkSampleCountFlags>(ConvertSampleCount(descriptor.m_multisampleState.m_samples)), formatProps.sampleCounts));
createInfo.samples = (static_cast<uint32_t>(sampleCountFlagBits) > 0) ? sampleCountFlagBits : VK_SAMPLE_COUNT_1_BIT;
createInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
createInfo.usage = GetImageUsageFlags();
createInfo.sharingMode = exclusiveOwnership ? VK_SHARING_MODE_EXCLUSIVE : VK_SHARING_MODE_CONCURRENT;
@@ -116,7 +116,7 @@ namespace AZ
{
AZ_Assert(IsQueryTypeValid(queryType), "Provided QueryType is invalid");
return static_cast<uint32_t>(m_queryTypeSupport) & static_cast<uint32_t>(queryType);
return static_cast<uint32_t>(m_queryTypeSupport) & AZ_BIT(static_cast<uint32_t>(queryType));
}
RPI::QueryPool* GpuQuerySystem::GetQueryPoolByType(RHI::QueryType queryType)
@@ -58,8 +58,8 @@ namespace AZ
RHI::ShaderResourceGroupPoolDescriptor poolDescriptor;
poolDescriptor.m_layout = shaderAsset.FindShaderResourceGroupLayout(srgName, supervariantIndex).get();
m_pool->SetName(srgName);
m_pool->SetName(AZ::Name(AZStd::string::format("%s_%s",shaderAsset.GetName().GetCStr(),srgName.GetCStr())));
const RHI::ResultCode resultCode = m_pool->Init(*device, poolDescriptor);
return resultCode;
}
@@ -27,7 +27,7 @@ void OnVsyncIntervalChanged(uint32_t const& interval)
// NOTE: On change, broadcasts the new requested vsync interval to all windows.
// The value of the vsync interval is constrained between 0 and 4
// Vsync intervals greater than 1 are not currently supported on the Vulkan RHI (see #2061 for discussion)
AZ_CVAR(uint32_t, rpi_vsync_interval, 0, OnVsyncIntervalChanged, AZ::ConsoleFunctorFlags::Null, "Set swapchain vsync interval");
AZ_CVAR(uint32_t, rpi_vsync_interval, 1, OnVsyncIntervalChanged, AZ::ConsoleFunctorFlags::Null, "Set swapchain vsync interval");
namespace AZ
{
@@ -11,7 +11,6 @@
#include <SceneAPI/SceneCore/Containers/Utilities/Filters.h>
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
#include <SceneAPI/SceneCore/DataTypes/DataTypeUtilities.h>
#include <SceneAPI/SceneCore/DataTypes/GraphData/IBoneData.h>
#include <SceneAPI/SceneCore/DataTypes/GraphData/IAnimationData.h>
#include <SceneAPI/SceneData/Rules/CoordinateSystemRule.h>
@@ -166,6 +165,34 @@ namespace EMotionFX
return finalMotionData;
}
AZ::SceneAPI::DataTypes::MatrixType MotionDataBuilder::GetLocalSpaceBindPose(const SceneContainers::SceneGraph& sceneGraph,
const SceneContainers::SceneGraph::NodeIndex rootBoneNodeIndex,
const SceneContainers::SceneGraph::NodeIndex nodeIndex,
const SceneDataTypes::ITransform* transform,
const SceneDataTypes::IBoneData* bone) const
{
if (nodeIndex != rootBoneNodeIndex)
{
const SceneContainers::SceneGraph::NodeIndex parentNodeIndex = sceneGraph.GetNodeParent(nodeIndex);
const SceneDataTypes::IGraphObject* parentNode = sceneGraph.GetNodeContent(parentNodeIndex).get();
if (const SceneDataTypes::IBoneData* parentBone = azrtti_cast<const SceneDataTypes::IBoneData*>(parentNode))
{
return parentBone->GetWorldTransform().GetInverseFull() * bone->GetWorldTransform();
}
}
if (bone)
{
return bone->GetWorldTransform();
}
else if (transform)
{
return transform->GetMatrix();
}
return AZ::SceneAPI::DataTypes::MatrixType::CreateIdentity();
}
AZ::SceneAPI::Events::ProcessingResult MotionDataBuilder::BuildMotionData(MotionDataBuilderContext& context)
{
if (context.m_phase != AZ::RC::Phase::Filling)
@@ -220,8 +247,10 @@ namespace EMotionFX
continue;
}
AZStd::shared_ptr<const SceneDataTypes::IBoneData> nodeBone = azrtti_cast<const SceneDataTypes::IBoneData*>(it->second);
if (!nodeBone)
// Check if we are dealing with a transform node or a bone and only recurse down the node hierarchy in this case.
const SceneDataTypes::IBoneData* nodeBone = azrtti_cast<const SceneDataTypes::IBoneData*>(it->second.get());
const SceneDataTypes::ITransform* nodeTransform = azrtti_cast<const SceneDataTypes::ITransform*>(it->second.get());
if (!nodeBone && !nodeTransform)
{
it.IgnoreNodeDescendants();
continue;
@@ -289,24 +318,13 @@ namespace EMotionFX
// Get the bind pose transform in local space.
using SceneAPIMatrixType = AZ::SceneAPI::DataTypes::MatrixType;
SceneAPIMatrixType bindSpaceLocalTransform;
const SceneContainers::SceneGraph::NodeIndex parentIndex = graph.GetNodeParent(boneNodeIndex);
if (boneNodeIndex != rootBoneNodeIndex)
{
auto parentNode = graph.GetNodeContent(parentIndex);
AZStd::shared_ptr<const SceneDataTypes::IBoneData> parentNodeBone = azrtti_cast<const SceneDataTypes::IBoneData*>(parentNode);
bindSpaceLocalTransform = parentNodeBone->GetWorldTransform().GetInverseFull() * nodeBone->GetWorldTransform();
}
else
{
bindSpaceLocalTransform = nodeBone->GetWorldTransform();
}
const SceneAPIMatrixType bindSpaceLocalTransform = GetLocalSpaceBindPose(graph, rootBoneNodeIndex, boneNodeIndex, nodeTransform, nodeBone);
// Get the time step and make sure it didn't change compared to other joint animations.
const double timeStep = animation->GetTimeStepBetweenFrames();
lowestTimeStep = AZ::GetMin<double>(timeStep, lowestTimeStep);
SceneAPIMatrixType sampleFrameTransformInverse;
AZ::SceneAPI::DataTypes::MatrixType sampleFrameTransformInverse;
if (additiveRule)
{
size_t sampleFrameIndex = additiveRule->GetSampleFrameIndex();
@@ -9,6 +9,9 @@
#include <SceneAPI/SceneCore/Components/ExportingComponent.h>
#include <SceneAPI/SceneCore/Containers/Scene.h>
#include <SceneAPI/SceneCore/Containers/SceneGraph.h>
#include <SceneAPI/SceneCore/DataTypes/GraphData/IBoneData.h>
#include <SceneAPI/SceneCore/DataTypes/GraphData/ITransform.h>
namespace EMotionFX
{
@@ -28,6 +31,14 @@ namespace EMotionFX
static void Reflect(AZ::ReflectContext* context);
AZ::SceneAPI::Events::ProcessingResult BuildMotionData(MotionDataBuilderContext& context);
private:
//! Get the bind pose transform in local space.
AZ::SceneAPI::DataTypes::MatrixType GetLocalSpaceBindPose(const AZ::SceneAPI::Containers::SceneGraph& sceneGraph,
const AZ::SceneAPI::Containers::SceneGraph::NodeIndex rootBoneNodeIndex,
const AZ::SceneAPI::Containers::SceneGraph::NodeIndex nodeIndex,
const AZ::SceneAPI::DataTypes::ITransform* transform,
const AZ::SceneAPI::DataTypes::IBoneData* bone) const;
};
} // namespace Pipeline
} // namespace EMotionFX
@@ -237,8 +237,8 @@ namespace EditorPythonBindings
{
ec->Class<PythonSystemComponent>("PythonSystemComponent", "The Python interpreter")
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC_CE("System"))
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC_CE("System"))
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
;
}
}
@@ -284,10 +284,10 @@ namespace EditorPythonBindings
ReleaseFunction m_releaseFunction;
};
ReleaseInitalizeWaiterScope scope([this]()
{
m_initalizeWaiter.release(m_initalizeWaiterCount);
m_initalizeWaiterCount = 0;
});
{
m_initalizeWaiter.release(m_initalizeWaiterCount);
m_initalizeWaiterCount = 0;
});
if (Py_IsInitialized())
{
@@ -327,6 +327,11 @@ namespace EditorPythonBindings
return result;
}
bool PythonSystemComponent::IsPythonActive()
{
return Py_IsInitialized() != 0;
}
void PythonSystemComponent::WaitForInitialization()
{
m_initalizeWaiterCount++;
@@ -44,6 +44,7 @@ namespace EditorPythonBindings
// AzToolsFramework::EditorPythonEventsInterface
bool StartPython(bool silenceWarnings = false) override;
bool StopPython(bool silenceWarnings = false) override;
bool IsPythonActive() override;
void WaitForInitialization() override;
void ExecuteWithLock(AZStd::function<void()> executionCallback) override;
////////////////////////////////////////////////////////////////////////
@@ -209,12 +209,17 @@ namespace Gestures
////////////////////////////////////////////////////////////////////////////////////////////////
inline uint32_t IRecognizer::GetGesturePointerIndex(const AzFramework::InputChannel& inputChannel)
{
const auto& mouseButtonIt = AZStd::find(AzFramework::InputDeviceMouse::Button::All.cbegin(),
AzFramework::InputDeviceMouse::Button::All.cend(),
inputChannel.GetInputChannelId());
if (mouseButtonIt != AzFramework::InputDeviceMouse::Button::All.cend())
// Only recognize gestures for the default mouse input device. The Editor may register synthetic
// mouse input devices with the same mouse input channels, which can confuse gesture recognition.
if (inputChannel.GetInputDevice().GetInputDeviceId() == AzFramework::InputDeviceMouse::Id)
{
return static_cast<uint32_t>(mouseButtonIt - AzFramework::InputDeviceMouse::Button::All.cbegin());
const auto& mouseButtonIt = AZStd::find(AzFramework::InputDeviceMouse::Button::All.cbegin(),
AzFramework::InputDeviceMouse::Button::All.cend(),
inputChannel.GetInputChannelId());
if (mouseButtonIt != AzFramework::InputDeviceMouse::Button::All.cend())
{
return static_cast<uint32_t>(mouseButtonIt - AzFramework::InputDeviceMouse::Button::All.cbegin());
}
}
const auto& touchIndexIt = AZStd::find(AzFramework::InputDeviceTouch::Touch::All.cbegin(),
+60 -6
View File
@@ -63,7 +63,6 @@ if (PAL_TRAIT_BUILD_HOST_TOOLS)
AUTORCC
FILES_CMAKE
lyshine_uicanvaseditor_files.cmake
lyshine_editor_builder_files.cmake
INCLUDE_DIRECTORIES
PRIVATE
.
@@ -78,7 +77,6 @@ if (PAL_TRAIT_BUILD_HOST_TOOLS)
3rdParty::Qt::Widgets
AZ::AzCore
AZ::AzToolsFramework
AZ::AssetBuilderSDK
Legacy::EditorCommon
Legacy::EditorCore
Gem::LyShine.Static
@@ -98,7 +96,6 @@ if (PAL_TRAIT_BUILD_HOST_TOOLS)
ly_add_target(
NAME LyShine.Editor GEM_MODULE
NAMESPACE Gem
FILES_CMAKE
lyshine_common_module_files.cmake
@@ -115,17 +112,72 @@ if (PAL_TRAIT_BUILD_HOST_TOOLS)
BUILD_DEPENDENCIES
PRIVATE
Legacy::CryCommon
AZ::AssetBuilderSDK
AZ::AzToolsFramework
Gem::LyShine.Editor.Static
Gem::LmbrCentral.Editor
Gem::TextureAtlas.Editor
RUNTIME_DEPENDENCIES
Gem::LmbrCentral.Editor
Gem::TextureAtlas.Editor
)
)
# by naming this target LyShine.Builders it ensures that it is loaded
# in any pipeline tools (Like Asset Processor, AssetBuilder, etc)
ly_add_target(
NAME LyShine.Builders.Static STATIC
NAMESPACE Gem
FILES_CMAKE
lyshine_editor_builder_files.cmake
INCLUDE_DIRECTORIES
PRIVATE
.
Source
PUBLIC
Include
BUILD_DEPENDENCIES
PRIVATE
AZ::AzCore
AZ::AzToolsFramework
AZ::AssetBuilderSDK
Gem::LyShine.Static
Legacy::CryCommon
Gem::LmbrCentral.Editor
Gem::TextureAtlas.Editor
Gem::AtomToolsFramework.Static
Gem::AtomToolsFramework.Editor
${additional_dependencies}
PUBLIC
Gem::Atom_RPI.Public
Gem::Atom_Utils.Static
Gem::Atom_Bootstrap.Headers
)
ly_add_target(
NAME LyShine.Builders GEM_MODULE
NAMESPACE Gem
OUTPUT_NAME Gem.LyShine.Builders
FILES_CMAKE
lyshine_common_module_files.cmake
COMPILE_DEFINITIONS
PRIVATE
LYSHINE_BUILDER
INCLUDE_DIRECTORIES
PRIVATE
.
Source
Editor
PUBLIC
Include
BUILD_DEPENDENCIES
PRIVATE
Legacy::CryCommon
AZ::AssetBuilderSDK
Gem::LyShine.Builders.Static
Gem::LmbrCentral.Editor
Gem::TextureAtlas.Editor
)
# by default, load the above "Gem::LyShine.Editor" module in dev tools:
ly_create_alias(NAME LyShine.Builders NAMESPACE Gem TARGETS Gem::LyShine.Editor)
ly_create_alias(NAME LyShine.Tools NAMESPACE Gem TARGETS Gem::LyShine.Editor)
endif()
@@ -169,6 +221,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED)
COMPILE_DEFINITIONS
PRIVATE
LYSHINE_EDITOR
LYSHINE_BUILDER
INCLUDE_DIRECTORIES
PRIVATE
Tests
@@ -182,6 +235,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED)
Legacy::CryCommon
AZ::AssetBuilderSDK
Gem::LyShine.Editor.Static
Gem::LyShine.Builders.Static
Gem::LmbrCentral.Editor
Gem::TextureAtlas
RUNTIME_DEPENDENCIES
+6 -6
View File
@@ -52,9 +52,9 @@
#include "World/UiCanvasProxyRefComponent.h"
#include "World/UiCanvasOnMeshComponent.h"
#if defined (LYSHINE_EDITOR)
# include "Pipeline/LyShineBuilder/LyShineBuilderComponent.h"
#endif // LYSHINE_EDITOR
#if defined(LYSHINE_BUILDER)
#include "Pipeline/LyShineBuilder/LyShineBuilderComponent.h"
#endif // LYSHINE_BUILDER
namespace LyShine
{
@@ -64,7 +64,7 @@ namespace LyShine
// Push results of [MyComponent]::CreateDescriptor() into m_descriptors here.
m_descriptors.insert(m_descriptors.end(), {
LyShineSystemComponent::CreateDescriptor(),
#if defined (LYSHINE_EDITOR)
#if defined(LYSHINE_EDITOR)
LyShineEditor::LyShineEditorSystemComponent::CreateDescriptor(),
#endif
UiCanvasAssetRefComponent::CreateDescriptor(),
@@ -103,7 +103,7 @@ namespace LyShine
UiRadioButtonComponent::CreateDescriptor(),
UiRadioButtonGroupComponent::CreateDescriptor(),
UiParticleEmitterComponent::CreateDescriptor(),
#if defined(LYSHINE_EDITOR)
#if defined(LYSHINE_BUILDER)
// Builder
LyShineBuilder::LyShineBuilderComponent::CreateDescriptor(),
#endif
@@ -123,7 +123,7 @@ namespace LyShine
{
return AZ::ComponentTypeList{
azrtti_typeid<LyShineSystemComponent>(),
#if defined (LYSHINE_EDITOR)
#if defined(LYSHINE_EDITOR)
azrtti_typeid<LyShineEditor::LyShineEditorSystemComponent>(),
#endif
#if AZ_LOADSCREENCOMPONENT_ENABLED
@@ -148,7 +148,6 @@ namespace LyShine
{
LyShineAllocatorScope::ActivateAllocators();
LyShineRequestBus::Handler::BusConnect();
UiSystemBus::Handler::BusConnect();
UiSystemToolsBus::Handler::BusConnect();
UiFrameworkBus::Handler::BusConnect();
@@ -196,7 +195,6 @@ namespace LyShine
UiSystemBus::Handler::BusDisconnect();
UiSystemToolsBus::Handler::BusDisconnect();
UiFrameworkBus::Handler::BusDisconnect();
LyShineRequestBus::Handler::BusDisconnect();
CrySystemEventBus::Handler::BusDisconnect();
LyShineAllocatorScope::DeactivateAllocators();
@@ -13,7 +13,6 @@
#include <LmbrCentral/Rendering/MaterialAsset.h>
#include <LyShine/LyShineBus.h>
#include <LyShine/Bus/UiSystemBus.h>
#include <LyShine/Bus/UiCanvasManagerBus.h>
#include <LyShine/Bus/Tools/UiSystemToolsBus.h>
@@ -28,7 +27,6 @@ namespace LyShine
class LyShineSystemComponent
: public AZ::Component
, protected LyShineRequestBus::Handler
, protected UiSystemBus::Handler
, protected UiSystemToolsBus::Handler
, protected LyShineAllocatorScope
@@ -8,4 +8,6 @@
set(FILES
Source/LyShineModule.cpp
Source/LyShineModule.h
Source/LyShineSystemComponent.cpp
Source/LyShineSystemComponent.h
)
@@ -26,8 +26,6 @@ set(FILES
Source/EditorPropertyTypes.h
Source/LyShineLoadScreen.cpp
Source/LyShineLoadScreen.h
Source/LyShineSystemComponent.cpp
Source/LyShineSystemComponent.h
Source/RenderGraph.cpp
Source/RenderGraph.h
Source/TextMarkup.cpp
@@ -1,45 +0,0 @@
{
"values": [
{
"$type": "MotionGroup",
"name": "idle_cwby_01",
"selectedRootBone": "RootNode.Reference",
"id": "{492E8A35-2647-581F-A701-F1D2A9FBB979}",
"rules": {
"rules": [
{
"$type": "MetaDataRule",
"commands": [
{
"$type": "CommandSystem::CommandAdjustMotion",
"dirtyFlag": {},
"motionExtractionFlags": {},
"name": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEventTrack",
"eventTrackName": "Sync",
"eventTrackIndex": {},
"isEnabled": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEventTrack",
"eventTrackName": "GameState",
"eventTrackIndex": {},
"isEnabled": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEvent",
"eventTrackName": "GameState",
"eventDatas": {}
}
]
},
{
"$type": "MotionSamplingRule"
}
]
}
}
]
}
@@ -1,61 +0,0 @@
{
"values": [
{
"$type": "MotionGroup",
"name": "reload",
"selectedRootBone": "RootNode.Reference",
"id": "{28092685-3550-5583-A666-CD60018AB2E9}",
"rules": {
"rules": [
{
"$type": "MetaDataRule",
"commands": [
{
"$type": "CommandSystem::CommandAdjustMotion",
"dirtyFlag": {},
"motionExtractionFlags": {},
"name": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEventTrack",
"eventTrackName": "Sync",
"eventTrackIndex": {},
"isEnabled": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEventTrack",
"eventTrackName": "ReloadEvent",
"eventTrackIndex": {},
"isEnabled": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEvent",
"eventTrackName": "ReloadEvent",
"startTime": 0.509211003780365,
"endTime": 0.509211003780365,
"eventDatas": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEvent",
"eventTrackName": "ReloadEvent",
"startTime": 1.2446810007095338,
"endTime": 1.2446810007095338,
"eventDatas": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEvent",
"eventTrackName": "ReloadEvent",
"startTime": 1.4295190572738648,
"endTime": 1.4295190572738648,
"eventDatas": {}
}
]
},
{
"$type": "MotionSamplingRule"
}
]
}
}
]
}
@@ -1,59 +0,0 @@
{
"values": [
{
"$type": "MotionGroup",
"name": "run",
"selectedRootBone": "RootNode.Reference",
"id": "{7D6889F1-6536-57B6-8B02-93C815D1ADA9}",
"rules": {
"rules": [
{
"$type": "MetaDataRule",
"commands": [
{
"$type": "CommandSystem::CommandAdjustMotion",
"dirtyFlag": {},
"motionExtractionFlags": {},
"name": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEventTrack",
"eventTrackName": "Sync",
"eventTrackIndex": {},
"isEnabled": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEvent",
"eventTrackName": "Sync",
"startTime": 0.3396751880645752,
"endTime": 0.3396751880645752,
"eventDatas": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEvent",
"eventTrackName": "Sync",
"startTime": 0.6319156885147095,
"endTime": 0.6319156885147095,
"eventDatas": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEventTrack",
"eventTrackName": "GameState",
"eventTrackIndex": {},
"isEnabled": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEvent",
"eventTrackName": "GameState",
"eventDatas": {}
}
]
},
{
"$type": "MotionSamplingRule"
}
]
}
}
]
}
@@ -1,47 +0,0 @@
{
"values": [
{
"$type": "MotionGroup",
"name": "shootrecoil",
"selectedRootBone": "RootNode.Reference",
"id": "{A1DC3BB2-3324-50F3-8C4B-BBFB61623129}",
"rules": {
"rules": [
{
"$type": "MetaDataRule",
"commands": [
{
"$type": "CommandSystem::CommandAdjustMotion",
"dirtyFlag": {},
"motionExtractionFlags": {},
"name": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEventTrack",
"eventTrackName": "Sync",
"eventTrackIndex": {},
"isEnabled": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEventTrack",
"eventTrackName": "RecoilEvent",
"eventTrackIndex": {},
"isEnabled": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEvent",
"eventTrackName": "RecoilEvent",
"startTime": 0.23250000178813935,
"endTime": 0.23250000178813935,
"eventDatas": {}
}
]
},
{
"$type": "MotionSamplingRule"
}
]
}
}
]
}
@@ -1,45 +0,0 @@
{
"values": [
{
"$type": "MotionGroup",
"name": "strafeback",
"selectedRootBone": "RootNode.Reference",
"id": "{CA0EF712-DA36-5DA8-B474-207BD250CF2F}",
"rules": {
"rules": [
{
"$type": "MetaDataRule",
"commands": [
{
"$type": "CommandSystem::CommandAdjustMotion",
"dirtyFlag": {},
"motionExtractionFlags": {},
"name": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEventTrack",
"eventTrackName": "Sync",
"eventTrackIndex": {},
"isEnabled": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEventTrack",
"eventTrackName": "GameEvents",
"eventTrackIndex": {},
"isEnabled": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEvent",
"eventTrackName": "GameEvents",
"eventDatas": {}
}
]
},
{
"$type": "MotionSamplingRule"
}
]
}
}
]
}
@@ -1,45 +0,0 @@
{
"values": [
{
"$type": "MotionGroup",
"name": "strafebackl",
"selectedRootBone": "RootNode.Reference",
"id": "{9433F0E6-EA1A-5473-AA21-EE4DC45387C1}",
"rules": {
"rules": [
{
"$type": "MetaDataRule",
"commands": [
{
"$type": "CommandSystem::CommandAdjustMotion",
"dirtyFlag": {},
"motionExtractionFlags": {},
"name": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEventTrack",
"eventTrackName": "Sync",
"eventTrackIndex": {},
"isEnabled": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEventTrack",
"eventTrackName": "GameState",
"eventTrackIndex": {},
"isEnabled": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEvent",
"eventTrackName": "GameState",
"eventDatas": {}
}
]
},
{
"$type": "MotionSamplingRule"
}
]
}
}
]
}
@@ -1,45 +0,0 @@
{
"values": [
{
"$type": "MotionGroup",
"name": "strafebackr",
"selectedRootBone": "RootNode.Reference",
"id": "{5392AC3D-FF18-51F5-984E-248CAAF09F2E}",
"rules": {
"rules": [
{
"$type": "MetaDataRule",
"commands": [
{
"$type": "CommandSystem::CommandAdjustMotion",
"dirtyFlag": {},
"motionExtractionFlags": {},
"name": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEventTrack",
"eventTrackName": "Sync",
"eventTrackIndex": {},
"isEnabled": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEventTrack",
"eventTrackName": "GameState",
"eventTrackIndex": {},
"isEnabled": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEvent",
"eventTrackName": "GameState",
"eventDatas": {}
}
]
},
{
"$type": "MotionSamplingRule"
}
]
}
}
]
}
@@ -1,59 +0,0 @@
{
"values": [
{
"$type": "MotionGroup",
"name": "strafeforward",
"selectedRootBone": "RootNode.Reference",
"id": "{2FB879C6-B3FB-5BD8-B52B-1012000351C2}",
"rules": {
"rules": [
{
"$type": "MetaDataRule",
"commands": [
{
"$type": "CommandSystem::CommandAdjustMotion",
"dirtyFlag": {},
"motionExtractionFlags": {},
"name": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEventTrack",
"eventTrackName": "Sync",
"eventTrackIndex": {},
"isEnabled": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEvent",
"eventTrackName": "Sync",
"startTime": 0.2708907127380371,
"endTime": 0.2708907127380371,
"eventDatas": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEvent",
"eventTrackName": "Sync",
"startTime": 0.9699265956878662,
"endTime": 0.9699265956878662,
"eventDatas": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEventTrack",
"eventTrackName": "GameState",
"eventTrackIndex": {},
"isEnabled": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEvent",
"eventTrackName": "GameState",
"eventDatas": {}
}
]
},
{
"$type": "MotionSamplingRule"
}
]
}
}
]
}
@@ -1,45 +0,0 @@
{
"values": [
{
"$type": "MotionGroup",
"name": "strafeforwardl",
"selectedRootBone": "RootNode.Reference",
"id": "{2D945D52-C313-57A3-B722-C6402ACC3506}",
"rules": {
"rules": [
{
"$type": "MetaDataRule",
"commands": [
{
"$type": "CommandSystem::CommandAdjustMotion",
"dirtyFlag": {},
"motionExtractionFlags": {},
"name": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEventTrack",
"eventTrackName": "Sync",
"eventTrackIndex": {},
"isEnabled": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEventTrack",
"eventTrackName": "GameState",
"eventTrackIndex": {},
"isEnabled": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEvent",
"eventTrackName": "GameState",
"eventDatas": {}
}
]
},
{
"$type": "MotionSamplingRule"
}
]
}
}
]
}
@@ -1,45 +0,0 @@
{
"values": [
{
"$type": "MotionGroup",
"name": "strafeforwardr",
"selectedRootBone": "RootNode.Reference",
"id": "{3E691B9F-C0D7-5BFD-BBBC-50BAE737886E}",
"rules": {
"rules": [
{
"$type": "MetaDataRule",
"commands": [
{
"$type": "CommandSystem::CommandAdjustMotion",
"dirtyFlag": {},
"motionExtractionFlags": {},
"name": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEventTrack",
"eventTrackName": "Sync",
"eventTrackIndex": {},
"isEnabled": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEventTrack",
"eventTrackName": "GameState",
"eventTrackIndex": {},
"isEnabled": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEvent",
"eventTrackName": "GameState",
"eventDatas": {}
}
]
},
{
"$type": "MotionSamplingRule"
}
]
}
}
]
}
@@ -1,45 +0,0 @@
{
"values": [
{
"$type": "MotionGroup",
"name": "strafeinplace",
"selectedRootBone": "RootNode.Reference",
"id": "{A2686CFC-D49B-5468-AE9F-E3F84FA75C6D}",
"rules": {
"rules": [
{
"$type": "MetaDataRule",
"commands": [
{
"$type": "CommandSystem::CommandAdjustMotion",
"dirtyFlag": {},
"motionExtractionFlags": {},
"name": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEventTrack",
"eventTrackName": "Sync",
"eventTrackIndex": {},
"isEnabled": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEventTrack",
"eventTrackName": "GameState",
"eventTrackIndex": {},
"isEnabled": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEvent",
"eventTrackName": "GameState",
"eventDatas": {}
}
]
},
{
"$type": "MotionSamplingRule"
}
]
}
}
]
}
@@ -1,45 +0,0 @@
{
"values": [
{
"$type": "MotionGroup",
"name": "strafeleft",
"selectedRootBone": "RootNode.Reference",
"id": "{2093C7DF-0C51-5C2B-B763-4DC1CC81D10E}",
"rules": {
"rules": [
{
"$type": "MetaDataRule",
"commands": [
{
"$type": "CommandSystem::CommandAdjustMotion",
"dirtyFlag": {},
"motionExtractionFlags": {},
"name": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEventTrack",
"eventTrackName": "Sync",
"eventTrackIndex": {},
"isEnabled": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEventTrack",
"eventTrackName": "GameState",
"eventTrackIndex": {},
"isEnabled": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEvent",
"eventTrackName": "GameState",
"eventDatas": {}
}
]
},
{
"$type": "MotionSamplingRule"
}
]
}
}
]
}
@@ -1,45 +0,0 @@
{
"values": [
{
"$type": "MotionGroup",
"name": "straferight",
"selectedRootBone": "RootNode.Reference",
"id": "{CE0E45E9-4B8C-5340-9521-B6290BAB24FC}",
"rules": {
"rules": [
{
"$type": "MetaDataRule",
"commands": [
{
"$type": "CommandSystem::CommandAdjustMotion",
"dirtyFlag": {},
"motionExtractionFlags": {},
"name": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEventTrack",
"eventTrackName": "Sync",
"eventTrackIndex": {},
"isEnabled": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEventTrack",
"eventTrackName": "GameState",
"eventTrackIndex": {},
"isEnabled": {}
},
{
"$type": "CommandSystem::CommandCreateMotionEvent",
"eventTrackName": "GameState",
"eventDatas": {}
}
]
},
{
"$type": "MotionSamplingRule"
}
]
}
}
]
}
+1
View File
@@ -61,6 +61,7 @@ if (PAL_TRAIT_BUILD_HOST_TOOLS)
RUNTIME_DEPENDENCIES
AZ::SceneCore
AZ::SceneData
AZ::SceneUI
)
# the SceneProcessing.Editor module above is only used in Builders and Tools.
ly_create_alias(NAME SceneProcessing.Builders NAMESPACE Gem TARGETS Gem::SceneProcessing.Editor)
@@ -493,7 +493,8 @@ namespace AZ::SceneGenerationComponents
// Copy node attributes
AZStd::apply([](const auto&&... nodePairView) {
((AZStd::for_each(begin(nodePairView), end(nodePairView), [](const auto& nodePair) {
auto& [originalNode, optimizedNode] = nodePair;
auto& originalNode = nodePair.first;
auto& optimizedNode = nodePair.second;
optimizedNode->CloneAttributesFrom(&originalNode.get());
})), ...);
}, std::tuple {