diff --git a/Source/Editor/Content/Import/ModelImportEntry.cs b/Source/Editor/Content/Import/ModelImportEntry.cs
index b17c8314d..8bdd7264a 100644
--- a/Source/Editor/Content/Import/ModelImportEntry.cs
+++ b/Source/Editor/Content/Import/ModelImportEntry.cs
@@ -1,5 +1,6 @@
// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
+using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
@@ -316,6 +317,20 @@ namespace FlaxEditor.Content.Import
[EditorOrder(400), DefaultValue(true)]
public bool ImportMaterials { get; set; } = true;
+ ///
+ /// If checked, materials will be imported as instances of a base material.
+ ///
+ [EditorDisplay("Materials"), VisibleIf(nameof(ImportMaterials))]
+ [EditorOrder(405), DefaultValue(false)]
+ public bool ImportMaterialsAsInstances = false;
+
+ ///
+ /// The material to import the model's materials as an instance of.
+ ///
+ [EditorDisplay("Materials"), VisibleIf(nameof(ImportMaterialsAsInstances))]
+ [EditorOrder(406)]
+ public Material InstanceToImportAs = null; // TODO: only show if BOTH ImportMaterials and ImportMaterialsAsInstances are true.
+
///
/// If checked, the importer will import texture files used by the model and any embedded texture resources.
///
@@ -406,6 +421,8 @@ namespace FlaxEditor.Content.Import
// Misc
public byte ImportMaterials;
+ public byte ImportMaterialsAsInstances;
+ public Guid InstanceToImportAs;
public byte ImportTextures;
public byte RestoreMaterialsOnReimport;
@@ -454,6 +471,8 @@ namespace FlaxEditor.Content.Import
LODCount = LODCount,
TriangleReduction = TriangleReduction,
ImportMaterials = (byte)(ImportMaterials ? 1 : 0),
+ ImportMaterialsAsInstances = (byte)(ImportMaterialsAsInstances ? 1 : 0),
+ InstanceToImportAs = InstanceToImportAs.ID,
ImportTextures = (byte)(ImportTextures ? 1 : 0),
RestoreMaterialsOnReimport = (byte)(RestoreMaterialsOnReimport ? 1 : 0),
GenerateSDF = (byte)(GenerateSDF ? 1 : 0),
@@ -496,6 +515,8 @@ namespace FlaxEditor.Content.Import
LODCount = options.LODCount;
TriangleReduction = options.TriangleReduction;
ImportMaterials = options.ImportMaterials != 0;
+ ImportMaterialsAsInstances = options.ImportMaterialsAsInstances != 0;
+ InstanceToImportAs = FlaxEngine.Content.Load(options.InstanceToImportAs);
ImportTextures = options.ImportTextures != 0;
RestoreMaterialsOnReimport = options.RestoreMaterialsOnReimport != 0;
GenerateSDF = options.GenerateSDF != 0;
diff --git a/Source/Editor/Managed/ManagedEditor.Internal.cpp b/Source/Editor/Managed/ManagedEditor.Internal.cpp
index dcaa25e6c..17708dab5 100644
--- a/Source/Editor/Managed/ManagedEditor.Internal.cpp
+++ b/Source/Editor/Managed/ManagedEditor.Internal.cpp
@@ -195,6 +195,8 @@ struct InternalModelOptions
// Misc
byte ImportMaterials;
+ byte ImportMaterialsAsInstances;
+ Guid InstanceToImportAs;
byte ImportTextures;
byte RestoreMaterialsOnReimport;
@@ -240,6 +242,8 @@ struct InternalModelOptions
to->LODCount = from->LODCount;
to->TriangleReduction = from->TriangleReduction;
to->ImportMaterials = from->ImportMaterials;
+ to->ImportMaterialsAsInstances = from->ImportMaterialsAsInstances;
+ to->InstanceToImportAs = from->InstanceToImportAs;
to->ImportTextures = from->ImportTextures;
to->RestoreMaterialsOnReimport = from->RestoreMaterialsOnReimport;
to->GenerateSDF = from->GenerateSDF;
@@ -282,6 +286,8 @@ struct InternalModelOptions
to->LODCount = from->LODCount;
to->TriangleReduction = from->TriangleReduction;
to->ImportMaterials = from->ImportMaterials;
+ to->ImportMaterialsAsInstances = from->ImportMaterialsAsInstances;
+ to->InstanceToImportAs = from->InstanceToImportAs;
to->ImportTextures = from->ImportTextures;
to->RestoreMaterialsOnReimport = from->RestoreMaterialsOnReimport;
to->GenerateSDF = from->GenerateSDF;
diff --git a/Source/Engine/Tools/ModelTool/ModelTool.Options.cpp b/Source/Engine/Tools/ModelTool/ModelTool.Options.cpp
index b7fb04855..7d1315a1f 100644
--- a/Source/Engine/Tools/ModelTool/ModelTool.Options.cpp
+++ b/Source/Engine/Tools/ModelTool/ModelTool.Options.cpp
@@ -61,6 +61,8 @@ void ModelTool::Options::Serialize(SerializeStream& stream, const void* otherObj
SERIALIZE(LODCount);
SERIALIZE(TriangleReduction);
SERIALIZE(ImportMaterials);
+ SERIALIZE(ImportMaterialsAsInstances);
+ SERIALIZE(InstanceToImportAs);
SERIALIZE(ImportTextures);
SERIALIZE(RestoreMaterialsOnReimport);
SERIALIZE(GenerateSDF);
@@ -102,6 +104,8 @@ void ModelTool::Options::Deserialize(DeserializeStream& stream, ISerializeModifi
DESERIALIZE(LODCount);
DESERIALIZE(TriangleReduction);
DESERIALIZE(ImportMaterials);
+ DESERIALIZE(ImportMaterialsAsInstances);
+ DESERIALIZE(InstanceToImportAs);
DESERIALIZE(ImportTextures);
DESERIALIZE(RestoreMaterialsOnReimport);
DESERIALIZE(GenerateSDF);
diff --git a/Source/Engine/Tools/ModelTool/ModelTool.h b/Source/Engine/Tools/ModelTool/ModelTool.h
index b29bed71f..cf6b15c3f 100644
--- a/Source/Engine/Tools/ModelTool/ModelTool.h
+++ b/Source/Engine/Tools/ModelTool/ModelTool.h
@@ -11,6 +11,7 @@
#include "Engine/Graphics/Models/ModelData.h"
#include "Engine/Graphics/Models/SkeletonData.h"
#include "Engine/Animations/AnimationData.h"
+#include
class JsonWriter;
@@ -247,6 +248,8 @@ public:
// Materials
bool ImportMaterials = true;
+ bool ImportMaterialsAsInstances = false;
+ Guid InstanceToImportAs;
bool ImportTextures = true;
bool RestoreMaterialsOnReimport = true;