// Copyright (c) 2012-2023 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();
}
}
}