From b9c618329a50b91ca1ccd9067a679de1388f53dd Mon Sep 17 00:00:00 2001 From: Walters Date: Mon, 19 Apr 2021 17:08:15 -0700 Subject: [PATCH 01/30] Customer PR. Released unused raw asset data in EmotionFX asset to reclaim memory after asset initialization --- .../EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp | 3 ++- .../Code/Source/Integration/Assets/AnimGraphAsset.cpp | 1 + Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h | 6 ++++++ .../Code/Source/Integration/Assets/MotionAsset.cpp | 1 + .../Code/Source/Integration/Assets/MotionSetAsset.cpp | 1 + 5 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Gems/EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp b/Gems/EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp index d0b24cb203..4a20190630 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp +++ b/Gems/EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp @@ -68,6 +68,8 @@ namespace EMotionFX &actorSettings, ""); + assetData->ReleaseEmotionFXData(); + if (!assetData->m_emfxActor) { AZ_Error("EMotionFX", false, "Failed to initialize actor asset %s", asset.ToString().c_str()); @@ -77,7 +79,6 @@ namespace EMotionFX assetData->m_emfxActor->SetIsOwnedByRuntime(true); // Note: Render actor depends on the mesh asset, so we need to manually create it after mesh asset has been loaded. - return static_cast(assetData->m_emfxActor); } diff --git a/Gems/EMotionFX/Code/Source/Integration/Assets/AnimGraphAsset.cpp b/Gems/EMotionFX/Code/Source/Integration/Assets/AnimGraphAsset.cpp index 82bb487d2e..3dd9621420 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Assets/AnimGraphAsset.cpp +++ b/Gems/EMotionFX/Code/Source/Integration/Assets/AnimGraphAsset.cpp @@ -90,6 +90,7 @@ namespace EMotionFX } } + assetData->ReleaseEmotionFXData(); AZ_Error("EMotionFX", assetData->m_emfxAnimGraph, "Failed to initialize anim graph asset %s", asset.GetHint().c_str()); return static_cast(assetData->m_emfxAnimGraph); } diff --git a/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h b/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h index 2936076258..4e7f1c984f 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h +++ b/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h @@ -36,6 +36,12 @@ namespace EMotionFX : AZ::Data::AssetData(id) {} + void ReleaseEmotionFXData() + { + m_emfxNativeData.clear(); + m_emfxNativeData.shrink_to_fit(); + } + AZStd::vector m_emfxNativeData; }; diff --git a/Gems/EMotionFX/Code/Source/Integration/Assets/MotionAsset.cpp b/Gems/EMotionFX/Code/Source/Integration/Assets/MotionAsset.cpp index 6bcc572ec6..5acbf5b4f7 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Assets/MotionAsset.cpp +++ b/Gems/EMotionFX/Code/Source/Integration/Assets/MotionAsset.cpp @@ -47,6 +47,7 @@ namespace EMotionFX assetData->m_emfxMotion->SetIsOwnedByRuntime(true); } + assetData->ReleaseEmotionFXData(); AZ_Error("EMotionFX", assetData->m_emfxMotion, "Failed to initialize motion asset %s", asset.GetHint().c_str()); return (assetData->m_emfxMotion); } diff --git a/Gems/EMotionFX/Code/Source/Integration/Assets/MotionSetAsset.cpp b/Gems/EMotionFX/Code/Source/Integration/Assets/MotionSetAsset.cpp index f437cea256..3fe6e0c395 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Assets/MotionSetAsset.cpp +++ b/Gems/EMotionFX/Code/Source/Integration/Assets/MotionSetAsset.cpp @@ -232,6 +232,7 @@ namespace EMotionFX // Set motion set's motion load callback, so if EMotion FX queries back for a motion, // we can pull the one managed through an AZ::Asset. assetData->m_emfxMotionSet->SetCallback(aznew CustomMotionSetCallback(asset)); + assetData->ReleaseEmotionFXData(); return true; } From 1ef7d5c14b66b3a1865cd0aaef941b2b81db45a4 Mon Sep 17 00:00:00 2001 From: Gene Walters Date: Wed, 21 Apr 2021 09:46:06 -0700 Subject: [PATCH 02/30] updating based on feedback --- Gems/EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp | 2 +- .../Code/Source/Integration/Assets/AnimGraphAsset.cpp | 2 +- Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h | 5 ++--- .../EMotionFX/Code/Source/Integration/Assets/MotionAsset.cpp | 2 +- .../Code/Source/Integration/Assets/MotionSetAsset.cpp | 2 +- 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Gems/EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp b/Gems/EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp index 4a20190630..518db289e2 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp +++ b/Gems/EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp @@ -68,7 +68,7 @@ namespace EMotionFX &actorSettings, ""); - assetData->ReleaseEmotionFXData(); + assetData->ReleaseEMotionFXData(); if (!assetData->m_emfxActor) { diff --git a/Gems/EMotionFX/Code/Source/Integration/Assets/AnimGraphAsset.cpp b/Gems/EMotionFX/Code/Source/Integration/Assets/AnimGraphAsset.cpp index 3dd9621420..a8b9746789 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Assets/AnimGraphAsset.cpp +++ b/Gems/EMotionFX/Code/Source/Integration/Assets/AnimGraphAsset.cpp @@ -90,7 +90,7 @@ namespace EMotionFX } } - assetData->ReleaseEmotionFXData(); + assetData->ReleaseEMotionFXData(); AZ_Error("EMotionFX", assetData->m_emfxAnimGraph, "Failed to initialize anim graph asset %s", asset.GetHint().c_str()); return static_cast(assetData->m_emfxAnimGraph); } diff --git a/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h b/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h index 4e7f1c984f..9b174c0620 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h +++ b/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h @@ -36,10 +36,9 @@ namespace EMotionFX : AZ::Data::AssetData(id) {} - void ReleaseEmotionFXData() + void ReleaseEMotionFXData() { - m_emfxNativeData.clear(); - m_emfxNativeData.shrink_to_fit(); + m_emfxNativeData = {}; } AZStd::vector m_emfxNativeData; diff --git a/Gems/EMotionFX/Code/Source/Integration/Assets/MotionAsset.cpp b/Gems/EMotionFX/Code/Source/Integration/Assets/MotionAsset.cpp index 5acbf5b4f7..2d95066b13 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Assets/MotionAsset.cpp +++ b/Gems/EMotionFX/Code/Source/Integration/Assets/MotionAsset.cpp @@ -47,7 +47,7 @@ namespace EMotionFX assetData->m_emfxMotion->SetIsOwnedByRuntime(true); } - assetData->ReleaseEmotionFXData(); + assetData->ReleaseEMotionFXData(); AZ_Error("EMotionFX", assetData->m_emfxMotion, "Failed to initialize motion asset %s", asset.GetHint().c_str()); return (assetData->m_emfxMotion); } diff --git a/Gems/EMotionFX/Code/Source/Integration/Assets/MotionSetAsset.cpp b/Gems/EMotionFX/Code/Source/Integration/Assets/MotionSetAsset.cpp index 3fe6e0c395..a49dd95986 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Assets/MotionSetAsset.cpp +++ b/Gems/EMotionFX/Code/Source/Integration/Assets/MotionSetAsset.cpp @@ -232,7 +232,7 @@ namespace EMotionFX // Set motion set's motion load callback, so if EMotion FX queries back for a motion, // we can pull the one managed through an AZ::Asset. assetData->m_emfxMotionSet->SetCallback(aznew CustomMotionSetCallback(asset)); - assetData->ReleaseEmotionFXData(); + assetData->ReleaseEMotionFXData(); return true; } From bfc4a3bb2179e6490006f6946e3a52b31a0fc341 Mon Sep 17 00:00:00 2001 From: hultonha Date: Thu, 22 Apr 2021 13:57:03 +0100 Subject: [PATCH 03/30] fix bug for setting SimpleMotion asset --- .../PropertyMotionCtrl.cpp | 201 ++++-------------- .../PropertyMotionCtrl.h | 123 +++++------ 2 files changed, 88 insertions(+), 236 deletions(-) diff --git a/Code/Sandbox/Editor/Controls/ReflectedPropertyControl/PropertyMotionCtrl.cpp b/Code/Sandbox/Editor/Controls/ReflectedPropertyControl/PropertyMotionCtrl.cpp index 69f5d9801a..1df31a2c1d 100644 --- a/Code/Sandbox/Editor/Controls/ReflectedPropertyControl/PropertyMotionCtrl.cpp +++ b/Code/Sandbox/Editor/Controls/ReflectedPropertyControl/PropertyMotionCtrl.cpp @@ -1,187 +1,64 @@ /* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates, or -* a third party where indicated. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates, or + * a third party where indicated. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ #include "EditorDefs.h" #include "PropertyMotionCtrl.h" -// Qt -#include -#include -#include - // AzToolsFramework -#include #include +#include - -MotionPropertyCtrl::MotionPropertyCtrl(QWidget *pParent) - : QWidget(pParent) +QWidget* MotionPropertyWidgetHandler::CreateGUI(QWidget* pParent) { - m_motionLabel = new QLabel; - - m_pBrowseButton = new QToolButton; - m_pBrowseButton->setIcon(QIcon(":/reflectedPropertyCtrl/img/file_browse.png")); - m_pApplyButton = new QToolButton; - m_pApplyButton->setIcon(QIcon(":/reflectedPropertyCtrl/img/apply.png")); - - m_pApplyButton->setFocusPolicy(Qt::StrongFocus); - m_pBrowseButton->setFocusPolicy(Qt::StrongFocus); - - QHBoxLayout *pLayout = new QHBoxLayout(this); - pLayout->setContentsMargins(0, 0, 0, 0); - pLayout->addWidget(m_motionLabel, 1); - pLayout->addWidget(m_pBrowseButton); - pLayout->addWidget(m_pApplyButton); - - connect(m_pBrowseButton, &QAbstractButton::clicked, this, &MotionPropertyCtrl::OnBrowseClicked); - connect(m_pApplyButton, &QAbstractButton::clicked, this, &MotionPropertyCtrl::OnApplyClicked); -}; - -MotionPropertyCtrl::~MotionPropertyCtrl() -{ -} - - -void MotionPropertyCtrl::SetValue(const CReflectedVarMotion &motion) -{ - m_motion = motion; - SetLabelText(motion.m_motion); -} - -CReflectedVarMotion MotionPropertyCtrl::value() const -{ - return m_motion; -} - -void MotionPropertyCtrl::OnBrowseClicked() -{ - - static AZ::Data::AssetType emotionFXMotionAssetType("{00494B8E-7578-4BA2-8B28-272E90680787}"); // from MotionAsset.h in EMotionFX Gem - - // Request the AssetBrowser Dialog and set a type filter - AssetSelectionModel selection = AssetSelectionModel::AssetTypeSelection(emotionFXMotionAssetType); - selection.SetSelectedAssetId(m_motion.m_assetId); - AzToolsFramework::EditorRequests::Bus::Broadcast(&AzToolsFramework::EditorRequests::BrowseForAssets, selection); - if (selection.IsValid()) - { - auto product = azrtti_cast(selection.GetResult()); - if (product != nullptr) - { - m_motion.m_motion = product->GetRelativePath(); - m_motion.m_assetId = product->GetAssetId(); - SetLabelText(m_motion.m_motion); - emit ValueChanged(m_motion); - } - } -} - -// TODO: Might be able to delete this function -void MotionPropertyCtrl::OnApplyClicked() -{ -#if 0 - CUIEnumerations &roGeneralProxy = CUIEnumerations::GetUIEnumerationsInstance(); - QStringList cSelectedMotions; - size_t nTotalMotions(0); - size_t nCurrentMotion(0); - - QString combinedString = GetIEditor()->GetResourceSelectorHost()->GetGlobalSelection("motion"); - SplitString(combinedString, cSelectedMotions, ','); - - nTotalMotions = cSelectedMotions.size(); - for (nCurrentMotion = 0; nCurrentMotion < nTotalMotions; ++nCurrentMotion) - { - QString& rstrCurrentAnimAction = cSelectedMotions[nCurrentMotion]; - if (!rstrCurrentAnimAction.isEmpty()) - { - m_motion.m_motion = rstrCurrentAnimAction.toLatin1().data(); - SetLabelText(m_motion.m_motion); - emit ValueChanged(m_motion); - } - } -#endif -} - -QWidget* MotionPropertyCtrl::GetFirstInTabOrder() -{ - return m_pBrowseButton; -} -QWidget* MotionPropertyCtrl::GetLastInTabOrder() -{ - return m_pApplyButton; -} - -void MotionPropertyCtrl::UpdateTabOrder() -{ - setTabOrder(m_pBrowseButton, m_pApplyButton); -} - -void MotionPropertyCtrl::SetLabelText(const AZStd::string& motion) -{ - if (!motion.empty()) - { - AZStd::string filename; - if (AzFramework::StringFunc::Path::GetFileName(motion.c_str(), filename)) - { - m_motionLabel->setText(filename.c_str()); - } - else - { - m_motionLabel->setText(motion.c_str()); - } - } - else - { - m_motionLabel->setText(""); - } -} - - -QWidget* MotionPropertyWidgetHandler::CreateGUI(QWidget *pParent) -{ - MotionPropertyCtrl* newCtrl = aznew MotionPropertyCtrl(pParent); - connect(newCtrl, &MotionPropertyCtrl::ValueChanged, newCtrl, [newCtrl]() - { - EBUS_EVENT(AzToolsFramework::PropertyEditorGUIMessages::Bus, RequestWrite, newCtrl); - }); + AzToolsFramework::PropertyAssetCtrl* newCtrl = aznew AzToolsFramework::PropertyAssetCtrl(pParent); + connect( + newCtrl, &AzToolsFramework::PropertyAssetCtrl::OnAssetIDChanged, this, [newCtrl]([[maybe_unused]] AZ::Data::AssetId newAssetId) { + EBUS_EVENT(AzToolsFramework::PropertyEditorGUIMessages::Bus, RequestWrite, newCtrl); + AzToolsFramework::PropertyEditorGUIMessages::Bus::Broadcast( + &AzToolsFramework::PropertyEditorGUIMessages::Bus::Handler::OnEditingFinished, newCtrl); + }); return newCtrl; } - -void MotionPropertyWidgetHandler::ConsumeAttribute(MotionPropertyCtrl* GUI, AZ::u32 attrib, AzToolsFramework::PropertyAttributeReader* attrValue, const char* debugName) +void MotionPropertyWidgetHandler::ConsumeAttribute( + [[maybe_unused]] AzToolsFramework::PropertyAssetCtrl* GUI, [[maybe_unused]] AZ::u32 attrib, + [[maybe_unused]] AzToolsFramework::PropertyAttributeReader* attrValue, [[maybe_unused]] const char* debugName) { - Q_UNUSED(GUI); - Q_UNUSED(attrib); - Q_UNUSED(attrValue); - Q_UNUSED(debugName); } -void MotionPropertyWidgetHandler::WriteGUIValuesIntoProperty(size_t index, MotionPropertyCtrl* GUI, property_t& instance, AzToolsFramework::InstanceDataNode* node) +void MotionPropertyWidgetHandler::WriteGUIValuesIntoProperty( + [[maybe_unused]] size_t index, [[maybe_unused]] AzToolsFramework::PropertyAssetCtrl* GUI, property_t& instance, + [[maybe_unused]] AzToolsFramework::InstanceDataNode* node) { - Q_UNUSED(index); - Q_UNUSED(node); - CReflectedVarMotion val = GUI->value(); + CReflectedVarMotion val; + val.m_motion = GUI->GetCurrentAssetHint(); + val.m_assetId = GUI->GetSelectedAssetID(); instance = static_cast(val); } -bool MotionPropertyWidgetHandler::ReadValuesIntoGUI(size_t index, MotionPropertyCtrl* GUI, const property_t& instance, AzToolsFramework::InstanceDataNode* node) +bool MotionPropertyWidgetHandler::ReadValuesIntoGUI( + [[maybe_unused]] size_t index, [[maybe_unused]] AzToolsFramework::PropertyAssetCtrl* GUI, const property_t& instance, + [[maybe_unused]] AzToolsFramework::InstanceDataNode* node) { - Q_UNUSED(index); - Q_UNUSED(node); - CReflectedVarMotion val = instance; - GUI->SetValue(val); + static const AZ::Data::AssetType emotionFXMotionAssetType( + "{00494B8E-7578-4BA2-8B28-272E90680787}"); // from MotionAsset.h in EMotionFX Gem + + GUI->blockSignals(true); + GUI->SetSelectedAssetID(instance.m_assetId); + GUI->SetCurrentAssetType(emotionFXMotionAssetType); + GUI->blockSignals(false); + return false; } - #include - diff --git a/Code/Sandbox/Editor/Controls/ReflectedPropertyControl/PropertyMotionCtrl.h b/Code/Sandbox/Editor/Controls/ReflectedPropertyControl/PropertyMotionCtrl.h index 568111b521..d04f1b3353 100644 --- a/Code/Sandbox/Editor/Controls/ReflectedPropertyControl/PropertyMotionCtrl.h +++ b/Code/Sandbox/Editor/Controls/ReflectedPropertyControl/PropertyMotionCtrl.h @@ -1,92 +1,67 @@ /* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ -#ifndef CRYINCLUDE_EDITOR_UTILS_PROPERTYMOTIONCTRL_H -#define CRYINCLUDE_EDITOR_UTILS_PROPERTYMOTIONCTRL_H #pragma once #if !defined(Q_MOC_RUN) -#include -#include #include "ReflectedVar.h" -#include -#include +#include +#include +#include #include - +#include +#include #endif -class QToolButton; -class QLabel; -class QHBoxLayout; - -namespace AzToolsFramework -{ - class PropertyAssetCtrl; -} - -class MotionPropertyCtrl - : public QWidget +class MotionPropertyWidgetHandler : QObject, + public AzToolsFramework::PropertyHandler { Q_OBJECT -public: - AZ_CLASS_ALLOCATOR(MotionPropertyCtrl, AZ::SystemAllocator, 0); - MotionPropertyCtrl(QWidget* pParent = nullptr); - virtual ~MotionPropertyCtrl(); - - CReflectedVarMotion value() const; - - QWidget* GetFirstInTabOrder(); - QWidget* GetLastInTabOrder(); - void UpdateTabOrder(); - -signals: - void ValueChanged(CReflectedVarMotion value); - -public slots: - void SetValue(const CReflectedVarMotion& motion); - -protected slots: - void OnBrowseClicked(); - void OnApplyClicked(); - -private: - void SetLabelText(const AZStd::string& motion); - - QToolButton* m_pBrowseButton; - QToolButton* m_pApplyButton; - QLabel* m_motionLabel; - - CReflectedVarMotion m_motion; -}; - -class MotionPropertyWidgetHandler - : QObject - , public AzToolsFramework::PropertyHandler < CReflectedVarMotion, MotionPropertyCtrl > -{ public: AZ_CLASS_ALLOCATOR(MotionPropertyWidgetHandler, AZ::SystemAllocator, 0); - virtual AZ::u32 GetHandlerName(void) const override { return AZ_CRC("Motion", 0xf5fea1e8); } - virtual bool IsDefaultHandler() const override { return true; } - virtual QWidget* GetFirstInTabOrder(MotionPropertyCtrl* widget) override { return widget->GetFirstInTabOrder(); } - virtual QWidget* GetLastInTabOrder(MotionPropertyCtrl* widget) override { return widget->GetLastInTabOrder(); } - virtual void UpdateWidgetInternalTabbing(MotionPropertyCtrl* widget) override { widget->UpdateTabOrder(); } + virtual AZ::u32 GetHandlerName(void) const override + { + return AZ_CRC("Motion", 0xf5fea1e8); + } + + virtual bool IsDefaultHandler() const override + { + return true; + } + + virtual QWidget* GetFirstInTabOrder(AzToolsFramework::PropertyAssetCtrl* widget) override + { + return widget->GetFirstInTabOrder(); + } + + virtual QWidget* GetLastInTabOrder(AzToolsFramework::PropertyAssetCtrl* widget) override + { + return widget->GetLastInTabOrder(); + } + + virtual void UpdateWidgetInternalTabbing(AzToolsFramework::PropertyAssetCtrl* widget) override + { + widget->UpdateTabOrder(); + } virtual QWidget* CreateGUI(QWidget* pParent) override; - virtual void ConsumeAttribute(MotionPropertyCtrl* GUI, AZ::u32 attrib, AzToolsFramework::PropertyAttributeReader* attrValue, const char* debugName) override; - virtual void WriteGUIValuesIntoProperty(size_t index, MotionPropertyCtrl* GUI, property_t& instance, AzToolsFramework::InstanceDataNode* node) override; - virtual bool ReadValuesIntoGUI(size_t index, MotionPropertyCtrl* GUI, const property_t& instance, AzToolsFramework::InstanceDataNode* node) override; + virtual void ConsumeAttribute( + AzToolsFramework::PropertyAssetCtrl* GUI, AZ::u32 attrib, AzToolsFramework::PropertyAttributeReader* attrValue, + const char* debugName) override; + virtual void WriteGUIValuesIntoProperty( + size_t index, AzToolsFramework::PropertyAssetCtrl* GUI, property_t& instance, AzToolsFramework::InstanceDataNode* node) override; + virtual bool ReadValuesIntoGUI( + size_t index, AzToolsFramework::PropertyAssetCtrl* GUI, const property_t& instance, + AzToolsFramework::InstanceDataNode* node) override; }; - - -#endif // CRYINCLUDE_EDITOR_UTILS_PROPERTYMOTIONCTRL_H From 0e803713bf212b575eab8d422a5a28208f4c5b8a Mon Sep 17 00:00:00 2001 From: amzn-sean <75276488+amzn-sean@users.noreply.github.com> Date: Thu, 22 Apr 2021 12:58:43 +0100 Subject: [PATCH 04/30] Ragdoll now uses Add/Remove SimulatedBody Addressed Minor Character PR feedback --- .../AzFramework/Physics/Character.h | 2 +- .../Physics/Common/PhysicsSimulatedBody.h | 2 +- .../SimulatedBodyConfiguration.cpp | 1 + .../SimulatedBodyConfiguration.h | 1 + .../AzFramework/Physics/Ragdoll.cpp | 5 ++ .../AzFramework/AzFramework/Physics/Ragdoll.h | 8 ++- .../PhysXCharacters/API/CharacterUtils.cpp | 37 ++++++------ .../PhysXCharacters/API/CharacterUtils.h | 5 +- .../Source/PhysXCharacters/API/Ragdoll.cpp | 20 ++----- .../Code/Source/PhysXCharacters/API/Ragdoll.h | 8 +-- .../PhysXCharacters/API/RagdollNode.cpp | 58 ++++++++++++++++--- .../Source/PhysXCharacters/API/RagdollNode.h | 8 ++- .../CharacterControllerComponent.cpp | 3 +- .../Components/RagdollComponent.cpp | 40 +++++++++---- .../Components/RagdollComponent.h | 4 +- Gems/PhysX/Code/Source/Scene/PhysXScene.cpp | 36 ++++++++++-- .../PhysXCharactersRagdollBenchmarks.cpp | 19 +++--- Gems/PhysX/Code/Tests/RagdollTests.cpp | 17 ++++-- 18 files changed, 183 insertions(+), 91 deletions(-) diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Character.h b/Code/Framework/AzFramework/AzFramework/Physics/Character.h index d6f67706f4..19a6cbfe03 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Character.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/Character.h @@ -78,7 +78,7 @@ namespace Physics float m_minimumMovementDistance = 0.001f; //!< To avoid jittering, the controller will not attempt to move distances below this. float m_maximumSpeed = 100.0f; //!< If the accumulated requested velocity for a tick exceeds this magnitude, it will be clamped. AZStd::string m_colliderTag; //!< Used to identify the collider associated with the character controller. - AZStd::shared_ptr m_shapeConfig = nullptr; //!< The shape to use when creating the character controller. + AZStd::shared_ptr m_shapeConfig; //!< The shape to use when creating the character controller. AZStd::vector> m_colliders; //!< The list of colliders to attach to the character controller. }; diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBody.h b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBody.h index d892e433bc..ed8a68dc24 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBody.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBody.h @@ -55,7 +55,7 @@ namespace AzPhysics //! Flag to determine if the body is part of the simulation. //! When true the body will be affected by any forces, collisions, and found with scene queries. - bool m_simulating = true; + bool m_simulating = false; //! Helper functions for setting user data. //! @param userData Can be a pointer to any type as internally will be cast to a void*. Object lifetime not managed by the SimulatedBody. diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.cpp b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.cpp index 0e29263e30..01bff3ccbb 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.cpp +++ b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.cpp @@ -46,6 +46,7 @@ namespace AzPhysics ->Field("orientation", &SimulatedBodyConfiguration::m_orientation) ->Field("scale", &SimulatedBodyConfiguration::m_scale) ->Field("entityId", &SimulatedBodyConfiguration::m_entityId) + ->Field("startSimulationEnabled", &SimulatedBodyConfiguration::m_startSimulationEnabled) ; } } diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.h b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.h index 203590adbb..6862bfccb8 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.h @@ -39,6 +39,7 @@ namespace AzPhysics AZ::Vector3 m_position = AZ::Vector3::CreateZero(); AZ::Quaternion m_orientation = AZ::Quaternion::CreateIdentity(); AZ::Vector3 m_scale = AZ::Vector3::CreateOne(); + bool m_startSimulationEnabled = true; // Entity/object association. AZ::EntityId m_entityId = AZ::EntityId(AZ::EntityId::InvalidEntityId); diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Ragdoll.cpp b/Code/Framework/AzFramework/AzFramework/Physics/Ragdoll.cpp index 02cd96ac00..f634360445 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Ragdoll.cpp +++ b/Code/Framework/AzFramework/AzFramework/Physics/Ragdoll.cpp @@ -52,6 +52,11 @@ namespace Physics } } + RagdollConfiguration::RagdollConfiguration() + { + m_startSimulationEnabled = false; //ragdolls do not start enabled. + } + void RagdollConfiguration::Reflect(AZ::ReflectContext* context) { AZ::SerializeContext* serializeContext = azrtti_cast(context); diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Ragdoll.h b/Code/Framework/AzFramework/AzFramework/Physics/Ragdoll.h index 3f98ca9303..239d93cf32 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Ragdoll.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/Ragdoll.h @@ -24,6 +24,8 @@ namespace Physics { + using ParentIndices = AZStd::vector; + class RagdollNodeConfiguration : public AzPhysics::RigidBodyConfiguration { @@ -46,7 +48,7 @@ namespace Physics AZ_RTTI(RagdollConfiguration, "{7C96D332-61D8-4C58-A2BF-707716D38D14}", AzPhysics::SimulatedBodyConfiguration); static void Reflect(AZ::ReflectContext* context); - RagdollConfiguration() = default; + RagdollConfiguration(); explicit RagdollConfiguration(const RagdollConfiguration& settings) = default; RagdollNodeConfiguration* FindNodeConfigByName(const AZStd::string& nodeName) const; @@ -56,6 +58,8 @@ namespace Physics AZStd::vector m_nodes; CharacterColliderConfiguration m_colliders; + RagdollState m_initialState; + ParentIndices m_parentIndices; }; /// Represents a single rigid part of a ragdoll. @@ -79,7 +83,7 @@ namespace Physics { public: AZ_CLASS_ALLOCATOR(Ragdoll, AZ::SystemAllocator, 0); - AZ_RTTI(Ragdoll, "{01F09602-80EC-4693-A0E7-C2719239044B}", AzPhysics::SimulatedBody); + AZ_RTTI(Physics::Ragdoll, "{01F09602-80EC-4693-A0E7-C2719239044B}", AzPhysics::SimulatedBody); virtual ~Ragdoll() = default; /// Inserts the ragdoll into the physics simulation. diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.cpp b/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.cpp index 6523238430..1c91818eb5 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.cpp +++ b/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.cpp @@ -167,19 +167,18 @@ namespace PhysX return aznew CharacterController(pxController, AZStd::move(callbackManager), scene->GetSceneHandle()); } - AZStd::unique_ptr CreateRagdoll(Physics::RagdollConfiguration& configuration, - const Physics::RagdollState& initialState, const ParentIndices& parentIndices, AzPhysics::SceneHandle sceneHandle) + Ragdoll* CreateRagdoll(Physics::RagdollConfiguration& configuration, AzPhysics::SceneHandle sceneHandle) { const size_t numNodes = configuration.m_nodes.size(); - if (numNodes != initialState.size()) + if (numNodes != configuration.m_initialState.size()) { AZ_Error("PhysX Ragdoll", false, "Mismatch between number of nodes in ragdoll configuration (%i) " - "and number of nodes in the initial ragdoll state (%i)", numNodes, initialState.size()); + "and number of nodes in the initial ragdoll state (%i)", numNodes, configuration.m_initialState.size()); return nullptr; } - AZStd::unique_ptr ragdoll = AZStd::make_unique(sceneHandle); - ragdoll->SetParentIndices(parentIndices); + Ragdoll* ragdoll = aznew Ragdoll(sceneHandle); + ragdoll->SetParentIndices(configuration.m_parentIndices); auto* sceneInterface = AZ::Interface::Get(); if (sceneInterface == nullptr) @@ -192,7 +191,7 @@ namespace PhysX for (size_t nodeIndex = 0; nodeIndex < numNodes; nodeIndex++) { Physics::RagdollNodeConfiguration& nodeConfig = configuration.m_nodes[nodeIndex]; - const Physics::RagdollNodeState& nodeState = initialState[nodeIndex]; + const Physics::RagdollNodeState& nodeState = configuration.m_initialState[nodeIndex]; Physics::CharacterColliderNodeConfiguration* colliderNodeConfig = configuration.m_colliders.FindNodeConfigByName(nodeConfig.m_debugName); if (colliderNodeConfig) @@ -212,22 +211,20 @@ namespace PhysX } nodeConfig.m_colliderAndShapeData = shapes; } + nodeConfig.m_startSimulationEnabled = false; + nodeConfig.m_position = nodeState.m_position; + nodeConfig.m_orientation = nodeState.m_orientation; - AzPhysics::SimulatedBodyHandle newBodyHandle = sceneInterface->AddSimulatedBody(sceneHandle, &nodeConfig); - if (newBodyHandle == AzPhysics::InvalidSimulatedBodyHandle) + AZStd::unique_ptr node = AZStd::make_unique(sceneHandle, nodeConfig); + if (node->GetRigidBodyHandle() != AzPhysics::InvalidSimulatedBodyHandle) + { + ragdoll->AddNode(AZStd::move(node)); + } + else { AZ_Error("PhysX Ragdoll", false, "Failed to create rigid body for ragdoll node %s", nodeConfig.m_debugName.c_str()); - return nullptr; + node.reset(); } - sceneInterface->DisableSimulationOfBody(sceneHandle, newBodyHandle); - auto* rigidBody = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, newBodyHandle)); - - physx::PxRigidDynamic* pxRigidDynamic = static_cast(rigidBody->GetNativePointer()); - physx::PxTransform transform(PxMathConvert(nodeState.m_position), PxMathConvert(nodeState.m_orientation)); - pxRigidDynamic->setGlobalPose(transform); - - AZStd::unique_ptr node = AZStd::make_unique(rigidBody, newBodyHandle); - ragdoll->AddNode(AZStd::move(node)); } // Set up joints. Needs a second pass because child nodes in the ragdoll config aren't guaranteed to have @@ -235,7 +232,7 @@ namespace PhysX size_t rootIndex = SIZE_MAX; for (size_t nodeIndex = 0; nodeIndex < numNodes; nodeIndex++) { - size_t parentIndex = parentIndices[nodeIndex]; + size_t parentIndex = configuration.m_parentIndices[nodeIndex]; if (parentIndex < numNodes) { physx::PxRigidDynamic* parentActor = ragdoll->GetPxRigidDynamic(parentIndex); diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.h b/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.h index 07aa4008d3..e919426457 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.h +++ b/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.h @@ -40,11 +40,8 @@ namespace PhysX //! Creates a ragdoll based on the specified setup and initial pose. //! @param configuration Information about collider geometry and joint setup required to initialize the ragdoll. - //! @param initialState Initial settings for the positions, orientations and velocities of the ragdoll nodes. - //! @param parentIndices Identifies the parent ragdoll node for each node in the ragdoll. //! @param sceneHandle A handle to the physics scene in which the ragdoll should be created. - AZStd::unique_ptr CreateRagdoll(Physics::RagdollConfiguration& configuration, - const Physics::RagdollState& initialState, const ParentIndices& parentIndices, AzPhysics::SceneHandle sceneHandle); + Ragdoll* CreateRagdoll(Physics::RagdollConfiguration& configuration, AzPhysics::SceneHandle sceneHandle); //! Creates a joint drive with properties based on the input values. //! The input values are validated and the damping ratio is used to calculate the damping value used internally. diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/API/Ragdoll.cpp b/Gems/PhysX/Code/Source/PhysXCharacters/API/Ragdoll.cpp index 72cb511e21..5249781e31 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/API/Ragdoll.cpp +++ b/Gems/PhysX/Code/Source/PhysXCharacters/API/Ragdoll.cpp @@ -45,7 +45,7 @@ namespace PhysX AZ::SerializeContext* serializeContext = azrtti_cast(context); if (serializeContext) { - serializeContext->Class() + serializeContext->Class() ->Version(1) ; } @@ -56,7 +56,7 @@ namespace PhysX m_nodes.push_back(AZStd::move(node)); } - void Ragdoll::SetParentIndices(const ParentIndices& parentIndices) + void Ragdoll::SetParentIndices(const Physics::ParentIndices& parentIndices) { m_parentIndices = parentIndices; } @@ -109,7 +109,6 @@ namespace PhysX this->ApplyQueuedDisableSimulation(); }) { - m_simulating = false; m_sceneOwner = sceneHandle; } @@ -117,14 +116,7 @@ namespace PhysX { m_sceneStartSimHandler.Disconnect(); - if (auto* sceneInterface = AZ::Interface::Get()) - { - const size_t numNodes = m_nodes.size(); - for (size_t nodeIndex = 0; nodeIndex < numNodes; nodeIndex++) - { - sceneInterface->RemoveSimulatedBody(m_sceneOwner, m_nodes[nodeIndex]->GetRigidBodyHandle()); - } - } + m_nodes.clear(); //the nodes destructor will remove the simulated body from the scene. } void Ragdoll::ApplyQueuedEnableSimulation() @@ -204,7 +196,6 @@ namespace PhysX sceneInterface->EnableSimulationOfBody(m_sceneOwner, m_nodes[nodeIndex]->GetRigidBodyHandle()); } - else { AZ_Error("PhysX Ragdoll", false, "Invalid PhysX actor for node index %i", nodeIndex); @@ -222,8 +213,7 @@ namespace PhysX } sceneInterface->RegisterSceneSimulationStartHandler(m_sceneOwner, m_sceneStartSimHandler); - - m_simulating = true; + sceneInterface->EnableSimulationOfBody(m_sceneOwner, m_bodyHandle); } void Ragdoll::EnableSimulationQueued(const Physics::RagdollState& initialState) @@ -276,7 +266,7 @@ namespace PhysX } } - m_simulating = false; + sceneInterface->DisableSimulationOfBody(m_sceneOwner, m_bodyHandle); } void Ragdoll::DisableSimulationQueued() diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/API/Ragdoll.h b/Gems/PhysX/Code/Source/PhysXCharacters/API/Ragdoll.h index 46bae6648b..7bf807bcc5 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/API/Ragdoll.h +++ b/Gems/PhysX/Code/Source/PhysXCharacters/API/Ragdoll.h @@ -19,8 +19,6 @@ namespace PhysX { - using ParentIndices = AZStd::vector; - /// PhysX specific implementation of generic physics API Ragdoll class. class Ragdoll : public Physics::Ragdoll @@ -29,7 +27,7 @@ namespace PhysX friend class RagdollComponent; AZ_CLASS_ALLOCATOR(Ragdoll, AZ::SystemAllocator, 0); - AZ_TYPE_INFO_LEGACY(PhysX::Ragdoll, "{55D477B5-B922-4D3E-89FE-7FB7B9FDD635}", Physics::Ragdoll); + AZ_RTTI(PhysX::Ragdoll, "{55D477B5-B922-4D3E-89FE-7FB7B9FDD635}", Physics::Ragdoll); static void Reflect(AZ::ReflectContext* context); Ragdoll() = default; @@ -38,7 +36,7 @@ namespace PhysX ~Ragdoll(); void AddNode(AZStd::unique_ptr node); - void SetParentIndices(const ParentIndices& parentIndices); + void SetParentIndices(const Physics::ParentIndices& parentIndices); void SetRootIndex(size_t nodeIndex); physx::PxRigidDynamic* GetPxRigidDynamic(size_t nodeIndex) const; physx::PxTransform GetRootPxTransform() const; @@ -75,7 +73,7 @@ namespace PhysX void ApplyQueuedDisableSimulation(); AZStd::vector> m_nodes; - ParentIndices m_parentIndices; + Physics::ParentIndices m_parentIndices; AZ::Outcome m_rootIndex = AZ::Failure(); /// Queued initial state for the ragdoll, for EnableSimulationQueued, to be applied prior to the world update. diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/API/RagdollNode.cpp b/Gems/PhysX/Code/Source/PhysXCharacters/API/RagdollNode.cpp index 63d62144f8..6e3b97212b 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/API/RagdollNode.cpp +++ b/Gems/PhysX/Code/Source/PhysXCharacters/API/RagdollNode.cpp @@ -12,6 +12,7 @@ #include #include +#include #include #include #include @@ -30,14 +31,14 @@ namespace PhysX } } - RagdollNode::RagdollNode(AzPhysics::RigidBody* rigidBody, AzPhysics::SimulatedBodyHandle rigidBodyHandle) - : m_rigidBody(rigidBody) - , m_rigidBodyHandle(rigidBodyHandle) + RagdollNode::RagdollNode(AzPhysics::SceneHandle sceneHandle, Physics::RagdollNodeConfiguration& nodeConfig) { - physx::PxRigidDynamic* pxRigidDynamic = static_cast(m_rigidBody->GetNativePointer()); - m_actorUserData = PhysX::ActorData(pxRigidDynamic); - m_actorUserData.SetRagdollNode(this); - m_actorUserData.SetEntityId(m_rigidBody->GetEntityId()); + CreatePhysicsBody(sceneHandle, nodeConfig); + } + + RagdollNode::~RagdollNode() + { + DestroyPhysicsBody(); } void RagdollNode::SetJoint(const AZStd::shared_ptr& joint) @@ -124,4 +125,47 @@ namespace PhysX { return m_rigidBodyHandle; } + + void RagdollNode::CreatePhysicsBody(AzPhysics::SceneHandle sceneHandle, Physics::RagdollNodeConfiguration& nodeConfig) + { + if (auto* sceneInterface = AZ::Interface::Get()) + { + m_rigidBodyHandle = sceneInterface->AddSimulatedBody(sceneHandle, &nodeConfig); + if (m_rigidBodyHandle == AzPhysics::InvalidSimulatedBodyHandle) + { + AZ_Error("PhysX RagdollNode", false, "Failed to create rigid body for ragdoll node %s", nodeConfig.m_debugName.c_str()); + return; + } + m_rigidBody = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, m_rigidBodyHandle)); + } + if (m_rigidBody == nullptr) + { + AZ_Error("PhysX RagdollNode", false, "Failed to create rigid body for ragdoll node %s", nodeConfig.m_debugName.c_str()); + return; + } + m_sceneOwner = sceneHandle; + + physx::PxRigidDynamic* pxRigidDynamic = static_cast(m_rigidBody->GetNativePointer()); + physx::PxTransform transform(PxMathConvert(nodeConfig.m_position), PxMathConvert(nodeConfig.m_orientation)); + pxRigidDynamic->setGlobalPose(transform); + + m_actorUserData = PhysX::ActorData(pxRigidDynamic); + m_actorUserData.SetRagdollNode(this); + m_actorUserData.SetEntityId(m_rigidBody->GetEntityId()); + } + + void RagdollNode::DestroyPhysicsBody() + { + if (m_rigidBody != nullptr) + { + if (auto* sceneInterface = AZ::Interface::Get()) + { + sceneInterface->RemoveSimulatedBody(m_sceneOwner, m_rigidBodyHandle); + } + m_rigidBody = nullptr; + m_rigidBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; + m_sceneOwner = AzPhysics::InvalidSceneHandle; + } + } + } // namespace PhysX diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/API/RagdollNode.h b/Gems/PhysX/Code/Source/PhysXCharacters/API/RagdollNode.h index c23930e25e..0567723c01 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/API/RagdollNode.h +++ b/Gems/PhysX/Code/Source/PhysXCharacters/API/RagdollNode.h @@ -29,8 +29,8 @@ namespace PhysX static void Reflect(AZ::ReflectContext* context); RagdollNode() = default; - explicit RagdollNode(AzPhysics::RigidBody* rigidBody, AzPhysics::SimulatedBodyHandle rigidBodyHandle); - ~RagdollNode() = default; + explicit RagdollNode(AzPhysics::SceneHandle sceneHandle, Physics::RagdollNodeConfiguration& nodeConfig); + ~RagdollNode(); void SetJoint(const AZStd::shared_ptr& joint); @@ -58,9 +58,13 @@ namespace PhysX AzPhysics::SimulatedBodyHandle GetRigidBodyHandle() const; private: + void CreatePhysicsBody(AzPhysics::SceneHandle sceneHandle, Physics::RagdollNodeConfiguration& nodeConfig); + void DestroyPhysicsBody(); + AZStd::shared_ptr m_joint; AzPhysics::RigidBody* m_rigidBody; AzPhysics::SimulatedBodyHandle m_rigidBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; + AzPhysics::SceneHandle m_sceneOwner = AzPhysics::InvalidSceneHandle; PhysX::ActorData m_actorUserData; }; } // namespace PhysX diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterControllerComponent.cpp b/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterControllerComponent.cpp index 26ef5f0032..ca02554036 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterControllerComponent.cpp +++ b/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterControllerComponent.cpp @@ -412,7 +412,6 @@ namespace PhysX AZ::TransformBus::EventResult(entityTranslation, GetEntityId(), &AZ::TransformBus::Events::GetWorldTranslation); m_characterConfig->m_position = entityTranslation; - AZ_Assert(m_controller == nullptr, "Calling create CharacterControllerComponent::CreateController() with an already created controller."); if (auto* sceneInterface = AZ::Interface::Get()) { AzPhysics::SimulatedBodyHandle bodyHandle = sceneInterface->AddSimulatedBody(defaultSceneHandle, m_characterConfig.get()); @@ -451,8 +450,8 @@ namespace PhysX if (auto* sceneInterface = AZ::Interface::Get()) { sceneInterface->RemoveSimulatedBody(m_controller->m_sceneOwner, m_controller->m_bodyHandle); - m_controller = nullptr; } + m_controller = nullptr; m_preSimulateHandler.Disconnect(); diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/Components/RagdollComponent.cpp b/Gems/PhysX/Code/Source/PhysXCharacters/Components/RagdollComponent.cpp index 56627ff7b9..d120e3d6b0 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/Components/RagdollComponent.cpp +++ b/Gems/PhysX/Code/Source/PhysXCharacters/Components/RagdollComponent.cpp @@ -55,6 +55,16 @@ namespace PhysX } } + if (classElement.GetVersion() < 3) + { + int ragdollElementIndex = classElement.FindElement(AZ_CRC_CE("PhysXRagdoll")); + + if (ragdollElementIndex >= 0) + { + classElement.RemoveElement(ragdollElementIndex); + } + } + return true; } @@ -66,8 +76,7 @@ namespace PhysX if (serializeContext) { serializeContext->Class() - ->Version(2, &VersionConverter) - ->Field("PhysXRagdoll", &RagdollComponent::m_ragdoll) + ->Version(3, &VersionConverter) ->Field("PositionIterations", &RagdollComponent::m_positionIterations) ->Field("VelocityIterations", &RagdollComponent::m_velocityIterations) ->Field("EnableJointProjection", &RagdollComponent::m_enableJointProjection) @@ -187,7 +196,7 @@ namespace PhysX Physics::Ragdoll* RagdollComponent::GetRagdoll() { - return m_ragdoll.get(); + return m_ragdoll; } void RagdollComponent::GetState(Physics::RagdollState& ragdollState) const @@ -250,7 +259,7 @@ namespace PhysX AzPhysics::SimulatedBody* RagdollComponent::GetWorldBody() { - return m_ragdoll.get(); + return GetRagdoll(); } AzPhysics::SceneQueryHit RagdollComponent::RayCast(const AzPhysics::RayCastRequest& request) @@ -283,8 +292,8 @@ namespace PhysX return; } - ParentIndices parentIndices; - parentIndices.resize(numNodes); + + ragdollConfiguration.m_parentIndices.resize(numNodes); for (size_t nodeIndex = 0; nodeIndex < numNodes; nodeIndex++) { AZStd::string parentName; @@ -292,7 +301,7 @@ namespace PhysX AzFramework::CharacterPhysicsDataRequestBus::EventResult(parentName, GetEntityId(), &AzFramework::CharacterPhysicsDataRequests::GetParentNodeName, nodeName); AZ::Outcome parentIndex = Utils::Characters::GetNodeIndex(ragdollConfiguration, parentName); - parentIndices[nodeIndex] = parentIndex ? parentIndex.GetValue() : SIZE_MAX; + ragdollConfiguration.m_parentIndices[nodeIndex] = parentIndex ? parentIndex.GetValue() : SIZE_MAX; ragdollConfiguration.m_nodes[nodeIndex].m_entityId = GetEntityId(); } @@ -303,12 +312,17 @@ namespace PhysX AZ::Transform entityTransform = AZ::Transform::CreateIdentity(); AZ::TransformBus::EventResult(entityTransform, GetEntityId(), &AZ::TransformBus::Events::GetWorldTM); - Physics::RagdollState bindPoseWorld = GetBindPoseWorld(bindPose, entityTransform); + ragdollConfiguration.m_initialState = GetBindPoseWorld(bindPose, entityTransform); AzPhysics::SceneHandle defaultSceneHandle = AzPhysics::InvalidSceneHandle; Physics::DefaultWorldBus::BroadcastResult(defaultSceneHandle, &Physics::DefaultWorldRequests::GetDefaultSceneHandle); - m_ragdoll = Utils::Characters::CreateRagdoll(ragdollConfiguration, bindPoseWorld, parentIndices, defaultSceneHandle); - if (!m_ragdoll) + + if (auto* sceneInterface = AZ::Interface::Get()) + { + AzPhysics::SimulatedBodyHandle bodyHandle = sceneInterface->AddSimulatedBody(defaultSceneHandle, &ragdollConfiguration); + m_ragdoll = azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(defaultSceneHandle, bodyHandle)); + } + if (m_ragdoll == nullptr) { AZ_Error("PhysX Ragdoll Component", false, "Failed to create ragdoll."); return; @@ -358,7 +372,11 @@ namespace PhysX AzFramework::RagdollPhysicsNotificationBus::Event(GetEntityId(), &AzFramework::RagdollPhysicsNotifications::OnRagdollDeactivated); - m_ragdoll.reset(); + if (auto* sceneInterface = AZ::Interface::Get()) + { + sceneInterface->RemoveSimulatedBody(m_ragdoll->m_sceneOwner, m_ragdoll->m_bodyHandle); + } + m_ragdoll = nullptr; } } diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/Components/RagdollComponent.h b/Gems/PhysX/Code/Source/PhysXCharacters/Components/RagdollComponent.h index 77a4c992a3..1b616dda79 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/Components/RagdollComponent.h +++ b/Gems/PhysX/Code/Source/PhysXCharacters/Components/RagdollComponent.h @@ -32,7 +32,7 @@ namespace PhysX , public AzFramework::CharacterPhysicsDataNotificationBus::Handler { public: - AZ_COMPONENT(RagdollComponent, "{B89498F8-4718-42FE-A457-A377DD0D61A0}"); + AZ_COMPONENT(PhysX::RagdollComponent, "{B89498F8-4718-42FE-A457-A377DD0D61A0}"); static void Reflect(AZ::ReflectContext* context); @@ -105,7 +105,7 @@ namespace PhysX bool IsJointProjectionVisible(); - AZStd::unique_ptr m_ragdoll; + Ragdoll* m_ragdoll; /// Minimum number of position iterations to perform in the PhysX solver. /// Lower iteration counts are less expensive but may behave less realistically. AZ::u32 m_positionIterations = 16; diff --git a/Gems/PhysX/Code/Source/Scene/PhysXScene.cpp b/Gems/PhysX/Code/Source/Scene/PhysXScene.cpp index 1e6eee774e..03bbac9fd4 100644 --- a/Gems/PhysX/Code/Source/Scene/PhysXScene.cpp +++ b/Gems/PhysX/Code/Source/Scene/PhysXScene.cpp @@ -209,6 +209,13 @@ namespace PhysX return controller; } + AzPhysics::SimulatedBody* CreateRagdollBody(PhysXScene* scene, + const Physics::RagdollConfiguration* ragdollConfig) + { + return Utils::Characters::CreateRagdoll(const_cast(*ragdollConfig), + scene->GetSceneHandle()); + } + //helper to perform a ray cast AzPhysics::SceneQueryHits RayCast(const AzPhysics::RayCastRequest* raycastRequest, AZStd::vector& raycastBuffer, @@ -622,6 +629,15 @@ namespace PhysX { newBody = Internal::CreateCharacterBody(this, azdynamic_cast(simulatedBodyConfig)); } + else if (azrtti_istypeof(simulatedBodyConfig)) + { + newBody = Internal::CreateRagdollBody(this, azdynamic_cast(simulatedBodyConfig)); + } + else + { + AZ_Warning("PhysXScene", false, "Unknown SimulatedBodyConfiguration."); + return AzPhysics::InvalidSimulatedBodyHandle; + } if (newBody != nullptr) { @@ -648,8 +664,11 @@ namespace PhysX newBody->m_bodyHandle = newBodyHandle; m_simulatedBodyAddedEvent.Signal(m_sceneHandle, newBodyHandle); - // Enable simulation by default (not signaling OnSimulationBodySimulationEnabled event) - EnableSimulationOfBodyInternal(*newBody); + // Enable simulation by default (not signaling OnSimulationBodySimulationEnabled event) + if (simulatedBodyConfig->m_startSimulationEnabled) + { + EnableSimulationOfBodyInternal(*newBody); + } return newBodyHandle; } @@ -878,7 +897,8 @@ namespace PhysX void PhysXScene::EnableSimulationOfBodyInternal(AzPhysics::SimulatedBody& body) { //character controller is a special actor and only needs the m_simulating flag set, - if (!azrtti_istypeof(body)) + if (!azrtti_istypeof(body) && + !azrtti_istypeof(body)) { auto pxActor = static_cast(body.GetNativePointer()); AZ_Assert(pxActor, "Simulated Body doesn't have a valid physx actor"); @@ -904,7 +924,8 @@ namespace PhysX void PhysXScene::DisableSimulationOfBodyInternal(AzPhysics::SimulatedBody& body) { //character controller is a special actor and only needs the m_simulating flag set, - if (!azrtti_istypeof(body)) + if (!azrtti_istypeof(body) && + !azrtti_istypeof(body)) { auto pxActor = static_cast(body.GetNativePointer()); AZ_Assert(pxActor, "Simulated Body doesn't have a valid physx actor"); @@ -948,11 +969,14 @@ namespace PhysX void PhysXScene::ClearDeferedDeletions() { - for (auto& simulatedBody : m_deferredDeletions) + // swap the deletions in case the simulated body + // manages more bodies and removes them on destruction (ie. Ragdoll). + AZStd::vector deletions; + deletions.swap(m_deferredDeletions); + for (auto* simulatedBody : deletions) { delete simulatedBody; } - m_deferredDeletions.clear(); } void PhysXScene::ProcessTriggerEvents() diff --git a/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersRagdollBenchmarks.cpp b/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersRagdollBenchmarks.cpp index 149dfac30b..4f905342be 100644 --- a/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersRagdollBenchmarks.cpp +++ b/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersRagdollBenchmarks.cpp @@ -125,19 +125,24 @@ namespace PhysX::Benchmarks return GetTPose(AZ::Vector3::CreateZero(), simulationType); } - AZStd::unique_ptr CreateRagdoll(AzPhysics::SceneHandle sceneHandle) + PhysX::Ragdoll* CreateRagdoll(AzPhysics::SceneHandle sceneHandle) { Physics::RagdollConfiguration* configuration = AZ::Utils::LoadObjectFromFile(AZ::Test::GetEngineRootPath() + "/Gems/PhysX/Code/Tests/RagdollConfiguration.xml"); - Physics::RagdollState initialState = GetTPose(); - PhysX::ParentIndices parentIndices; + configuration->m_initialState = GetTPose(); + configuration->m_parentIndices.reserve(configuration->m_nodes.size()); for (int i = 0; i < configuration->m_nodes.size(); i++) { - parentIndices.push_back(RagdollTestData::ParentIndices[i]); + configuration->m_parentIndices.push_back(RagdollTestData::ParentIndices[i]); } - return PhysX::Utils::Characters::CreateRagdoll(*configuration, initialState, parentIndices, sceneHandle); + if (auto* sceneInterface = AZ::Interface::Get()) + { + AzPhysics::SimulatedBodyHandle bodyHandle = sceneInterface->AddSimulatedBody(sceneHandle, configuration); + return azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, bodyHandle)); + } + return nullptr; } //! BM_Ragdoll_AtRest - This test just spawns the requested number of ragdolls and places them near the terrain @@ -148,7 +153,7 @@ namespace PhysX::Benchmarks const int numRagdolls = static_cast(state.range(0)); //create ragdolls - AZStd::vector> ragdolls; + AZStd::vector ragdolls; ragdolls.reserve(numRagdolls); for (int i = 0; i < numRagdolls; i++) { @@ -218,7 +223,7 @@ namespace PhysX::Benchmarks washingMachineCentre, RagdollConstants::WashingMachine::BladeRPM); //create ragdolls - AZStd::vector> ragdolls; + AZStd::vector ragdolls; ragdolls.reserve(numRagdolls); for (int i = 0; i < numRagdolls; i++) { diff --git a/Gems/PhysX/Code/Tests/RagdollTests.cpp b/Gems/PhysX/Code/Tests/RagdollTests.cpp index 8e3bdc69c3..ec803c1707 100644 --- a/Gems/PhysX/Code/Tests/RagdollTests.cpp +++ b/Gems/PhysX/Code/Tests/RagdollTests.cpp @@ -37,7 +37,7 @@ namespace PhysX - + )DELIMITER"; @@ -63,19 +63,24 @@ namespace PhysX return ragdollState; } - AZStd::unique_ptr CreateRagdoll(AzPhysics::SceneHandle sceneHandle) + Ragdoll* CreateRagdoll(AzPhysics::SceneHandle sceneHandle) { Physics::RagdollConfiguration* configuration = AZ::Utils::LoadObjectFromFile(AZ::Test::GetCurrentExecutablePath() + "/Test.Assets/Gems/PhysX/Code/Tests/RagdollConfiguration.xml"); - Physics::RagdollState initialState = GetTPose(); - ParentIndices parentIndices; + configuration->m_initialState = GetTPose(); + configuration->m_parentIndices.reserve(configuration->m_nodes.size()); for (int i = 0; i < configuration->m_nodes.size(); i++) { - parentIndices.push_back(RagdollTestData::ParentIndices[i]); + configuration->m_parentIndices.push_back(RagdollTestData::ParentIndices[i]); } - return Utils::Characters::CreateRagdoll(*configuration, initialState, parentIndices, sceneHandle); + if (auto* sceneInterface = AZ::Interface::Get()) + { + AzPhysics::SimulatedBodyHandle bodyHandle = sceneInterface->AddSimulatedBody(sceneHandle, configuration); + return azdynamic_cast(sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, bodyHandle)); + } + return nullptr; } #if AZ_TRAIT_DISABLE_FAILED_PHYSICS_TESTS From 8f265f2d3bbdd5ae3a7ffb7dfb473b2284a01798 Mon Sep 17 00:00:00 2001 From: amzn-sean <75276488+amzn-sean@users.noreply.github.com> Date: Thu, 22 Apr 2021 15:19:41 +0100 Subject: [PATCH 05/30] fixed failing tests --- .../collision_events_script.scriptcanvas | 7664 +++++++++-------- .../onpostphysicsupdate.scriptcanvas | 3241 +++---- .../ontick.scriptcanvas | 2572 +++--- ...tCanvas_ShapeCastVerification.scriptcanvas | 1373 +-- ..._ScriptCanvas_PostUpdateEvent.scriptcanvas | 2048 ++--- ...7_ScriptCanvas_PreUpdateEvent.scriptcanvas | 1781 ++-- 6 files changed, 9491 insertions(+), 9188 deletions(-) diff --git a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas b/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas index a422f072a5..34e80f3ccd 100644 --- a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas +++ b/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas @@ -3,7 +3,7 @@ - + @@ -16,21 +16,21 @@ - + - + - + - + - + @@ -39,23 +39,9 @@ - - - - - - - - - - - - - - - - + + @@ -76,12 +62,13 @@ + - + @@ -91,45 +78,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -150,12 +100,13 @@ + - + @@ -165,8 +116,8 @@ - - + + @@ -187,123 +138,13 @@ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -317,22 +158,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + - - - - + @@ -354,52 +258,256 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - - - + + - + - - - - - - - - - + + + + + + + - - - + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + @@ -408,7 +516,375 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -441,7 +917,7 @@ - + @@ -468,6 +944,7 @@ + @@ -505,6 +982,7 @@ + @@ -542,6 +1020,7 @@ + @@ -579,6 +1058,7 @@ + @@ -616,6 +1096,7 @@ + @@ -653,6 +1134,7 @@ + @@ -690,6 +1172,7 @@ + @@ -719,7 +1202,7 @@ - + @@ -746,6 +1229,7 @@ + @@ -800,1929 +1284,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -2755,7 +1317,7 @@ - + @@ -2782,6 +1344,7 @@ + @@ -2819,6 +1382,7 @@ + @@ -2856,6 +1420,7 @@ + @@ -2893,6 +1458,7 @@ + @@ -2930,6 +1496,7 @@ + @@ -2967,6 +1534,7 @@ + @@ -3004,6 +1572,7 @@ + @@ -3033,7 +1602,7 @@ - + @@ -3060,6 +1629,7 @@ + @@ -3114,530 +1684,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -3683,6 +1730,7 @@ + @@ -3720,6 +1768,7 @@ + @@ -3757,6 +1806,7 @@ + @@ -3794,6 +1844,7 @@ + @@ -3831,6 +1882,7 @@ + @@ -3873,6 +1925,7 @@ + @@ -3910,6 +1963,7 @@ + @@ -3947,6 +2001,7 @@ + @@ -3984,6 +2039,7 @@ + @@ -4021,6 +2077,7 @@ + @@ -4103,21 +2160,212 @@ - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4154,12 +2402,13 @@ + - + @@ -4191,12 +2440,13 @@ + - + @@ -4228,43 +2478,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -4285,16 +2499,16 @@ - - - + + + - + @@ -4302,7 +2516,7 @@ - + @@ -4348,6 +2562,7 @@ + @@ -4385,6 +2600,7 @@ + @@ -4427,6 +2643,7 @@ + @@ -4464,6 +2681,7 @@ + @@ -4492,21 +2710,389 @@ - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4538,12 +3124,13 @@ + - + @@ -4575,12 +3162,13 @@ + - + @@ -4612,16 +3200,17 @@ + - + - + @@ -4631,7 +3220,307 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4682,6 +3571,7 @@ + @@ -4719,6 +3609,7 @@ + @@ -4756,6 +3647,7 @@ + @@ -4793,7 +3685,1212 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4839,6 +4936,7 @@ + @@ -4876,6 +4974,7 @@ + @@ -4918,6 +5017,7 @@ + @@ -4955,6 +5055,7 @@ + @@ -4985,7 +5086,7 @@ - + @@ -4995,7 +5096,7 @@ - + @@ -5003,7 +5104,7 @@ - + @@ -5016,7 +5117,7 @@ - + @@ -5026,7 +5127,7 @@ - + @@ -5034,7 +5135,7 @@ - + @@ -5047,7 +5148,7 @@ - + @@ -5057,7 +5158,7 @@ - + @@ -5065,7 +5166,7 @@ - + @@ -5078,7 +5179,7 @@ - + @@ -5088,7 +5189,7 @@ - + @@ -5096,7 +5197,7 @@ - + @@ -5109,7 +5210,7 @@ - + @@ -5119,7 +5220,7 @@ - + @@ -5127,7 +5228,7 @@ - + @@ -5140,7 +5241,7 @@ - + @@ -5150,7 +5251,7 @@ - + @@ -5158,7 +5259,7 @@ - + @@ -5171,7 +5272,7 @@ - + @@ -5181,7 +5282,7 @@ - + @@ -5189,7 +5290,7 @@ - + @@ -5202,7 +5303,7 @@ - + @@ -5212,7 +5313,7 @@ - + @@ -5220,7 +5321,7 @@ - + @@ -5233,7 +5334,7 @@ - + @@ -5243,7 +5344,7 @@ - + @@ -5251,7 +5352,7 @@ - + @@ -5264,7 +5365,7 @@ - + @@ -5274,7 +5375,7 @@ - + @@ -5282,7 +5383,7 @@ - + @@ -5295,7 +5396,7 @@ - + @@ -5305,7 +5406,7 @@ - + @@ -5313,7 +5414,7 @@ - + @@ -5326,7 +5427,7 @@ - + @@ -5336,7 +5437,7 @@ - + @@ -5344,7 +5445,7 @@ - + @@ -5357,7 +5458,7 @@ - + @@ -5367,7 +5468,7 @@ - + @@ -5375,7 +5476,7 @@ - + @@ -5388,7 +5489,7 @@ - + @@ -5398,7 +5499,7 @@ - + @@ -5406,7 +5507,7 @@ - + @@ -5419,7 +5520,7 @@ - + @@ -5429,7 +5530,7 @@ - + @@ -5437,7 +5538,7 @@ - + @@ -5450,7 +5551,7 @@ - + @@ -5460,7 +5561,7 @@ - + @@ -5468,7 +5569,7 @@ - + @@ -5481,7 +5582,7 @@ - + @@ -5491,7 +5592,7 @@ - + @@ -5499,7 +5600,7 @@ - + @@ -5512,7 +5613,7 @@ - + @@ -5522,7 +5623,7 @@ - + @@ -5530,7 +5631,7 @@ - + @@ -5543,7 +5644,7 @@ - + @@ -5553,7 +5654,7 @@ - + @@ -5561,7 +5662,7 @@ - + @@ -5574,7 +5675,7 @@ - + @@ -5584,7 +5685,7 @@ - + @@ -5592,7 +5693,7 @@ - + @@ -5605,7 +5706,7 @@ - + @@ -5615,7 +5716,7 @@ - + @@ -5623,7 +5724,7 @@ - + @@ -5636,7 +5737,7 @@ - + @@ -5646,7 +5747,7 @@ - + @@ -5654,7 +5755,7 @@ - + @@ -5667,7 +5768,7 @@ - + @@ -5677,7 +5778,7 @@ - + @@ -5685,7 +5786,7 @@ - + @@ -5698,7 +5799,7 @@ - + @@ -5708,7 +5809,7 @@ - + @@ -5716,7 +5817,7 @@ - + @@ -5729,7 +5830,7 @@ - + @@ -5739,7 +5840,7 @@ - + @@ -5747,7 +5848,7 @@ - + @@ -5760,7 +5861,7 @@ - + @@ -5770,7 +5871,7 @@ - + @@ -5778,7 +5879,7 @@ - + @@ -5791,7 +5892,7 @@ - + @@ -5801,7 +5902,7 @@ - + @@ -5809,7 +5910,7 @@ - + @@ -5822,7 +5923,7 @@ - + @@ -5832,7 +5933,7 @@ - + @@ -5840,7 +5941,7 @@ - + @@ -5853,7 +5954,7 @@ - + @@ -5863,7 +5964,7 @@ - + @@ -5871,7 +5972,7 @@ - + @@ -5884,7 +5985,7 @@ - + @@ -5894,7 +5995,7 @@ - + @@ -5902,7 +6003,7 @@ - + @@ -5915,7 +6016,7 @@ - + @@ -5925,7 +6026,7 @@ - + @@ -5933,7 +6034,7 @@ - + @@ -5946,7 +6047,7 @@ - + @@ -5956,7 +6057,7 @@ - + @@ -5964,7 +6065,7 @@ - + @@ -5977,7 +6078,7 @@ - + @@ -5987,7 +6088,7 @@ - + @@ -5995,7 +6096,7 @@ - + @@ -6008,7 +6109,7 @@ - + @@ -6018,7 +6119,7 @@ - + @@ -6026,7 +6127,7 @@ - + @@ -6039,7 +6140,7 @@ - + @@ -6049,7 +6150,7 @@ - + @@ -6057,7 +6158,7 @@ - + @@ -6070,7 +6171,7 @@ - + @@ -6080,7 +6181,7 @@ - + @@ -6088,7 +6189,7 @@ - + @@ -6101,7 +6202,7 @@ - + @@ -6111,7 +6212,7 @@ - + @@ -6119,7 +6220,7 @@ - + @@ -6132,7 +6233,7 @@ - + @@ -6142,7 +6243,7 @@ - + @@ -6150,7 +6251,7 @@ - + @@ -6163,7 +6264,7 @@ - + @@ -6173,7 +6274,7 @@ - + @@ -6181,7 +6282,7 @@ - + @@ -6194,7 +6295,7 @@ - + @@ -6204,7 +6305,7 @@ - + @@ -6212,7 +6313,7 @@ - + @@ -6225,7 +6326,7 @@ - + @@ -6235,7 +6336,7 @@ - + @@ -6243,7 +6344,7 @@ - + @@ -6256,7 +6357,7 @@ - + @@ -6266,7 +6367,7 @@ - + @@ -6274,7 +6375,7 @@ - + @@ -6287,7 +6388,7 @@ - + @@ -6297,7 +6398,7 @@ - + @@ -6305,7 +6406,7 @@ - + @@ -6318,7 +6419,7 @@ - + @@ -6328,7 +6429,7 @@ - + @@ -6336,7 +6437,7 @@ - + @@ -6349,7 +6450,7 @@ - + @@ -6359,7 +6460,7 @@ - + @@ -6367,7 +6468,7 @@ - + @@ -6386,7 +6487,7 @@ - + @@ -6394,7 +6495,7 @@ - + @@ -6402,334 +6503,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -6740,10 +6514,22 @@ - - + + - + + + + + + + + + + + + + @@ -6751,7 +6537,49 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -6761,6 +6589,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -6769,12 +6731,26 @@ - - - - + + + + + + + + + + + + + + + + + + @@ -6793,151 +6769,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -6947,56 +6783,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -7008,301 +6794,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -7310,61 +6802,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -7375,10 +6813,22 @@ - - + + - + + + + + + + + + + + + + @@ -7386,7 +6836,133 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -7399,14 +6975,254 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -7416,6 +7232,265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -7423,6 +7498,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -7430,6 +7531,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -7446,38 +7579,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -7497,7 +7598,7 @@ - + @@ -7524,14 +7625,15 @@ - + + - + @@ -7558,14 +7660,15 @@ - + + - + @@ -7592,7 +7695,8 @@ - + + diff --git a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/onpostphysicsupdate.scriptcanvas b/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/onpostphysicsupdate.scriptcanvas index 88e3333298..f4ca23b882 100644 --- a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/onpostphysicsupdate.scriptcanvas +++ b/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/onpostphysicsupdate.scriptcanvas @@ -3,7 +3,7 @@ - + @@ -16,1135 +16,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -1190,6 +62,7 @@ + @@ -1227,6 +100,7 @@ + @@ -1264,6 +138,7 @@ + @@ -1301,6 +176,7 @@ + @@ -1338,6 +214,7 @@ + @@ -1375,6 +252,7 @@ + @@ -1425,111 +303,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -1576,6 +350,7 @@ + @@ -1613,6 +388,7 @@ + @@ -1633,7 +409,657 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1679,6 +1105,7 @@ + @@ -1716,6 +1143,7 @@ + @@ -1753,6 +1181,7 @@ + @@ -1790,6 +1219,7 @@ + @@ -1827,6 +1257,7 @@ + @@ -1869,6 +1300,7 @@ + @@ -1906,6 +1338,7 @@ + @@ -1943,6 +1376,7 @@ + @@ -1980,6 +1414,7 @@ + @@ -2017,6 +1452,7 @@ + @@ -2094,12 +1530,12 @@ - + - + @@ -2145,6 +1581,7 @@ + @@ -2182,6 +1619,7 @@ + @@ -2224,6 +1662,7 @@ + @@ -2261,6 +1700,7 @@ + @@ -2298,6 +1738,7 @@ + @@ -2335,6 +1776,7 @@ + @@ -2372,6 +1814,7 @@ + @@ -2436,11 +1879,618 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -2450,7 +2500,7 @@ - + @@ -2458,7 +2508,7 @@ - + @@ -2471,7 +2521,7 @@ - + @@ -2481,7 +2531,7 @@ - + @@ -2489,7 +2539,7 @@ - + @@ -2502,7 +2552,7 @@ - + @@ -2512,7 +2562,7 @@ - + @@ -2520,7 +2570,7 @@ - + @@ -2533,7 +2583,7 @@ - + @@ -2543,7 +2593,7 @@ - + @@ -2551,7 +2601,7 @@ - + @@ -2564,7 +2614,7 @@ - + @@ -2574,7 +2624,7 @@ - + @@ -2582,7 +2632,7 @@ - + @@ -2595,7 +2645,7 @@ - + @@ -2605,7 +2655,7 @@ - + @@ -2613,7 +2663,7 @@ - + @@ -2626,7 +2676,7 @@ - + @@ -2636,7 +2686,7 @@ - + @@ -2644,7 +2694,7 @@ - + @@ -2657,7 +2707,7 @@ - + @@ -2667,7 +2717,7 @@ - + @@ -2675,7 +2725,7 @@ - + @@ -2688,7 +2738,7 @@ - + @@ -2698,7 +2748,7 @@ - + @@ -2706,7 +2756,7 @@ - + @@ -2719,7 +2769,7 @@ - + @@ -2729,7 +2779,7 @@ - + @@ -2737,7 +2787,7 @@ - + @@ -2750,7 +2800,7 @@ - + @@ -2760,7 +2810,7 @@ - + @@ -2768,7 +2818,7 @@ - + @@ -2781,7 +2831,7 @@ - + @@ -2791,7 +2841,7 @@ - + @@ -2799,7 +2849,7 @@ - + @@ -2812,7 +2862,7 @@ - + @@ -2822,7 +2872,7 @@ - + @@ -2830,7 +2880,7 @@ - + @@ -2843,7 +2893,7 @@ - + @@ -2853,7 +2903,7 @@ - + @@ -2861,7 +2911,7 @@ - + @@ -2880,7 +2930,7 @@ - + @@ -2888,188 +2938,41 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -3077,94 +2980,30 @@ - + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -3180,27 +3019,7 @@ - - - - - - - - - - - - - - - - - - - - - + @@ -3208,22 +3027,20 @@ - + - - - - + + + - - - - + + + @@ -3234,15 +3051,17 @@ - - - + + + + - - - + + + + @@ -3250,22 +3069,167 @@ - + - - + + + + + + + + + + + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3276,15 +3240,17 @@ - - - + + + + - - - + + + + @@ -3292,43 +3258,127 @@ - + - - - - + + + - - - - + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3365,7 +3415,27 @@ - + + + + + + + + + + + + + + + + + + + + + @@ -3377,27 +3447,7 @@ - - - - - - - - - - - - - - - - - - - - - + @@ -3415,7 +3465,7 @@ - + @@ -3441,6 +3491,7 @@ + diff --git a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/ontick.scriptcanvas b/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/ontick.scriptcanvas index f49edd0f46..65f10d4f81 100644 --- a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/ontick.scriptcanvas +++ b/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/ontick.scriptcanvas @@ -3,7 +3,7 @@ - + @@ -16,295 +16,105 @@ - + - + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - @@ -312,21 +122,21 @@ - + - + - + - + - + @@ -337,7 +147,7 @@ - + @@ -358,12 +168,13 @@ + - + @@ -374,7 +185,7 @@ - + @@ -395,12 +206,56 @@ + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -432,12 +287,13 @@ + - + @@ -469,12 +325,13 @@ + - + @@ -506,12 +363,13 @@ + - + @@ -543,21 +401,38 @@ + + + + + + + + + + + + + + + - + + + - + - + @@ -567,7 +442,7 @@ - + @@ -577,7 +452,7 @@ - + @@ -593,7 +468,304 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -639,6 +811,7 @@ + @@ -676,6 +849,7 @@ + @@ -713,6 +887,7 @@ + @@ -750,6 +925,7 @@ + @@ -787,6 +963,7 @@ + @@ -824,6 +1001,7 @@ + @@ -861,6 +1039,7 @@ + @@ -898,6 +1077,7 @@ + @@ -940,6 +1120,7 @@ + @@ -977,6 +1158,7 @@ + @@ -1056,102 +1238,285 @@ - + - + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - @@ -1160,7 +1525,309 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1211,6 +1878,7 @@ + @@ -1248,6 +1916,7 @@ + @@ -1285,6 +1954,7 @@ + @@ -1322,6 +1992,7 @@ + @@ -1357,641 +2028,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -2001,7 +2042,7 @@ - + @@ -2009,7 +2050,7 @@ - + @@ -2022,7 +2063,7 @@ - + @@ -2032,7 +2073,7 @@ - + @@ -2040,7 +2081,7 @@ - + @@ -2053,7 +2094,7 @@ - + @@ -2063,7 +2104,7 @@ - + @@ -2071,7 +2112,7 @@ - + @@ -2084,7 +2125,7 @@ - + @@ -2094,7 +2135,7 @@ - + @@ -2102,7 +2143,7 @@ - + @@ -2115,7 +2156,7 @@ - + @@ -2125,7 +2166,7 @@ - + @@ -2133,7 +2174,7 @@ - + @@ -2146,7 +2187,7 @@ - + @@ -2156,7 +2197,7 @@ - + @@ -2164,7 +2205,7 @@ - + @@ -2177,7 +2218,7 @@ - + @@ -2187,7 +2228,7 @@ - + @@ -2195,7 +2236,7 @@ - + @@ -2208,7 +2249,7 @@ - + @@ -2218,7 +2259,7 @@ - + @@ -2226,7 +2267,7 @@ - + @@ -2239,7 +2280,7 @@ - + @@ -2249,7 +2290,7 @@ - + @@ -2257,7 +2298,7 @@ - + @@ -2270,7 +2311,7 @@ - + @@ -2280,7 +2321,7 @@ - + @@ -2288,7 +2329,7 @@ - + @@ -2301,7 +2342,7 @@ - + @@ -2311,7 +2352,7 @@ - + @@ -2319,7 +2360,7 @@ - + @@ -2338,7 +2379,7 @@ - + @@ -2346,41 +2387,41 @@ - + - - - - + + + - - - - + + + - + - - - + + + + - - - + + + + @@ -2388,41 +2429,41 @@ - + - - - - + + + - - - - + + + - + - - - + + + + - - - + + + + @@ -2430,10 +2471,72 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2449,27 +2552,7 @@ - - - - - - - - - - - - - - - - - - - - - + @@ -2477,22 +2560,20 @@ - + - - - - + + + - - - - + + + @@ -2503,15 +2584,17 @@ - - - + + + + - - - + + + + @@ -2519,22 +2602,83 @@ - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2545,15 +2689,17 @@ - - - + + + + - - - + + + + @@ -2561,146 +2707,41 @@ - + - - - - + + + - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -2711,23 +2752,7 @@ - - - - - - - - - - - - - - - - - + @@ -2735,7 +2760,23 @@ - + + + + + + + + + + + + + + + + + @@ -2779,6 +2820,7 @@ + diff --git a/AutomatedTesting/ScriptCanvas/C12712455_ScriptCanvas_ShapeCastVerification.scriptcanvas b/AutomatedTesting/ScriptCanvas/C12712455_ScriptCanvas_ShapeCastVerification.scriptcanvas index ff9fe5c64c..b24a477a2e 100644 --- a/AutomatedTesting/ScriptCanvas/C12712455_ScriptCanvas_ShapeCastVerification.scriptcanvas +++ b/AutomatedTesting/ScriptCanvas/C12712455_ScriptCanvas_ShapeCastVerification.scriptcanvas @@ -3,7 +3,7 @@ - + @@ -16,21 +16,118 @@ - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -67,54 +164,13 @@ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -146,12 +202,13 @@ + - + @@ -183,6 +240,7 @@ + @@ -195,36 +253,24 @@ - + - - - - - - - - - - - - - - + + - + - + @@ -232,16 +278,7 @@ - - - - - - - - - - + @@ -292,6 +329,7 @@ + @@ -334,6 +372,7 @@ + @@ -371,6 +410,7 @@ + @@ -408,6 +448,7 @@ + @@ -457,58 +498,21 @@ - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -545,12 +549,56 @@ + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -582,12 +630,13 @@ + - + @@ -619,6 +668,7 @@ + @@ -631,24 +681,36 @@ - + + + + + + + + + + + + + - - + + - + - + @@ -656,7 +718,16 @@ - + + + + + + + + + + @@ -702,6 +773,7 @@ + @@ -739,6 +811,7 @@ + @@ -781,6 +854,7 @@ + @@ -823,6 +897,7 @@ + @@ -865,6 +940,7 @@ + @@ -907,6 +983,7 @@ + @@ -949,6 +1026,7 @@ + @@ -991,6 +1069,7 @@ + @@ -1028,6 +1107,7 @@ + @@ -1065,6 +1145,7 @@ + @@ -1102,6 +1183,7 @@ + @@ -1139,6 +1221,7 @@ + @@ -1176,6 +1259,7 @@ + @@ -1213,6 +1297,7 @@ + @@ -1296,334 +1381,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -1670,6 +1433,7 @@ + @@ -1712,6 +1476,7 @@ + @@ -1749,6 +1514,7 @@ + @@ -1786,6 +1552,7 @@ + @@ -1868,21 +1635,231 @@ - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1893,7 +1870,7 @@ - + @@ -1914,11 +1891,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + @@ -1926,21 +1963,21 @@ - + - + - + @@ -1977,12 +2014,13 @@ + - + @@ -2019,12 +2057,13 @@ + - + @@ -2056,12 +2095,13 @@ + - + @@ -2093,6 +2133,7 @@ + @@ -2105,7 +2146,7 @@ - + @@ -2144,7 +2185,7 @@ - + @@ -2154,7 +2195,7 @@ - + @@ -2162,7 +2203,7 @@ - + @@ -2175,7 +2216,7 @@ - + @@ -2185,7 +2226,7 @@ - + @@ -2193,7 +2234,7 @@ - + @@ -2206,7 +2247,7 @@ - + @@ -2216,7 +2257,7 @@ - + @@ -2224,7 +2265,7 @@ - + @@ -2237,7 +2278,7 @@ - + @@ -2247,7 +2288,7 @@ - + @@ -2255,7 +2296,7 @@ - + @@ -2268,7 +2309,7 @@ - + @@ -2278,7 +2319,7 @@ - + @@ -2286,7 +2327,7 @@ - + @@ -2299,7 +2340,7 @@ - + @@ -2309,7 +2350,7 @@ - + @@ -2317,7 +2358,7 @@ - + @@ -2330,7 +2371,7 @@ - + @@ -2340,7 +2381,7 @@ - + @@ -2348,7 +2389,7 @@ - + @@ -2361,7 +2402,7 @@ - + @@ -2371,7 +2412,7 @@ - + @@ -2379,7 +2420,7 @@ - + @@ -2392,7 +2433,7 @@ - + @@ -2402,7 +2443,7 @@ - + @@ -2410,7 +2451,7 @@ - + @@ -2429,7 +2470,7 @@ - + @@ -2437,49 +2478,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -2492,7 +2491,7 @@ - + @@ -2513,7 +2512,7 @@ - + @@ -2521,27 +2520,15 @@ - + - - - - - - - - - - - - - - + + - + @@ -2552,25 +2539,10 @@ - - + + - - - - - - - - - - - - - - - - + @@ -2580,24 +2552,9 @@ - - - - - - - - - - - - - - - - - - + + + @@ -2605,7 +2562,7 @@ - + @@ -2615,8 +2572,8 @@ - - + + @@ -2626,20 +2583,22 @@ - + - - - + + + + - - - + + + + @@ -2650,17 +2609,15 @@ - - - - + + + - - - - + + + @@ -2668,7 +2625,49 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2681,51 +2680,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -2736,15 +2691,17 @@ - - - + + + + - - - + + + + @@ -2752,7 +2709,7 @@ - + @@ -2760,7 +2717,7 @@ - + @@ -2780,7 +2737,7 @@ - + @@ -2792,25 +2749,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - + + diff --git a/AutomatedTesting/ScriptCanvas/C14195074_ScriptCanvas_PostUpdateEvent.scriptcanvas b/AutomatedTesting/ScriptCanvas/C14195074_ScriptCanvas_PostUpdateEvent.scriptcanvas index 988184109a..b9f438a4f3 100644 --- a/AutomatedTesting/ScriptCanvas/C14195074_ScriptCanvas_PostUpdateEvent.scriptcanvas +++ b/AutomatedTesting/ScriptCanvas/C14195074_ScriptCanvas_PostUpdateEvent.scriptcanvas @@ -3,7 +3,7 @@ - + @@ -16,868 +16,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -923,6 +62,7 @@ + @@ -960,6 +100,7 @@ + @@ -997,6 +138,7 @@ + @@ -1034,6 +176,7 @@ + @@ -1071,6 +214,7 @@ + @@ -1113,6 +257,7 @@ + @@ -1150,6 +295,7 @@ + @@ -1187,6 +333,7 @@ + @@ -1224,6 +371,7 @@ + @@ -1261,6 +409,7 @@ + @@ -1343,7 +492,885 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1390,6 +1417,7 @@ + @@ -1427,6 +1455,7 @@ + @@ -1513,6 +1542,7 @@ + @@ -1599,6 +1629,7 @@ + @@ -1680,6 +1711,7 @@ + @@ -1720,7 +1752,7 @@ - + @@ -1730,7 +1762,7 @@ - + @@ -1738,7 +1770,7 @@ - + @@ -1751,7 +1783,7 @@ - + @@ -1761,7 +1793,7 @@ - + @@ -1769,7 +1801,7 @@ - + @@ -1782,7 +1814,7 @@ - + @@ -1792,7 +1824,7 @@ - + @@ -1800,7 +1832,7 @@ - + @@ -1813,7 +1845,7 @@ - + @@ -1823,7 +1855,7 @@ - + @@ -1831,7 +1863,7 @@ - + @@ -1844,7 +1876,7 @@ - + @@ -1854,7 +1886,7 @@ - + @@ -1862,7 +1894,7 @@ - + @@ -1875,7 +1907,7 @@ - + @@ -1885,7 +1917,7 @@ - + @@ -1893,7 +1925,7 @@ - + @@ -1906,7 +1938,7 @@ - + @@ -1916,7 +1948,7 @@ - + @@ -1924,7 +1956,7 @@ - + @@ -1937,7 +1969,7 @@ - + @@ -1947,7 +1979,7 @@ - + @@ -1955,7 +1987,7 @@ - + @@ -1974,7 +2006,7 @@ - + @@ -1982,7 +2014,49 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1995,28 +2069,28 @@ - + - + - + - + @@ -2024,62 +2098,46 @@ - + - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2087,7 +2145,7 @@ - + @@ -2123,46 +2181,20 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + - - - - - - + @@ -2170,7 +2202,7 @@ - + @@ -2178,27 +2210,27 @@ - + - + - + - + @@ -2212,41 +2244,41 @@ - + - - - - - - - - - - - - - - + + - + - + - - + + - + + + + + + + + + + + + + @@ -2276,7 +2308,7 @@ - + @@ -2284,7 +2316,7 @@ - + @@ -2296,7 +2328,7 @@ - + diff --git a/AutomatedTesting/ScriptCanvas/C14902097_ScriptCanvas_PreUpdateEvent.scriptcanvas b/AutomatedTesting/ScriptCanvas/C14902097_ScriptCanvas_PreUpdateEvent.scriptcanvas index a5b927dfc1..7db4f3a35c 100644 --- a/AutomatedTesting/ScriptCanvas/C14902097_ScriptCanvas_PreUpdateEvent.scriptcanvas +++ b/AutomatedTesting/ScriptCanvas/C14902097_ScriptCanvas_PreUpdateEvent.scriptcanvas @@ -3,7 +3,7 @@ - + @@ -16,163 +16,21 @@ - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -209,54 +67,13 @@ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -288,12 +105,51 @@ + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -325,6 +181,7 @@ + @@ -337,33 +194,21 @@ - + - - - - - - - - - - - - - + - + @@ -374,7 +219,363 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -421,6 +622,7 @@ + @@ -458,6 +660,7 @@ + @@ -544,6 +747,7 @@ + @@ -630,6 +834,7 @@ + @@ -711,6 +916,7 @@ + @@ -749,72 +955,21 @@ - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -824,163 +979,91 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -994,12 +1077,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -1013,22 +1128,8 @@ - - - - - - - - - - - - - - - + @@ -1050,47 +1151,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - - - + + - + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + @@ -1098,7 +1320,7 @@ - + @@ -1144,6 +1366,7 @@ + @@ -1181,6 +1404,7 @@ + @@ -1218,6 +1442,7 @@ + @@ -1255,6 +1480,7 @@ + @@ -1292,6 +1518,7 @@ + @@ -1334,6 +1561,7 @@ + @@ -1371,6 +1599,7 @@ + @@ -1408,6 +1637,7 @@ + @@ -1445,6 +1675,7 @@ + @@ -1482,6 +1713,7 @@ + @@ -1562,210 +1794,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -1775,7 +1808,7 @@ - + @@ -1783,7 +1816,7 @@ - + @@ -1796,7 +1829,7 @@ - + @@ -1806,7 +1839,7 @@ - + @@ -1814,7 +1847,7 @@ - + @@ -1827,7 +1860,7 @@ - + @@ -1837,7 +1870,7 @@ - + @@ -1845,7 +1878,7 @@ - + @@ -1858,7 +1891,7 @@ - + @@ -1868,7 +1901,7 @@ - + @@ -1876,7 +1909,7 @@ - + @@ -1889,7 +1922,7 @@ - + @@ -1899,7 +1932,7 @@ - + @@ -1907,7 +1940,7 @@ - + @@ -1920,7 +1953,7 @@ - + @@ -1930,7 +1963,7 @@ - + @@ -1938,7 +1971,7 @@ - + @@ -1951,7 +1984,7 @@ - + @@ -1961,7 +1994,7 @@ - + @@ -1969,7 +2002,7 @@ - + @@ -1982,7 +2015,7 @@ - + @@ -1992,7 +2025,7 @@ - + @@ -2000,7 +2033,7 @@ - + @@ -2019,7 +2052,7 @@ - + @@ -2027,27 +2060,15 @@ - + - - - - - - - - - - - - - - + + - + @@ -2057,97 +2078,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2155,60 +2085,16 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + + + @@ -2216,30 +2102,10 @@ - + - - - - - - - - - - - - - - - - - - - - @@ -2255,7 +2121,27 @@ - + + + + + + + + + + + + + + + + + + + + + @@ -2263,27 +2149,57 @@ - + - - - + + + + - - - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2293,11 +2209,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2336,15 +2369,7 @@ - - - - - - - - - + @@ -2352,13 +2377,21 @@ - + + + + + + + + + From cd978eaa93f208ceecffbce139e7f7750e81b02a Mon Sep 17 00:00:00 2001 From: amzn-sean <75276488+amzn-sean@users.noreply.github.com> Date: Thu, 22 Apr 2021 17:22:26 +0100 Subject: [PATCH 06/30] fix potential memory leak --- Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.cpp b/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.cpp index 1c91818eb5..75cf536403 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.cpp +++ b/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.cpp @@ -184,6 +184,7 @@ namespace PhysX if (sceneInterface == nullptr) { AZ_Error("PhysX Ragdoll", false, "Unable to Create Ragdoll, Physics Scene Interface is missing."); + delete ragdoll; return nullptr; } @@ -206,6 +207,7 @@ namespace PhysX else { AZ_Error("PhysX Ragdoll", false, "Failed to create collider shape for ragdoll node %s", nodeConfig.m_debugName.c_str()); + delete ragdoll; return nullptr; } } @@ -287,6 +289,7 @@ namespace PhysX else { AZ_Error("PhysX Ragdoll", false, "Failed to create joint for node index %i.", nodeIndex); + delete ragdoll; return nullptr; } } From 53b29cbca50daf045fe0ddf715e1edd825c98e48 Mon Sep 17 00:00:00 2001 From: Gene Walters Date: Thu, 22 Apr 2021 16:36:47 -0700 Subject: [PATCH 07/30] updating based on feedback --- Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h b/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h index 9b174c0620..ca0f6d996d 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h +++ b/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h @@ -38,7 +38,8 @@ namespace EMotionFX void ReleaseEMotionFXData() { - m_emfxNativeData = {}; + m_emfxNativeData.clear(); + m_emfxNativeData.shrink_to_fit(); } AZStd::vector m_emfxNativeData; From 9f0075c9dfeda0869a50d30c3a2916d15b40bdd2 Mon Sep 17 00:00:00 2001 From: amzn-sean <75276488+amzn-sean@users.noreply.github.com> Date: Fri, 23 Apr 2021 11:00:08 +0100 Subject: [PATCH 08/30] cleanup of create ragdoll ptr handling --- .../Code/Source/PhysXCharacters/API/CharacterUtils.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.cpp b/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.cpp index 75cf536403..893e622701 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.cpp +++ b/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.cpp @@ -177,14 +177,13 @@ namespace PhysX return nullptr; } - Ragdoll* ragdoll = aznew Ragdoll(sceneHandle); + AZStd::unique_ptr ragdoll = AZStd::make_unique(sceneHandle); ragdoll->SetParentIndices(configuration.m_parentIndices); auto* sceneInterface = AZ::Interface::Get(); if (sceneInterface == nullptr) { AZ_Error("PhysX Ragdoll", false, "Unable to Create Ragdoll, Physics Scene Interface is missing."); - delete ragdoll; return nullptr; } @@ -207,7 +206,6 @@ namespace PhysX else { AZ_Error("PhysX Ragdoll", false, "Failed to create collider shape for ragdoll node %s", nodeConfig.m_debugName.c_str()); - delete ragdoll; return nullptr; } } @@ -289,7 +287,6 @@ namespace PhysX else { AZ_Error("PhysX Ragdoll", false, "Failed to create joint for node index %i.", nodeIndex); - delete ragdoll; return nullptr; } } @@ -301,8 +298,8 @@ namespace PhysX } ragdoll->SetRootIndex(rootIndex); - - return ragdoll; + + return ragdoll.release(); } physx::PxD6JointDrive CreateD6JointDrive(float stiffness, float dampingRatio, float forceLimit) From b215d1c09860082463f09800802b73b5c22cb15a Mon Sep 17 00:00:00 2001 From: mnaumov Date: Fri, 23 Apr 2021 14:56:28 -0700 Subject: [PATCH 09/30] Enlarged thumbnails on hover --- .../UI/PropertyEditor/PropertyAssetCtrl.cpp | 41 +++-------------- .../UI/PropertyEditor/PropertyAssetCtrl.hxx | 9 +--- ...DropDown.cpp => ThumbnailPropertyCtrl.cpp} | 45 +++++++++++++++---- ...nailDropDown.h => ThumbnailPropertyCtrl.h} | 7 ++- .../aztoolsframework_files.cmake | 4 +- .../Material/EditorMaterialComponentSlot.cpp | 2 +- 6 files changed, 52 insertions(+), 56 deletions(-) rename Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/{ThumbnailDropDown.cpp => ThumbnailPropertyCtrl.cpp} (65%) rename Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/{ThumbnailDropDown.h => ThumbnailPropertyCtrl.h} (84%) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp index 261645e79a..9d9a3da69b 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp @@ -63,7 +63,7 @@ AZ_POP_DISABLE_WARNING #include #include -#include +#include namespace AzToolsFramework { @@ -93,15 +93,11 @@ namespace AzToolsFramework setAcceptDrops(true); - m_thumbnail = new Thumbnailer::ThumbnailWidget(this); - m_thumbnail->setFixedSize(QSize(24, 24)); + m_thumbnail = new ThumbnailPropertyCtrl(this); + m_thumbnail->setFixedSize(QSize(40, 24)); m_thumbnail->setVisible(false); - m_thumbnailDropDown = new ThumbnailDropDown(this); - m_thumbnailDropDown->setFixedSize(QSize(40, 24)); - m_thumbnailDropDown->setVisible(false); - - connect(m_thumbnailDropDown, &ThumbnailDropDown::clicked, this, &PropertyAssetCtrl::OnEditButtonClicked); + connect(m_thumbnail, &ThumbnailPropertyCtrl::clicked, this, &PropertyAssetCtrl::OnEditButtonClicked); m_editButton = new QToolButton(this); m_editButton->setAutoRaise(true); @@ -112,7 +108,6 @@ namespace AzToolsFramework connect(m_editButton, &QToolButton::clicked, this, &PropertyAssetCtrl::OnEditButtonClicked); pLayout->addWidget(m_thumbnail); - pLayout->addWidget(m_thumbnailDropDown); pLayout->addWidget(m_browseEdit); pLayout->addWidget(m_editButton); @@ -1091,9 +1086,8 @@ namespace AzToolsFramework void PropertyAssetCtrl::UpdateThumbnail() { m_thumbnail->setVisible(m_showThumbnail); - m_thumbnailDropDown->setVisible(m_showThumbnailDropDown); - if (m_showThumbnail || m_showThumbnailDropDown) + if (m_showThumbnail) { const AZ::Data::AssetId assetID = GetCurrentAssetID(); if (assetID.IsValid()) @@ -1112,17 +1106,12 @@ namespace AzToolsFramework { m_thumbnail->SetThumbnailKey(thumbnailKey, Thumbnailer::ThumbnailContext::DefaultContext); } - if (m_showThumbnailDropDown) - { - m_thumbnailDropDown->SetThumbnailKey(thumbnailKey, Thumbnailer::ThumbnailContext::DefaultContext); - } return; } } } m_thumbnail->ClearThumbnail(); - m_thumbnailDropDown->ClearThumbnail(); } void PropertyAssetCtrl::SetClearButtonEnabled(bool enable) @@ -1156,16 +1145,6 @@ namespace AzToolsFramework return m_showThumbnail; } - void PropertyAssetCtrl::SetShowThumbnailDropDown(bool enable) - { - m_showThumbnailDropDown = enable; - } - - bool PropertyAssetCtrl::GetShowThumbnailDropDown() const - { - return m_showThumbnailDropDown; - } - const AZ::Uuid& AssetPropertyHandlerDefault::GetHandledType() const { return AZ::GetAssetClassId(); @@ -1276,19 +1255,11 @@ namespace AzToolsFramework } } else if (attrib == AZ_CRC_CE("Thumbnail")) - { - bool showThumbnail = false; - if (attrValue->Read(showThumbnail)) - { - GUI->SetShowThumbnail(showThumbnail); - } - } - else if (attrib == AZ_CRC_CE("ThumbnailWithDropDown")) { PropertyAssetCtrl::EditCallbackType* func = azdynamic_cast(attrValue->GetAttribute()); if (func) { - GUI->SetShowThumbnailDropDown(true); + GUI->SetShowThumbnail(true); GUI->SetEditNotifyCallback(func); } else diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.hxx index b1f2dbb529..f7f7ece856 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.hxx +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.hxx @@ -45,7 +45,7 @@ namespace AzToolsFramework { class AssetCompleterModel; class AssetCompleterListView; - class ThumbnailDropDown; + class ThumbnailPropertyCtrl; namespace Thumbnailer { @@ -95,8 +95,7 @@ namespace AzToolsFramework void OnAssetIDChanged(AZ::Data::AssetId newAssetID); protected: - ThumbnailDropDown* m_thumbnailDropDown = nullptr; - Thumbnailer::ThumbnailWidget* m_thumbnail = nullptr; + ThumbnailPropertyCtrl* m_thumbnail = nullptr; QPushButton* m_errorButton = nullptr; QToolButton* m_editButton = nullptr; @@ -158,8 +157,6 @@ namespace AzToolsFramework bool m_showThumbnail = false; - bool m_showThumbnailDropDown = false; - // ! Default suffix used in the field's placeholder text when a default value is set. const char* m_DefaultSuffix = " (default)"; @@ -209,8 +206,6 @@ namespace AzToolsFramework void SetShowThumbnail(bool enable); bool GetShowThumbnail() const; - void SetShowThumbnailDropDown(bool enable); - bool GetShowThumbnailDropDown() const; void SetSelectedAssetID(const AZ::Data::AssetId& newID); void SetCurrentAssetType(const AZ::Data::AssetType& newType); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailDropDown.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.cpp similarity index 65% rename from Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailDropDown.cpp rename to Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.cpp index 8a942a952a..6b9322226f 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailDropDown.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.cpp @@ -19,12 +19,14 @@ AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") // 4251: 'QRawFon #include #include #include +#include AZ_POP_DISABLE_WARNING -#include "ThumbnailDropDown.h" +#include "ThumbnailPropertyCtrl.h" namespace AzToolsFramework { - ThumbnailDropDown::ThumbnailDropDown(QWidget* parent) + + ThumbnailPropertyCtrl::ThumbnailPropertyCtrl(QWidget* parent) : QWidget(parent) { QHBoxLayout* pLayout = new QHBoxLayout(); @@ -51,19 +53,20 @@ namespace AzToolsFramework setLayout(pLayout); } - void ThumbnailDropDown::SetThumbnailKey(Thumbnailer::SharedThumbnailKey key, const char* contextName) + void ThumbnailPropertyCtrl::SetThumbnailKey(Thumbnailer::SharedThumbnailKey key, const char* contextName) { + m_key = key; m_emptyThumbnail->setVisible(false); m_thumbnail->SetThumbnailKey(key, contextName); } - void ThumbnailDropDown::ClearThumbnail() + void ThumbnailPropertyCtrl::ClearThumbnail() { m_emptyThumbnail->setVisible(true); m_thumbnail->ClearThumbnail(); } - bool ThumbnailDropDown::event(QEvent* e) + bool ThumbnailPropertyCtrl::event(QEvent* e) { if (isEnabled()) { @@ -77,7 +80,7 @@ namespace AzToolsFramework return QWidget::event(e); } - void ThumbnailDropDown::paintEvent(QPaintEvent* e) + void ThumbnailPropertyCtrl::paintEvent(QPaintEvent* e) { QPainter p(this); QRect targetRect(QPoint(), QSize(40, 24)); @@ -85,17 +88,41 @@ namespace AzToolsFramework QWidget::paintEvent(e); } - void ThumbnailDropDown::enterEvent(QEvent* e) +#pragma optimize("", off) + void ThumbnailPropertyCtrl::enterEvent(QEvent* e) { m_dropDownArrow->setPixmap(QPixmap(":/stylesheet/img/triangle0_highlighted.png")); + if (!m_thumbnailEnlarged && m_key) + { + QWidget* rootWidget = QApplication::activeWindow(); + if (!rootWidget) + return; + QPoint rootPosition = rootWidget->pos(); + QPoint myPosition = pos(); + QPoint position = mapToGlobal(myPosition - QPoint(185, 0)); + QSize size(180, 180); + m_thumbnailEnlarged = new Thumbnailer::ThumbnailWidget(); + m_thumbnailEnlarged->setFixedSize(size); + m_thumbnailEnlarged->move(position); + m_thumbnailEnlarged->setWindowTitle("test"); + m_thumbnailEnlarged->setWindowFlags(Qt::Window | Qt::FramelessWindowHint); + m_thumbnailEnlarged->SetThumbnailKey(m_key); + m_thumbnailEnlarged->show(); + } QWidget::enterEvent(e); } +#pragma optimize("", on) - void ThumbnailDropDown::leaveEvent(QEvent* e) + void ThumbnailPropertyCtrl::leaveEvent(QEvent* e) { m_dropDownArrow->setPixmap(QPixmap(":/stylesheet/img/triangle0.png")); + if (m_thumbnailEnlarged) + { + delete m_thumbnailEnlarged; + m_thumbnailEnlarged = nullptr; + } QWidget::leaveEvent(e); } } -#include "UI/PropertyEditor/moc_ThumbnailDropDown.cpp" +#include "UI/PropertyEditor/moc_ThumbnailPropertyCtrl.cpp" diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailDropDown.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.h similarity index 84% rename from Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailDropDown.h rename to Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.h index da269742ff..129b68f307 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailDropDown.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.h @@ -30,11 +30,12 @@ namespace AzToolsFramework class ThumbnailWidget; } - class ThumbnailDropDown : public QWidget + //! Used by PropertyAssetCtrl to display thumbnail preview of the asset as well as additional drop-down actions + class ThumbnailPropertyCtrl : public QWidget { Q_OBJECT public: - explicit ThumbnailDropDown(QWidget* parent = nullptr); + explicit ThumbnailPropertyCtrl(QWidget* parent = nullptr); //! Call this to set what thumbnail widget will display void SetThumbnailKey(Thumbnailer::SharedThumbnailKey key, const char* contextName = "Default"); @@ -52,7 +53,9 @@ namespace AzToolsFramework void leaveEvent(QEvent* e) override; private: + Thumbnailer::SharedThumbnailKey m_key; Thumbnailer::ThumbnailWidget* m_thumbnail = nullptr; + Thumbnailer::ThumbnailWidget* m_thumbnailEnlarged = nullptr; QLabel* m_emptyThumbnail = nullptr; AspectRatioAwarePixmapWidget* m_dropDownArrow = nullptr; }; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframework_files.cmake b/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframework_files.cmake index 2939bb44ad..96eaab3009 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframework_files.cmake +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframework_files.cmake @@ -417,8 +417,8 @@ set(FILES UI/PropertyEditor/GrowTextEdit.cpp UI/PropertyEditor/MultiLineTextEditHandler.h UI/PropertyEditor/MultiLineTextEditHandler.cpp - UI/PropertyEditor/ThumbnailDropDown.h - UI/PropertyEditor/ThumbnailDropDown.cpp + UI/PropertyEditor/ThumbnailPropertyCtrl.h + UI/PropertyEditor/ThumbnailPropertyCtrl.cpp UI/Slice/SlicePushWidget.cpp UI/Slice/SlicePushWidget.hxx UI/Slice/SliceOverridesNotificationWindow.cpp diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentSlot.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentSlot.cpp index 2f74991756..a8c5a7eb41 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentSlot.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentSlot.cpp @@ -98,7 +98,7 @@ namespace AZ ->Attribute(AZ::Edit::Attributes::DefaultAsset, &EditorMaterialComponentSlot::GetDefaultAssetId) ->Attribute(AZ::Edit::Attributes::NameLabelOverride, &EditorMaterialComponentSlot::GetLabel) ->Attribute(AZ::Edit::Attributes::ShowProductAssetFileName, true) - ->Attribute("ThumbnailWithDropDown", &EditorMaterialComponentSlot::OpenPopupMenu) + ->Attribute("Thumbnail", &EditorMaterialComponentSlot::OpenPopupMenu) ; } } From 9f4606c17a729449f5774a26bd791d0b33e49603 Mon Sep 17 00:00:00 2001 From: mnaumov Date: Fri, 23 Apr 2021 15:01:11 -0700 Subject: [PATCH 10/30] Removing test code --- .../UI/PropertyEditor/ThumbnailPropertyCtrl.cpp | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.cpp index 6b9322226f..a5b9f71cc5 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.cpp @@ -88,30 +88,22 @@ namespace AzToolsFramework QWidget::paintEvent(e); } -#pragma optimize("", off) void ThumbnailPropertyCtrl::enterEvent(QEvent* e) { m_dropDownArrow->setPixmap(QPixmap(":/stylesheet/img/triangle0_highlighted.png")); if (!m_thumbnailEnlarged && m_key) { - QWidget* rootWidget = QApplication::activeWindow(); - if (!rootWidget) - return; - QPoint rootPosition = rootWidget->pos(); - QPoint myPosition = pos(); - QPoint position = mapToGlobal(myPosition - QPoint(185, 0)); + QPoint position = mapToGlobal(pos() - QPoint(185, 0)); QSize size(180, 180); m_thumbnailEnlarged = new Thumbnailer::ThumbnailWidget(); m_thumbnailEnlarged->setFixedSize(size); m_thumbnailEnlarged->move(position); - m_thumbnailEnlarged->setWindowTitle("test"); m_thumbnailEnlarged->setWindowFlags(Qt::Window | Qt::FramelessWindowHint); m_thumbnailEnlarged->SetThumbnailKey(m_key); m_thumbnailEnlarged->show(); } QWidget::enterEvent(e); } -#pragma optimize("", on) void ThumbnailPropertyCtrl::leaveEvent(QEvent* e) { From 30458bc1be353aa791e9e0bc7b999e179881a7a7 Mon Sep 17 00:00:00 2001 From: mnaumov Date: Fri, 23 Apr 2021 21:40:27 -0700 Subject: [PATCH 11/30] PR feedback --- .../UI/PropertyEditor/PropertyAssetCtrl.cpp | 34 +++++++++++++++---- .../UI/PropertyEditor/PropertyAssetCtrl.hxx | 7 +++- .../PropertyEditor/ThumbnailPropertyCtrl.cpp | 14 ++++++++ .../UI/PropertyEditor/ThumbnailPropertyCtrl.h | 2 ++ .../Material/EditorMaterialComponentSlot.cpp | 2 +- 5 files changed, 51 insertions(+), 8 deletions(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp index 9d9a3da69b..276b8f75ab 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp @@ -97,7 +97,7 @@ namespace AzToolsFramework m_thumbnail->setFixedSize(QSize(40, 24)); m_thumbnail->setVisible(false); - connect(m_thumbnail, &ThumbnailPropertyCtrl::clicked, this, &PropertyAssetCtrl::OnEditButtonClicked); + connect(m_thumbnail, &ThumbnailPropertyCtrl::clicked, [&]() { PropertyAssetCtrl::OnEditButtonClicked(m_thumbnailCallback); }); m_editButton = new QToolButton(this); m_editButton->setAutoRaise(true); @@ -105,7 +105,7 @@ namespace AzToolsFramework m_editButton->setToolTip("Edit asset"); m_editButton->setVisible(false); - connect(m_editButton, &QToolButton::clicked, this, &PropertyAssetCtrl::OnEditButtonClicked); + connect(m_editButton, &QToolButton::clicked, [&]() { PropertyAssetCtrl::OnEditButtonClicked(m_editNotifyCallback); }); pLayout->addWidget(m_thumbnail); pLayout->addWidget(m_browseEdit); @@ -704,13 +704,13 @@ namespace AzToolsFramework AzFramework::AssetCatalogEventBus::Handler::BusDisconnect(); } - void PropertyAssetCtrl::OnEditButtonClicked() + void PropertyAssetCtrl::OnEditButtonClicked(EditCallbackType* editNotifyCallback) { const AZ::Data::AssetId assetID = GetCurrentAssetID(); - if (m_editNotifyCallback) + if (editNotifyCallback) { AZ_Error("Asset Property", m_editNotifyTarget, "No notification target set for edit callback."); - m_editNotifyCallback->Invoke(m_editNotifyTarget, assetID, GetCurrentAssetType()); + editNotifyCallback->Invoke(m_editNotifyTarget, assetID, GetCurrentAssetType()); return; } else @@ -1089,6 +1089,7 @@ namespace AzToolsFramework if (m_showThumbnail) { + m_thumbnail->ShowDropDownArrow(m_showThumbnailDropDownButton); const AZ::Data::AssetId assetID = GetCurrentAssetID(); if (assetID.IsValid()) { @@ -1145,6 +1146,21 @@ namespace AzToolsFramework return m_showThumbnail; } + void PropertyAssetCtrl::SetShowThumbnailDropDownButton(bool enable) + { + m_showThumbnailDropDownButton = enable; + } + + bool PropertyAssetCtrl::GetShowThumbnailDropDownButton() const + { + return m_showThumbnailDropDownButton; + } + + void PropertyAssetCtrl::SetThumbnailCallback(EditCallbackType* editNotifyCallback) + { + m_thumbnailCallback = editNotifyCallback; + } + const AZ::Uuid& AssetPropertyHandlerDefault::GetHandledType() const { return AZ::GetAssetClassId(); @@ -1255,15 +1271,21 @@ namespace AzToolsFramework } } else if (attrib == AZ_CRC_CE("Thumbnail")) + { + GUI->SetShowThumbnail(true); + } + else if (attrib == AZ_CRC_CE("ThumbnailCallback")) { PropertyAssetCtrl::EditCallbackType* func = azdynamic_cast(attrValue->GetAttribute()); if (func) { GUI->SetShowThumbnail(true); - GUI->SetEditNotifyCallback(func); + GUI->SetShowThumbnailDropDownButton(true); + GUI->SetThumbnailCallback(func); } else { + GUI->SetShowThumbnailDropDownButton(false); GUI->SetEditNotifyCallback(nullptr); } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.hxx index f7f7ece856..aa4a174607 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.hxx +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.hxx @@ -156,6 +156,8 @@ namespace AzToolsFramework bool m_showProductAssetName = true; bool m_showThumbnail = false; + bool m_showThumbnailDropDownButton = false; + EditCallbackType* m_thumbnailCallback = nullptr; // ! Default suffix used in the field's placeholder text when a default value is set. const char* m_DefaultSuffix = " (default)"; @@ -206,6 +208,9 @@ namespace AzToolsFramework void SetShowThumbnail(bool enable); bool GetShowThumbnail() const; + void SetShowThumbnailDropDownButton(bool enable); + bool GetShowThumbnailDropDownButton() const; + void SetThumbnailCallback(EditCallbackType* editNotifyCallback); void SetSelectedAssetID(const AZ::Data::AssetId& newID); void SetCurrentAssetType(const AZ::Data::AssetType& newType); @@ -216,7 +221,7 @@ namespace AzToolsFramework void OnClearButtonClicked(); void UpdateAssetDisplay(); void OnLineEditFocus(bool focus); - virtual void OnEditButtonClicked(); + virtual void OnEditButtonClicked(EditCallbackType* editNotifyCallback); void OnCompletionModelReset(); void OnAutocomplete(const QModelIndex& index); void OnTextChange(const QString& text); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.cpp index a5b9f71cc5..4a501484c2 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.cpp @@ -39,6 +39,7 @@ namespace AzToolsFramework m_dropDownArrow = new AspectRatioAwarePixmapWidget(this); m_dropDownArrow->setPixmap(QPixmap(":/stylesheet/img/triangle0.png")); m_dropDownArrow->setFixedSize(QSize(8, 24)); + ShowDropDownArrow(false); m_emptyThumbnail = new QLabel(this); m_emptyThumbnail->setPixmap(QPixmap(":/stylesheet/img/line.png")); @@ -66,6 +67,19 @@ namespace AzToolsFramework m_thumbnail->ClearThumbnail(); } + void ThumbnailPropertyCtrl::ShowDropDownArrow(bool visible) + { + if (visible) + { + setFixedSize(QSize(40, 24)); + } + else + { + setFixedSize(QSize(24, 24)); + } + m_dropDownArrow->setVisible(visible); + } + bool ThumbnailPropertyCtrl::event(QEvent* e) { if (isEnabled()) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.h index 129b68f307..ee61deab07 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.h @@ -42,6 +42,8 @@ namespace AzToolsFramework //! Remove current thumbnail void ClearThumbnail(); + void ShowDropDownArrow(bool visible); + bool event(QEvent* e) override; Q_SIGNALS: diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentSlot.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentSlot.cpp index a8c5a7eb41..9d63f4a4a9 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentSlot.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentSlot.cpp @@ -98,7 +98,7 @@ namespace AZ ->Attribute(AZ::Edit::Attributes::DefaultAsset, &EditorMaterialComponentSlot::GetDefaultAssetId) ->Attribute(AZ::Edit::Attributes::NameLabelOverride, &EditorMaterialComponentSlot::GetLabel) ->Attribute(AZ::Edit::Attributes::ShowProductAssetFileName, true) - ->Attribute("Thumbnail", &EditorMaterialComponentSlot::OpenPopupMenu) + ->Attribute("ThumbnailCallback", &EditorMaterialComponentSlot::OpenPopupMenu) ; } } From 0bcc85e4d86f05d61439fd3c579a8d34d0056984 Mon Sep 17 00:00:00 2001 From: mnaumov Date: Fri, 23 Apr 2021 21:55:14 -0700 Subject: [PATCH 12/30] scope pointer --- .../UI/PropertyEditor/ThumbnailPropertyCtrl.cpp | 5 ++--- .../UI/PropertyEditor/ThumbnailPropertyCtrl.h | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.cpp index 4a501484c2..bb9232435a 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.cpp @@ -109,7 +109,7 @@ namespace AzToolsFramework { QPoint position = mapToGlobal(pos() - QPoint(185, 0)); QSize size(180, 180); - m_thumbnailEnlarged = new Thumbnailer::ThumbnailWidget(); + m_thumbnailEnlarged.reset(new Thumbnailer::ThumbnailWidget()); m_thumbnailEnlarged->setFixedSize(size); m_thumbnailEnlarged->move(position); m_thumbnailEnlarged->setWindowFlags(Qt::Window | Qt::FramelessWindowHint); @@ -124,8 +124,7 @@ namespace AzToolsFramework m_dropDownArrow->setPixmap(QPixmap(":/stylesheet/img/triangle0.png")); if (m_thumbnailEnlarged) { - delete m_thumbnailEnlarged; - m_thumbnailEnlarged = nullptr; + m_thumbnailEnlarged.reset(); } QWidget::leaveEvent(e); } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.h index ee61deab07..428f24dbf6 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.h @@ -57,7 +57,7 @@ namespace AzToolsFramework private: Thumbnailer::SharedThumbnailKey m_key; Thumbnailer::ThumbnailWidget* m_thumbnail = nullptr; - Thumbnailer::ThumbnailWidget* m_thumbnailEnlarged = nullptr; + QScopedPointer m_thumbnailEnlarged; QLabel* m_emptyThumbnail = nullptr; AspectRatioAwarePixmapWidget* m_dropDownArrow = nullptr; }; From 4f05cbeca9d0242751fb23780b79a14329ebe278 Mon Sep 17 00:00:00 2001 From: dmcdiar Date: Sun, 25 Apr 2021 19:13:16 -0700 Subject: [PATCH 13/30] Validated reflection probe visibility state when changing the cubemap type. --- .../EditorReflectionProbeComponent.cpp | 20 ++++++++++++++++--- .../EditorReflectionProbeComponent.h | 3 +++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/ReflectionProbe/EditorReflectionProbeComponent.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/ReflectionProbe/EditorReflectionProbeComponent.cpp index eac4213867..976b8f4267 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/ReflectionProbe/EditorReflectionProbeComponent.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/ReflectionProbe/EditorReflectionProbeComponent.cpp @@ -53,16 +53,20 @@ namespace AZ ->Attribute(AZ::Edit::Attributes::ViewportIcon, "editor/icons/components/viewport/component_placeholder.png") ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c)) ->Attribute(AZ::Edit::Attributes::AutoExpand, true) + ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) ->Attribute(AZ::Edit::Attributes::PrimaryAssetType, AZ::AzTypeInfo::Uuid()) - ->ClassElement(AZ::Edit::ClassElements::Group, "Cubemap") + ->ClassElement(AZ::Edit::ClassElements::Group, "Cubemap Bake") ->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") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorReflectionProbeComponent::OnUseBakedCubemapChanged) ->UIElement(AZ::Edit::UIHandlers::Button, "Bake Reflection Probe", "Bake Reflection Probe") ->Attribute(AZ::Edit::Attributes::NameLabelOverride, "") ->Attribute(AZ::Edit::Attributes::ButtonText, "Bake Reflection Probe") ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorReflectionProbeComponent::BakeReflectionProbe) ->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") + ->Attribute(AZ::Edit::Attributes::ChangeValidate, &EditorReflectionProbeComponent::OnUseBakedCubemapValidate) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorReflectionProbeComponent::OnUseBakedCubemapChanged) ->DataElement(AZ::Edit::UIHandlers::MultiLineEdit, &EditorReflectionProbeComponent::m_bakedCubeMapRelativePath, "Baked Cubemap Path", "Baked Cubemap Path") ->Attribute(AZ::Edit::Attributes::ReadOnly, true) ->Attribute(AZ::Edit::Attributes::Visibility, &EditorReflectionProbeComponent::GetBakedCubemapVisibilitySetting) @@ -188,6 +192,16 @@ namespace AZ return false; } + AZ::Outcome EditorReflectionProbeComponent::OnUseBakedCubemapValidate([[maybe_unused]] void* newValue, [[maybe_unused]] const AZ::Uuid& valueType) + { + if (!m_controller.m_featureProcessor) + { + return AZ::Failure(AZStd::string("This Reflection Probe entity is hidden, it must be visible in order to change the cubemap type.")); + } + + return AZ::Success(); + } + AZ::u32 EditorReflectionProbeComponent::OnUseBakedCubemapChanged() { // save setting to the configuration diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/ReflectionProbe/EditorReflectionProbeComponent.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/ReflectionProbe/EditorReflectionProbeComponent.h index 5b992ae5aa..eba9575ec4 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/ReflectionProbe/EditorReflectionProbeComponent.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/ReflectionProbe/EditorReflectionProbeComponent.h @@ -47,6 +47,9 @@ namespace AZ void DisplayEntityViewport(const AzFramework::ViewportInfo& viewportInfo, AzFramework::DebugDisplayRequests& debugDisplay) override; private: + // validation + AZ::Outcome OnUseBakedCubemapValidate(void* newValue, const AZ::Uuid& valueType); + // change notifications AZ::u32 OnUseBakedCubemapChanged(); AZ::u32 OnAuthoredCubemapChanged(); From c4e3c39ee2d246926dadd1e314abd94f8ab57e70 Mon Sep 17 00:00:00 2001 From: mnaumov Date: Mon, 26 Apr 2021 12:44:51 -0700 Subject: [PATCH 14/30] PR feedback --- .../UI/PropertyEditor/PropertyAssetCtrl.cpp | 23 ++++++++++++++----- .../UI/PropertyEditor/PropertyAssetCtrl.hxx | 3 ++- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp index 276b8f75ab..d2e34c662f 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp @@ -97,7 +97,7 @@ namespace AzToolsFramework m_thumbnail->setFixedSize(QSize(40, 24)); m_thumbnail->setVisible(false); - connect(m_thumbnail, &ThumbnailPropertyCtrl::clicked, [&]() { PropertyAssetCtrl::OnEditButtonClicked(m_thumbnailCallback); }); + connect(m_thumbnail, &ThumbnailPropertyCtrl::clicked, this, &PropertyAssetCtrl::OnThumbnailClicked); m_editButton = new QToolButton(this); m_editButton->setAutoRaise(true); @@ -105,7 +105,7 @@ namespace AzToolsFramework m_editButton->setToolTip("Edit asset"); m_editButton->setVisible(false); - connect(m_editButton, &QToolButton::clicked, [&]() { PropertyAssetCtrl::OnEditButtonClicked(m_editNotifyCallback); }); + connect(m_editButton, &QToolButton::clicked, this, &PropertyAssetCtrl::OnEditButtonClicked); pLayout->addWidget(m_thumbnail); pLayout->addWidget(m_browseEdit); @@ -183,6 +183,17 @@ namespace AzToolsFramework } } + void PropertyAssetCtrl::OnThumbnailClicked() + { + const AZ::Data::AssetId assetID = GetCurrentAssetID(); + if (m_thumbnailCallback) + { + AZ_Error("Asset Property", m_editNotifyTarget, "No notification target set for edit callback."); + m_thumbnailCallback->Invoke(m_editNotifyTarget, assetID, GetCurrentAssetType()); + return; + } + } + void PropertyAssetCtrl::OnCompletionModelReset() { if (!m_completerIsActive) @@ -704,13 +715,13 @@ namespace AzToolsFramework AzFramework::AssetCatalogEventBus::Handler::BusDisconnect(); } - void PropertyAssetCtrl::OnEditButtonClicked(EditCallbackType* editNotifyCallback) + void PropertyAssetCtrl::OnEditButtonClicked() { const AZ::Data::AssetId assetID = GetCurrentAssetID(); - if (editNotifyCallback) + if (m_editNotifyCallback) { AZ_Error("Asset Property", m_editNotifyTarget, "No notification target set for edit callback."); - editNotifyCallback->Invoke(m_editNotifyTarget, assetID, GetCurrentAssetType()); + m_editNotifyCallback->Invoke(m_editNotifyTarget, assetID, GetCurrentAssetType()); return; } else @@ -1286,7 +1297,7 @@ namespace AzToolsFramework else { GUI->SetShowThumbnailDropDownButton(false); - GUI->SetEditNotifyCallback(nullptr); + GUI->SetThumbnailCallback(nullptr); } } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.hxx index aa4a174607..b28ce3247c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.hxx +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.hxx @@ -221,7 +221,8 @@ namespace AzToolsFramework void OnClearButtonClicked(); void UpdateAssetDisplay(); void OnLineEditFocus(bool focus); - virtual void OnEditButtonClicked(EditCallbackType* editNotifyCallback); + virtual void OnEditButtonClicked(); + void OnThumbnailClicked(); void OnCompletionModelReset(); void OnAutocomplete(const QModelIndex& index); void OnTextChange(const QString& text); From f76b69d480b2491bbe1ff8e31ea015f9b9d55966 Mon Sep 17 00:00:00 2001 From: mbalfour Date: Mon, 26 Apr 2021 16:15:25 -0500 Subject: [PATCH 15/30] Added a handful of null checks to let new level creation succeed. --- Code/Sandbox/Editor/GameExporter.cpp | 54 +++++++++++++++++----------- Code/Sandbox/Editor/Mission.cpp | 7 ++-- Code/Sandbox/Editor/ShaderCache.cpp | 1 + 3 files changed, 40 insertions(+), 22 deletions(-) diff --git a/Code/Sandbox/Editor/GameExporter.cpp b/Code/Sandbox/Editor/GameExporter.cpp index 00836018cf..9039fca70d 100644 --- a/Code/Sandbox/Editor/GameExporter.cpp +++ b/Code/Sandbox/Editor/GameExporter.cpp @@ -139,7 +139,10 @@ bool CGameExporter::Export(unsigned int flags, [[maybe_unused]] EEndian eExportE // Make sure we unload any unused CGFs before exporting so that they don't end up in // the level data. - pEditor->Get3DEngine()->FreeUnusedCGFResources(); + if (pEditor->Get3DEngine()) + { + pEditor->Get3DEngine()->FreeUnusedCGFResources(); + } CCryEditDoc* pDocument = pEditor->GetDocument(); @@ -282,7 +285,7 @@ void CGameExporter::ExportVisAreas(const char* pszGamePath, EEndian eExportEndia SHotUpdateInfo exportInfo; I3DEngine* p3DEngine = pEditor->Get3DEngine(); - if (eExportEndian == GetPlatformEndian()) // skip second export, this data is common for PC and consoles + if (p3DEngine && (eExportEndian == GetPlatformEndian())) // skip second export, this data is common for PC and consoles { std::vector* pTempBrushTable = NULL; std::vector<_smart_ptr>* pTempMatsTable = NULL; @@ -367,25 +370,28 @@ void CGameExporter::ExportLevelData(const QString& path, bool bExportMission) QString missionFileName; QString currentMissionFileName; I3DEngine* p3DEngine = pEditor->Get3DEngine(); - for (int i = 0; i < pDocument->GetMissionCount(); i++) + if (p3DEngine) { - CMission* pMission = pDocument->GetMission(i); - - QString name = pMission->GetName(); - name.replace(' ', '_'); - missionFileName = QStringLiteral("Mission_%1.xml").arg(name); - - XmlNodeRef missionDescNode = missionsNode->newChild("Mission"); - missionDescNode->setAttr("Name", pMission->GetName().toUtf8().data()); - missionDescNode->setAttr("File", missionFileName.toUtf8().data()); - missionDescNode->setAttr("CGFCount", p3DEngine->GetLoadedObjectCount()); - - int nProgressBarRange = m_numExportedMaterials / 10 + p3DEngine->GetLoadedObjectCount(); - missionDescNode->setAttr("ProgressBarRange", nProgressBarRange); - - if (pMission == pCurrentMission) + for (int i = 0; i < pDocument->GetMissionCount(); i++) { - currentMissionFileName = missionFileName; + CMission* pMission = pDocument->GetMission(i); + + QString name = pMission->GetName(); + name.replace(' ', '_'); + missionFileName = QStringLiteral("Mission_%1.xml").arg(name); + + XmlNodeRef missionDescNode = missionsNode->newChild("Mission"); + missionDescNode->setAttr("Name", pMission->GetName().toUtf8().data()); + missionDescNode->setAttr("File", missionFileName.toUtf8().data()); + missionDescNode->setAttr("CGFCount", p3DEngine->GetLoadedObjectCount()); + + int nProgressBarRange = m_numExportedMaterials / 10 + p3DEngine->GetLoadedObjectCount(); + missionDescNode->setAttr("ProgressBarRange", nProgressBarRange); + + if (pMission == pCurrentMission) + { + currentMissionFileName = missionFileName; + } } } @@ -413,7 +419,10 @@ void CGameExporter::ExportLevelData(const QString& path, bool bExportMission) XmlNodeRef missionNode = rootAction->createNode("Mission"); pCurrentMission->Export(missionNode, objectsNode); - missionNode->setAttr("CGFCount", p3DEngine->GetLoadedObjectCount()); + if (p3DEngine) + { + missionNode->setAttr("CGFCount", p3DEngine->GetLoadedObjectCount()); + } //if (!CFileUtil::OverwriteFile( path+currentMissionFileName )) // return; @@ -483,6 +492,11 @@ void CGameExporter::ExportLevelInfo(const QString& path) ////////////////////////////////////////////////////////////////////////// void CGameExporter::ExportMapInfo(XmlNodeRef& node) { + if (!GetIEditor()->Get3DEngine()) + { + return; + } + XmlNodeRef info = node->newChild("LevelInfo"); IEditor* pEditor = GetIEditor(); diff --git a/Code/Sandbox/Editor/Mission.cpp b/Code/Sandbox/Editor/Mission.cpp index 57f2033f3b..b9668f1c80 100644 --- a/Code/Sandbox/Editor/Mission.cpp +++ b/Code/Sandbox/Editor/Mission.cpp @@ -212,8 +212,11 @@ void CMission::SyncContent(bool bRetrieve, bool bIgnoreObjects, [[maybe_unused]] else { // Save time of day. - m_timeOfDay = XmlHelpers::CreateXmlNode("TimeOfDay"); - GetIEditor()->Get3DEngine()->GetTimeOfDay()->Serialize(m_timeOfDay, false); + if (GetIEditor()->Get3DEngine()) + { + m_timeOfDay = XmlHelpers::CreateXmlNode("TimeOfDay"); + GetIEditor()->Get3DEngine()->GetTimeOfDay()->Serialize(m_timeOfDay, false); + } if (!bIgnoreObjects) { diff --git a/Code/Sandbox/Editor/ShaderCache.cpp b/Code/Sandbox/Editor/ShaderCache.cpp index 5a5b0d8f58..3beeb9a7c4 100644 --- a/Code/Sandbox/Editor/ShaderCache.cpp +++ b/Code/Sandbox/Editor/ShaderCache.cpp @@ -138,6 +138,7 @@ bool CLevelShaderCache::SaveBuffer(QString& textBuffer) void CLevelShaderCache::Update() { IRenderer* pRenderer = gEnv->pRenderer; + if (pRenderer) { QString buf; char* str = NULL; From 8c54cf8633b324365839bb4b3800209701b64e72 Mon Sep 17 00:00:00 2001 From: jromnoa Date: Mon, 26 Apr 2021 15:29:49 -0700 Subject: [PATCH 16/30] increase test timeout and add missing test case IDs --- ...ydra_AtomEditorComponents_AddedToEntity.py | 48 +--- .../atom_renderer/test_Atom_MainSuite.py | 209 ++++++++++++++++-- .../atom_renderer/test_Atom_SandboxSuite.py | 205 +---------------- 3 files changed, 203 insertions(+), 259 deletions(-) diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_AddedToEntity.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_AddedToEntity.py index 8701d2f211..1069fe6641 100644 --- a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_AddedToEntity.py +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_AddedToEntity.py @@ -7,25 +7,10 @@ distribution (the "License"). All use of this software is governed by the Licens or, if provided, by the license below or the license accompanying this file. Do not remove or modify any license notices. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +Hydra script that creates an entity and attaches Atom components to it for test verification. """ -# This module does a bulk test and update of many components at once. -# Each test case is listed below in the format: -# "Test Case ID: Test Case Title (URL)" - -# C32078130: Tone Mapper (https://testrail.agscollab.com/index.php?/cases/view/32078130) -# C32078129: Light (https://testrail.agscollab.com/index.php?/cases/view/32078129) -# C32078131: Radius Weight Modifier (https://testrail.agscollab.com/index.php?/cases/view/32078131) -# C32078127: PostFX Layer (https://testrail.agscollab.com/index.php?/cases/view/32078127) -# C32078126: Point Light (https://testrail.agscollab.com/index.php?/cases/view/32078126) -# C32078125: Physical Sky (https://testrail.agscollab.com/index.php?/cases/view/32078125) -# C32078115: Global Skylight (IBL) (https://testrail.agscollab.com/index.php?/cases/view/32078115) -# C32078121: Exposure Control (https://testrail.agscollab.com/index.php?/cases/view/32078121) -# C32078120: Directional Light (https://testrail.agscollab.com/index.php?/cases/view/32078120) -# C32078119: DepthOfField (https://testrail.agscollab.com/index.php?/cases/view/32078119) -# C32078118: Decal (https://testrail.agscollab.com/index.php?/cases/view/32078118) -# C32078117: Area Light (https://testrail.agscollab.com/index.php?/cases/view/32078117) - import os import sys @@ -151,28 +136,6 @@ def run(): # Wait for Editor idle loop before executing Python hydra scripts. TestHelper.init_idle() - # Create a new level. - new_level_name = "tmp_level" # Specified in TestAllComponentsBasicTests.py - heightmap_resolution = 512 - heightmap_meters_per_pixel = 1 - terrain_texture_resolution = 412 - use_terrain = False - - # Return codes are ECreateLevelResult defined in CryEdit.h - return_code = general.create_level_no_prompt( - new_level_name, heightmap_resolution, heightmap_meters_per_pixel, terrain_texture_resolution, use_terrain) - if return_code == 1: - general.log(f"{new_level_name} level already exists") - elif return_code == 2: - general.log("Failed to create directory") - elif return_code == 3: - general.log("Directory length is too long") - elif return_code != 0: - general.log("Unknown error, failed to create level") - else: - general.log(f"{new_level_name} level created successfully") - EditorTestHelper.after_level_load(bypass_viewport_resize=True) - # Delete all existing entities initially search_filter = azlmbr.entity.SearchFilter() all_entities = entity.SearchBus(azlmbr.bus.Broadcast, "SearchEntities", search_filter) @@ -209,7 +172,7 @@ def run(): entity_obj, ["Capsule Shape"], area_light)) # Decal Component - material_asset_path = os.path.join("Materials", "decal", "aiirship_nose_number_decal.material") + material_asset_path = os.path.join("Materials", "basic_grey.material") material_asset = asset.AssetCatalogRequestBus( bus.Broadcast, "GetAssetIdByPath", material_asset_path, math.Uuid(), False) ComponentTests( @@ -263,9 +226,12 @@ def run(): # Radius Weight Modifier Component ComponentTests("Radius Weight Modifier") - # Spot Light Component + # Light Component ComponentTests("Light") + # Display Mapper Component + ComponentTests("Display Mapper") + if __name__ == "__main__": run() diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py index 8031d7e65d..8621fcb248 100644 --- a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py @@ -13,32 +13,207 @@ import logging import os import pytest -import ly_test_tools.environment.file_system as file_system - import editor_python_test_tools.hydra_test_utils as hydra logger = logging.getLogger(__name__) -EDITOR_TIMEOUT = 60 +EDITOR_TIMEOUT = 120 TEST_DIRECTORY = os.path.join(os.path.dirname(__file__), "atom_hydra_scripts") @pytest.mark.parametrize("project", ["AutomatedTesting"]) @pytest.mark.parametrize("launcher_platform", ['windows_editor']) -@pytest.mark.parametrize("level", ["tmp_level"]) +@pytest.mark.parametrize("level", ["auto_test"]) class TestAtomEditorComponents(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, project, level): - # Cleanup our temp level - file_system.delete( - [os.path.join(workspace.paths.engine_root(), project, "Levels", "AtomLevels", level)], True, True) - def teardown(): - # Cleanup our temp level - file_system.delete( - [os.path.join(workspace.paths.engine_root(), project, "Levels", "AtomLevels", level)], True, True) - request.addfinalizer(teardown) + @pytest.mark.test_case_id( + "C32078117", # Area Light + "C32078130", # Display Mapper + "C32078129", # Light + "C32078131", # Radius Weight Modifier + "C32078127", # PostFX Layer + "C32078126", # Point Light + "C32078125", # Physical Sky + "C32078115", # Global Skylight (IBL) + "C32078121", # Exposure Control + "C32078120", # Directional Light + "C32078119", # DepthOfField + "C32078118") # Decal + def test_AtomEditorComponents_AddedToEntity(self, request, editor, level, workspace, project, launcher_platform): + cfg_args = [level] - # It requires at least one test - def test_Dummy(self, request, editor, level, workspace, project, launcher_platform): - pass + expected_lines = [ + # Area Light Component + "Area Light Entity successfully created", + "Area Light_test: Component added to the entity: True", + "Area Light_test: Component removed after UNDO: True", + "Area Light_test: Component added after REDO: True", + "Area Light_test: Entered game mode: True", + "Area Light_test: Entity enabled after adding required components: True", + "Area Light_test: Entity is hidden: True", + "Area Light_test: Entity is shown: True", + "Area Light_test: Entity deleted: True", + "Area Light_test: UNDO entity deletion works: True", + "Area Light_test: REDO entity deletion works: True", + # Decal Component + "Decal Entity successfully created", + "Decal_test: Component added to the entity: True", + "Decal_test: Component removed after UNDO: True", + "Decal_test: Component added after REDO: True", + "Decal_test: Entered game mode: True", + "Decal_test: Exit game mode: True", + "Decal Settings|Decal Settings|Material: SUCCESS", + "Decal_test: Entity is hidden: True", + "Decal_test: Entity is shown: True", + "Decal_test: Entity deleted: True", + "Decal_test: UNDO entity deletion works: True", + "Decal_test: REDO entity deletion works: True", + # DepthOfField Component + "DepthOfField Entity successfully created", + "DepthOfField_test: Component added to the entity: True", + "DepthOfField_test: Component removed after UNDO: True", + "DepthOfField_test: Component added after REDO: True", + "DepthOfField_test: Entered game mode: True", + "DepthOfField_test: Exit game mode: True", + "DepthOfField_test: Entity disabled initially: True", + "DepthOfField_test: Entity enabled after adding required components: True", + "DepthOfField Controller|Configuration|Camera Entity: SUCCESS", + "DepthOfField_test: Entity is hidden: True", + "DepthOfField_test: Entity is shown: True", + "DepthOfField_test: Entity deleted: True", + "DepthOfField_test: UNDO entity deletion works: True", + "DepthOfField_test: REDO entity deletion works: True", + # Directional Light Component + "Directional Light Entity successfully created", + "Directional Light_test: Component added to the entity: True", + "Directional Light_test: Component removed after UNDO: True", + "Directional Light_test: Component added after REDO: True", + "Directional Light_test: Entered game mode: True", + "Directional Light_test: Exit game mode: True", + "Directional Light Controller|Configuration|Shadow|Camera: SUCCESS", + "Directional Light_test: Entity is hidden: True", + "Directional Light_test: Entity is shown: True", + "Directional Light_test: Entity deleted: True", + "Directional Light_test: UNDO entity deletion works: True", + "Directional Light_test: REDO entity deletion works: True", + # Exposure Control Component + "Exposure Control Entity successfully created", + "Exposure Control_test: Component added to the entity: True", + "Exposure Control_test: Component removed after UNDO: True", + "Exposure Control_test: Component added after REDO: True", + "Exposure Control_test: Entered game mode: True", + "Exposure Control_test: Exit game mode: True", + "Exposure Control_test: Entity disabled initially: True", + "Exposure Control_test: Entity enabled after adding required components: True", + "Exposure Control_test: Entity is hidden: True", + "Exposure Control_test: Entity is shown: True", + "Exposure Control_test: Entity deleted: True", + "Exposure Control_test: UNDO entity deletion works: True", + "Exposure Control_test: REDO entity deletion works: True", + # Global Skylight (IBL) Component + "Global Skylight (IBL) Entity successfully created", + "Global Skylight (IBL)_test: Component added to the entity: True", + "Global Skylight (IBL)_test: Component removed after UNDO: True", + "Global Skylight (IBL)_test: Component added after REDO: True", + "Global Skylight (IBL)_test: Entered game mode: True", + "Global Skylight (IBL)_test: Exit game mode: True", + "Global Skylight (IBL) Controller|Configuration|Diffuse Image: SUCCESS", + "Global Skylight (IBL) Controller|Configuration|Specular Image: SUCCESS", + "Global Skylight (IBL)_test: Entity is hidden: True", + "Global Skylight (IBL)_test: Entity is shown: True", + "Global Skylight (IBL)_test: Entity deleted: True", + "Global Skylight (IBL)_test: UNDO entity deletion works: True", + "Global Skylight (IBL)_test: REDO entity deletion works: True", + # Physical Sky Component + "Physical Sky Entity successfully created", + "Physical Sky component was added to entity", + "Entity has a Physical Sky component", + "Physical Sky_test: Component added to the entity: True", + "Physical Sky_test: Component removed after UNDO: True", + "Physical Sky_test: Component added after REDO: True", + "Physical Sky_test: Entered game mode: True", + "Physical Sky_test: Exit game mode: True", + "Physical Sky_test: Entity is hidden: True", + "Physical Sky_test: Entity is shown: True", + "Physical Sky_test: Entity deleted: True", + "Physical Sky_test: UNDO entity deletion works: True", + "Physical Sky_test: REDO entity deletion works: True", + # Point Light Component + "Point Light Entity successfully created", + "Point Light_test: Component added to the entity: True", + "Point Light_test: Component removed after UNDO: True", + "Point Light_test: Component added after REDO: True", + "Point Light_test: Entered game mode: True", + "Point Light_test: Exit game mode: True", + "Point Light_test: Entity is hidden: True", + "Point Light_test: Entity is shown: True", + "Point Light_test: Entity deleted: True", + "Point Light_test: UNDO entity deletion works: True", + "Point Light_test: REDO entity deletion works: True", + # PostFX Layer Component + "PostFX Layer Entity successfully created", + "PostFX Layer_test: Component added to the entity: True", + "PostFX Layer_test: Component removed after UNDO: True", + "PostFX Layer_test: Component added after REDO: True", + "PostFX Layer_test: Entered game mode: True", + "PostFX Layer_test: Exit game mode: True", + "PostFX Layer_test: Entity is hidden: True", + "PostFX Layer_test: Entity is shown: True", + "PostFX Layer_test: Entity deleted: True", + "PostFX Layer_test: UNDO entity deletion works: True", + "PostFX Layer_test: REDO entity deletion works: True", + # Radius Weight Modifier Component + "Radius Weight Modifier Entity successfully created", + "Radius Weight Modifier_test: Component added to the entity: True", + "Radius Weight Modifier_test: Component removed after UNDO: True", + "Radius Weight Modifier_test: Component added after REDO: True", + "Radius Weight Modifier_test: Entered game mode: True", + "Radius Weight Modifier_test: Exit game mode: True", + "Radius Weight Modifier_test: Entity is hidden: True", + "Radius Weight Modifier_test: Entity is shown: True", + "Radius Weight Modifier_test: Entity deleted: True", + "Radius Weight Modifier_test: UNDO entity deletion works: True", + "Radius Weight Modifier_test: REDO entity deletion works: True", + # Light Component + "Light Entity successfully created", + "Light_test: Component added to the entity: True", + "Light_test: Component removed after UNDO: True", + "Light_test: Component added after REDO: True", + "Light_test: Entered game mode: True", + "Light_test: Exit game mode: True", + "Light_test: Entity is hidden: True", + "Light_test: Entity is shown: True", + "Light_test: Entity deleted: True", + "Light_test: UNDO entity deletion works: True", + "Light_test: REDO entity deletion works: True", + # Display Mapper Component + "Display Mapper Entity successfully created", + "Display Mapper_test: Component added to the entity: True", + "Display Mapper_test: Component removed after UNDO: True", + "Display Mapper_test: Component added after REDO: True", + "Display Mapper_test: Entered game mode: True", + "Display Mapper_test: Exit game mode: True", + "Display Mapper_test: Entity is hidden: True", + "Display Mapper_test: Entity is shown: True", + "Display Mapper_test: Entity deleted: True", + "Display Mapper_test: UNDO entity deletion works: True", + "Display Mapper_test: REDO entity deletion works: True", + ] + + unexpected_lines = [ + "failed to open", + "Traceback (most recent call last):", + ] + + hydra.launch_and_validate_results( + request, + TEST_DIRECTORY, + editor, + "hydra_AtomEditorComponents_AddedToEntity.py", + timeout=EDITOR_TIMEOUT, + expected_lines=expected_lines, + unexpected_lines=unexpected_lines, + halt_on_unexpected=True, + null_renderer=True, + cfg_args=cfg_args, + ) diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_SandboxSuite.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_SandboxSuite.py index a82d5c5fd4..01474e6018 100644 --- a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_SandboxSuite.py +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_SandboxSuite.py @@ -9,211 +9,14 @@ remove or modify any license notices. This file is distributed on an "AS IS" BAS WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. """ -import logging -import os import pytest -import ly_test_tools.environment.file_system as file_system - -import editor_python_test_tools.hydra_test_utils as hydra - -logger = logging.getLogger(__name__) -EDITOR_TIMEOUT = 60 -TEST_DIRECTORY = os.path.join(os.path.dirname(__file__), "atom_hydra_scripts") - @pytest.mark.parametrize("project", ["AutomatedTesting"]) @pytest.mark.parametrize("launcher_platform", ['windows_editor']) -@pytest.mark.parametrize("level", ["tmp_level"]) +@pytest.mark.parametrize("level", ["auto_test"]) class TestAtomEditorComponents(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, project, level): - # Cleanup our temp level - file_system.delete( - [os.path.join(workspace.paths.engine_root(), project, "Levels", "AtomLevels", level)], True, True) - def teardown(): - # Cleanup our temp level - file_system.delete( - [os.path.join(workspace.paths.engine_root(), project, "Levels", "AtomLevels", level)], True, True) - - request.addfinalizer(teardown) - - @pytest.mark.test_case_id( - "C32078130", # Tone Mapper - "C32078129", # Light - "C32078131", # Radius Weight Modifier - "C32078127", # PostFX Layer - "C32078126", # Point Light - "C32078125", # Physical Sky - "C32078115", # Global Skylight (IBL) - "C32078121", # Exposure Control - "C32078120", # Directional Light - "C32078119", # DepthOfField - "C32078118") # Decal - def test_AtomEditorComponents_AddedToEntity(self, request, editor, level, workspace, project, launcher_platform): - cfg_args = [level] - - expected_lines = [ - # Area Light Component - "Area Light Entity successfully created", - "Area Light_test: Component added to the entity: True", - "Area Light_test: Component removed after UNDO: True", - "Area Light_test: Component added after REDO: True", - "Area Light_test: Entered game mode: True", - "Area Light_test: Entity enabled after adding required components: True", - "Area Light_test: Entity is hidden: True", - "Area Light_test: Entity is shown: True", - "Area Light_test: Entity deleted: True", - "Area Light_test: UNDO entity deletion works: True", - "Area Light_test: REDO entity deletion works: True", - # Decal Component - "Decal Entity successfully created", - "Decal_test: Component added to the entity: True", - "Decal_test: Component removed after UNDO: True", - "Decal_test: Component added after REDO: True", - "Decal_test: Entered game mode: True", - "Decal_test: Exit game mode: True", - "Decal Settings|Decal Settings|Material: SUCCESS", - "Decal_test: Entity is hidden: True", - "Decal_test: Entity is shown: True", - "Decal_test: Entity deleted: True", - "Decal_test: UNDO entity deletion works: True", - "Decal_test: REDO entity deletion works: True", - # DepthOfField Component - "DepthOfField Entity successfully created", - "DepthOfField_test: Component added to the entity: True", - "DepthOfField_test: Component removed after UNDO: True", - "DepthOfField_test: Component added after REDO: True", - "DepthOfField_test: Entered game mode: True", - "DepthOfField_test: Exit game mode: True", - "DepthOfField_test: Entity disabled initially: True", - "DepthOfField_test: Entity enabled after adding required components: True", - "DepthOfField Controller|Configuration|Camera Entity: SUCCESS", - "DepthOfField_test: Entity is hidden: True", - "DepthOfField_test: Entity is shown: True", - "DepthOfField_test: Entity deleted: True", - "DepthOfField_test: UNDO entity deletion works: True", - "DepthOfField_test: REDO entity deletion works: True", - # Directional Light Component - "Directional Light Entity successfully created", - "Directional Light_test: Component added to the entity: True", - "Directional Light_test: Component removed after UNDO: True", - "Directional Light_test: Component added after REDO: True", - "Directional Light_test: Entered game mode: True", - "Directional Light_test: Exit game mode: True", - "Directional Light Controller|Configuration|Shadow|Camera: SUCCESS", - "Directional Light_test: Entity is hidden: True", - "Directional Light_test: Entity is shown: True", - "Directional Light_test: Entity deleted: True", - "Directional Light_test: UNDO entity deletion works: True", - "Directional Light_test: REDO entity deletion works: True", - # Exposure Control Component - "Exposure Control Entity successfully created", - "Exposure Control_test: Component added to the entity: True", - "Exposure Control_test: Component removed after UNDO: True", - "Exposure Control_test: Component added after REDO: True", - "Exposure Control_test: Entered game mode: True", - "Exposure Control_test: Exit game mode: True", - "Exposure Control_test: Entity disabled initially: True", - "Exposure Control_test: Entity enabled after adding required components: True", - "Exposure Control_test: Entity is hidden: True", - "Exposure Control_test: Entity is shown: True", - "Exposure Control_test: Entity deleted: True", - "Exposure Control_test: UNDO entity deletion works: True", - "Exposure Control_test: REDO entity deletion works: True", - # Global Skylight (IBL) Component - "Global Skylight (IBL) Entity successfully created", - "Global Skylight (IBL)_test: Component added to the entity: True", - "Global Skylight (IBL)_test: Component removed after UNDO: True", - "Global Skylight (IBL)_test: Component added after REDO: True", - "Global Skylight (IBL)_test: Entered game mode: True", - "Global Skylight (IBL)_test: Exit game mode: True", - "Global Skylight (IBL) Controller|Configuration|Diffuse Image: SUCCESS", - "Global Skylight (IBL) Controller|Configuration|Specular Image: SUCCESS", - "Global Skylight (IBL)_test: Entity is hidden: True", - "Global Skylight (IBL)_test: Entity is shown: True", - "Global Skylight (IBL)_test: Entity deleted: True", - "Global Skylight (IBL)_test: UNDO entity deletion works: True", - "Global Skylight (IBL)_test: REDO entity deletion works: True", - # Physical Sky Component - "Physical Sky Entity successfully created", - "Physical Sky component was added to entity", - "Entity has a Physical Sky component", - "Physical Sky_test: Component added to the entity: True", - "Physical Sky_test: Component removed after UNDO: True", - "Physical Sky_test: Component added after REDO: True", - "Physical Sky_test: Entered game mode: True", - "Physical Sky_test: Exit game mode: True", - "Physical Sky_test: Entity is hidden: True", - "Physical Sky_test: Entity is shown: True", - "Physical Sky_test: Entity deleted: True", - "Physical Sky_test: UNDO entity deletion works: True", - "Physical Sky_test: REDO entity deletion works: True", - # Point Light Component - "Point Light Entity successfully created", - "Point Light_test: Component added to the entity: True", - "Point Light_test: Component removed after UNDO: True", - "Point Light_test: Component added after REDO: True", - "Point Light_test: Entered game mode: True", - "Point Light_test: Exit game mode: True", - "Point Light_test: Entity is hidden: True", - "Point Light_test: Entity is shown: True", - "Point Light_test: Entity deleted: True", - "Point Light_test: UNDO entity deletion works: True", - "Point Light_test: REDO entity deletion works: True", - # PostFX Layer Component - "PostFX Layer Entity successfully created", - "PostFX Layer_test: Component added to the entity: True", - "PostFX Layer_test: Component removed after UNDO: True", - "PostFX Layer_test: Component added after REDO: True", - "PostFX Layer_test: Entered game mode: True", - "PostFX Layer_test: Exit game mode: True", - "PostFX Layer_test: Entity is hidden: True", - "PostFX Layer_test: Entity is shown: True", - "PostFX Layer_test: Entity deleted: True", - "PostFX Layer_test: UNDO entity deletion works: True", - "PostFX Layer_test: REDO entity deletion works: True", - # Radius Weight Modifier Component - "Radius Weight Modifier Entity successfully created", - "Radius Weight Modifier_test: Component added to the entity: True", - "Radius Weight Modifier_test: Component removed after UNDO: True", - "Radius Weight Modifier_test: Component added after REDO: True", - "Radius Weight Modifier_test: Entered game mode: True", - "Radius Weight Modifier_test: Exit game mode: True", - "Radius Weight Modifier_test: Entity is hidden: True", - "Radius Weight Modifier_test: Entity is shown: True", - "Radius Weight Modifier_test: Entity deleted: True", - "Radius Weight Modifier_test: UNDO entity deletion works: True", - "Radius Weight Modifier_test: REDO entity deletion works: True", - # Light Component - "Light Entity successfully created", - "Light_test: Component added to the entity: True", - "Light_test: Component removed after UNDO: True", - "Light_test: Component added after REDO: True", - "Light_test: Entered game mode: True", - "Light_test: Exit game mode: True", - "Light_test: Entity is hidden: True", - "Light_test: Entity is shown: True", - "Light_test: Entity deleted: True", - "Light_test: UNDO entity deletion works: True", - "Light_test: REDO entity deletion works: True", - ] - - unexpected_lines = [ - "failed to open", - "Traceback (most recent call last):", - ] - - hydra.launch_and_validate_results( - request, - TEST_DIRECTORY, - editor, - "hydra_AtomEditorComponents_AddedToEntity.py", - timeout=EDITOR_TIMEOUT, - expected_lines=expected_lines, - unexpected_lines=unexpected_lines, - halt_on_unexpected=True, - null_renderer=True, - cfg_args=cfg_args, - ) + # It requires at least one test + def test_Dummy(self, request, editor, level, workspace, project, launcher_platform): + pass From bf70ccaa398ae0580bf72a730ac43bf5e68b7292 Mon Sep 17 00:00:00 2001 From: jromnoa Date: Mon, 26 Apr 2021 15:32:29 -0700 Subject: [PATCH 17/30] remove unused import --- .../hydra_AtomEditorComponents_AddedToEntity.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_AddedToEntity.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_AddedToEntity.py index 1069fe6641..82a7e92c16 100644 --- a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_AddedToEntity.py +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_AddedToEntity.py @@ -26,10 +26,6 @@ sys.path.append(os.path.join(azlmbr.paths.devroot, "AutomatedTesting", "Gem", "P import editor_python_test_tools.hydra_editor_utils as hydra from editor_python_test_tools.utils import TestHelper -from editor_python_test_tools.editor_test_helper import EditorTestHelper - - -EditorTestHelper = EditorTestHelper(log_prefix="AtomEditorComponents") def run(): From 7da10ac9243e3af6410859696b8ae9727c267797 Mon Sep 17 00:00:00 2001 From: Gene Walters Date: Mon, 26 Apr 2021 16:17:14 -0700 Subject: [PATCH 18/30] Null check when removing old component variables. This is used for graph properties that have been deleted. --- .../Code/Editor/Components/EditorScriptCanvasComponent.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Gems/ScriptCanvas/Code/Editor/Components/EditorScriptCanvasComponent.cpp b/Gems/ScriptCanvas/Code/Editor/Components/EditorScriptCanvasComponent.cpp index f49ace2e58..ba82f58889 100644 --- a/Gems/ScriptCanvas/Code/Editor/Components/EditorScriptCanvasComponent.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Components/EditorScriptCanvasComponent.cpp @@ -528,8 +528,10 @@ namespace ScriptCanvasEditor { const auto& variableId = varConfig.m_graphVariable.GetVariableId(); + // We only add component sourced graph properties to the script canvas component, so if this variable was switched to a graph-only property remove it. + // Also be sure to remove this variable if it's been deleted entirely. auto graphVariable = graphVarData.FindVariable(variableId); - if (!graphVariable->IsComponentProperty()) + if (!graphVariable || !graphVariable->IsComponentProperty()) { oldVariableIds.push_back(variableId); } From 9da734990768695964309fe5ba7af2335c74fc86 Mon Sep 17 00:00:00 2001 From: jromnoa Date: Mon, 26 Apr 2021 17:52:19 -0700 Subject: [PATCH 19/30] fix DEV_DIR variable for ctest_entrypoint.cmd --- scripts/ctest/ctest_entrypoint.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/ctest/ctest_entrypoint.cmd b/scripts/ctest/ctest_entrypoint.cmd index 585c1223f5..cbdbcc76ef 100644 --- a/scripts/ctest/ctest_entrypoint.cmd +++ b/scripts/ctest/ctest_entrypoint.cmd @@ -13,7 +13,7 @@ REM Continuous Integration CLI entrypoint script to start CTest, triggering post REM SETLOCAL -SET DEV_DIR=%~dp0\.. +SET DEV_DIR=%~dp0\..\.. SET PYTHON=%DEV_DIR%\python\python.cmd SET CTEST_SCRIPT=%~dp0\ctest_driver.py From c415fcc0b42dd42c349be98fc050de57ba396885 Mon Sep 17 00:00:00 2001 From: Aaron Ruiz Mora Date: Tue, 27 Apr 2021 10:00:27 +0100 Subject: [PATCH 20/30] Cloth will override all the vertices of the mesh and do CPU skinning on the non-simulated vertices when the optimization 'remove static particles' is enabled --- .../ClothComponentMesh/ActorClothSkinning.cpp | 191 ++++++++++-------- .../ClothComponentMesh/ActorClothSkinning.h | 29 ++- .../ClothComponentMesh/ClothComponentMesh.cpp | 49 +++-- Gems/NvCloth/Code/Source/Utils/AssetHelper.h | 3 + .../Code/Source/Utils/MeshAssetHelper.cpp | 9 + .../ActorClothSkinningTest.cpp | 24 +-- 6 files changed, 179 insertions(+), 126 deletions(-) diff --git a/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ActorClothSkinning.cpp b/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ActorClothSkinning.cpp index ffbba25ee0..0baa385f44 100644 --- a/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ActorClothSkinning.cpp +++ b/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ActorClothSkinning.cpp @@ -33,7 +33,6 @@ namespace NvCloth AZ::EntityId entityId, const MeshNodeInfo& meshNodeInfo, const size_t numSimParticles, - const AZStd::vector& meshRemappedVertices, AZStd::vector& skinningData) { AZ::Data::Asset modelAsset; @@ -115,14 +114,7 @@ namespace NvCloth for (int vertexIndex = 0; vertexIndex < subMeshInfo.m_numVertices; ++vertexIndex) { - const int skinnedDataIndex = meshRemappedVertices[subMeshInfo.m_verticesFirstIndex + vertexIndex]; - if (skinnedDataIndex < 0) - { - // Removed particle - continue; - } - - SkinningInfo& skinningInfo = skinningData[skinnedDataIndex]; + SkinningInfo& skinningInfo = skinningData[subMeshInfo.m_verticesFirstIndex + vertexIndex]; skinningInfo.m_jointIndices.resize(influenceCount); skinningInfo.m_jointWeights.resize(influenceCount); @@ -208,19 +200,17 @@ namespace NvCloth { } + protected: // ActorClothSkinning overrides ... void UpdateSkinning() override; - void ApplySkinning( - const AZStd::vector& originalPositions, - AZStd::vector& positions) override; + bool HasSkinningTransformData() override; + void ComputeVertexSkinnningTransform(const SkinningInfo& skinningInfo) override; + AZ::Vector3 ComputeSkinningPosition(const AZ::Vector3& originalPosition) override; + AZ::Vector3 ComputeSkinningVector(const AZ::Vector3& originalVector) override; private: - AZ::Vector3 ComputeSkinnedPosition( - const AZ::Vector3& originalPosition, - const SkinningInfo& skinningInfo, - const AZ::Matrix3x4* skinningMatrices); - const AZ::Matrix3x4* m_skinningMatrices = nullptr; + AZ::Matrix3x4 m_vertexSkinningTransform = AZ::Matrix3x4::CreateIdentity(); }; void ActorClothSkinningLinear::UpdateSkinning() @@ -230,35 +220,14 @@ namespace NvCloth m_skinningMatrices = Internal::ObtainSkinningMatrices(m_entityId); } - void ActorClothSkinningLinear::ApplySkinning( - const AZStd::vector& originalPositions, - AZStd::vector& positions) + bool ActorClothSkinningLinear::HasSkinningTransformData() { - if (!m_skinningMatrices) - { - return; - } - - AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Cloth); - - for (size_t index = 0; index < originalPositions.size(); ++index) - { - const AZ::Vector3 skinnedPosition = ComputeSkinnedPosition( - originalPositions[index].GetAsVector3(), - m_skinningData[index], - m_skinningMatrices); - - // Avoid overwriting the w component - positions[index].Set(skinnedPosition, positions[index].GetW()); - } + return m_skinningMatrices != nullptr; } - AZ::Vector3 ActorClothSkinningLinear::ComputeSkinnedPosition( - const AZ::Vector3& originalPosition, - const SkinningInfo& skinningInfo, - const AZ::Matrix3x4* skinningMatrices) + void ActorClothSkinningLinear::ComputeVertexSkinnningTransform(const SkinningInfo& skinningInfo) { - AZ::Matrix3x4 clothSkinningMatrix = AZ::Matrix3x4::CreateZero(); + m_vertexSkinningTransform = AZ::Matrix3x4::CreateZero(); for (size_t weightIndex = 0; weightIndex < skinningInfo.m_jointWeights.size(); ++weightIndex) { const AZ::u16 jointIndex = skinningInfo.m_jointIndices[weightIndex]; @@ -273,11 +242,19 @@ namespace NvCloth // This way the skinning results are much similar to the skinning performed in GPU. for (int i = 0; i < 3; ++i) { - clothSkinningMatrix.SetRow(i, clothSkinningMatrix.GetRow(i) + skinningMatrices[jointIndex].GetRow(i) * jointWeight); + m_vertexSkinningTransform.SetRow(i, m_vertexSkinningTransform.GetRow(i) + m_skinningMatrices[jointIndex].GetRow(i) * jointWeight); } } + } - return clothSkinningMatrix * originalPosition; + AZ::Vector3 ActorClothSkinningLinear::ComputeSkinningPosition(const AZ::Vector3& originalPosition) + { + return m_vertexSkinningTransform * originalPosition; + } + + AZ::Vector3 ActorClothSkinningLinear::ComputeSkinningVector(const AZ::Vector3& originalVector) + { + return (m_vertexSkinningTransform * AZ::Vector4::CreateFromVector3AndFloat(originalVector, 0.0f)).GetAsVector3().GetNormalized(); } // Specialized class that applies dual quaternion blending skinning @@ -290,22 +267,19 @@ namespace NvCloth { } + protected: // ActorClothSkinning overrides ... void UpdateSkinning() override; - void ApplySkinning( - const AZStd::vector& originalPositions, - AZStd::vector& positions) override; + bool HasSkinningTransformData() override; + void ComputeVertexSkinnningTransform(const SkinningInfo& skinningInfo) override; + AZ::Vector3 ComputeSkinningPosition(const AZ::Vector3& originalPosition) override; + AZ::Vector3 ComputeSkinningVector(const AZ::Vector3& originalVector) override; private: - AZ::Vector3 ComputeSkinnedPosition( - const AZ::Vector3& originalPosition, - const SkinningInfo& skinningInfo, - const AZStd::unordered_map& skinningDualQuaternions); - AZStd::unordered_map m_skinningDualQuaternions; + DualQuat m_vertexSkinningTransform = DualQuat(type_identity::IDENTITY); }; - void ActorClothSkinningDualQuaternion::UpdateSkinning() { AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Cloth); @@ -313,35 +287,14 @@ namespace NvCloth m_skinningDualQuaternions = Internal::ObtainSkinningDualQuaternions(m_entityId, m_jointIndices); } - void ActorClothSkinningDualQuaternion::ApplySkinning( - const AZStd::vector& originalPositions, - AZStd::vector& positions) + bool ActorClothSkinningDualQuaternion::HasSkinningTransformData() { - if (m_skinningDualQuaternions.empty()) - { - return; - } - - AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Cloth); - - for (size_t index = 0; index < originalPositions.size(); ++index) - { - const AZ::Vector3 skinnedPosition = ComputeSkinnedPosition( - originalPositions[index].GetAsVector3(), - m_skinningData[index], - m_skinningDualQuaternions); - - // Avoid overwriting the w component - positions[index].Set(skinnedPosition, positions[index].GetW()); - } + return !m_skinningDualQuaternions.empty(); } - AZ::Vector3 ActorClothSkinningDualQuaternion::ComputeSkinnedPosition( - const AZ::Vector3& originalPosition, - const SkinningInfo& skinningInfo, - const AZStd::unordered_map& skinningDualQuaternions) + void ActorClothSkinningDualQuaternion::ComputeVertexSkinnningTransform(const SkinningInfo& skinningInfo) { - DualQuat clothSkinningDualQuaternion(type_zero::ZERO); + m_vertexSkinningTransform = DualQuat(type_zero::ZERO); for (size_t weightIndex = 0; weightIndex < skinningInfo.m_jointWeights.size(); ++weightIndex) { const AZ::u16 jointIndex = skinningInfo.m_jointIndices[weightIndex]; @@ -352,21 +305,28 @@ namespace NvCloth continue; } - clothSkinningDualQuaternion += skinningDualQuaternions.at(jointIndex) * jointWeight; + m_vertexSkinningTransform += m_skinningDualQuaternions.at(jointIndex) * jointWeight; } - clothSkinningDualQuaternion.Normalize(); + m_vertexSkinningTransform.Normalize(); + } - return LYVec3ToAZVec3(clothSkinningDualQuaternion * AZVec3ToLYVec3(originalPosition)); + AZ::Vector3 ActorClothSkinningDualQuaternion::ComputeSkinningPosition(const AZ::Vector3& originalPosition) + { + return LYVec3ToAZVec3(m_vertexSkinningTransform * AZVec3ToLYVec3(originalPosition)); + } + + AZ::Vector3 ActorClothSkinningDualQuaternion::ComputeSkinningVector(const AZ::Vector3& originalVector) + { + return LYVec3ToAZVec3(m_vertexSkinningTransform.nq * AZVec3ToLYVec3(originalVector)).GetNormalized(); } AZStd::unique_ptr ActorClothSkinning::Create( AZ::EntityId entityId, const MeshNodeInfo& meshNodeInfo, - const size_t numSimParticles, - const AZStd::vector& meshRemappedVertices) + const size_t numSimParticles) { AZStd::vector skinningData; - if (!Internal::ObtainSkinningData(entityId, meshNodeInfo, numSimParticles, meshRemappedVertices, skinningData)) + if (!Internal::ObtainSkinningData(entityId, meshNodeInfo, numSimParticles, skinningData)) { return nullptr; } @@ -427,6 +387,69 @@ namespace NvCloth { } + void ActorClothSkinning::ApplySkinning( + const AZStd::vector& originalPositions, + AZStd::vector& positions, + const AZStd::vector& meshRemappedVertices) + { + if (!HasSkinningTransformData() || + originalPositions.empty() || + originalPositions.size() != positions.size() || + m_skinningData.size() != meshRemappedVertices.size()) + { + return; + } + + AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Cloth); + + AZStd::unordered_set skinnedIndices; + for (size_t index = 0; index < meshRemappedVertices.size(); ++index) + { + const int remappedIndex = meshRemappedVertices[index]; + if (remappedIndex >= 0 && !skinnedIndices.contains(remappedIndex)) + { + ComputeVertexSkinnningTransform(m_skinningData[index]); + + const AZ::Vector3 skinnedPosition = ComputeSkinningPosition(originalPositions[remappedIndex].GetAsVector3()); + positions[remappedIndex].Set(skinnedPosition, positions[remappedIndex].GetW()); // Avoid overwriting the w component + + skinnedIndices.emplace(remappedIndex); // Avoid computing this index again + } + } + } + + void ActorClothSkinning::ApplySkinninOnRemovedVertices( + const MeshClothInfo& originalData, + ClothComponentMesh::RenderData& renderData, + const AZStd::vector& meshRemappedVertices) + { + if (!HasSkinningTransformData() || + originalData.m_particles.empty() || + originalData.m_particles.size() != renderData.m_particles.size() || + originalData.m_particles.size() != m_skinningData.size() || + m_skinningData.size() != meshRemappedVertices.size()) + { + return; + } + + AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Cloth); + + for (size_t index = 0; index < originalData.m_particles.size(); ++index) + { + if (meshRemappedVertices[index] < 0) + { + ComputeVertexSkinnningTransform(m_skinningData[index]); + + const AZ::Vector3 skinnedPosition = ComputeSkinningPosition(originalData.m_particles[index].GetAsVector3()); + renderData.m_particles[index].Set(skinnedPosition, renderData.m_particles[index].GetW()); // Avoid overwriting the w component + + renderData.m_tangents[index] = ComputeSkinningVector(originalData.m_tangents[index]); + renderData.m_bitangents[index] = ComputeSkinningVector(originalData.m_bitangents[index]); + renderData.m_normals[index] = ComputeSkinningVector(originalData.m_normals[index]); + } + } + } + void ActorClothSkinning::UpdateActorVisibility() { bool isVisible = true; diff --git a/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ActorClothSkinning.h b/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ActorClothSkinning.h index 8fd77c9347..8cf139c75a 100644 --- a/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ActorClothSkinning.h +++ b/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ActorClothSkinning.h @@ -16,6 +16,8 @@ #include +#include + namespace NvCloth { struct MeshNodeInfo; @@ -42,8 +44,7 @@ namespace NvCloth static AZStd::unique_ptr Create( AZ::EntityId entityId, const MeshNodeInfo& meshNodeInfo, - const size_t numSimParticles, - const AZStd::vector& meshRemappedVertices); + const size_t numSimParticles); explicit ActorClothSkinning(AZ::EntityId entityId); @@ -52,9 +53,17 @@ namespace NvCloth //! Applies skinning to a list of positions. //! @note w components are not affected. - virtual void ApplySkinning( + void ApplySkinning( const AZStd::vector& originalPositions, - AZStd::vector& positions) = 0; + AZStd::vector& positions, + const AZStd::vector& meshRemappedVertices); + + //! Applies skinning to a list of positions and vectors whose vertices + //! have not been used for simulation (remapped index is negative). + void ApplySkinninOnRemovedVertices( + const MeshClothInfo& originalData, + ClothComponentMesh::RenderData& renderData, + const AZStd::vector& meshRemappedVertices); //! Updates visibility variables. void UpdateActorVisibility(); @@ -66,6 +75,18 @@ namespace NvCloth bool WasActorVisible() const; protected: + //! Returns true if it has valid skinning trasform data. + virtual bool HasSkinningTransformData() = 0; + + //! Computes the skinnning transformation to apply to a vertex data. + virtual void ComputeVertexSkinnningTransform(const SkinningInfo& skinningInfo) = 0; + + //! Computes skinning on a position. + virtual AZ::Vector3 ComputeSkinningPosition(const AZ::Vector3& originalPosition) = 0; + + //! Computes skinning on a vector. + virtual AZ::Vector3 ComputeSkinningVector(const AZ::Vector3& originalVector) = 0; + AZ::EntityId m_entityId; // Skinning information of all particles diff --git a/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ClothComponentMesh.cpp b/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ClothComponentMesh.cpp index f1d088823f..740518b61a 100644 --- a/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ClothComponentMesh.cpp +++ b/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ClothComponentMesh.cpp @@ -166,6 +166,13 @@ namespace NvCloth // Initialize render data m_renderDataBufferIndex = 0; + { + auto& renderData = GetRenderData(); + renderData.m_particles = m_meshClothInfo.m_particles; + renderData.m_tangents = m_meshClothInfo.m_tangents; + renderData.m_bitangents = m_meshClothInfo.m_bitangents; + renderData.m_normals = m_meshClothInfo.m_normals; + } UpdateRenderData(m_cloth->GetParticles()); // Copy the first initialized element to the rest of the buffer for (AZ::u32 i = 1; i < RenderDataBufferSize; ++i) @@ -177,7 +184,7 @@ namespace NvCloth m_actorClothColliders = ActorClothColliders::Create(m_entityId); // It will return a valid instance if it's an actor with skinning data. - m_actorClothSkinning = ActorClothSkinning::Create(m_entityId, m_meshNodeInfo, m_cloth->GetParticles().size(), m_meshRemappedVertices); + m_actorClothSkinning = ActorClothSkinning::Create(m_entityId, m_meshNodeInfo, m_meshClothInfo.m_particles.size()); m_numberOfClothSkinningUpdates = 0; m_clothConstraints = ClothConstraints::Create( @@ -356,7 +363,7 @@ namespace NvCloth { // Update skinning for all particles and apply it to cloth AZStd::vector particles = m_cloth->GetParticles(); - m_actorClothSkinning->ApplySkinning(m_cloth->GetInitialParticles(), particles); + m_actorClothSkinning->ApplySkinning(m_cloth->GetInitialParticles(), particles, m_meshRemappedVertices); m_cloth->SetParticles(AZStd::move(particles)); m_cloth->DiscardParticleDelta(); } @@ -372,8 +379,8 @@ namespace NvCloth if (m_actorClothSkinning) { - m_actorClothSkinning->ApplySkinning(m_clothConstraints->GetMotionConstraints(), m_motionConstraints); - m_actorClothSkinning->ApplySkinning(m_clothConstraints->GetSeparationConstraints(), m_separationConstraints); + m_actorClothSkinning->ApplySkinning(m_clothConstraints->GetMotionConstraints(), m_motionConstraints, m_meshRemappedVertices); + m_actorClothSkinning->ApplySkinning(m_clothConstraints->GetSeparationConstraints(), m_separationConstraints, m_meshRemappedVertices); } m_cloth->GetClothConfigurator()->SetMotionConstraints(m_motionConstraints); @@ -392,6 +399,14 @@ namespace NvCloth return; } + auto& renderData = GetRenderData(); + + if (m_config.m_removeStaticTriangles && m_actorClothSkinning) + { + // Apply skinning to the non-simulated part of the mesh. + m_actorClothSkinning->ApplySkinninOnRemovedVertices(m_meshClothInfo, renderData, m_meshRemappedVertices); + } + // Calculate normals of the cloth particles (simplified mesh). AZStd::vector normals; [[maybe_unused]] bool normalsCalculated = @@ -401,19 +416,10 @@ namespace NvCloth // Copy particles and normals to render data. // Since cloth's vertices were welded together, // the full mesh will result in smooth normals. - auto& renderData = GetRenderData(); - renderData.m_particles.resize_no_construct(m_meshRemappedVertices.size()); - renderData.m_normals.resize_no_construct(m_meshRemappedVertices.size()); for (size_t index = 0; index < m_meshRemappedVertices.size(); ++index) { const int remappedIndex = m_meshRemappedVertices[index]; - if (remappedIndex < 0) - { - // Removed particle. Assign initial values to have something valid during tangents and bitangents calculation. - renderData.m_particles[index] = m_meshClothInfo.m_particles[index]; - renderData.m_normals[index] = AZ::Vector3::CreateAxisZ(); - } - else + if (remappedIndex >= 0) { renderData.m_particles[index] = particles[remappedIndex]; renderData.m_normals[index] = normals[remappedIndex]; @@ -505,8 +511,8 @@ namespace NvCloth } const AZ::RPI::ModelLodAsset::Mesh& subMesh = modelLodAsset->GetMeshes()[subMeshInfo.m_primitiveIndex]; - int numVertices = subMeshInfo.m_numVertices; - int firstVertex = subMeshInfo.m_verticesFirstIndex; + const int numVertices = subMeshInfo.m_numVertices; + const int firstVertex = subMeshInfo.m_verticesFirstIndex; if (subMesh.GetVertexCount() != numVertices) { AZ_Error("ClothComponentMesh", false, @@ -540,12 +546,6 @@ namespace NvCloth { const int renderVertexIndex = firstVertex + index; - if (m_meshRemappedVertices[renderVertexIndex] < 0) - { - // Removed particle from simulation - continue; - } - const SimParticleFormat& renderParticle = renderParticles[renderVertexIndex]; destVerticesBuffer[index].Set( renderParticle.GetX(), @@ -604,10 +604,7 @@ namespace NvCloth m_meshClothInfo.m_particles, m_meshClothInfo.m_indices, meshSimplifiedParticles, meshSimplifiedIndices, m_meshRemappedVertices, - // [TODO LYN-1890] - // Since blend weights cannot be controlled per instance with Atom, - // this additional mesh optimization is not possible at the moment. - false /*m_config.m_removeStaticTriangles*/); + m_config.m_removeStaticTriangles); if (meshSimplifiedParticles.empty() || meshSimplifiedIndices.empty()) { diff --git a/Gems/NvCloth/Code/Source/Utils/AssetHelper.h b/Gems/NvCloth/Code/Source/Utils/AssetHelper.h index 9630eeb5e1..4c73282008 100644 --- a/Gems/NvCloth/Code/Source/Utils/AssetHelper.h +++ b/Gems/NvCloth/Code/Source/Utils/AssetHelper.h @@ -65,6 +65,9 @@ namespace NvCloth AZStd::vector m_uvs; AZStd::vector m_motionConstraints; AZStd::vector m_backstopData; //!< X contains offset, Y contains radius. + AZStd::vector m_tangents; + AZStd::vector m_bitangents; + AZStd::vector m_normals; }; //! Interface to obtain cloth information from inside an Asset. diff --git a/Gems/NvCloth/Code/Source/Utils/MeshAssetHelper.cpp b/Gems/NvCloth/Code/Source/Utils/MeshAssetHelper.cpp index fa8d6e5455..00ce77c176 100644 --- a/Gems/NvCloth/Code/Source/Utils/MeshAssetHelper.cpp +++ b/Gems/NvCloth/Code/Source/Utils/MeshAssetHelper.cpp @@ -12,6 +12,8 @@ #include +#include + #include namespace NvCloth @@ -224,6 +226,13 @@ namespace NvCloth meshClothInfo.m_indices.insert(meshClothInfo.m_indices.end(), sourceIndices.begin(), sourceIndices.end()); } + // Calculate tangent space for the mesh. + [[maybe_unused]] bool tangentSpaceCalculated = + AZ::Interface::Get()->CalculateTangentSpace( + meshClothInfo.m_particles, meshClothInfo.m_indices, meshClothInfo.m_uvs, + meshClothInfo.m_tangents, meshClothInfo.m_bitangents, meshClothInfo.m_normals); + AZ_Assert(tangentSpaceCalculated, "Failed to calculate tangent space."); + return true; } } // namespace NvCloth diff --git a/Gems/NvCloth/Code/Tests/Components/ClothComponentMesh/ActorClothSkinningTest.cpp b/Gems/NvCloth/Code/Tests/Components/ClothComponentMesh/ActorClothSkinningTest.cpp index 2977cfce8c..75cff2da04 100644 --- a/Gems/NvCloth/Code/Tests/Components/ClothComponentMesh/ActorClothSkinningTest.cpp +++ b/Gems/NvCloth/Code/Tests/Components/ClothComponentMesh/ActorClothSkinningTest.cpp @@ -98,7 +98,7 @@ namespace UnitTest { AZ::EntityId entityId; AZStd::unique_ptr actorClothSkinning = - NvCloth::ActorClothSkinning::Create(entityId, {}, 0, {}); + NvCloth::ActorClothSkinning::Create(entityId, {}, 0); EXPECT_TRUE(actorClothSkinning.get() == nullptr); } @@ -107,7 +107,7 @@ namespace UnitTest { AZ::EntityId entityId; AZStd::unique_ptr actorClothSkinning = - NvCloth::ActorClothSkinning::Create(entityId, MeshNodeInfo, MeshRemappedVertices.size(), MeshRemappedVertices); + NvCloth::ActorClothSkinning::Create(entityId, MeshNodeInfo, MeshRemappedVertices.size()); EXPECT_TRUE(actorClothSkinning.get() == nullptr); } @@ -122,7 +122,7 @@ namespace UnitTest } AZStd::unique_ptr actorClothSkinning = - NvCloth::ActorClothSkinning::Create(m_actorComponent->GetEntityId(), {}, 0, {}); + NvCloth::ActorClothSkinning::Create(m_actorComponent->GetEntityId(), {}, 0); EXPECT_TRUE(actorClothSkinning.get() == nullptr); } @@ -139,7 +139,7 @@ namespace UnitTest } AZStd::unique_ptr actorClothSkinning = - NvCloth::ActorClothSkinning::Create(m_actorComponent->GetEntityId(), MeshNodeInfo, MeshVertices.size(), MeshRemappedVertices); + NvCloth::ActorClothSkinning::Create(m_actorComponent->GetEntityId(), MeshNodeInfo, MeshVertices.size()); EXPECT_TRUE(actorClothSkinning.get() == nullptr); } @@ -156,7 +156,7 @@ namespace UnitTest } AZStd::unique_ptr actorClothSkinning = - NvCloth::ActorClothSkinning::Create(m_actorComponent->GetEntityId(), MeshNodeInfo, MeshVertices.size(), MeshRemappedVertices); + NvCloth::ActorClothSkinning::Create(m_actorComponent->GetEntityId(), MeshNodeInfo, MeshVertices.size()); EXPECT_TRUE(actorClothSkinning.get() != nullptr); } @@ -184,7 +184,7 @@ namespace UnitTest } AZStd::unique_ptr actorClothSkinning = - NvCloth::ActorClothSkinning::Create(actorComponent->GetEntityId(), MeshNodeInfo, MeshVertices.size(), MeshRemappedVertices); + NvCloth::ActorClothSkinning::Create(actorComponent->GetEntityId(), MeshNodeInfo, MeshVertices.size()); ASSERT_TRUE(actorClothSkinning.get() != nullptr); const AZStd::vector clothParticles = {{ @@ -195,7 +195,7 @@ namespace UnitTest AZStd::vector skinnedClothParticles(clothParticles.size(), NvCloth::SimParticleFormat(0.0f, 0.0f, 0.0f, 1.0f)); actorClothSkinning->UpdateSkinning(); - actorClothSkinning->ApplySkinning(clothParticles, skinnedClothParticles); + actorClothSkinning->ApplySkinning(clothParticles, skinnedClothParticles, MeshRemappedVertices); EXPECT_THAT(skinnedClothParticles, ::testing::Pointwise(ContainerIsCloseTolerance(Tolerance), clothParticles)); @@ -208,7 +208,7 @@ namespace UnitTest AZStd::vector newSkinnedClothParticles(clothParticles.size(), NvCloth::SimParticleFormat(0.0f, 0.0f, 0.0f, 1.0f)); actorClothSkinning->UpdateSkinning(); - actorClothSkinning->ApplySkinning(clothParticles, newSkinnedClothParticles); + actorClothSkinning->ApplySkinning(clothParticles, newSkinnedClothParticles, MeshRemappedVertices); const AZ::Transform diffTransform = AZ::Transform::CreateRotationY(AZ::DegToRad(90.0f)); const AZStd::vector clothParticlesResult = {{ @@ -245,7 +245,7 @@ namespace UnitTest } AZStd::unique_ptr actorClothSkinning = - NvCloth::ActorClothSkinning::Create(m_actorComponent->GetEntityId(), MeshNodeInfo, MeshVertices.size(), MeshRemappedVertices); + NvCloth::ActorClothSkinning::Create(m_actorComponent->GetEntityId(), MeshNodeInfo, MeshVertices.size()); ASSERT_TRUE(actorClothSkinning.get() != nullptr); const AZStd::vector clothParticles = {{ @@ -256,7 +256,7 @@ namespace UnitTest AZStd::vector skinnedClothParticles(clothParticles.size(), NvCloth::SimParticleFormat(0.0f, 0.0f, 0.0f, 1.0f)); actorClothSkinning->UpdateSkinning(); - actorClothSkinning->ApplySkinning(clothParticles, skinnedClothParticles); + actorClothSkinning->ApplySkinning(clothParticles, skinnedClothParticles, MeshRemappedVertices); EXPECT_THAT(skinnedClothParticles, ::testing::Pointwise(ContainerIsCloseTolerance(Tolerance), clothParticles)); @@ -271,7 +271,7 @@ namespace UnitTest AZStd::vector newSkinnedClothParticles(clothParticles.size(), NvCloth::SimParticleFormat(0.0f, 0.0f, 0.0f, 1.0f)); actorClothSkinning->UpdateSkinning(); - actorClothSkinning->ApplySkinning(clothParticles, newSkinnedClothParticles); + actorClothSkinning->ApplySkinning(clothParticles, newSkinnedClothParticles, MeshRemappedVertices); const AZStd::vector clothParticlesResult = {{ NvCloth::SimParticleFormat(-48.4177f, -31.9446f, 45.2279f, 1.0f), @@ -294,7 +294,7 @@ namespace UnitTest } AZStd::unique_ptr actorClothSkinning = - NvCloth::ActorClothSkinning::Create(m_actorComponent->GetEntityId(), MeshNodeInfo, MeshVertices.size(), MeshRemappedVertices); + NvCloth::ActorClothSkinning::Create(m_actorComponent->GetEntityId(), MeshNodeInfo, MeshVertices.size()); ASSERT_TRUE(actorClothSkinning.get() != nullptr); EXPECT_FALSE(actorClothSkinning->IsActorVisible()); From 7f1e3b4054a71202b00a57b52e15114cd7ad4601 Mon Sep 17 00:00:00 2001 From: Aaron Ruiz Mora Date: Tue, 27 Apr 2021 13:56:31 +0100 Subject: [PATCH 21/30] Moving largeworlds's failing tests to sandbox --- .../dyn_veg/test_DynamicSliceInstanceSpawner.py | 2 +- .../largeworlds/dyn_veg/test_EmptyInstanceSpawner.py | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DynamicSliceInstanceSpawner.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DynamicSliceInstanceSpawner.py index c5b8046f73..f0673a9438 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DynamicSliceInstanceSpawner.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DynamicSliceInstanceSpawner.py @@ -41,7 +41,7 @@ class TestDynamicSliceInstanceSpawner(object): return console @pytest.mark.test_case_id("C28851763") - @pytest.mark.SUITE_main + @pytest.mark.SUITE_sandbox @pytest.mark.parametrize("launcher_platform", ['windows_editor']) def test_DynamicSliceInstanceSpawner_DynamicSliceSpawnerWorks(self, request, editor, level, workspace, project, launcher_platform): diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_EmptyInstanceSpawner.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_EmptyInstanceSpawner.py index a7f221b780..fc8c31fc7b 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_EmptyInstanceSpawner.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_EmptyInstanceSpawner.py @@ -36,8 +36,13 @@ class TestEmptyInstanceSpawner(object): file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True) - @pytest.mark.test_case_id("C28851762") + # Main suite needs at least one test @pytest.mark.SUITE_main + def test_EmptyInstanceSpawner_Dummy(self, request, editor, level, workspace, project, launcher_platform): + pass + + @pytest.mark.test_case_id("C28851762") + @pytest.mark.SUITE_sandbox def test_EmptyInstanceSpawner_EmptySpawnerWorks(self, request, editor, level, launcher_platform): cfg_args = [level] From 95a44c481ad42f059f926f21072cedbc12210a3c Mon Sep 17 00:00:00 2001 From: amzn-sean <75276488+amzn-sean@users.noreply.github.com> Date: Tue, 27 Apr 2021 14:17:05 +0100 Subject: [PATCH 22/30] fixed errors from main merge --- .../Gem/PythonTests/physics/TestSuite_Periodic.py | 2 ++ .../DebugDraw/Code/Source/DebugDrawSystemComponent.cpp | 9 ++++++--- .../Code/Source/PhysXCharacters/API/CharacterUtils.cpp | 10 ++++++++-- Gems/PhysXDebug/Code/Source/SystemComponent.cpp | 6 +++--- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py index ad8ae6481f..50eb36e31d 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py +++ b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py @@ -269,6 +269,8 @@ class TestAutomation(TestAutomationBase): from . import C18977601_Material_FrictionCombinePriority as test_module self._run_test(request, workspace, editor, test_module) + @pytest.mark.xfail( + reason="Something with the CryRenderer disabling is causeing this test to fail now.") @revert_physics_config def test_C13895144_Ragdoll_ChangeLevel(self, request, workspace, editor, launcher_platform): from . import C13895144_Ragdoll_ChangeLevel as test_module diff --git a/Gems/DebugDraw/Code/Source/DebugDrawSystemComponent.cpp b/Gems/DebugDraw/Code/Source/DebugDrawSystemComponent.cpp index 0a1dd366e6..545dc7d2f9 100644 --- a/Gems/DebugDraw/Code/Source/DebugDrawSystemComponent.cpp +++ b/Gems/DebugDraw/Code/Source/DebugDrawSystemComponent.cpp @@ -443,9 +443,12 @@ namespace DebugDraw AZ::TransformBus::EventResult(sphereElement.m_worldLocation, sphereElement.m_targetEntityId, &AZ::TransformBus::Events::GetWorldTranslation); } - ColorB lyColor(sphereElement.m_color.ToU32()); - Vec3 worldLocation(AZVec3ToLYVec3(sphereElement.m_worldLocation)); - gEnv->pRenderer->GetIRenderAuxGeom()->DrawSphere(worldLocation, sphereElement.m_radius, lyColor, true); + if (gEnv->pRenderer) + { + ColorB lyColor(sphereElement.m_color.ToU32()); + Vec3 worldLocation(AZVec3ToLYVec3(sphereElement.m_worldLocation)); + gEnv->pRenderer->GetIRenderAuxGeom()->DrawSphere(worldLocation, sphereElement.m_radius, lyColor, true); + } } removeExpiredDebugElementsFromVector(m_activeSpheres); diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.cpp b/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.cpp index 893e622701..fb55e8865d 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.cpp +++ b/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.cpp @@ -197,9 +197,15 @@ namespace PhysX if (colliderNodeConfig) { AZStd::vector> shapes; - for (const auto& shapeConfig : colliderNodeConfig->m_shapes) + for (const auto [colliderConfig, shapeConfig] : colliderNodeConfig->m_shapes) { - if (auto shape = AZStd::make_shared(*shapeConfig.first, *shapeConfig.second)) + if (colliderConfig == nullptr || shapeConfig == nullptr) + { + AZ_Error("PhysX Ragdoll", false, "Failed to create collider shape for ragdoll node %s", nodeConfig.m_debugName.c_str()); + return nullptr; + } + + if (auto shape = AZStd::make_shared(*colliderConfig, *shapeConfig)) { shapes.emplace_back(shape); } diff --git a/Gems/PhysXDebug/Code/Source/SystemComponent.cpp b/Gems/PhysXDebug/Code/Source/SystemComponent.cpp index 0d26d1cbc0..77b0959008 100644 --- a/Gems/PhysXDebug/Code/Source/SystemComponent.cpp +++ b/Gems/PhysXDebug/Code/Source/SystemComponent.cpp @@ -511,13 +511,13 @@ namespace PhysXDebug void SystemComponent::RenderBuffers() { - if (gEnv && !m_linePoints.empty()) + if (gEnv && gEnv->pRenderer && !m_linePoints.empty()) { AZ_Assert(m_linePoints.size() == m_lineColors.size(), "Lines: Expected an equal number of points to colors."); gEnv->pRenderer->GetIRenderAuxGeom()->DrawLines(m_linePoints.begin(), m_linePoints.size(), m_lineColors.begin(), 1.0f); } - if (gEnv && !m_trianglePoints.empty()) + if (gEnv && gEnv->pRenderer && !m_trianglePoints.empty()) { AZ_Assert(m_trianglePoints.size() == m_triangleColors.size(), "Triangles: Expected an equal number of points to colors."); gEnv->pRenderer->GetIRenderAuxGeom()->DrawTriangles(m_trianglePoints.begin(), m_trianglePoints.size(), m_triangleColors.begin()); @@ -829,7 +829,7 @@ namespace PhysXDebug { AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Physics); - if (m_settings.m_visualizationEnabled && m_culling.m_boxWireframe) + if (gEnv && gEnv->pRenderer && m_settings.m_visualizationEnabled && m_culling.m_boxWireframe) { ColorB wireframeColor = MapOriginalPhysXColorToUserDefinedValues(1); AABB lyAABB(AZAabbToLyAABB(cullingBoxAabb)); From 5e50fc2961c010389fc908612afce783f7a19e7f Mon Sep 17 00:00:00 2001 From: amzn-sean <75276488+amzn-sean@users.noreply.github.com> Date: Tue, 27 Apr 2021 14:39:18 +0100 Subject: [PATCH 23/30] fix build failure --- AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py | 2 +- Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py index 50eb36e31d..39ed85a65a 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py +++ b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py @@ -270,7 +270,7 @@ class TestAutomation(TestAutomationBase): self._run_test(request, workspace, editor, test_module) @pytest.mark.xfail( - reason="Something with the CryRenderer disabling is causeing this test to fail now.") + reason="Something with the CryRenderer disabling is causing this test to fail now.") @revert_physics_config def test_C13895144_Ragdoll_ChangeLevel(self, request, workspace, editor, launcher_platform): from . import C13895144_Ragdoll_ChangeLevel as test_module diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.cpp b/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.cpp index fb55e8865d..d1502a0c65 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.cpp +++ b/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.cpp @@ -197,7 +197,7 @@ namespace PhysX if (colliderNodeConfig) { AZStd::vector> shapes; - for (const auto [colliderConfig, shapeConfig] : colliderNodeConfig->m_shapes) + for (const auto& [colliderConfig, shapeConfig] : colliderNodeConfig->m_shapes) { if (colliderConfig == nullptr || shapeConfig == nullptr) { From 00fca9489c2471dab42154c6b9b6ba60d01170d3 Mon Sep 17 00:00:00 2001 From: Aaron Ruiz Mora Date: Tue, 27 Apr 2021 14:52:10 +0100 Subject: [PATCH 24/30] Fix editor crashing by protecting gEnv->g3DEngine --- Code/Sandbox/Editor/EditorViewportWidget.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Code/Sandbox/Editor/EditorViewportWidget.cpp b/Code/Sandbox/Editor/EditorViewportWidget.cpp index 25588e85a7..9ce567c91e 100644 --- a/Code/Sandbox/Editor/EditorViewportWidget.cpp +++ b/Code/Sandbox/Editor/EditorViewportWidget.cpp @@ -2428,7 +2428,10 @@ void EditorViewportWidget::SetDefaultCamera() return; } ResetToViewSourceType(ViewSourceType::None); - gEnv->p3DEngine->GetPostEffectBaseGroup()->SetParam("Dof_Active", 0.0f); + if (gEnv->p3DEngine) + { + gEnv->p3DEngine->GetPostEffectBaseGroup()->SetParam("Dof_Active", 0.0f); + } GetViewManager()->SetCameraObjectId(m_cameraObjectId); SetName(m_defaultViewName); SetViewTM(m_defaultViewTM); From d20fb50c9d9447ecb5fa5ae369dee9f2d73e101c Mon Sep 17 00:00:00 2001 From: Aaron Ruiz Mora Date: Tue, 27 Apr 2021 14:52:33 +0100 Subject: [PATCH 25/30] Cloth CPU Skinning using MCore DualQuaternions instead of Cry DualQuat --- .../ClothComponentMesh/ActorClothSkinning.cpp | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ActorClothSkinning.cpp b/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ActorClothSkinning.cpp index 0baa385f44..c295eca188 100644 --- a/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ActorClothSkinning.cpp +++ b/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ActorClothSkinning.cpp @@ -10,15 +10,13 @@ * */ -#include // Needed for DualQuat -#include - #include #include // Needed to access the Mesh information inside Actor. #include #include +#include #include #include @@ -171,7 +169,7 @@ namespace NvCloth return transformData->GetSkinningMatrices(); } - AZStd::unordered_map ObtainSkinningDualQuaternions( + AZStd::unordered_map ObtainSkinningDualQuaternions( AZ::EntityId entityId, const AZStd::vector& jointIndices) { @@ -181,10 +179,10 @@ namespace NvCloth return {}; } - AZStd::unordered_map skinningDualQuaternions; + AZStd::unordered_map skinningDualQuaternions; for (AZ::u16 jointIndex : jointIndices) { - skinningDualQuaternions.emplace(jointIndex, AZMatrix3x4ToLYMatrix3x4(skinningMatrices[jointIndex])); + skinningDualQuaternions.emplace(jointIndex, MCore::DualQuaternion(AZ::Transform::CreateFromMatrix3x4(skinningMatrices[jointIndex]))); } return skinningDualQuaternions; } @@ -276,8 +274,8 @@ namespace NvCloth AZ::Vector3 ComputeSkinningVector(const AZ::Vector3& originalVector) override; private: - AZStd::unordered_map m_skinningDualQuaternions; - DualQuat m_vertexSkinningTransform = DualQuat(type_identity::IDENTITY); + AZStd::unordered_map m_skinningDualQuaternions; + MCore::DualQuaternion m_vertexSkinningTransform; }; void ActorClothSkinningDualQuaternion::UpdateSkinning() @@ -294,7 +292,7 @@ namespace NvCloth void ActorClothSkinningDualQuaternion::ComputeVertexSkinnningTransform(const SkinningInfo& skinningInfo) { - m_vertexSkinningTransform = DualQuat(type_zero::ZERO); + m_vertexSkinningTransform = MCore::DualQuaternion(AZ::Quaternion::CreateZero(), AZ::Quaternion::CreateZero()); for (size_t weightIndex = 0; weightIndex < skinningInfo.m_jointWeights.size(); ++weightIndex) { const AZ::u16 jointIndex = skinningInfo.m_jointIndices[weightIndex]; @@ -312,12 +310,12 @@ namespace NvCloth AZ::Vector3 ActorClothSkinningDualQuaternion::ComputeSkinningPosition(const AZ::Vector3& originalPosition) { - return LYVec3ToAZVec3(m_vertexSkinningTransform * AZVec3ToLYVec3(originalPosition)); + return m_vertexSkinningTransform.TransformPoint(originalPosition); } AZ::Vector3 ActorClothSkinningDualQuaternion::ComputeSkinningVector(const AZ::Vector3& originalVector) { - return LYVec3ToAZVec3(m_vertexSkinningTransform.nq * AZVec3ToLYVec3(originalVector)).GetNormalized(); + return m_vertexSkinningTransform.TransformVector(originalVector).GetNormalized(); } AZStd::unique_ptr ActorClothSkinning::Create( From 5452b5d8769d50da2b390d20ae93e5d177e882a9 Mon Sep 17 00:00:00 2001 From: spham Date: Mon, 26 Apr 2021 15:55:04 -0700 Subject: [PATCH 26/30] - Update Lua for mac to rev6 (Fix missing debug libs) --- cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake b/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake index 3cff2c92d8..fb6b17fb72 100644 --- a/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake +++ b/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake @@ -40,7 +40,7 @@ ly_associate_package(PACKAGE_NAME PVRTexTool-4.24.0-rev4-multiplatform ly_associate_package(PACKAGE_NAME freetype-2.10.4.14-mac-ios TARGETS freetype PACKAGE_HASH 67b4f57aed92082d3fd7c16aa244a7d908d90122c296b0a63f73e0a0b8761977) ly_associate_package(PACKAGE_NAME tiff-4.2.0.15-mac-ios TARGETS tiff PACKAGE_HASH a23ae1f8991a29f8e5df09d6d5b00d7768a740f90752cef465558c1768343709) ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev3-mac TARGETS AWSNativeSDK PACKAGE_HASH 21920372e90355407578b45ac19580df1463a39a25a867bcd0ffd8b385c8254a) -ly_associate_package(PACKAGE_NAME Lua-5.3.5-rev5-mac TARGETS Lua PACKAGE_HASH d63357a73f9f8f297cf770fa4b92dca1fdd5761d4a2215e38f6e96fa274b28aa) +ly_associate_package(PACKAGE_NAME Lua-5.3.5-rev6-mac TARGETS Lua PACKAGE_HASH b9079fd35634774c9269028447562c6b712dbc83b9c64975c095fd423ff04c08) ly_associate_package(PACKAGE_NAME PhysX-4.1.0.25992954-rev1-mac TARGETS PhysX PACKAGE_HASH 149f5e9b44bd27291b1c4772f5e89a1e0efa88eef73c7e0b188935ed4d0c4a70) ly_associate_package(PACKAGE_NAME etc2comp-9cd0f9cae0-rev1-mac TARGETS etc2comp PACKAGE_HASH 1966ab101c89db7ecf30984917e0a48c0d02ee0e4d65b798743842b9469c0818) ly_associate_package(PACKAGE_NAME mikkelsen-1.0.0.4-mac TARGETS mikkelsen PACKAGE_HASH 83af99ca8bee123684ad254263add556f0cf49486c0b3e32e6d303535714e505) From fc3a48bb26916618fdb77bfb2023bcde5eff5540 Mon Sep 17 00:00:00 2001 From: rhongAMZ <69218254+rhongAMZ@users.noreply.github.com> Date: Tue, 27 Apr 2021 09:07:34 -0700 Subject: [PATCH 27/30] EMFX: Fix a crash when deleting blend tree node (#331) --- Gems/EMotionFX/Code/EMotionFX/Source/BlendTree.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTree.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTree.cpp index 02d286a1d0..3eb4aad119 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTree.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTree.cpp @@ -303,7 +303,8 @@ namespace EMotionFX if (GetFinalNode() == nodeToRemove) { - SetFinalNodeId(AnimGraphNodeId::InvalidId); + m_finalNodeId = AnimGraphNodeId::InvalidId; + m_finalNode = nullptr; } // call it for all children From 17997b3df8f6dc9e5a4cc0ebf74681a37d1ceaee Mon Sep 17 00:00:00 2001 From: Benjamin Jillich <43751992+amzn-jillich@users.noreply.github.com> Date: Tue, 27 Apr 2021 18:40:04 +0200 Subject: [PATCH 28/30] [LYN-3135] Animation Editor: Some of the default animation assets are broken (#348) * Cowboy asset was missing mesh group. * There was a coordinate system rule mismatch between the animations and the character that led to skinning artefacts. --- .../Cowboy/Actor/Cowboy_01.fbx.assetinfo | 1379 ++++++----------- .../Animations/aimposes01.fbx.assetinfo | 165 +- .../Animations/idle_cwby_01.fbx.assetinfo | 136 +- .../Cowboy/Animations/reload.fbx.assetinfo | 198 +-- .../Cowboy/Animations/run.fbx.assetinfo | 196 +-- .../Animations/shootrecoil.fbx.assetinfo | 138 +- .../Animations/strafeback.fbx.assetinfo | 136 +- .../Animations/strafebackl.fbx.assetinfo | 136 +- .../Animations/strafebackr.fbx.assetinfo | 136 +- .../Animations/strafeforward.fbx.assetinfo | 196 +-- .../Animations/strafeforwardl.fbx.assetinfo | 136 +- .../Animations/strafeforwardr.fbx.assetinfo | 136 +- .../Animations/strafeinplace.fbx.assetinfo | 136 +- .../Animations/strafeleft.fbx.assetinfo | 136 +- .../Animations/straferight.fbx.assetinfo | 136 +- 15 files changed, 1129 insertions(+), 2367 deletions(-) diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Actor/Cowboy_01.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Actor/Cowboy_01.fbx.assetinfo index 963975f48e..2db91380e3 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Actor/Cowboy_01.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Actor/Cowboy_01.fbx.assetinfo @@ -1,937 +1,442 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "values": [ + { + "$type": "ActorGroup", + "name": "cowboy_01", + "id": "{0020C9AF-AA5D-50CB-8FE0-4250396B3F9D}", + "rules": { + "rules": [ + { + "$type": "MetaDataRule", + "metaData": "AdjustActor -actorID $(ACTORID) -name \"cowboy_01\"\r\nActorSetCollisionMeshes -actorID $(ACTORID) -lod 0 -nodeList \"\"\r\nAdjustActor -actorID $(ACTORID) -nodesExcludedFromBounds \"\" -nodeAction \"select\"\r\nAdjustActor -actorID $(ACTORID) -nodeAction \"replace\" -attachmentNodes \"\"\r\nAdjustActor -actorID $(ACTORID) -motionExtractionNodeName \"Reference\"\r\nAdjustActor -actorID $(ACTORID) -mirrorSetup \"LeftUpLeg,RightUpLeg;RightUpLeg,LeftUpLeg;LeftShoulder,RightShoulder;RightShoulder,LeftShoulder;LeftLegHelper4,RightLegHelper4;LeftLeg,RightLeg;RightLegHelper4,LeftLegHelper4;RightLeg,LeftLeg;LeftArm,RightArm;RightArm,LeftArm;LeftLegHelper5,RightLegHelper5;LeftLegHelper8,RightLegHelper8;LeftLegHelper7,RightLegHelper7;LeftLegHelper6,RightLegHelper6;LeftFoot,RightFoot;RightLegHelper5,LeftLegHelper5;RightLegHelper8,LeftLegHelper8;RightLegHelper7,LeftLegHelper7;RightLegHelper6,LeftLegHelper6;RightFoot,LeftFoot;LeftArmHelper4,RightArmHelper4;LeftArmHelper1,RightArmHelper1;LeftArmHelper2,RightArmHelper2;LeftArmHelper3,RightArmHelper3;LeftForeArm,RightForeArm;RightArmHelper4,LeftArmHelper4;RightArmHelper3,LeftArmHelper3;RightArmHelper2,LeftArmHelper2;RightArmHelper1,LeftArmHelper1;RightForeArm,LeftForeArm;LeftLegHelper9,RightLegHelper9;LeftToeBase,RightToeBase;RightLegHelper9,LeftLegHelper9;RightToeBase,LeftToeBase;LeftArmHelper5,RightArmHelper5;LeftArmHelper8,RightArmHelper8;LeftArmHelper6,RightArmHelper6;LeftArmHelper7,RightArmHelper7;LeftHand,RightHand;RightArmHelper5,LeftArmHelper5;RightArmHelper8,LeftArmHelper8;RightArmHelper7,LeftArmHelper7;RightArmHelper6,LeftArmHelper6;RightHand,LeftHand;LeftArmHelper9,RightArmHelper9;LeftInHandPinky,RightInHandPinky;LeftInHandRing,RightInHandRing;LeftInHandIndex,RightInHandIndex;LeftHandThumb1,RightHandThumb1;RightArmHelper9,LeftArmHelper9;RightInHandPinky,LeftInHandPinky;RightInHandRing,LeftInHandRing;RightInHandIndex,LeftInHandIndex;RightHandThumb1,LeftHandThumb1;LeftHandPinky1,RightHandPinky1;LeftHandRing1,RightHandRing1;LeftHandMiddle1,RightHandMiddle1;LeftHandIndex1,RightHandIndex1;LeftHandThumb2,RightHandThumb2;RightHandPinky1,LeftHandPinky1;RightHandRing1,LeftHandRing1;RightHandMiddle1,LeftHandMiddle1;RightHandIndex1,LeftHandIndex1;RightHandThumb2,LeftHandThumb2;LeftHandPinky2,RightHandPinky2;LeftHandRing2,RightHandRing2;LeftHandMiddle2,RightHandMiddle2;LeftHandIndex2,RightHandIndex2;LeftHandThumb3,RightHandThumb3;RightHandPinky2,LeftHandPinky2;RightHandRing2,LeftHandRing2;RightHandMiddle2,LeftHandMiddle2;RightHandIndex2,LeftHandIndex2;RightHandThumb3,LeftHandThumb3;LeftHandPinky3,RightHandPinky3;LeftHandRing3,RightHandRing3;LeftHandMiddle3,RightHandMiddle3;LeftHandIndex3,RightHandIndex3;RightHandPinky3,LeftHandPinky3;RightHandRing3,LeftHandRing3;RightHandMiddle3,LeftHandMiddle3;RightHandIndex3,LeftHandIndex3;\"\r\n" + } + ] + } + }, + { + "$type": "{07B356B7-3635-40B5-878A-FAC4EFD5AD86} MeshGroup", + "name": "Cowboy_01", + "nodeSelectionList": { + "selectedNodes": [ + "RootNode", + "RootNode.Reference", + "RootNode.cowboy_01", + "RootNode.Reference.transform", + "RootNode.Reference.Hips", + "RootNode.cowboy_01.SkinWeight_0", + "RootNode.cowboy_01.transform", + "RootNode.cowboy_01.map1", + "RootNode.cowboy_01.mat_cowboy_01", + "RootNode.Reference.Hips.transform", + "RootNode.Reference.Hips.Spine", + "RootNode.Reference.Hips.Pelvis", + "RootNode.Reference.Hips.Spine.transform", + "RootNode.Reference.Hips.Spine.Spine1", + "RootNode.Reference.Hips.Pelvis.transform", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg", + "RootNode.Reference.Hips.Pelvis.RightUpLeg", + "RootNode.Reference.Hips.Pelvis.Holster1", + "RootNode.Reference.Hips.Pelvis.Belt1", + "RootNode.Reference.Hips.Spine.Spine1.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder", + "RootNode.Reference.Hips.Spine.Spine1.Neck", + "RootNode.Reference.Hips.Spine.Spine1.aimstart", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.transform", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLegHelper4", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.transform", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLegHelper4", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.HolsterPin1", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg", + "RootNode.Reference.Hips.Pelvis.Holster1.transform", + "RootNode.Reference.Hips.Pelvis.Holster1.Holster2", + "RootNode.Reference.Hips.Pelvis.Belt1.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm", + "RootNode.Reference.Hips.Spine.Spine1.Neck.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1", + "RootNode.Reference.Hips.Spine.Spine1.aimstart.transform", + "RootNode.Reference.Hips.Spine.Spine1.aimstart.aimend", + "RootNode.Reference.Hips.Spine.Spine1.aimstart.propmatch", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLegHelper4.transform", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLegHelper4.LeftLegHelper5", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.transform", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper8", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper7", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper6", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftFoot", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLegHelper4.transform", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLegHelper4.RightLegHelper5", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.HolsterPin1.transform", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.transform", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper8", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper7", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper6", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightFoot", + "RootNode.Reference.Hips.Pelvis.Holster1.Holster2.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper4", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper1", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper2", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper3", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper4", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper3", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper2", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper1", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmPV", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head", + "RootNode.Reference.Hips.Spine.Spine1.aimstart.aimend.transform", + "RootNode.Reference.Hips.Spine.Spine1.aimstart.propmatch.transform", + "RootNode.Reference.Hips.Spine.Spine1.aimstart.propmatch.aimwristmatch", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLegHelper4.LeftLegHelper5.transform", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper8.transform", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper8.LeftLegHelper9", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper7.transform", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper6.transform", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftFoot.transform", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftFoot.LeftToeBase", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLegHelper4.RightLegHelper5.transform", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper8.transform", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper8.RightLegHelper9", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper7.transform", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper6.transform", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightFoot.transform", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightFoot.RightToeBase", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper4.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper4.LeftArmHelper5", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper1.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper2.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper3.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper8", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper6", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper7", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper4.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper4.RightArmHelper5", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper3.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper2.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper1.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper8", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper7", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper6", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmPV.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_eye_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_eye_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair0_PUPPET_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair1_PUPPET_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair0_PUPPET_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair1_PUPPET_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.aimstart.propmatch.aimwristmatch.transform", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper8.LeftLegHelper9.transform", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftFoot.LeftToeBase.transform", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper8.RightLegHelper9.transform", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightFoot.RightToeBase.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper4.LeftArmHelper5.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper8.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper8.LeftArmHelper9", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper6.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper7.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftHandThumb1", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper4.RightArmHelper5.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper8.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper8.RightArmHelper9", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper7.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper6.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightHandThumb1", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.prop", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_eye_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_eye_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair0_PUPPET_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair0_PUPPET_0_JNT.Rt_Hair0_PUPPET_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair1_PUPPET_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair1_PUPPET_0_JNT.Rt_Hair1_PUPPET_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.Ct_BackHair_PUPPET_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botTeeth_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair0_PUPPET_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair0_PUPPET_0_JNT.Lf_Hair0_PUPPET_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair1_PUPPET_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair1_PUPPET_0_JNT.Lf_Hair1_PUPPET_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_browExt_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_browCen_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_browInt_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_brow_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_browInt_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_browCen_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_browExt_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_cheekRaiseOut_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_cheekRaiseCen_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_cheekRaiseInt_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_cheekRaiseInt_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_cheekRaiseCen_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_cheekRaiseOut_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_nose_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topTeeth_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Lf_cheek_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Rt_cheek_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper8.LeftArmHelper9.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.LeftHandPinky1", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.LeftHandRing1", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.LeftHandMiddle1", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.LeftHandIndex1", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftHandThumb1.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftHandThumb1.LeftHandThumb2", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper8.RightArmHelper9.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.RightHandPinky1", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.RightHandRing1", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.RightHandMiddle1", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.RightHandIndex1", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightHandThumb1.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightHandThumb1.RightHandThumb2", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.prop.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair0_PUPPET_0_JNT.Rt_Hair0_PUPPET_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair0_PUPPET_0_JNT.Rt_Hair0_PUPPET_1_JNT.Rt_Hair0_PUPPET_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair1_PUPPET_0_JNT.Rt_Hair1_PUPPET_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair1_PUPPET_0_JNT.Rt_Hair1_PUPPET_1_JNT.Rt_Hair1_PUPPET_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.Ct_BackHair_PUPPET_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.Ct_BackHair_PUPPET_1_JNT.Ct_BackHair_PUPPET_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botTeeth_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.Ct_tongue_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_cornerLip_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_botLip_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_botLip_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_botLip_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Ct_botLip_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_botLip_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_botLip_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_botLip_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_cornerLip_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair0_PUPPET_0_JNT.Lf_Hair0_PUPPET_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair0_PUPPET_0_JNT.Lf_Hair0_PUPPET_1_JNT.Lf_Hair0_PUPPET_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair1_PUPPET_0_JNT.Lf_Hair1_PUPPET_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair1_PUPPET_0_JNT.Lf_Hair1_PUPPET_1_JNT.Lf_Hair1_PUPPET_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_browExt_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_browCen_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_browInt_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_brow_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_browInt_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_browCen_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_browExt_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_lidCorner_in_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_lidCorner_out_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_lidCorner_in_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_lidCorner_out_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_cheekRaiseOut_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_cheekRaiseCen_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_cheekRaiseInt_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_cheekRaiseInt_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_cheekRaiseCen_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_cheekRaiseOut_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_nose_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_nose_0_JNT.Lf_nostril_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_nose_0_JNT.Rt_nostril_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Rt_topLip_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Rt_topLip_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Rt_topLip_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Ct_topLip_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Lf_topLip_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Lf_topLip_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Lf_topLip_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topTeeth_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Lf_cheek_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Rt_cheek_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.LeftHandPinky1.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.LeftHandPinky1.LeftHandPinky2", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.LeftHandRing1.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.LeftHandRing1.LeftHandRing2", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.LeftHandMiddle1.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.LeftHandMiddle1.LeftHandMiddle2", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.LeftHandIndex1.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.LeftHandIndex1.LeftHandIndex2", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftHandThumb1.LeftHandThumb2.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftHandThumb1.LeftHandThumb2.LeftHandThumb3", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.RightHandPinky1.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.RightHandPinky1.RightHandPinky2", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.RightHandRing1.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.RightHandRing1.RightHandRing2", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.RightHandMiddle1.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.RightHandMiddle1.RightHandMiddle2", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.RightHandIndex1.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.RightHandIndex1.RightHandIndex2", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightHandThumb1.RightHandThumb2.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightHandThumb1.RightHandThumb2.RightHandThumb3", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair0_PUPPET_0_JNT.Rt_Hair0_PUPPET_1_JNT.Rt_Hair0_PUPPET_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair1_PUPPET_0_JNT.Rt_Hair1_PUPPET_1_JNT.Rt_Hair1_PUPPET_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.Ct_BackHair_PUPPET_1_JNT.Ct_BackHair_PUPPET_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.Ct_BackHair_PUPPET_1_JNT.Ct_BackHair_PUPPET_2_JNT.Ct_BackHair_PUPPET_3_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.Ct_tongue_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.Ct_tongue_1_JNT.Ct_tongue_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_cornerLip_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_botLip_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_botLip_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_botLip_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Ct_botLip_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_botLip_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_botLip_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_botLip_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_cornerLip_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair0_PUPPET_0_JNT.Lf_Hair0_PUPPET_1_JNT.Lf_Hair0_PUPPET_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair1_PUPPET_0_JNT.Lf_Hair1_PUPPET_1_JNT.Lf_Hair1_PUPPET_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.Ct_FrontHair_PUPPET_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.Rt_botLid_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.Rt_topLid_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_lidCorner_in_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_lidCorner_out_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.Lf_botLid_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.Lf_topLid_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_lidCorner_in_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_lidCorner_out_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_nose_0_JNT.Lf_nostril_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_nose_0_JNT.Rt_nostril_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Rt_topLip_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Rt_topLip_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Rt_topLip_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Ct_topLip_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Lf_topLip_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Lf_topLip_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Lf_topLip_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.LeftHandPinky1.LeftHandPinky2.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.LeftHandPinky1.LeftHandPinky2.LeftHandPinky3", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.LeftHandRing1.LeftHandRing2.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.LeftHandRing1.LeftHandRing2.LeftHandRing3", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.LeftHandMiddle1.LeftHandMiddle2.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.LeftHandMiddle1.LeftHandMiddle2.LeftHandMiddle3", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.LeftHandIndex1.LeftHandIndex2.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.LeftHandIndex1.LeftHandIndex2.LeftHandIndex3", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftHandThumb1.LeftHandThumb2.LeftHandThumb3.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.RightHandPinky1.RightHandPinky2.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.RightHandPinky1.RightHandPinky2.RightHandPinky3", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.RightHandRing1.RightHandRing2.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.RightHandRing1.RightHandRing2.RightHandRing3", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.RightHandMiddle1.RightHandMiddle2.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.RightHandMiddle1.RightHandMiddle2.RightHandMiddle3", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.RightHandIndex1.RightHandIndex2.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.RightHandIndex1.RightHandIndex2.RightHandIndex3", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightHandThumb1.RightHandThumb2.RightHandThumb3.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.Ct_BackHair_PUPPET_1_JNT.Ct_BackHair_PUPPET_2_JNT.Ct_BackHair_PUPPET_3_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.Ct_tongue_1_JNT.Ct_tongue_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.Ct_tongue_1_JNT.Ct_tongue_2_JNT.Ct_tongue_3_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_1_JNT.Lf_Hat_PUPPET_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_1_JNT.Rt_Hat_PUPPET_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.Ct_FrontHair_PUPPET_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.Ct_FrontHair_PUPPET_1_JNT.Ct_FrontHair_PUPPET_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.Rt_botLid_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.Rt_botLid_0_JNT.Rt_botLid_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.Rt_botLid_0_JNT.Rt_botLid_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.Rt_topLid_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.Rt_topLid_0_JNT.Rt_topLid_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.Rt_topLid_0_JNT.Rt_topLid_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.Lf_botLid_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.Lf_botLid_0_JNT.Lf_botLid_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.Lf_botLid_0_JNT.Lf_botLid_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.Lf_topLid_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.Lf_topLid_0_JNT.Lf_topLid_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.Lf_topLid_0_JNT.Lf_topLid_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.LeftHandPinky1.LeftHandPinky2.LeftHandPinky3.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.LeftHandRing1.LeftHandRing2.LeftHandRing3.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.LeftHandMiddle1.LeftHandMiddle2.LeftHandMiddle3.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.LeftHandIndex1.LeftHandIndex2.LeftHandIndex3.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.RightHandPinky1.RightHandPinky2.RightHandPinky3.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.RightHandRing1.RightHandRing2.RightHandRing3.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.RightHandMiddle1.RightHandMiddle2.RightHandMiddle3.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.RightHandIndex1.RightHandIndex2.RightHandIndex3.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.Ct_tongue_1_JNT.Ct_tongue_2_JNT.Ct_tongue_3_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_1_JNT.Lf_Hat_PUPPET_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_1_JNT.Lf_Hat_PUPPET_2_JNT.Lf_Hat_PUPPET_3_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_1_JNT.Rt_Hat_PUPPET_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_1_JNT.Rt_Hat_PUPPET_2_JNT.Rt_Hat_PUPPET_3_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.Ct_FrontHair_PUPPET_1_JNT.Ct_FrontHair_PUPPET_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.Ct_FrontHair_PUPPET_1_JNT.Ct_FrontHair_PUPPET_2_JNT.Ct_FrontHair_PUPPET_3_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.Rt_botLid_0_JNT.Rt_botLid_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.Rt_botLid_0_JNT.Rt_botLid_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.Rt_topLid_0_JNT.Rt_topLid_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.Rt_topLid_0_JNT.Rt_topLid_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.Lf_botLid_0_JNT.Lf_botLid_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.Lf_botLid_0_JNT.Lf_botLid_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.Lf_topLid_0_JNT.Lf_topLid_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.Lf_topLid_0_JNT.Lf_topLid_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_1_JNT.Lf_Hat_PUPPET_2_JNT.Lf_Hat_PUPPET_3_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_1_JNT.Rt_Hat_PUPPET_2_JNT.Rt_Hat_PUPPET_3_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.Ct_FrontHair_PUPPET_1_JNT.Ct_FrontHair_PUPPET_2_JNT.Ct_FrontHair_PUPPET_3_JNT.transform" + ] + }, + "rules": { + "rules": [ + { + "$type": "SkinRule" + }, + { + "$type": "MaterialRule" + } + ] + }, + "id": "{6247689D-B117-4653-A672-12198E7EDD69}" + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/aimposes01.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/aimposes01.fbx.assetinfo index 74e470b719..60a381de2c 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/aimposes01.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/aimposes01.fbx.assetinfo @@ -1,109 +1,56 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "values": [ + { + "$type": "MotionGroup", + "name": "aimposes01", + "selectedRootBone": "RootNode.Reference", + "id": "{394BA97A-7EF3-56B3-ADE2-D9D734AA5B6B}", + "rules": { + "rules": [ + { + "$type": "MotionRangeRule" + }, + { + "$type": "MotionSamplingRule" + } + ] + } + }, + { + "$type": "MotionGroup", + "name": "aimposes01-1", + "selectedRootBone": "RootNode.Reference", + "id": "{991539D2-8F87-40EF-9664-7994FFEA6B34}", + "rules": { + "rules": [ + { + "$type": "MotionRangeRule", + "startFrame": 1, + "endFrame": 1 + }, + { + "$type": "MotionSamplingRule" + } + ] + } + }, + { + "$type": "MotionGroup", + "name": "aimposes01-2", + "selectedRootBone": "RootNode.Reference", + "id": "{DBCED014-4E7E-4865-9F94-F84B85F6B007}", + "rules": { + "rules": [ + { + "$type": "MotionRangeRule", + "startFrame": 2, + "endFrame": 2 + }, + { + "$type": "MotionSamplingRule" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/idle_cwby_01.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/idle_cwby_01.fbx.assetinfo index 2e4a8f55d7..2ca1f67d65 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/idle_cwby_01.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/idle_cwby_01.fbx.assetinfo @@ -1,91 +1,45 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "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" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/reload.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/reload.fbx.assetinfo index 4cd5a8194a..3d935c330e 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/reload.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/reload.fbx.assetinfo @@ -1,137 +1,61 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "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" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/run.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/run.fbx.assetinfo index b93139dc83..c32d66694b 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/run.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/run.fbx.assetinfo @@ -1,137 +1,59 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "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" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/shootrecoil.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/shootrecoil.fbx.assetinfo index 89f051b5eb..9536e6597d 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/shootrecoil.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/shootrecoil.fbx.assetinfo @@ -1,91 +1,47 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "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" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeback.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeback.fbx.assetinfo index 91b795d9af..9d7c7e299c 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeback.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeback.fbx.assetinfo @@ -1,91 +1,45 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "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" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafebackl.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafebackl.fbx.assetinfo index 00ba9b3830..b22d00d3fe 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafebackl.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafebackl.fbx.assetinfo @@ -1,91 +1,45 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "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" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafebackr.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafebackr.fbx.assetinfo index 7f15392868..6b7dd5c4aa 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafebackr.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafebackr.fbx.assetinfo @@ -1,91 +1,45 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "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" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeforward.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeforward.fbx.assetinfo index 5003f620ca..a0dd296fa9 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeforward.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeforward.fbx.assetinfo @@ -1,137 +1,59 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "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" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeforwardl.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeforwardl.fbx.assetinfo index bd6a91a56c..233d7d248e 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeforwardl.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeforwardl.fbx.assetinfo @@ -1,91 +1,45 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "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" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeforwardr.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeforwardr.fbx.assetinfo index 7014e29bcf..5332ba04bd 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeforwardr.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeforwardr.fbx.assetinfo @@ -1,91 +1,45 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "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" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeinplace.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeinplace.fbx.assetinfo index 6ad0025f61..4d7e41b48a 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeinplace.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeinplace.fbx.assetinfo @@ -1,91 +1,45 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "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" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeleft.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeleft.fbx.assetinfo index a257eba8e0..02114bd336 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeleft.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeleft.fbx.assetinfo @@ -1,91 +1,45 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "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" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/straferight.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/straferight.fbx.assetinfo index c4308f71e2..28ac40918d 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/straferight.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/straferight.fbx.assetinfo @@ -1,91 +1,45 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "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" + } + ] + } + } + ] +} \ No newline at end of file From 66bdf4e26d28f334564809a91076c4516987a312 Mon Sep 17 00:00:00 2001 From: AMZN-AlexOteiza <82234181+AMZN-AlexOteiza@users.noreply.github.com> Date: Tue, 27 Apr 2021 17:53:03 +0100 Subject: [PATCH 29/30] Fix and re-enabled blast tests and moved them to main * Fixed and reenabled Blast tests * moved blast tests to main Co-authored-by: aljanru --- .../Blast/ActorSplitsAfterCapsuleDamage.py | 12 ++++++++---- .../PythonTests/Blast/ActorSplitsAfterCollision.py | 12 ++++++++---- .../Gem/PythonTests/Blast/ActorSplitsAfterDamage.py | 4 ++-- .../Blast/ActorSplitsAfterImpactSpreadDamage.py | 12 ++++++++---- .../Blast/ActorSplitsAfterRadialDamage.py | 12 ++++++++---- .../PythonTests/Blast/ActorSplitsAfterShearDamage.py | 12 ++++++++---- .../Blast/ActorSplitsAfterStressDamage.py | 12 ++++++++---- .../Blast/ActorSplitsAfterTriangleDamage.py | 12 ++++++++---- .../PythonTests/Blast/{Utils.py => BlastUtils.py} | 0 AutomatedTesting/Gem/PythonTests/CMakeLists.txt | 3 ++- 10 files changed, 60 insertions(+), 31 deletions(-) rename AutomatedTesting/Gem/PythonTests/Blast/{Utils.py => BlastUtils.py} (100%) mode change 100755 => 100644 diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCapsuleDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCapsuleDamage.py index a961ccdc52..7ed47d0b58 100755 --- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCapsuleDamage.py +++ b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCapsuleDamage.py @@ -15,9 +15,9 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__))) from ActorSplitsAfterDamage import Tests -def run(): - from ActorSplitsAfterDamage import run as internal_run - from editor_python_test_tools.utils import Constants +def ActorSplitsAfterCapsuleDamage(): + from ActorSplitsAfterDamage import base_run as internal_run + from BlastUtils import Constants def CapsuleDamage(target_id, position0): position1 = azlmbr.object.construct('Vector3', position0.x + 1.0, position0.y, position0.z) @@ -30,4 +30,8 @@ def run(): if __name__ == "__main__": - run() + import ImportPathHelper as imports + imports.init() + + from editor_python_test_tools.utils import Report + Report.start_test(ActorSplitsAfterCapsuleDamage) diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCollision.py b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCollision.py index 5692773d6d..a75aae21f0 100755 --- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCollision.py +++ b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCollision.py @@ -22,7 +22,7 @@ class Tests(): # fmt: on -def run(): +def ActorSplitsAfterCollision(): """ Summary: @@ -60,8 +60,8 @@ def run(): import azlmbr.legacy.general as general import azlmbr.bus - from editor_python_test_tools.utils import CollisionHandler - from editor_python_test_tools.utils import BlastNotificationHandler + from BlastUtils import CollisionHandler + from BlastUtils import BlastNotificationHandler # Constants TIMEOUT = 2.0 @@ -107,4 +107,8 @@ def run(): if __name__ == "__main__": - run() + import ImportPathHelper as imports + imports.init() + + from editor_python_test_tools.utils import Report + Report.start_test(ActorSplitsAfterCollision) diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterDamage.py index ddd90ca89a..d71f17c958 100755 --- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterDamage.py +++ b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterDamage.py @@ -20,7 +20,7 @@ class Tests(): # fmt: on -def run(damage_func): +def base_run(damage_func): """ Summary: @@ -56,7 +56,7 @@ def run(damage_func): import azlmbr.legacy.general as general import azlmbr.bus - from editor_python_test_tools.utils import BlastNotificationHandler + from BlastUtils import BlastNotificationHandler # Constants TIMEOUT = 2.0 diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterImpactSpreadDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterImpactSpreadDamage.py index 9b3fd1e596..e2783ef605 100755 --- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterImpactSpreadDamage.py +++ b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterImpactSpreadDamage.py @@ -15,9 +15,9 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__))) from ActorSplitsAfterDamage import Tests -def run(): - from ActorSplitsAfterDamage import run as internal_run - from editor_python_test_tools.utils import Constants +def ActorSplitsAfterImpactSpreadDamage(): + from ActorSplitsAfterDamage import base_run as internal_run + from BlastUtils import Constants def ImpactSpreadDamage(target_id, position): azlmbr.destruction.BlastFamilyDamageRequestBus(azlmbr.bus.Event, "Impact Spread Damage", target_id, @@ -28,4 +28,8 @@ def run(): if __name__ == "__main__": - run() + import ImportPathHelper as imports + imports.init() + + from editor_python_test_tools.utils import Report + Report.start_test(ActorSplitsAfterImpactSpreadDamage) diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterRadialDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterRadialDamage.py index a219e63d34..f89a322bec 100755 --- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterRadialDamage.py +++ b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterRadialDamage.py @@ -15,9 +15,9 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__))) from ActorSplitsAfterDamage import Tests -def run(): - from ActorSplitsAfterDamage import run as internal_run - from editor_python_test_tools.utils import Constants +def ActorSplitsAfterRadialDamage(): + from ActorSplitsAfterDamage import base_run as internal_run + from BlastUtils import Constants def RadialDamage(target_id, position): azlmbr.destruction.BlastFamilyDamageRequestBus(azlmbr.bus.Event, "Radial Damage", target_id, @@ -28,4 +28,8 @@ def run(): if __name__ == "__main__": - run() + import ImportPathHelper as imports + imports.init() + + from editor_python_test_tools.utils import Report + Report.start_test(ActorSplitsAfterRadialDamage) \ No newline at end of file diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterShearDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterShearDamage.py index e775be302d..5d2b6db1f3 100755 --- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterShearDamage.py +++ b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterShearDamage.py @@ -15,9 +15,9 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__))) from ActorSplitsAfterDamage import Tests -def run(): - from ActorSplitsAfterDamage import run as internal_run - from editor_python_test_tools.utils import Constants +def ActorSplitsAfterShearDamage(): + from ActorSplitsAfterDamage import base_run as internal_run + from BlastUtils import Constants def ShearDamage(target_id, position): normal = azlmbr.object.construct('Vector3', 1.0, 0.0, 0.0) @@ -29,4 +29,8 @@ def run(): if __name__ == "__main__": - run() + import ImportPathHelper as imports + imports.init() + + from editor_python_test_tools.utils import Report + Report.start_test(ActorSplitsAfterShearDamage) \ No newline at end of file diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterStressDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterStressDamage.py index 0195190348..bfbbde259a 100755 --- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterStressDamage.py +++ b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterStressDamage.py @@ -15,9 +15,9 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__))) from ActorSplitsAfterDamage import Tests -def run(): - from ActorSplitsAfterDamage import run as internal_run - from editor_python_test_tools.utils import Constants +def ActorSplitsAfterStressDamage(): + from ActorSplitsAfterDamage import base_run as internal_run + from BlastUtils import Constants def StressDamage(target_id, position): force = azlmbr.object.construct('Vector3', 0.0, 0.0, -100.0) # Should be enough to break `brittle` objects @@ -28,4 +28,8 @@ def run(): if __name__ == "__main__": - run() + import ImportPathHelper as imports + imports.init() + + from editor_python_test_tools.utils import Report + Report.start_test(ActorSplitsAfterStressDamage) diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterTriangleDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterTriangleDamage.py index 0351fe42e2..e8f44bbc77 100755 --- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterTriangleDamage.py +++ b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterTriangleDamage.py @@ -15,9 +15,9 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__))) from ActorSplitsAfterDamage import Tests -def run(): - from ActorSplitsAfterDamage import run as internal_run - from editor_python_test_tools.utils import Constants +def ActorSplitsAfterTriangleDamage(): + from ActorSplitsAfterDamage import base_run as internal_run + from BlastUtils import Constants def TriangleDamage(target_id, position): # Some points that form a triangle that contains the given position @@ -32,4 +32,8 @@ def run(): if __name__ == "__main__": - run() + import ImportPathHelper as imports + imports.init() + + from editor_python_test_tools.utils import Report + Report.start_test(ActorSplitsAfterTriangleDamage) \ No newline at end of file diff --git a/AutomatedTesting/Gem/PythonTests/Blast/Utils.py b/AutomatedTesting/Gem/PythonTests/Blast/BlastUtils.py old mode 100755 new mode 100644 similarity index 100% rename from AutomatedTesting/Gem/PythonTests/Blast/Utils.py rename to AutomatedTesting/Gem/PythonTests/Blast/BlastUtils.py diff --git a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt index 260d5ea1b1..d31ea6334c 100644 --- a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt +++ b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt @@ -170,7 +170,7 @@ endif() if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS) ly_add_pytest( NAME AutomatedTesting::BlastTests - TEST_SUITE periodic + TEST_SUITE main TEST_SERIAL TRUE PATH ${CMAKE_CURRENT_LIST_DIR}/Blast/TestSuite_Active.py TIMEOUT 3600 @@ -178,6 +178,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS) Legacy::Editor AZ::AssetProcessor AutomatedTesting.Assets + COMPONENT Blast ) endif() From 6aa5b5698f90c6e9a4bc2cd123beacc698e1cfd3 Mon Sep 17 00:00:00 2001 From: Terry Michaels <81711813+tjmichaels@users.noreply.github.com> Date: Tue, 27 Apr 2021 12:17:50 -0500 Subject: [PATCH 30/30] Removed Cry FogVolume component (#346) --- Gems/LmbrCentral/Code/Source/LmbrCentral.cpp | 2 - .../Code/Source/LmbrCentralEditor.cpp | 2 - .../Rendering/EditorFogVolumeComponent.cpp | 353 ------------------ .../Rendering/EditorFogVolumeComponent.h | 93 ----- .../Code/Source/Rendering/FogVolumeCommon.cpp | 179 --------- .../Code/Source/Rendering/FogVolumeCommon.h | 116 ------ .../Source/Rendering/FogVolumeComponent.cpp | 203 ---------- .../Source/Rendering/FogVolumeComponent.h | 84 ----- .../Rendering/FogVolumeRequestsHandler.cpp | 264 ------------- .../Rendering/FogVolumeRequestsHandler.h | 94 ----- .../Rendering/FogVolumeComponentBus.h | 247 ------------ .../Code/lmbrcentral_editor_files.cmake | 2 - Gems/LmbrCentral/Code/lmbrcentral_files.cmake | 7 - 13 files changed, 1646 deletions(-) delete mode 100644 Gems/LmbrCentral/Code/Source/Rendering/EditorFogVolumeComponent.cpp delete mode 100644 Gems/LmbrCentral/Code/Source/Rendering/EditorFogVolumeComponent.h delete mode 100644 Gems/LmbrCentral/Code/Source/Rendering/FogVolumeCommon.cpp delete mode 100644 Gems/LmbrCentral/Code/Source/Rendering/FogVolumeCommon.h delete mode 100644 Gems/LmbrCentral/Code/Source/Rendering/FogVolumeComponent.cpp delete mode 100644 Gems/LmbrCentral/Code/Source/Rendering/FogVolumeComponent.h delete mode 100644 Gems/LmbrCentral/Code/Source/Rendering/FogVolumeRequestsHandler.cpp delete mode 100644 Gems/LmbrCentral/Code/Source/Rendering/FogVolumeRequestsHandler.h delete mode 100644 Gems/LmbrCentral/Code/include/LmbrCentral/Rendering/FogVolumeComponentBus.h diff --git a/Gems/LmbrCentral/Code/Source/LmbrCentral.cpp b/Gems/LmbrCentral/Code/Source/LmbrCentral.cpp index 29dc8a92aa..0f6b084201 100644 --- a/Gems/LmbrCentral/Code/Source/LmbrCentral.cpp +++ b/Gems/LmbrCentral/Code/Source/LmbrCentral.cpp @@ -39,7 +39,6 @@ #include "Rendering/LightComponent.h" #include "Rendering/HighQualityShadowComponent.h" #include "Rendering/MeshComponent.h" -#include "Rendering/FogVolumeComponent.h" #include "Rendering/GeomCacheComponent.h" #include "Ai/NavigationComponent.h" #include "Scripting/TagComponent.h" @@ -241,7 +240,6 @@ namespace LmbrCentral StereoRendererComponent::CreateDescriptor(), NavigationSystemComponent::CreateDescriptor(), GeometrySystemComponent::CreateDescriptor(), - FogVolumeComponent::CreateDescriptor(), RandomTimedSpawnerComponent::CreateDescriptor(), GeometryCacheComponent::CreateDescriptor(), SphereShapeDebugDisplayComponent::CreateDescriptor(), diff --git a/Gems/LmbrCentral/Code/Source/LmbrCentralEditor.cpp b/Gems/LmbrCentral/Code/Source/LmbrCentralEditor.cpp index c658f5ebb9..b20ce12f35 100644 --- a/Gems/LmbrCentral/Code/Source/LmbrCentralEditor.cpp +++ b/Gems/LmbrCentral/Code/Source/LmbrCentralEditor.cpp @@ -34,7 +34,6 @@ #include "Rendering/EditorEnvProbeComponent.h" #include "Rendering/EditorHighQualityShadowComponent.h" #include "Rendering/EditorMeshComponent.h" -#include "Rendering/EditorFogVolumeComponent.h" #include "Rendering/EditorGeomCacheComponent.h" #include "Scripting/EditorLookAtComponent.h" #include "Scripting/EditorRandomTimedSpawnerComponent.h" @@ -104,7 +103,6 @@ namespace LmbrCentral EditorCommentComponent::CreateDescriptor(), EditorNavigationAreaComponent::CreateDescriptor(), EditorNavigationSeedComponent::CreateDescriptor(), - EditorFogVolumeComponent::CreateDescriptor(), EditorRandomTimedSpawnerComponent::CreateDescriptor(), EditorGeometryCacheComponent::CreateDescriptor(), EditorSpawnerComponent::CreateDescriptor(), diff --git a/Gems/LmbrCentral/Code/Source/Rendering/EditorFogVolumeComponent.cpp b/Gems/LmbrCentral/Code/Source/Rendering/EditorFogVolumeComponent.cpp deleted file mode 100644 index fcc44ff3cb..0000000000 --- a/Gems/LmbrCentral/Code/Source/Rendering/EditorFogVolumeComponent.cpp +++ /dev/null @@ -1,353 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#include "LmbrCentral_precompiled.h" - -#include -#include -#include - -#include -#include - -#include "EditorFogVolumeComponent.h" - -namespace LmbrCentral -{ - void EditorFogVolumeComponent::Activate() - { - Base::Activate(); - - const auto entityId = GetEntityId(); - - m_configuration.SetEntityId(entityId); - m_configuration.UpdateSizeFromEntityShape(); - - m_fogVolume.SetEntityId(entityId); - m_fogVolume.CreateFogVolumeRenderNode(m_configuration); - - RefreshFog(); - - RenderNodeRequestBus::Handler::BusConnect(entityId); - FogVolumeComponentRequestBus::Handler::BusConnect(entityId); - ShapeComponentNotificationsBus::Handler::BusConnect(entityId); - AZ::TransformNotificationBus::Handler::BusConnect(entityId); - AzToolsFramework::EditorEvents::Bus::Handler::BusConnect(); - } - - void EditorFogVolumeComponent::Deactivate() - { - Base::Deactivate(); - - m_fogVolume.DestroyRenderNode(); - m_fogVolume.SetEntityId(AZ::EntityId()); - m_configuration.SetEntityId(AZ::EntityId()); - - AzToolsFramework::EditorEvents::Bus::Handler::BusDisconnect(); - AZ::TransformNotificationBus::Handler::BusDisconnect(); - ShapeComponentNotificationsBus::Handler::BusDisconnect(); - FogVolumeComponentRequestBus::Handler::BusDisconnect(); - RenderNodeRequestBus::Handler::BusDisconnect(); - } - - void EditorFogVolumeComponent::Reflect(AZ::ReflectContext* context) - { - AZ::SerializeContext* serializeContext = azrtti_cast(context); - - EditorFogVolumeConfiguration::Reflect(context); - - if (serializeContext) - { - serializeContext->Class() - ->Version(1) - ->Field("FogVolumeConfiguration", &EditorFogVolumeComponent::m_configuration); - - if (AZ::EditContext* editContext = serializeContext->GetEditContext()) - { - editContext->Class( - "Fog Volume", "Allows to specify an area with a fog") - ->ClassElement(AZ::Edit::ClassElements::EditorData, "") - ->Attribute(AZ::Edit::Attributes::Category, "Environment") - ->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/FogVolume.svg") - ->Attribute(AZ::Edit::Attributes::ViewportIcon, "Editor/Icons/Components/Viewport/FogVolume.png") - ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c)) - ->Attribute(AZ::Edit::Attributes::HelpPageURL, "http://docs.aws.amazon.com/console/lumberyard/userguide/fog-volume-component") - ->Attribute(AZ::Edit::Attributes::AutoExpand, false) - ->DataElement(0, &EditorFogVolumeComponent::m_configuration, "Settings", "Fog configuration") - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) - ; - } - } - - if (AZ::BehaviorContext* behaviorContext = azrtti_cast(context)) - { - behaviorContext->Class()->RequestBus("EditorFogVolumeComponentRequestBus"); - FogVolumeComponent::ExposeRequestsBusInBehaviorContext(behaviorContext, "EditorFogVolumeComponentRequestBus"); - } - } - - IRenderNode* EditorFogVolumeComponent::GetRenderNode() - { - return m_fogVolume.GetRenderNode(); - } - - float EditorFogVolumeComponent::GetRenderNodeRequestBusOrder() const - { - return FogVolumeComponent::s_renderNodeRequestBusOrder; - } - - void EditorFogVolumeComponent::RefreshFog() - { - m_fogVolume.UpdateFogVolumeProperties(m_configuration); - m_fogVolume.UpdateRenderingFlags(m_configuration); - m_fogVolume.UpdateFogVolumeTransform(); - } - - void EditorFogVolumeComponent::OnTransformChanged([[maybe_unused]] const AZ::Transform& local, [[maybe_unused]] const AZ::Transform& world) - { - // Entities transform component calls OnTransformChanged before this component is activated - // This only happens during undo operations so we guard against that in the Editor component - if (m_fogVolume.GetRenderNode()) - { - RefreshFog(); - } - } - - void EditorFogVolumeComponent::OnShapeChanged(ShapeComponentNotifications::ShapeChangeReasons changeReason) - { - if (changeReason == ShapeComponentNotifications::ShapeChangeReasons::ShapeChanged) - { - m_configuration.UpdateSizeFromEntityShape(); - RefreshFog(); - } - } - - void EditorFogVolumeComponent::OnEditorSpecChange() - { - RefreshFog(); - } - - void EditorFogVolumeComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required) - { - return FogVolumeComponent::GetRequiredServices(required); - } - - void EditorFogVolumeComponent::BuildGameEntity(AZ::Entity* gameEntity) - { - FogVolumeComponent* fogComponent = gameEntity->CreateComponent(); - if (fogComponent) - { - fogComponent->SetConfiguration(m_configuration); - } - } - - void EditorFogVolumeConfiguration::Reflect(AZ::ReflectContext * context) - { - if (AZ::SerializeContext* serializeContext = azrtti_cast(context)) - { - serializeContext->Class()-> - Version(1); - - if (AZ::EditContext* editContext = serializeContext->GetEditContext()) - { - editContext->Class("Configuration", "Fog Volume configuration") - - ->ClassElement(AZ::Edit::ClassElements::EditorData, "") - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) - - ->DataElement(AZ::Edit::UIHandlers::ComboBox, &FogVolumeConfiguration::m_volumeType, - "Volume type", "Shape of the fog") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->EnumAttribute(FogVolumeType::RectangularPrism, "Cuboid") - ->EnumAttribute(FogVolumeType::Ellipsoid, "Ellipsoid") - - ->DataElement(AZ::Edit::UIHandlers::Color, &FogVolumeConfiguration::m_color, - "Color", "Fog color") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - - ->DataElement(AZ::Edit::UIHandlers::CheckBox, &FogVolumeConfiguration::m_useGlobalFogColor, - "Use global fog color", "If true, the Color property is ignored. Instead, the current global fog color is used") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_globalDensity, - "Fog Density", "Controls the density of the fog. The higher the value the more dense the fog and the less you'll be able to see objects behind or inside the fog volume") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, 0.01f) - ->Attribute(AZ::Edit::Attributes::Max, 1000.0f) - ->Attribute(AZ::Edit::Attributes::Step, 1.0f) - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_densityOffset, - "Density offset", "Offset fog density, used in conjunction with the GlobalDensity parameter") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, -1000.0f) - ->Attribute(AZ::Edit::Attributes::Max, 1000.0f) - ->Attribute(AZ::Edit::Attributes::Step, 1.0f) - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_nearCutoff, - "Near cutoff", "Stop rendering the object, depending on camera distance to object") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, 2.0f) - ->Attribute(AZ::Edit::Attributes::Step, 0.1f) - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_softEdges, - "Soft edges", "Specifies a factor that is used to soften the edges of the fog volume when viewed from outside") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, 1.0f) - ->Attribute(AZ::Edit::Attributes::Step, 0.01f) - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_windInfluence, - "Wind influence (Volumetric Fog only)", "Controls the influence of the wind (Volumetric Fog only)") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, 20.0f) - ->Attribute(AZ::Edit::Attributes::Step, 0.01f) - - ->ClassElement(AZ::Edit::ClassElements::Group, "Rendering General") - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - - ->DataElement(AZ::Edit::UIHandlers::CheckBox, &FogVolumeConfiguration::m_ignoresVisAreas, - "Ignore vis. areas", "Controls whether this entity should respond to visareas") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - - ->DataElement(AZ::Edit::UIHandlers::CheckBox, &FogVolumeConfiguration::m_affectsThisAreaOnly, - "Affect this area only", "Set this parameter to false to make this entity affect in multiple visareas") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - - ->DataElement(0, &FogVolumeConfiguration::m_viewDistMultiplier, - "View distance multiplier", "Adjusts max view distance. If 1.0 then default is used. 1.1 would be 10% further than default.") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Suffix, "x") - ->Attribute(AZ::Edit::Attributes::Min, 0.f) - - ->DataElement(AZ::Edit::UIHandlers::ComboBox, &FogVolumeConfiguration::m_minSpec, - "Minimum spec", "Min spec for the fog to be active.") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->EnumAttribute(EngineSpec::Never, "Never") - ->EnumAttribute(EngineSpec::VeryHigh, "Very high") - ->EnumAttribute(EngineSpec::High, "High") - ->EnumAttribute(EngineSpec::Medium, "Medium") - ->EnumAttribute(EngineSpec::Low, "Low") - - ->ClassElement(AZ::Edit::ClassElements::Group, "") - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_hdrDynamic, - "HDR Dynamic (Non-Volumetric Fog)", "Specifies how much brighter than the default 255,255,255 white the fog is (Non-Volumetric Fog only)") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, 20.0f) - ->Attribute(AZ::Edit::Attributes::Step, 0.01f) - - ->ClassElement(AZ::Edit::ClassElements::Group, "Fall Off Settings") - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_fallOffDirLong, - "Longitude", "Controls the longitude of the world space fall off direction of the fog. 0 represents East, rotation is counter-clockwise") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, 360.0f) - ->Attribute(AZ::Edit::Attributes::Step, 1.0f) - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_fallOffDirLatitude, - "Latitude", "Controls the latitude of the world space fall off direction of the fog. 90 lets the fall off direction point upwards in world space") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, 360.0f) - ->Attribute(AZ::Edit::Attributes::Step, 1.0f) - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_fallOffShift, - "Shift", "Controls how much to shift the fog density distribution along the fall off direction in world units") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, -50.0f) - ->Attribute(AZ::Edit::Attributes::Max, 50.0f) - ->Attribute(AZ::Edit::Attributes::Step, 0.1f) - ->Attribute(AZ::Edit::Attributes::Suffix, "m") - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_fallOffScale, - "Scale", "Scales the density distribution along the fall off direction. Higher values will make the fog fall off more rapidly and generate thicker fog layers along the negative fall off direction") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, -50.0f) - ->Attribute(AZ::Edit::Attributes::Max, 50.0f) - ->Attribute(AZ::Edit::Attributes::Step, 0.01f) - - ->ClassElement(AZ::Edit::ClassElements::Group, "Ramp (Volumetric Fog only)") - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_rampStart, - "Start", "Specifies the start distance of fog density ramp in world units") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, 30000.0f) - ->Attribute(AZ::Edit::Attributes::Step, 1.0f) - ->Attribute(AZ::Edit::Attributes::Suffix, "m") - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_rampEnd, - "End", "Specifies the end distance of fog density ramp in world units") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, 30000.0f) - ->Attribute(AZ::Edit::Attributes::Step, 1.0f) - ->Attribute(AZ::Edit::Attributes::Suffix, "m") - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_rampInfluence, - "Influence", "Controls the influence of fog density ramp") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, 1.0f) - ->Attribute(AZ::Edit::Attributes::Step, 0.01f) - - ->ClassElement(AZ::Edit::ClassElements::Group, "Density Noise (Volumetric Fog only)") - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_densityNoiseScale, - "Scale", "Scales the noise for the density") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, 10.0f) - ->Attribute(AZ::Edit::Attributes::Step, 0.01f) - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_densityNoiseOffset, - "Offset", "Offsets the noise for the density") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, -2.0f) - ->Attribute(AZ::Edit::Attributes::Max, 2.0f) - ->Attribute(AZ::Edit::Attributes::Step, 0.01f) - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_densityNoiseTimeFrequency, - "Time frequency", "Controls the time frequency of the noise for the density") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, 1.0f) - ->Attribute(AZ::Edit::Attributes::Step, 0.01f) - - ->DataElement(AZ::Edit::UIHandlers::Default, &FogVolumeConfiguration::m_densityNoiseFrequency, - "Spatial frequency", "Controls the spatial frequency of the noise for the density") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, 10000.0f) - ; - } - } - } - - AZ::Crc32 EditorFogVolumeConfiguration::PropertyChanged() - { - if (m_entityId.IsValid()) - { - FogVolumeComponentRequestBus::Event(m_entityId, &FogVolumeComponentRequestBus::Events::RefreshFog); - } - return AZ::Edit::PropertyRefreshLevels::None; - } -} diff --git a/Gems/LmbrCentral/Code/Source/Rendering/EditorFogVolumeComponent.h b/Gems/LmbrCentral/Code/Source/Rendering/EditorFogVolumeComponent.h deleted file mode 100644 index d7b8c3d042..0000000000 --- a/Gems/LmbrCentral/Code/Source/Rendering/EditorFogVolumeComponent.h +++ /dev/null @@ -1,93 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include -#include -#include -#include -#include - -#include -#include - -#include "FogVolumeComponent.h" -#include "FogVolumeRequestsHandler.h" - -namespace LmbrCentral -{ - class EditorFogVolumeConfiguration - : public FogVolumeConfiguration - { - public: - AZ_TYPE_INFO(EditorFogVolumeConfiguration, "{9D431EA0-92F9-4A00-96C6-28B189A6EE56}"); - - static void Reflect(AZ::ReflectContext* context); - AZ::Crc32 PropertyChanged() override; - }; - - /** - * In-editor fog volume component. - */ - class EditorFogVolumeComponent - : public AzToolsFramework::Components::EditorComponentBase - , private RenderNodeRequestBus::Handler - , private FogVolumeComponentRequestsBusHandler - , private AZ::TransformNotificationBus::Handler - , private ShapeComponentNotificationsBus::Handler - , private AzToolsFramework::EditorEvents::Bus::Handler - { - private: - using Base = AzToolsFramework::Components::EditorComponentBase; - - public: - AZ_EDITOR_COMPONENT(EditorFogVolumeComponent, "{8CA5AB61-96D8-482F-B07C-DAD72ED73646}"); - - ~EditorFogVolumeComponent() override = default; - - // AZ::Component interface implementation - void Activate() override; - void Deactivate() override; - - static void Reflect(AZ::ReflectContext* context); - - // RenderNodeRequestBus::Handler - IRenderNode* GetRenderNode() override; - float GetRenderNodeRequestBusOrder() const override; - - // FogVolumeComponentRequestBus::Handler - void RefreshFog() override; - - // TransformNotificationBus::Handler - void OnTransformChanged(const AZ::Transform& local, const AZ::Transform& world) override; - - // ShapeComponentNotificationsBus::Handler - void OnShapeChanged(ShapeComponentNotifications::ShapeChangeReasons changeReason) override; - - // AzToolsFramework::EditorEvents::Handler - void OnEditorSpecChange() override; - - static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required); - - void BuildGameEntity(AZ::Entity* gameEntity) override; - - protected: - FogVolumeConfiguration& GetConfiguration() override - { - return m_configuration; - } - - private: - EditorFogVolumeConfiguration m_configuration; - FogVolume m_fogVolume; - }; -} diff --git a/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeCommon.cpp b/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeCommon.cpp deleted file mode 100644 index 458c76377e..0000000000 --- a/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeCommon.cpp +++ /dev/null @@ -1,179 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#include "LmbrCentral_precompiled.h" - -#include -#include -#include -#include - -#include "FogVolumeCommon.h" -#include "FogVolumeComponent.h" - -#include - -namespace LmbrCentral -{ - FogVolume::FogVolume() - : m_fogRenderNode(nullptr) - { - } - - FogVolume::~FogVolume() - { - DestroyRenderNode(); - } - - void FogVolume::CreateFogVolumeRenderNode(const FogVolumeConfiguration& fogVolumeConfig) - { - AZ_Assert(m_entityId.IsValid(), "[FogVolumeCommon/FogVolumeComponent Component] Entity id is invalid"); - DestroyRenderNode(); - - m_fogRenderNode = static_cast(gEnv->p3DEngine->CreateRenderNode(eERType_FogVolume)); - m_fogRenderNode->SetMinSpec(static_cast(fogVolumeConfig.m_minSpec)); - m_fogRenderNode->SetViewDistanceMultiplier(fogVolumeConfig.m_viewDistMultiplier); - - UpdateFogVolumeProperties(fogVolumeConfig); - UpdateFogVolumeTransform(); - } - - void FogVolume::DestroyRenderNode() - { - if (m_fogRenderNode != nullptr) - { - m_fogRenderNode->ReleaseNode(); - m_fogRenderNode = nullptr; - } - } - - void FogVolume::UpdateFogVolumeProperties(const FogVolumeConfiguration& fogVolumeConfig) - { - AZ_Assert(m_fogRenderNode != nullptr, "[FogVolumeCommon/FogVolumeComponent Component] Trying to updated null render node"); - - SFogVolumeProperties fogProperties; - FogUtils::FogConfigToFogParams(fogVolumeConfig, fogProperties); - - m_fogRenderNode->SetFogVolumeProperties(fogProperties); - } - - void FogVolume::UpdateFogVolumeTransform() - { - AZ_Assert(m_fogRenderNode != nullptr, "[FogVolumeCommon/FogVolumeComponent Component] Trying to updated null render node"); - - AZ::Transform parentTransform = AZ::Transform::CreateIdentity(); - AZ::TransformBus::EventResult(parentTransform, m_entityId, &AZ::TransformBus::Events::GetWorldTM); - - m_fogRenderNode->SetScale(AZVec3ToLYVec3(parentTransform.GetScale())); - m_fogRenderNode->SetMatrix(AZTransformToLYTransform(parentTransform)); - } - - void FogVolume::UpdateRenderingFlags(const FogVolumeConfiguration& fogVolumeConfig) - { - if (m_fogRenderNode) - { - m_fogRenderNode->SetMinSpec(static_cast(fogVolumeConfig.m_minSpec)); - - if (gEnv && gEnv->p3DEngine) - { - const int configSpec = gEnv->pSystem->GetConfigSpec(true); - - AZ::u32 rendFlags = static_cast(m_fogRenderNode->GetRndFlags()); - - const bool hidden = static_cast(configSpec) < static_cast(fogVolumeConfig.m_minSpec); - if (hidden) - { - rendFlags |= ERF_HIDDEN; - } - else - { - rendFlags &= ~ERF_HIDDEN; - } - - rendFlags |= ERF_COMPONENT_ENTITY; - m_fogRenderNode->SetRndFlags(rendFlags); - } - } - } - - void FogUtils::FogConfigToFogParams(const LmbrCentral::FogVolumeConfiguration& configuration, SFogVolumeProperties& fogVolumeProperties) - { - AZ_Assert(configuration.m_volumeType != FogVolumeType::None, "[FogConfigToFogParams] Attempting to create a fog with invalid volume type") - - fogVolumeProperties.m_volumeType = static_cast(configuration.m_volumeType); - fogVolumeProperties.m_size = AZVec3ToLYVec3(configuration.m_size); - fogVolumeProperties.m_color = AZColorToLYVec3(configuration.m_color); - fogVolumeProperties.m_useGlobalFogColor = configuration.m_useGlobalFogColor; - fogVolumeProperties.m_ignoresVisAreas = configuration.m_ignoresVisAreas; - fogVolumeProperties.m_affectsThisAreaOnly = configuration.m_affectsThisAreaOnly; - - fogVolumeProperties.m_globalDensity = max(0.01f, configuration.m_globalDensity); - fogVolumeProperties.m_densityOffset = configuration.m_densityOffset; - fogVolumeProperties.m_nearCutoff = configuration.m_nearCutoff; - fogVolumeProperties.m_fHDRDynamic = configuration.m_hdrDynamic; - fogVolumeProperties.m_softEdges = configuration.m_softEdges; - - fogVolumeProperties.m_heightFallOffDirLong = configuration.m_fallOffDirLong; - fogVolumeProperties.m_heightFallOffDirLati = configuration.m_fallOffDirLatitude; - fogVolumeProperties.m_heightFallOffShift = configuration.m_fallOffShift; - fogVolumeProperties.m_heightFallOffScale = configuration.m_fallOffScale; - - fogVolumeProperties.m_rampStart = configuration.m_rampStart; - fogVolumeProperties.m_rampEnd = configuration.m_rampEnd; - fogVolumeProperties.m_rampInfluence = configuration.m_rampInfluence; - fogVolumeProperties.m_windInfluence = configuration.m_windInfluence; - - fogVolumeProperties.m_densityNoiseScale = configuration.m_densityNoiseScale; - fogVolumeProperties.m_densityNoiseOffset = configuration.m_densityNoiseOffset; - fogVolumeProperties.m_densityNoiseTimeFrequency = configuration.m_densityNoiseTimeFrequency; - fogVolumeProperties.m_densityNoiseFrequency = AZVec3ToLYVec3(configuration.m_densityNoiseFrequency); - } - - void FogVolumeConfiguration::Reflect(AZ::ReflectContext * context) - { - if (AZ::SerializeContext *serializeContext = azrtti_cast(context)) - { - serializeContext->Class() - ->Version(1) - ->Field("VolumeType", &FogVolumeConfiguration::m_volumeType) - ->Field("Color", &FogVolumeConfiguration::m_color) - ->Field("HdrDynamic", &FogVolumeConfiguration::m_hdrDynamic) - ->Field("UseGlobalFogColor", &FogVolumeConfiguration::m_useGlobalFogColor) - ->Field("SoftEdges", &FogVolumeConfiguration::m_softEdges) - ->Field("WindInfluence", &FogVolumeConfiguration::m_windInfluence) - ->Field("GlobalDensity", &FogVolumeConfiguration::m_globalDensity) - ->Field("DensityOffset", &FogVolumeConfiguration::m_densityOffset) - ->Field("NearCutoff", &FogVolumeConfiguration::m_nearCutoff) - ->Field("EngineSpec", &FogVolumeConfiguration::m_minSpec) - ->Field("DistMult", &FogVolumeConfiguration::m_viewDistMultiplier) - ->Field("IgnoresVisAreas", &FogVolumeConfiguration::m_ignoresVisAreas) - ->Field("AffectsThisAreaOnly", &FogVolumeConfiguration::m_affectsThisAreaOnly) - ->Field("FallOffDirLong", &FogVolumeConfiguration::m_fallOffDirLong) - ->Field("FallOffDirLatitude", &FogVolumeConfiguration::m_fallOffDirLatitude) - ->Field("FallOffShift", &FogVolumeConfiguration::m_fallOffShift) - ->Field("FallOffScale", &FogVolumeConfiguration::m_fallOffScale) - ->Field("RampStart", &FogVolumeConfiguration::m_rampStart) - ->Field("RampEnd", &FogVolumeConfiguration::m_rampEnd) - ->Field("RampInfluence", &FogVolumeConfiguration::m_rampInfluence) - ->Field("DensityNoiseScale", &FogVolumeConfiguration::m_densityNoiseScale) - ->Field("DensityNoiseOffset", &FogVolumeConfiguration::m_densityNoiseOffset) - ->Field("DensityNoiseTimeFrequency", &FogVolumeConfiguration::m_densityNoiseTimeFrequency) - ->Field("DensityNoiseFrequency", &FogVolumeConfiguration::m_densityNoiseFrequency) - ; - } - } - - void FogVolumeConfiguration::UpdateSizeFromEntityShape() - { - AZ_Assert(m_entityId.IsValid(), "[FogVolumeConfiguration] Entity id is invalid"); - BoxShapeComponentRequestsBus::EventResult(m_size, m_entityId, &BoxShapeComponentRequestsBus::Events::GetBoxDimensions); - } -} diff --git a/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeCommon.h b/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeCommon.h deleted file mode 100644 index aba73d1165..0000000000 --- a/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeCommon.h +++ /dev/null @@ -1,116 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include -#include -#include - -#include - -struct SFogVolumeProperties; -struct IFogVolumeRenderNode; - -namespace LmbrCentral -{ - /** - * Stores configuration settings for the Fog Volume. - */ - class FogVolumeConfiguration - { - public: - AZ_TYPE_INFO(FogVolumeConfiguration, "{3B786BBB-0B1D-4EF2-9181-CC75C783C26E}"); - virtual ~FogVolumeConfiguration() {}; - - static void Reflect(AZ::ReflectContext* context); - - // Universal rendering properties - EngineSpec m_minSpec = EngineSpec::Low; - float m_viewDistMultiplier = 1.0f; - - FogVolumeType m_volumeType = FogVolumeType::Ellipsoid; - AZ::Color m_color = AZ::Color(1.f, 1.f, 1.f, 1.f); - // Size is not reflected: taken from BoxShape - AZ::Vector3 m_size = AZ::Vector3(1.0f, 1.0f, 1.0f); - - float m_hdrDynamic = false; - bool m_useGlobalFogColor = false; - - float m_globalDensity = 1.0f; - float m_densityOffset = 0.0f; - float m_nearCutoff = 0.0f; - - float m_fallOffDirLong = 0.0f; - float m_fallOffDirLatitude = 90.0f; - float m_fallOffShift = 0.0f; - float m_fallOffScale = 1.0f; - - float m_softEdges = 1.0f; - - float m_rampStart = 1.0f; - float m_rampEnd = 50.0f; - float m_rampInfluence = 0.0f; - float m_windInfluence = 1.0f; - - float m_densityNoiseScale = 1.0f; - float m_densityNoiseOffset = 1.0f; - float m_densityNoiseTimeFrequency = 0.0f; - - AZ::Vector3 m_densityNoiseFrequency = AZ::Vector3(10.0f, 10.0f, 10.0f); - bool m_ignoresVisAreas = false; - bool m_affectsThisAreaOnly = 0.0f; - - void UpdateSizeFromEntityShape(); - - // Implemented in EditorFogVolumeConfiguration - virtual AZ::Crc32 PropertyChanged() { return 0; } - - void SetEntityId(AZ::EntityId id) { m_entityId = id; } - - protected: - // Not reflected - AZ::EntityId m_entityId; - }; - - class FogVolume - { - public: - FogVolume(); - FogVolume(const FogVolume&) = delete; - FogVolume& operator= (const FogVolume&) = delete; - - virtual ~FogVolume(); - - void SetEntityId(AZ::EntityId id) { m_entityId = id; } - - void CreateFogVolumeRenderNode(const FogVolumeConfiguration& fogVolumeConfig); - void DestroyRenderNode(); - - IFogVolumeRenderNode* GetRenderNode() const - { - return m_fogRenderNode; - } - - void UpdateFogVolumeProperties(const FogVolumeConfiguration& fogVolumeConfig); - void UpdateRenderingFlags(const FogVolumeConfiguration& fogVolumeConfig); - void UpdateFogVolumeTransform(); - - private: - IFogVolumeRenderNode* m_fogRenderNode; - AZ::EntityId m_entityId; - }; - - namespace FogUtils - { - void FogConfigToFogParams(const LmbrCentral::FogVolumeConfiguration& configuration, SFogVolumeProperties& fogVolumeProperties); - } -} diff --git a/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeComponent.cpp b/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeComponent.cpp deleted file mode 100644 index 865bba6c12..0000000000 --- a/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeComponent.cpp +++ /dev/null @@ -1,203 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#include "LmbrCentral_precompiled.h" - -#include -#include -#include - -#include "FogVolumeComponent.h" - -namespace LmbrCentral -{ - const float FogVolumeComponent::s_renderNodeRequestBusOrder = 500.f; - - void FogVolumeComponent::Activate() - { - const auto entityId = GetEntityId(); - - m_configuration.SetEntityId(entityId); - m_configuration.UpdateSizeFromEntityShape(); - - m_fogVolume.SetEntityId(entityId); - m_fogVolume.CreateFogVolumeRenderNode(m_configuration); - - RefreshFog(); - - RenderNodeRequestBus::Handler::BusConnect(entityId); - FogVolumeComponentRequestBus::Handler::BusConnect(entityId); - ShapeComponentNotificationsBus::Handler::BusConnect(entityId); - AZ::TransformNotificationBus::Handler::BusConnect(entityId); - } - - void FogVolumeComponent::Deactivate() - { - m_fogVolume.DestroyRenderNode(); - m_fogVolume.SetEntityId(AZ::EntityId()); - m_configuration.SetEntityId(AZ::EntityId()); - - RenderNodeRequestBus::Handler::BusDisconnect(); - FogVolumeComponentRequestBus::Handler::BusDisconnect(); - ShapeComponentNotificationsBus::Handler::BusDisconnect(); - AZ::TransformNotificationBus::Handler::BusDisconnect(); - } - - void FogVolumeComponent::Reflect(AZ::ReflectContext* context) - { - FogVolumeConfiguration::Reflect(context); - - if (AZ::SerializeContext* serializeContext = azrtti_cast(context)) - { - serializeContext->Class() - ->Version(1) - ->Field("FogVolumeConfiguration", &FogVolumeComponent::m_configuration); - } - - if (AZ::BehaviorContext* behaviorContext = azrtti_cast(context)) - { - behaviorContext->Class()->RequestBus("FogVolumeComponentRequestBus"); - FogVolumeComponent::ExposeRequestsBusInBehaviorContext(behaviorContext, "FogVolumeComponentRequestBus"); - } - } - - IRenderNode* FogVolumeComponent::GetRenderNode() - { - return m_fogVolume.GetRenderNode(); - } - - float FogVolumeComponent::GetRenderNodeRequestBusOrder() const - { - return s_renderNodeRequestBusOrder; - } - - void FogVolumeComponent::RefreshFog() - { - m_fogVolume.UpdateFogVolumeProperties(m_configuration); - m_fogVolume.UpdateRenderingFlags(m_configuration); - m_fogVolume.UpdateFogVolumeTransform(); - } - - void FogVolumeComponent::OnTransformChanged([[maybe_unused]] const AZ::Transform & local, [[maybe_unused]] const AZ::Transform & world) - { - RefreshFog(); - } - - void FogVolumeComponent::OnShapeChanged(ShapeComponentNotifications::ShapeChangeReasons changeReason) - { - if (changeReason == ShapeComponentNotifications::ShapeChangeReasons::ShapeChanged) - { - m_configuration.UpdateSizeFromEntityShape(); - RefreshFog(); - } - } - - void FogVolumeComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType & required) - { - required.push_back(AZ_CRC("BoxShapeService", 0x946a0032)); - } - - void FogVolumeComponent::ExposeRequestsBusInBehaviorContext(AZ::BehaviorContext* behaviorContext, const char* name) - { - behaviorContext->EBus(name) - ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::All) - ->Event("RefreshFog", &FogVolumeComponentRequestBus::Events::RefreshFog) - - ->Event("GetVolumeType", &FogVolumeComponentRequestBus::Events::GetVolumeType) - ->Event("SetVolumeType", &FogVolumeComponentRequestBus::Events::SetVolumeType) - ->VirtualProperty("VolumeType", "GetVolumeType", "SetVolumeType") - - ->Event("GetColor", &FogVolumeComponentRequestBus::Events::GetColor) - ->Event("SetColor", &FogVolumeComponentRequestBus::Events::SetColor) - ->VirtualProperty("Color", "GetColor", "SetColor") - - ->Event("GetHdrDynamic", &FogVolumeComponentRequestBus::Events::GetHdrDynamic) - ->Event("SetHdrDynamic", &FogVolumeComponentRequestBus::Events::SetHdrDynamic) - ->VirtualProperty("HdrDynamic", "GetHdrDynamic", "SetHdrDynamic") - - ->Event("GetUseGlobalFogColor", &FogVolumeComponentRequestBus::Events::GetUseGlobalFogColor) - ->Event("SetUseGlobalFogColor", &FogVolumeComponentRequestBus::Events::SetUseGlobalFogColor) - ->VirtualProperty("UseGlobalFogColor", "GetUseGlobalFogColor", "SetUseGlobalFogColor") - - ->Event("GetGlobalDensity", &FogVolumeComponentRequestBus::Events::GetGlobalDensity) - ->Event("SetGlobalDensity", &FogVolumeComponentRequestBus::Events::SetGlobalDensity) - ->VirtualProperty("GlobalDensity", "GetGlobalDensity", "SetGlobalDensity") - - ->Event("GetDensityOffset", &FogVolumeComponentRequestBus::Events::GetDensityOffset) - ->Event("SetDensityOffset", &FogVolumeComponentRequestBus::Events::SetDensityOffset) - ->VirtualProperty("DensityOffset", "GetDensityOffset", "SetDensityOffset") - - ->Event("GetNearCutoff", &FogVolumeComponentRequestBus::Events::GetNearCutoff) - ->Event("SetNearCutoff", &FogVolumeComponentRequestBus::Events::SetNearCutoff) - ->VirtualProperty("NearCutoff", "GetNearCutoff", "SetNearCutoff") - - ->Event("GetFallOffDirLong", &FogVolumeComponentRequestBus::Events::GetFallOffDirLong) - ->Event("SetFallOffDirLong", &FogVolumeComponentRequestBus::Events::SetFallOffDirLong) - ->VirtualProperty("FallOffDirLong", "GetFallOffDirLong", "SetFallOffDirLong") - - ->Event("GetFallOffDirLatitude", &FogVolumeComponentRequestBus::Events::GetFallOffDirLatitude) - ->Event("SetFallOffDirLatitude", &FogVolumeComponentRequestBus::Events::SetFallOffDirLatitude) - ->VirtualProperty("FallOffDirLatitude", "GetFallOffDirLatitude", "SetFallOffDirLatitude") - - ->Event("GetFallOffShift", &FogVolumeComponentRequestBus::Events::GetFallOffShift) - ->Event("SetFallOffShift", &FogVolumeComponentRequestBus::Events::SetFallOffShift) - ->VirtualProperty("FallOffShift", "GetFallOffShift", "SetFallOffShift") - - ->Event("GetFallOffScale", &FogVolumeComponentRequestBus::Events::GetFallOffScale) - ->Event("SetFallOffScale", &FogVolumeComponentRequestBus::Events::SetFallOffScale) - ->VirtualProperty("FallOffScale", "GetFallOffScale", "SetFallOffScale") - - ->Event("GetSoftEdges", &FogVolumeComponentRequestBus::Events::GetSoftEdges) - ->Event("SetSoftEdges", &FogVolumeComponentRequestBus::Events::SetSoftEdges) - ->VirtualProperty("SoftEdges", "GetSoftEdges", "SetSoftEdges") - - ->Event("GetRampStart", &FogVolumeComponentRequestBus::Events::GetRampStart) - ->Event("SetRampStart", &FogVolumeComponentRequestBus::Events::SetRampStart) - ->VirtualProperty("RampStart", "GetRampStart", "SetRampStart") - - ->Event("GetRampEnd", &FogVolumeComponentRequestBus::Events::GetRampEnd) - ->Event("SetRampEnd", &FogVolumeComponentRequestBus::Events::SetRampEnd) - ->VirtualProperty("RampEnd", "GetRampEnd", "SetRampEnd") - - ->Event("GetRampInfluence", &FogVolumeComponentRequestBus::Events::GetRampInfluence) - ->Event("SetRampInfluence", &FogVolumeComponentRequestBus::Events::SetRampInfluence) - ->VirtualProperty("RampInfluence", "GetRampInfluence", "SetRampInfluence") - - ->Event("GetWindInfluence", &FogVolumeComponentRequestBus::Events::GetWindInfluence) - ->Event("SetWindInfluence", &FogVolumeComponentRequestBus::Events::SetWindInfluence) - ->VirtualProperty("WindInfluence", "GetWindInfluence", "SetWindInfluence") - - ->Event("GetDensityNoiseScale", &FogVolumeComponentRequestBus::Events::GetDensityNoiseScale) - ->Event("SetDensityNoiseScale", &FogVolumeComponentRequestBus::Events::SetDensityNoiseScale) - ->VirtualProperty("DensityNoiseScale", "GetDensityNoiseScale", "SetDensityNoiseScale") - - ->Event("GetDensityNoiseOffset", &FogVolumeComponentRequestBus::Events::GetDensityNoiseOffset) - ->Event("SetDensityNoiseOffset", &FogVolumeComponentRequestBus::Events::SetDensityNoiseOffset) - ->VirtualProperty("DensityNoiseOffset", "GetDensityNoiseOffset", "SetDensityNoiseOffset") - - ->Event("GetDensityNoiseTimeFrequency", &FogVolumeComponentRequestBus::Events::GetDensityNoiseTimeFrequency) - ->Event("SetDensityNoiseTimeFrequency", &FogVolumeComponentRequestBus::Events::SetDensityNoiseTimeFrequency) - ->VirtualProperty("DensityNoiseTimeFrequency", "GetDensityNoiseTimeFrequency", "SetDensityNoiseTimeFrequency") - - ->Event("GetDensityNoiseFrequency", &FogVolumeComponentRequestBus::Events::GetDensityNoiseFrequency) - ->Event("SetDensityNoiseFrequency", &FogVolumeComponentRequestBus::Events::SetDensityNoiseFrequency) - ->VirtualProperty("DensityNoiseFrequency", "GetDensityNoiseFrequency", "SetDensityNoiseFrequency") - - ->Event("GetIgnoresVisAreas", &FogVolumeComponentRequestBus::Events::GetIgnoresVisAreas) - ->Event("SetIgnoresVisAreas", &FogVolumeComponentRequestBus::Events::SetIgnoresVisAreas) - ->VirtualProperty("IgnoresVisAreas", "GetIgnoresVisAreas", "SetIgnoresVisAreas") - - ->Event("GetAffectsThisAreaOnly", &FogVolumeComponentRequestBus::Events::GetAffectsThisAreaOnly) - ->Event("SetAffectsThisAreaOnly", &FogVolumeComponentRequestBus::Events::SetAffectsThisAreaOnly) - ->VirtualProperty("AffectsThisAreaOnly", "GetAffectsThisAreaOnly", "SetAffectsThisAreaOnly") - ; - } -} diff --git a/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeComponent.h b/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeComponent.h deleted file mode 100644 index a43deb7cf9..0000000000 --- a/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeComponent.h +++ /dev/null @@ -1,84 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include - -#include -#include -#include -#include - -#include -#include - -#include - -#include "FogVolumeCommon.h" -#include "FogVolumeRequestsHandler.h" - -namespace LmbrCentral -{ - /*! - * In-game Fog Volume component. - */ - class FogVolumeComponent - : public AZ::Component - , public RenderNodeRequestBus::Handler - , private FogVolumeComponentRequestsBusHandler - , private AZ::TransformNotificationBus::Handler - , private ShapeComponentNotificationsBus::Handler - { - public: - AZ_COMPONENT(FogVolumeComponent, "{C01B9E8F-C015-46AC-9065-79445CE1408A}"); - ~FogVolumeComponent() override = default; - - template - void SetConfiguration(T&& configuration) - { - m_configuration = AZStd::forward(configuration); - } - - // AZ::Component interface implementation - void Activate() override; - void Deactivate() override; - - static void Reflect(AZ::ReflectContext* context); - - // RenderNodeRequestBus::Handler interface implementation - IRenderNode* GetRenderNode() override; - float GetRenderNodeRequestBusOrder() const override; - static const float s_renderNodeRequestBusOrder; - - // TransformNotificationBus::Handler - void OnTransformChanged(const AZ::Transform& local, const AZ::Transform& world) override; - - // ShapeComponentNotificationsBus::Handler - void OnShapeChanged(ShapeComponentNotifications::ShapeChangeReasons changeReason) override; - - // FogVolumeComponentRequestBus::Handler - void RefreshFog() override; - - static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required); - static void ExposeRequestsBusInBehaviorContext(AZ::BehaviorContext* behaviorContext, const char* name); - - protected: - FogVolumeConfiguration& GetConfiguration() override - { - return m_configuration; - } - - private: - FogVolumeConfiguration m_configuration; - FogVolume m_fogVolume; - }; -} diff --git a/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeRequestsHandler.cpp b/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeRequestsHandler.cpp deleted file mode 100644 index 9b23481659..0000000000 --- a/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeRequestsHandler.cpp +++ /dev/null @@ -1,264 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#include "LmbrCentral_precompiled.h" - -#include "FogVolumeRequestsHandler.h" -#include "FogVolumeCommon.h" - -namespace LmbrCentral -{ - FogVolumeType FogVolumeComponentRequestsBusHandler::GetVolumeType() - { - return GetConfiguration().m_volumeType; - } - - void FogVolumeComponentRequestsBusHandler::SetVolumeType(FogVolumeType volumeType) - { - auto& configuration = GetConfiguration(); - if (configuration.m_volumeType != volumeType) - { - configuration.m_volumeType = volumeType; - RefreshFog(); - } - } - - AZ::Color FogVolumeComponentRequestsBusHandler::GetColor() - { - return GetConfiguration().m_color; - } - - void FogVolumeComponentRequestsBusHandler::SetColor(AZ::Color color) - { - GetConfiguration().m_color = color; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetHdrDynamic() - { - return GetConfiguration().m_hdrDynamic; - } - - void FogVolumeComponentRequestsBusHandler::SetHdrDynamic(float hdrDynamic) - { - GetConfiguration().m_hdrDynamic = hdrDynamic; - RefreshFog(); - } - - bool FogVolumeComponentRequestsBusHandler::GetUseGlobalFogColor() - { - return GetConfiguration().m_useGlobalFogColor; - } - - void FogVolumeComponentRequestsBusHandler::SetUseGlobalFogColor(bool useGlobalFogColor) - { - GetConfiguration().m_useGlobalFogColor = useGlobalFogColor; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetGlobalDensity() - { - return GetConfiguration().m_globalDensity; - } - - void FogVolumeComponentRequestsBusHandler::SetGlobalDensity(float globalDensity) - { - GetConfiguration().m_globalDensity = globalDensity; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetDensityOffset() - { - return GetConfiguration().m_densityOffset; - } - - void FogVolumeComponentRequestsBusHandler::SetDensityOffset(float densityOffset) - { - GetConfiguration().m_densityOffset = densityOffset; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetNearCutoff() - { - return GetConfiguration().m_nearCutoff; - } - - void FogVolumeComponentRequestsBusHandler::SetNearCutoff(float nearCutoff) - { - GetConfiguration().m_nearCutoff = nearCutoff; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetFallOffDirLong() - { - return GetConfiguration().m_fallOffDirLong; - } - - void FogVolumeComponentRequestsBusHandler::SetFallOffDirLong(float fallOffDirLong) - { - GetConfiguration().m_fallOffDirLong = fallOffDirLong; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetFallOffDirLatitude() - { - return GetConfiguration().m_fallOffDirLatitude; - } - - void FogVolumeComponentRequestsBusHandler::SetFallOffDirLatitude(float fallOffDirLatitude) - { - GetConfiguration().m_fallOffDirLatitude = fallOffDirLatitude; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetFallOffShift() - { - return GetConfiguration().m_fallOffShift; - } - - void FogVolumeComponentRequestsBusHandler::SetFallOffShift(float fallOffShift) - { - GetConfiguration().m_fallOffShift = fallOffShift; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetFallOffScale() - { - return GetConfiguration().m_fallOffScale; - } - - void FogVolumeComponentRequestsBusHandler::SetFallOffScale(float fallOffScale) - { - GetConfiguration().m_fallOffScale = fallOffScale; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetSoftEdges() - { - return GetConfiguration().m_softEdges; - } - - void FogVolumeComponentRequestsBusHandler::SetSoftEdges(float softEdges) - { - GetConfiguration().m_softEdges = softEdges; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetRampStart() - { - return GetConfiguration().m_rampStart; - } - - void FogVolumeComponentRequestsBusHandler::SetRampStart(float rampStart) - { - GetConfiguration().m_rampStart = rampStart; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetRampEnd() - { - return GetConfiguration().m_rampEnd; - } - - void FogVolumeComponentRequestsBusHandler::SetRampEnd(float rampEnd) - { - GetConfiguration().m_rampEnd = rampEnd; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetRampInfluence() - { - return GetConfiguration().m_rampInfluence; - } - - void FogVolumeComponentRequestsBusHandler::SetRampInfluence(float rampInfluence) - { - GetConfiguration().m_rampInfluence = rampInfluence; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetWindInfluence() - { - return GetConfiguration().m_windInfluence; - } - - void FogVolumeComponentRequestsBusHandler::SetWindInfluence(float windInfluence) - { - GetConfiguration().m_windInfluence = windInfluence; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetDensityNoiseScale() - { - return GetConfiguration().m_densityNoiseScale; - } - - void FogVolumeComponentRequestsBusHandler::SetDensityNoiseScale(float densityNoiseScale) - { - GetConfiguration().m_densityNoiseScale = densityNoiseScale; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetDensityNoiseOffset() - { - return GetConfiguration().m_densityNoiseOffset; - } - - void FogVolumeComponentRequestsBusHandler::SetDensityNoiseOffset(float densityNoiseOffset) - { - GetConfiguration().m_densityNoiseOffset = densityNoiseOffset; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetDensityNoiseTimeFrequency() - { - return GetConfiguration().m_densityNoiseTimeFrequency; - } - - void FogVolumeComponentRequestsBusHandler::SetDensityNoiseTimeFrequency(float timeFrequency) - { - GetConfiguration().m_densityNoiseTimeFrequency = timeFrequency; - RefreshFog(); - } - - AZ::Vector3 FogVolumeComponentRequestsBusHandler::GetDensityNoiseFrequency() - { - return GetConfiguration().m_densityNoiseFrequency; - } - - void FogVolumeComponentRequestsBusHandler::SetDensityNoiseFrequency(AZ::Vector3 densityNoiseFrequency) - { - GetConfiguration().m_densityNoiseFrequency = densityNoiseFrequency; - RefreshFog(); - } - - bool FogVolumeComponentRequestsBusHandler::GetIgnoresVisAreas() - { - return GetConfiguration().m_ignoresVisAreas; - } - - void FogVolumeComponentRequestsBusHandler::SetIgnoresVisAreas(bool ignoresVisAreas) - { - GetConfiguration().m_ignoresVisAreas = ignoresVisAreas; - RefreshFog(); - } - - bool FogVolumeComponentRequestsBusHandler::GetAffectsThisAreaOnly() - { - return GetConfiguration().m_affectsThisAreaOnly; - } - - void FogVolumeComponentRequestsBusHandler::SetAffectsThisAreaOnly(bool affectsThisAreaOnly) - { - GetConfiguration().m_affectsThisAreaOnly = affectsThisAreaOnly; - RefreshFog(); - } -} diff --git a/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeRequestsHandler.h b/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeRequestsHandler.h deleted file mode 100644 index 1c164e6edf..0000000000 --- a/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeRequestsHandler.h +++ /dev/null @@ -1,94 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include -#include - -namespace LmbrCentral -{ - class FogVolumeComponentRequestsBusHandler - : public FogVolumeComponentRequestBus::Handler - { - ///////////////////////////////////////////// - // FogVolumeComponentRequestBus::Handler - FogVolumeType GetVolumeType() override; - void SetVolumeType(FogVolumeType volumeType) override; - - AZ::Color GetColor() override; - void SetColor(AZ::Color color) override; - - float GetHdrDynamic() override; - void SetHdrDynamic(float hdrDynamic) override; - - bool GetUseGlobalFogColor() override; - void SetUseGlobalFogColor(bool useGlobalFogColor) override; - - float GetGlobalDensity() override; - void SetGlobalDensity(float globalDensity) override; - - float GetDensityOffset() override; - void SetDensityOffset(float densityOffset) override; - - float GetNearCutoff() override; - void SetNearCutoff(float nearCutoff) override; - - float GetFallOffDirLong() override; - void SetFallOffDirLong(float fallOffDirLong) override; - - float GetFallOffDirLatitude() override; - void SetFallOffDirLatitude(float fallOffDirLatitude) override; - - float GetFallOffShift() override; - void SetFallOffShift(float fallOffShift) override; - - float GetFallOffScale() override; - void SetFallOffScale(float fallOffScale) override; - - float GetSoftEdges() override; - void SetSoftEdges(float softEdges) override; - - float GetRampStart() override; - void SetRampStart(float rampStart) override; - - float GetRampEnd() override; - void SetRampEnd(float rampEnd) override; - - float GetRampInfluence() override; - void SetRampInfluence(float rampInfluence) override; - - float GetWindInfluence() override; - void SetWindInfluence(float windInfluence) override; - - float GetDensityNoiseScale() override; - void SetDensityNoiseScale(float densityNoiseScale) override; - - float GetDensityNoiseOffset() override; - void SetDensityNoiseOffset(float densityNoiseOffset) override; - - float GetDensityNoiseTimeFrequency() override; - void SetDensityNoiseTimeFrequency(float timeFrequency) override; - - AZ::Vector3 GetDensityNoiseFrequency() override; - void SetDensityNoiseFrequency(AZ::Vector3 densityNoiseFrequency) override; - - bool GetIgnoresVisAreas() override; - void SetIgnoresVisAreas(bool ignoresVisAreas) override; - - bool GetAffectsThisAreaOnly() override; - void SetAffectsThisAreaOnly(bool affectsThisAreaOnly) override; - ///////////////////////////////////////////// - - protected: - virtual FogVolumeConfiguration& GetConfiguration() = 0; - }; -} diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Rendering/FogVolumeComponentBus.h b/Gems/LmbrCentral/Code/include/LmbrCentral/Rendering/FogVolumeComponentBus.h deleted file mode 100644 index 55a1d1d039..0000000000 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Rendering/FogVolumeComponentBus.h +++ /dev/null @@ -1,247 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include - -namespace LmbrCentral -{ - class FogVolumeConfiguration; - - enum class FogVolumeType : AZ::s32 - { - None = -1, - Ellipsoid = 0, - RectangularPrism = 1, - }; - - class FogVolumeComponentRequests - : public AZ::ComponentBus - { - public: - virtual ~FogVolumeComponentRequests() {} - - /// Propagates updated configuration to the fog volume component - virtual void RefreshFog() {}; - - /** - * Gets the volume shape type. - */ - virtual FogVolumeType GetVolumeType() { return FogVolumeType::None; } - /** - * Sets the volume shape type. - */ - virtual void SetVolumeType([[maybe_unused]] FogVolumeType volumeType) {}; - - /** - * Gets color of the fog. - */ - virtual AZ::Color GetColor() { return AZ::Color::CreateOne(); } - /** - * Sets color of the fog. - */ - virtual void SetColor([[maybe_unused]] AZ::Color color) {}; - - /** - * Gets HDR Dynamic. - */ - virtual float GetHdrDynamic() { return FLT_MAX; } - /** - * Set HDR Dynamic. - */ - virtual void SetHdrDynamic([[maybe_unused]] float hdrDynamic) {}; - - /** - * Returns true if global fog color is used instead of the color property. - */ - virtual bool GetUseGlobalFogColor() { return false; } - /** - * Sets whether global fog color is used instead of the color property. - */ - virtual void SetUseGlobalFogColor([[maybe_unused]] bool useGlobalFogColor) {}; - - /** - * Gets Fog density. - */ - virtual float GetGlobalDensity() { return FLT_MAX; } - /** - * Sets Fog density. Fog density controls how thick the fog appears. - */ - virtual void SetGlobalDensity([[maybe_unused]] float globalDensity) {}; - - /** - * Gets density offset - */ - virtual float GetDensityOffset() { return FLT_MAX; } - /** - * Sets density offset. Density offset additionaly controls to the density of the fog volume. - */ - virtual void SetDensityOffset([[maybe_unused]] float densityOffset) {}; - - /** - * Gets near cutoff distance - */ - virtual float GetNearCutoff() { return FLT_MAX; } - /** - * Sets near cutoff distance. Stops rendering the volume, depending on the camera distance to the object (m). - */ - virtual void SetNearCutoff([[maybe_unused]] float nearCutoff) {}; - - /** - * Gets fall off direction horizontally. - */ - virtual float GetFallOffDirLong() { return FLT_MAX; } - /** - * Sets fall off direction horizontally. - */ - virtual void SetFallOffDirLong([[maybe_unused]] float fallOffDirLong) {}; - - /** - * Gets vertical fall off direction. - */ - virtual float GetFallOffDirLatitude() { return FLT_MAX; } - /** - * Sets vertical fall off direction. Controls the latitude of the world space fall off direction of the fog. - * A value of 90 degrees lets the fall off direction point upwards in world space (respectively, -90° points downwards). - */ - virtual void SetFallOffDirLatitude([[maybe_unused]] float fallOffDirLatitude) {}; - - /** - * Gets fall off shift. - */ - virtual float GetFallOffShift() { return FLT_MAX; } - /** - * Sets fall off shift. Controls how much to shift the fog density along the fall off direction. - * Positive values will move thicker fog layers along the fall off direction into the fog volume. - * Negative values will move thick layers along the negative fall off direction out of the fog volume. - */ - virtual void SetFallOffShift([[maybe_unused]] float fallOffShift) {}; - - /** - * Gets the scale of density distribution along the fall off direction. - */ - virtual float GetFallOffScale() { return FLT_MAX; } - /** - * Sets the scale of the density distribution along the fall off direction. Higher values will make the fog fall off more rapidly. - */ - virtual void SetFallOffScale([[maybe_unused]] float fallOffScale) {}; - - /** - * Gets a factor that is used to soften the edges of the fog volume when viewed from outside. - */ - virtual float GetSoftEdges() { return FLT_MAX; } - /** - * Sets a factor that is used to soften the edges of the fog volume when viewed from outside. - */ - virtual void SetSoftEdges([[maybe_unused]] float softEdges) {}; - - /** - * Gets the start distance of fog density ramp in world units (m) Only works with Volumetric Fog. - */ - virtual float GetRampStart() { return FLT_MAX; } - /** - * Sets the start distance of fog density ramp in world units (m) Only works with Volumetric Fog. - */ - virtual void SetRampStart([[maybe_unused]] float rampStart) {}; - - /** - * Gets the end distance of fog density ramp in world units (m). Only works with Volumetric Fog. - */ - virtual float GetRampEnd() { return FLT_MAX; } - /** - * Sets the end distance of fog density ramp in world units (m). Only works with Volumetric Fog. - */ - virtual void SetRampEnd([[maybe_unused]] float rampEnd) {}; - - /** - * Gets the influence of fog density ramp. Only works with Volumetric Fog. - */ - virtual float GetRampInfluence() { return FLT_MAX; } - /** - * Sets the influence of fog density ramp. Only works with Volumetric Fog. - */ - virtual void SetRampInfluence([[maybe_unused]] float rampInfluence) {}; - - /** - * Gets the influence of the global wind upon the fog volume. Only works with Volumetric Fog. - */ - virtual float GetWindInfluence() { return FLT_MAX; } - /** - * Sets the influence of the global wind upon the fog volume. Only works with Volumetric Fog. - */ - virtual void SetWindInfluence([[maybe_unused]] float windInfluence) {}; - - /** - * Gets the scale of the noise value for the density. Only works with Volumetric Fog. - */ - virtual float GetDensityNoiseScale() { return FLT_MAX; } - /** - * Sets the scale of the noise value for the density. This will define the thickness of the individual patches of fog (clouds), - * or if you look at it from the other direction it will define how big the spaces are in-between each cloud. Reducing the value - * will thin out the cloud density and increase the spacing between each cloud. - * Only works with Volumetric Fog. - */ - virtual void SetDensityNoiseScale([[maybe_unused]] float densityNoiseScale) {}; - - /** - * Gets the offset of the noise value for the density. Only works with Volumetric Fog. - */ - virtual float GetDensityNoiseOffset() { return FLT_MAX; } - /** - * Sets the offset of the noise value for the density. Noise breaks up the solid shape of the fog volume into patches. - * Only works with Volumetric Fog. - */ - virtual void SetDensityNoiseOffset([[maybe_unused]] float densityNoiseOffset) {}; - - /** - * Gets the time frequency of the noise for the density. High frequencies produce fast changing fog. Allows the individual fog patches to morph into - * different shapes during the course of their lifetime. Keep this value low otherwise they will morph too quickly and will look very unnatural - */ - virtual float GetDensityNoiseTimeFrequency() { return FLT_MAX; } - /** - * Sets the time frequency of the noise for the density. High frequencies produce fast changing fog. Only works with Volumetric Fog. - */ - virtual void SetDensityNoiseTimeFrequency([[maybe_unused]] float timeFrequency) {}; - - /** - * Gets the spatial frequency of the noise for the density. - */ - virtual AZ::Vector3 GetDensityNoiseFrequency() { return AZ::Vector3::CreateOne(); } - /** - * Sets the spatial frequency of the noise for the density. Allows defining how many fog patches are there. - * Increasing Z value will create a layered effect within the volume simulating different fog patches stacked on top of each other. - * Adding higher values in X & Y would mean there would be more individual fog patches within the volume. - * Only works with Volumetric Fog - */ - virtual void SetDensityNoiseFrequency([[maybe_unused]] AZ::Vector3 densityNoiseFrequency) {}; - - /** - * Returns true if the FogVolume entity should respond to VisAreas and ClipVolumes. - */ - virtual bool GetIgnoresVisAreas() { return false; }; - /** - * Sets whether the FogVolume entity should respond to VisAreas and ClipVolumes. - */ - virtual void SetIgnoresVisAreas([[maybe_unused]] bool ignoresVisAreas) {}; - - /** - * Returns true if the FogVolume entity effect doesn't occur in multiple VisAreas and ClipVolumes. - */ - virtual bool GetAffectsThisAreaOnly() { return false; }; - /** - * Sets whether the FogVolume entity effect doesn't occur in multiple VisAreas and ClipVolumes. - */ - virtual void SetAffectsThisAreaOnly([[maybe_unused]] bool affectsThisAreaOnly) {}; - }; - - using FogVolumeComponentRequestBus = AZ::EBus; -} diff --git a/Gems/LmbrCentral/Code/lmbrcentral_editor_files.cmake b/Gems/LmbrCentral/Code/lmbrcentral_editor_files.cmake index a7dcc8f770..ab245a07f4 100644 --- a/Gems/LmbrCentral/Code/lmbrcentral_editor_files.cmake +++ b/Gems/LmbrCentral/Code/lmbrcentral_editor_files.cmake @@ -58,8 +58,6 @@ set(FILES Source/Rendering/EditorMeshComponent.cpp Source/Rendering/EditorHighQualityShadowComponent.h Source/Rendering/EditorHighQualityShadowComponent.cpp - Source/Rendering/EditorFogVolumeComponent.h - Source/Rendering/EditorFogVolumeComponent.cpp Source/Rendering/EditorGeomCacheComponent.h Source/Rendering/EditorGeomCacheComponent.cpp Source/Scripting/EditorLookAtComponent.h diff --git a/Gems/LmbrCentral/Code/lmbrcentral_files.cmake b/Gems/LmbrCentral/Code/lmbrcentral_files.cmake index ba0330e93c..d0df6c7dd0 100644 --- a/Gems/LmbrCentral/Code/lmbrcentral_files.cmake +++ b/Gems/LmbrCentral/Code/lmbrcentral_files.cmake @@ -45,7 +45,6 @@ set(FILES include/LmbrCentral/Rendering/MeshComponentBus.h include/LmbrCentral/Rendering/MeshModificationBus.h include/LmbrCentral/Rendering/RenderNodeBus.h - include/LmbrCentral/Rendering/FogVolumeComponentBus.h include/LmbrCentral/Rendering/HighQualityShadowComponentBus.h include/LmbrCentral/Rendering/GeomCacheComponentBus.h include/LmbrCentral/Rendering/GiRegistrationBus.h @@ -115,12 +114,6 @@ set(FILES Source/Rendering/LightInstance.h Source/Rendering/LightInstance.cpp Source/Rendering/MaterialHandle.cpp - Source/Rendering/FogVolumeComponent.h - Source/Rendering/FogVolumeComponent.cpp - Source/Rendering/FogVolumeCommon.h - Source/Rendering/FogVolumeCommon.cpp - Source/Rendering/FogVolumeRequestsHandler.h - Source/Rendering/FogVolumeRequestsHandler.cpp Source/Rendering/MeshAssetHandler.h Source/Rendering/MeshAssetHandler.cpp Source/Rendering/MeshComponent.h