Fix prefab preview to wait for the assets streaming

This commit is contained in:
2026-04-20 12:49:43 +02:00
parent e90dde491d
commit 633f2fa901
9 changed files with 69 additions and 3 deletions
+1 -3
View File
@@ -122,9 +122,7 @@ namespace FlaxEditor.Content
return false;
// Check if asset is streamed enough
var asset = (Prefab)request.Asset;
// TODO: check all prefab actors to have loaded resources (models/textures/etc.)
return asset.IsLoaded;
return ThumbnailsModule.HasMinimumQuality((Prefab)request.Asset);
}
private void Prepare(Actor actor, ref BoundingBox bounds)
@@ -181,6 +181,14 @@ namespace FlaxEditor.Content.Thumbnails
return baseMaterial == null || HasMinimumQualityInternal(baseMaterial);
}
internal static bool HasMinimumQuality(Prefab asset)
{
if (!asset.IsLoaded)
return false;
var defaultInstance = asset.GetDefaultInstance();
return defaultInstance == null || HasMinimumQualityInternal(defaultInstance);
}
private static bool HasMinimumQualityInternal(MaterialBase asset)
{
if (!asset.IsLoaded)
@@ -194,6 +202,43 @@ namespace FlaxEditor.Content.Thumbnails
return true;
}
private static bool HasMinimumQualityInternal(Actor actor)
{
if (!actor.IsActive)
return true;
if (actor is ModelInstanceActor modelInstance)
{
var model = modelInstance.GetModel();
if (model && !HasMinimumQuality(model))
return false;
var slots = modelInstance.MaterialSlots;
foreach (var slot in slots)
{
if (slot.Material && !HasMinimumQuality(slot.Material))
return false;
}
}
if (actor is SpriteRender spriteRender)
{
if (spriteRender.Material && !HasMinimumQuality(spriteRender.Material))
return false;
}
if (actor is TextRender textRender)
{
if (textRender.Material && !HasMinimumQuality(textRender.Material))
return false;
}
for (int i = 0; i < actor.ChildrenCount; i++)
{
if (!HasMinimumQualityInternal(actor.GetChild(i)))
return false;
}
return true;
}
#region IContentItemOwner
/// <inheritdoc />
@@ -1332,6 +1332,11 @@ MaterialBase* AnimatedModel::GetMaterial(int32 entryIndex)
return material;
}
ModelBase* AnimatedModel::GetModel()
{
return SkinnedModel.Get();
}
bool AnimatedModel::IntersectsEntry(int32 entryIndex, const Ray& ray, Real& distance, Vector3& normal)
{
auto model = SkinnedModel.Get();
@@ -476,6 +476,7 @@ public:
void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) override;
const Span<MaterialSlot> GetMaterialSlots() const override;
MaterialBase* GetMaterial(int32 entryIndex) override;
ModelBase* GetModel() 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;
bool GetMeshData(const MeshReference& ref, MeshBufferType type, BytesContainer& result, int32& count, GPUVertexLayout** layout) const override;
@@ -66,6 +66,11 @@ public:
/// <param name="entryIndex">The material slot entry index.</param>
API_FUNCTION(Sealed) virtual MaterialBase* GetMaterial(int32 entryIndex) = 0;
/// <summary>
/// Gets the model (base class).
/// </summary>
API_FUNCTION(Sealed) virtual ModelBase* GetModel() = 0;
/// <summary>
/// Sets the material to the entry slot. Can be used to override the material of the meshes using this slot.
/// </summary>
@@ -367,6 +367,11 @@ MaterialBase* SplineModel::GetMaterial(int32 entryIndex)
return material;
}
ModelBase* SplineModel::GetModel()
{
return Model.Get();
}
void SplineModel::UpdateBounds()
{
OnSplineUpdated();
+1
View File
@@ -117,6 +117,7 @@ public:
void OnParentChanged() override;
const Span<MaterialSlot> GetMaterialSlots() const override;
MaterialBase* GetMaterial(int32 entryIndex) override;
ModelBase* GetModel() override;
void UpdateBounds() override;
protected:
@@ -599,6 +599,11 @@ MaterialBase* StaticModel::GetMaterial(int32 entryIndex)
return material;
}
ModelBase* StaticModel::GetModel()
{
return Model.Get();
}
bool StaticModel::IntersectsEntry(int32 entryIndex, const Ray& ray, Real& distance, Vector3& normal)
{
auto model = Model.Get();
+1
View File
@@ -178,6 +178,7 @@ public:
void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) override;
const Span<MaterialSlot> GetMaterialSlots() const override;
MaterialBase* GetMaterial(int32 entryIndex) override;
ModelBase* GetModel() 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;
bool GetMeshData(const MeshReference& ref, MeshBufferType type, BytesContainer& result, int32& count, GPUVertexLayout** layout) const override;