galibzon před 5 měsíci
rodič
revize
993de88a09

+ 9 - 0
Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Material/MaterialComponentBus.h

@@ -53,6 +53,15 @@ namespace AZ
             //! @returns Map of material assigned data including materials, property overrides, and other parameters.
             virtual const MaterialAssignmentMap& GetMaterialMap() const = 0;
 
+            //! Similar as above, but returns a deep copy of all materials.
+            //! This "Copy" function is useful for Lua because GetMaterialMap()
+            //! returns a reference and Lua treats it a as a reference too.
+            //! Making further chages to the material component, for example by calling SetMaterialAssetId()
+            //! would indirectly affect the MaterialAssignmentMap that was returned by reference.
+            //! To avoid this scenario, a Lua script can call this function to get an actual copy that remains
+            //! unaffected by calling functions like SetMaterialAssetId().
+            virtual MaterialAssignmentMap GetMaterialMapCopy() const = 0;
+
             //! Clears all overridden materials and properties from the material component.
             virtual void ClearMaterialMap() = 0;
 

+ 8 - 1
Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialComponentController.cpp

@@ -44,6 +44,7 @@ namespace AZ
                     ->Event("GetMaterialLabel", &MaterialComponentRequestBus::Events::GetMaterialLabel, "GetMaterialSlotLabel")
                     ->Event("SetMaterialMap", &MaterialComponentRequestBus::Events::SetMaterialMap, "SetMaterialOverrides")
                     ->Event("GetMaterialMap", &MaterialComponentRequestBus::Events::GetMaterialMap, "GetMaterialOverrides")
+                    ->Event("GetMaterialMapCopy", &MaterialComponentRequestBus::Events::GetMaterialMapCopy)
                     ->Event("ClearMaterialMap", &MaterialComponentRequestBus::Events::ClearMaterialMap, "ClearAllMaterialOverrides")
                     ->Event("SetMaterialAssetIdOnDefaultSlot", &MaterialComponentRequestBus::Events::SetMaterialAssetIdOnDefaultSlot, "SetDefaultMaterialOverride")
                     ->Event("GetMaterialAssetIdOnDefaultSlot", &MaterialComponentRequestBus::Events::GetMaterialAssetIdOnDefaultSlot, "GetDefaultMaterialOverride")
@@ -237,7 +238,8 @@ namespace AZ
             if (!m_queuedLoadMaterials &&
                 !m_queuedMaterialsCreatedNotification &&
                 !m_queuedMaterialsUpdatedNotification &&
-                m_materialsWithDirtyProperties.empty())
+                m_materialsWithDirtyProperties.empty() &&
+                m_notifiedMaterialAssets.empty())
             {
                 SystemTickBus::Handler::BusDisconnect();
             }
@@ -413,6 +415,11 @@ namespace AZ
             return m_configuration.m_materials;
         }
 
+        MaterialAssignmentMap MaterialComponentController::GetMaterialMapCopy() const
+        {
+            return m_configuration.m_materials;
+        }
+
         void MaterialComponentController::ClearMaterialMap()
         {
             if (!m_configuration.m_materials.empty())

+ 1 - 0
Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialComponentController.h

@@ -52,6 +52,7 @@ namespace AZ
             AZStd::string GetMaterialLabel(const MaterialAssignmentId& materialAssignmentId) const override;
             void SetMaterialMap(const MaterialAssignmentMap& materials) override;
             const MaterialAssignmentMap& GetMaterialMap() const override;
+            MaterialAssignmentMap GetMaterialMapCopy() const override;
             void ClearMaterialMap() override;
             void ClearMaterialsOnModelSlots() override;
             void ClearMaterialsOnLodSlots() override;