diff --git a/Source/Engine/Content/Assets/MaterialBase.h b/Source/Engine/Content/Assets/MaterialBase.h
index bca70b6da..070347348 100644
--- a/Source/Engine/Content/Assets/MaterialBase.h
+++ b/Source/Engine/Content/Assets/MaterialBase.h
@@ -27,7 +27,6 @@ public:
///
/// Returns true if material is an material instance.
///
- /// True if it's a material instance, otherwise false.
virtual bool IsMaterialInstance() const = 0;
public:
diff --git a/Source/Engine/Level/Actors/AnimatedModel.cpp b/Source/Engine/Level/Actors/AnimatedModel.cpp
index 373278885..dff527924 100644
--- a/Source/Engine/Level/Actors/AnimatedModel.cpp
+++ b/Source/Engine/Level/Actors/AnimatedModel.cpp
@@ -898,6 +898,14 @@ void AnimatedModel::Deserialize(DeserializeStream& stream, ISerializeModifier* m
DrawModes |= DrawPass::GlobalSurfaceAtlas;
}
+const Span AnimatedModel::GetMaterialSlots() const
+{
+ const auto model = SkinnedModel.Get();
+ if (model && !model->WaitForLoaded())
+ return ToSpan(model->MaterialSlots);
+ return Span();
+}
+
MaterialBase* AnimatedModel::GetMaterial(int32 entryIndex)
{
if (SkinnedModel)
diff --git a/Source/Engine/Level/Actors/AnimatedModel.h b/Source/Engine/Level/Actors/AnimatedModel.h
index 2693f573d..763629e93 100644
--- a/Source/Engine/Level/Actors/AnimatedModel.h
+++ b/Source/Engine/Level/Actors/AnimatedModel.h
@@ -373,6 +373,7 @@ public:
bool IntersectsItself(const Ray& ray, Real& distance, Vector3& normal) override;
void Serialize(SerializeStream& stream, const void* otherObj) override;
void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) override;
+ const Span GetMaterialSlots() const override;
MaterialBase* GetMaterial(int32 entryIndex) override;
bool IntersectsEntry(int32 entryIndex, const Ray& ray, Real& distance, Vector3& normal) override;
bool IntersectsEntry(const Ray& ray, Real& distance, Vector3& normal, int32& entryIndex) override;
diff --git a/Source/Engine/Level/Actors/ModelInstanceActor.h b/Source/Engine/Level/Actors/ModelInstanceActor.h
index 1dfd5c0e0..3faad35b3 100644
--- a/Source/Engine/Level/Actors/ModelInstanceActor.h
+++ b/Source/Engine/Level/Actors/ModelInstanceActor.h
@@ -35,6 +35,11 @@ public:
///
API_PROPERTY() void SetEntries(const Array& value);
+ ///
+ /// Gets the material slots array set on the asset (eg. model or skinned model asset).
+ ///
+ API_PROPERTY(Sealed) virtual const Span GetMaterialSlots() const = 0;
+
///
/// Gets the material used to draw the meshes which are assigned to that slot (set in Entries or model's default).
///
diff --git a/Source/Engine/Level/Actors/SplineModel.cpp b/Source/Engine/Level/Actors/SplineModel.cpp
index 843bf6076..6ca841b41 100644
--- a/Source/Engine/Level/Actors/SplineModel.cpp
+++ b/Source/Engine/Level/Actors/SplineModel.cpp
@@ -341,6 +341,14 @@ void SplineModel::OnParentChanged()
OnSplineUpdated();
}
+const Span SplineModel::GetMaterialSlots() const
+{
+ const auto model = Model.Get();
+ if (model && !model->WaitForLoaded())
+ return ToSpan(model->MaterialSlots);
+ return Span();
+}
+
MaterialBase* SplineModel::GetMaterial(int32 entryIndex)
{
if (Model)
diff --git a/Source/Engine/Level/Actors/SplineModel.h b/Source/Engine/Level/Actors/SplineModel.h
index 87f39699c..2a3d45a27 100644
--- a/Source/Engine/Level/Actors/SplineModel.h
+++ b/Source/Engine/Level/Actors/SplineModel.h
@@ -115,6 +115,7 @@ public:
void Serialize(SerializeStream& stream, const void* otherObj) override;
void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) override;
void OnParentChanged() override;
+ const Span GetMaterialSlots() const override;
MaterialBase* GetMaterial(int32 entryIndex) override;
protected:
diff --git a/Source/Engine/Level/Actors/StaticModel.cpp b/Source/Engine/Level/Actors/StaticModel.cpp
index 778f24d65..93eef3056 100644
--- a/Source/Engine/Level/Actors/StaticModel.cpp
+++ b/Source/Engine/Level/Actors/StaticModel.cpp
@@ -535,6 +535,14 @@ void StaticModel::Deserialize(DeserializeStream& stream, ISerializeModifier* mod
}
}
+const Span StaticModel::GetMaterialSlots() const
+{
+ const auto model = Model.Get();
+ if (model && !model->WaitForLoaded())
+ return ToSpan(model->MaterialSlots);
+ return Span();
+}
+
MaterialBase* StaticModel::GetMaterial(int32 entryIndex)
{
if (Model)
diff --git a/Source/Engine/Level/Actors/StaticModel.h b/Source/Engine/Level/Actors/StaticModel.h
index 06fbdd874..600f174c9 100644
--- a/Source/Engine/Level/Actors/StaticModel.h
+++ b/Source/Engine/Level/Actors/StaticModel.h
@@ -166,6 +166,7 @@ public:
bool IntersectsItself(const Ray& ray, Real& distance, Vector3& normal) override;
void Serialize(SerializeStream& stream, const void* otherObj) override;
void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) override;
+ const Span GetMaterialSlots() const override;
MaterialBase* GetMaterial(int32 entryIndex) override;
bool IntersectsEntry(int32 entryIndex, const Ray& ray, Real& distance, Vector3& normal) override;
bool IntersectsEntry(const Ray& ray, Real& distance, Vector3& normal, int32& entryIndex) override;