// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
using System;
using System.Text;
using FlaxEngine;
namespace FlaxEditor.Content
{
///
/// Represents binary asset item.
///
///
public class BinaryAssetItem : AssetItem
{
///
/// The type of the asset (the same as but cached as type reference).
///
public readonly Type Type;
///
/// Initializes a new instance of the class.
///
/// The asset path.
/// The asset identifier.
/// The asset type name identifier.
/// The asset type.
/// The asset type search filter type.
public BinaryAssetItem(string path, ref Guid id, string typeName, Type type, ContentItemSearchFilter searchFilter)
: base(path, typeName, ref id)
{
Type = type;
SearchFilter = searchFilter;
}
///
/// Gets the asset import path.
///
/// The import path.
/// True if fails, otherwise false.
public bool GetImportPath(out string importPath)
{
// TODO: add internal call to content backend with fast import asset metadata gather (without asset loading)
var asset = FlaxEngine.Content.Load(ID, 100);
if (asset)
{
// Get meta from loaded asset
importPath = asset.ImportPath;
return string.IsNullOrEmpty(importPath);
}
importPath = string.Empty;
return true;
}
internal void OnReimport(ref Guid id)
{
ID = id;
OnReimport();
}
///
public override ContentItemSearchFilter SearchFilter { get; }
///
public override bool IsOfType(Type type)
{
return type.IsAssignableFrom(Type);
}
}
///
/// Implementation of for assets.
///
///
public class TextureAssetItem : BinaryAssetItem
{
///
public TextureAssetItem(string path, ref Guid id, string typeName, Type type)
: base(path, ref id, typeName, type, ContentItemSearchFilter.Texture)
{
}
///
protected override void OnBuildTooltipText(StringBuilder sb)
{
base.OnBuildTooltipText(sb);
var asset = FlaxEngine.Content.Load(ID, 100);
if (asset)
{
sb.Append("Format: ").Append(asset.Format).AppendLine();
sb.Append("Size: ").Append(asset.Width).Append('x').Append(asset.Height);
if (asset.ArraySize != 1)
sb.Append('[').Append(asset.ArraySize).Append(']');
sb.AppendLine();
sb.Append("Mip Levels: ").Append(asset.MipLevels).AppendLine();
}
}
}
///
/// Implementation of for assets.
///
///
public class ModelItem : BinaryAssetItem
{
///
public ModelItem(string path, ref Guid id, string typeName, Type type)
: base(path, ref id, typeName, type, ContentItemSearchFilter.Model)
{
}
///
public override bool OnEditorDrag(object context)
{
return true;
}
///
public override Actor OnEditorDrop(object context)
{
return new StaticModel { Model = FlaxEngine.Content.LoadAsync(ID) };
}
///
protected override void OnBuildTooltipText(StringBuilder sb)
{
base.OnBuildTooltipText(sb);
var asset = FlaxEngine.Content.Load(ID, 100);
if (asset)
{
var lods = asset.LODs;
int triangleCount = 0, vertexCount = 0;
for (int lodIndex = 0; lodIndex < lods.Length; lodIndex++)
{
var lod = lods[lodIndex];
for (int meshIndex = 0; meshIndex < lod.Meshes.Length; meshIndex++)
{
var mesh = lod.Meshes[meshIndex];
triangleCount += mesh.TriangleCount;
vertexCount += mesh.VertexCount;
}
}
sb.Append("LODs: ").Append(lods.Length).AppendLine();
sb.Append("Triangles: ").Append(triangleCount.ToString("N0")).AppendLine();
sb.Append("Vertices: ").Append(vertexCount.ToString("N0")).AppendLine();
}
}
}
///
/// Implementation of for assets.
///
///
public class SkinnedModeItem : BinaryAssetItem
{
///
public SkinnedModeItem(string path, ref Guid id, string typeName, Type type)
: base(path, ref id, typeName, type, ContentItemSearchFilter.Model)
{
}
///
public override bool OnEditorDrag(object context)
{
return true;
}
///
public override Actor OnEditorDrop(object context)
{
return new AnimatedModel { SkinnedModel = FlaxEngine.Content.LoadAsync(ID) };
}
///
protected override void OnBuildTooltipText(StringBuilder sb)
{
base.OnBuildTooltipText(sb);
var asset = FlaxEngine.Content.Load(ID, 100);
if (asset)
{
var lods = asset.LODs;
int triangleCount = 0, vertexCount = 0;
for (int lodIndex = 0; lodIndex < lods.Length; lodIndex++)
{
var lod = lods[lodIndex];
for (int meshIndex = 0; meshIndex < lod.Meshes.Length; meshIndex++)
{
var mesh = lod.Meshes[meshIndex];
triangleCount += mesh.TriangleCount;
vertexCount += mesh.VertexCount;
}
}
sb.Append("LODs: ").Append(lods.Length).AppendLine();
sb.Append("Triangles: ").Append(triangleCount.ToString("N0")).AppendLine();
sb.Append("Vertices: ").Append(vertexCount.ToString("N0")).AppendLine();
sb.Append("Skeleton Nodes: ").Append(asset.Nodes.Length).AppendLine();
sb.Append("Blend Shapes: ").Append(asset.BlendShapes.Length).AppendLine();
}
}
}
}