// 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(); } } } }