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;