// Copyright (c) 2012-2022 Wojciech Figat. All rights reserved. using System.Collections.Generic; using System.IO; namespace FlaxEditor.Content.Import { /// /// Creates new for the given source file. /// /// The import request. /// The file entry. public delegate ImportFileEntry ImportFileEntryHandler(ref Request request); /// /// File import entry. /// public class ImportFileEntry : IFileEntryAction { /// public string SourceUrl { get; } /// public string ResultUrl { get; private set; } /// /// Gets a value indicating whether this entry has settings to modify. /// public virtual bool HasSettings => Settings != null; /// /// Gets or sets the settings object to modify. /// public virtual object Settings => null; /// /// Tries the override import settings. /// /// The settings. /// True if settings override was successful and there is no need to edit them in dedicated dialog, otherwise false. public virtual bool TryOverrideSettings(object settings) { return false; } /// /// Initializes a new instance of the class. /// /// The import request. public ImportFileEntry(ref Request request) { SourceUrl = request.InputPath; ResultUrl = request.OutputPath; } /// /// Modifies the result URL filename (keeps destination folder and extension). /// /// The new filename. public void ModifyResultFilename(string filename) { var directory = Path.GetDirectoryName(ResultUrl) ?? string.Empty; var extension = Path.GetExtension(ResultUrl); ResultUrl = Path.Combine(directory, filename + extension); } /// /// Performs file importing. /// /// True if failed, otherwise false. public virtual bool Import() { // Skip if missing if (!Directory.Exists(SourceUrl) && !File.Exists(SourceUrl)) return true; // Setup output string folder = Path.GetDirectoryName(ResultUrl); if (folder != null && !Directory.Exists(folder)) Directory.CreateDirectory(folder); if (Directory.Exists(SourceUrl)) { // Copy directory Utilities.Utils.DirectoryCopy(SourceUrl, ResultUrl, true); return false; } // Copy file File.Copy(SourceUrl, ResultUrl, true); return false; } /// /// The file types registered for importing. Key is a file extension (without a leading dot). /// Allows to plug custom importing options gather for different input file types. /// public static readonly Dictionary FileTypes = new Dictionary(32); /// /// Creates the entry. /// /// The import request. /// Created file entry. public static ImportFileEntry CreateEntry(ref Request request) { // Get extension (without a dot) var extension = Path.GetExtension(request.InputPath); if (string.IsNullOrEmpty(extension)) return new FolderImportEntry(ref request); if (extension[0] == '.') extension = extension.Remove(0, 1); extension = extension.ToLower(); // Check if use overriden type if (FileTypes.TryGetValue(extension, out ImportFileEntryHandler createDelegate)) return createDelegate(ref request); return request.IsInBuilt ? new AssetImportEntry(ref request) : new ImportFileEntry(ref request); } internal static void RegisterDefaultTypes() { // Textures FileTypes["tga"] = ImportTexture; FileTypes["png"] = ImportTexture; FileTypes["bmp"] = ImportTexture; FileTypes["gif"] = ImportTexture; FileTypes["tiff"] = ImportTexture; FileTypes["tif"] = ImportTexture; FileTypes["jpeg"] = ImportTexture; FileTypes["jpg"] = ImportTexture; FileTypes["dds"] = ImportTexture; FileTypes["hdr"] = ImportTexture; FileTypes["raw"] = ImportTexture; // Models FileTypes["obj"] = ImportModel; FileTypes["fbx"] = ImportModel; FileTypes["x"] = ImportModel; FileTypes["dae"] = ImportModel; FileTypes["gltf"] = ImportModel; FileTypes["glb"] = ImportModel; // FileTypes["blend"] = ImportModel; FileTypes["bvh"] = ImportModel; FileTypes["ase"] = ImportModel; FileTypes["ply"] = ImportModel; FileTypes["dxf"] = ImportModel; FileTypes["ifc"] = ImportModel; FileTypes["nff"] = ImportModel; FileTypes["smd"] = ImportModel; FileTypes["vta"] = ImportModel; FileTypes["mdl"] = ImportModel; FileTypes["md2"] = ImportModel; FileTypes["md3"] = ImportModel; FileTypes["md5mesh"] = ImportModel; FileTypes["q3o"] = ImportModel; FileTypes["q3s"] = ImportModel; FileTypes["ac"] = ImportModel; FileTypes["stl"] = ImportModel; FileTypes["lwo"] = ImportModel; FileTypes["lws"] = ImportModel; FileTypes["lxo"] = ImportModel; // Audio FileTypes["wav"] = ImportAudio; FileTypes["mp3"] = ImportAudio; FileTypes["ogg"] = ImportAudio; } private static ImportFileEntry ImportModel(ref Request request) { return new ModelImportEntry(ref request); } private static ImportFileEntry ImportAudio(ref Request request) { return new AudioImportEntry(ref request); } private static ImportFileEntry ImportTexture(ref Request request) { return new TextureImportEntry(ref request); } /// public bool Execute() { return Import(); } } }