From fd4b9a5a9f18cdfa5c52aea56dd819431fb4be36 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Fri, 16 Dec 2022 16:29:43 -0600 Subject: [PATCH 001/103] Return focus to parent on mouse leave. --- Source/Editor/Windows/GameWindow.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Source/Editor/Windows/GameWindow.cs b/Source/Editor/Windows/GameWindow.cs index 23558c396..89598265c 100644 --- a/Source/Editor/Windows/GameWindow.cs +++ b/Source/Editor/Windows/GameWindow.cs @@ -345,6 +345,13 @@ namespace FlaxEditor.Windows Cursor = CursorType.Default; } + /// + public override void OnMouseLeave() + { + Parent?.Focus(); + base.OnMouseLeave(); + } + /// public override void OnShowContextMenu(ContextMenu menu) { From 9a71e0274f5fef4e9282dea1a4e14f6db9372b6e Mon Sep 17 00:00:00 2001 From: Menotdan <32620310+Menotdan@users.noreply.github.com> Date: Sat, 20 May 2023 00:03:40 -0400 Subject: [PATCH 002/103] Add required options for material instance importing. --- .../Editor/Content/Import/ModelImportEntry.cs | 21 +++++++++++++++++++ .../Editor/Managed/ManagedEditor.Internal.cpp | 6 ++++++ .../Tools/ModelTool/ModelTool.Options.cpp | 4 ++++ Source/Engine/Tools/ModelTool/ModelTool.h | 3 +++ 4 files changed, 34 insertions(+) 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; From 89ce2b087ec1b00852f56665a1720b45fa7fd0b6 Mon Sep 17 00:00:00 2001 From: Menotdan <32620310+Menotdan@users.noreply.github.com> Date: Sat, 20 May 2023 00:13:45 -0400 Subject: [PATCH 003/103] Add parameter for AddMaterial() as an experiment, messing around with ideas. --- Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp b/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp index 1eb9e1f27..a4eebe830 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp +++ b/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp @@ -207,7 +207,7 @@ struct OpenFbxImporterData return false; } - int32 AddMaterial(ImportedModelData& result, const ofbx::Material* mat) + int32 AddMaterial(ImportedModelData& result, const ofbx::Material* mat, const Material* instanceOf) { int32 index = Materials.Find(mat); if (index == -1) From f03bb60d5bad400e0e67836d8d3e273c12d8de7f Mon Sep 17 00:00:00 2001 From: Menotdan <32620310+Menotdan@users.noreply.github.com> Date: Sun, 21 May 2023 00:20:54 -0400 Subject: [PATCH 004/103] Figured out where I actually need to add code, and added code there. --- .../Tools/ModelTool/ModelTool.OpenFBX.cpp | 3 +- Source/Engine/Tools/ModelTool/ModelTool.cpp | 70 ++++++++++++++----- Source/ThirdParty/OpenFBX/ofbx.h | 1 + 3 files changed, 55 insertions(+), 19 deletions(-) diff --git a/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp b/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp index a4eebe830..37b3f45a8 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp +++ b/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp @@ -207,7 +207,7 @@ struct OpenFbxImporterData return false; } - int32 AddMaterial(ImportedModelData& result, const ofbx::Material* mat, const Material* instanceOf) + int32 AddMaterial(ImportedModelData& result, const ofbx::Material* mat) { int32 index = Materials.Find(mat); if (index == -1) @@ -542,6 +542,7 @@ bool ProcessMesh(ImportedModelData& result, OpenFbxImporterData& data, const ofb else aMaterial = aMesh->getMaterial(0); } + mesh.MaterialSlotIndex = data.AddMaterial(result, aMaterial); // Vertex positions diff --git a/Source/Engine/Tools/ModelTool/ModelTool.cpp b/Source/Engine/Tools/ModelTool/ModelTool.cpp index 103d2187a..e15891a62 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.cpp +++ b/Source/Engine/Tools/ModelTool/ModelTool.cpp @@ -30,6 +30,7 @@ #include "Engine/Tools/TextureTool/TextureTool.h" #include "Engine/ContentImporters/AssetsImportingManager.h" #include "Engine/ContentImporters/CreateMaterial.h" +#include "Engine/ContentImporters/CreateMaterialInstance.h" #include "Engine/ContentImporters/CreateCollisionData.h" #include "Editor/Utilities/EditorUtilities.h" #include @@ -862,24 +863,57 @@ bool ModelTool::ImportModel(const String& path, ModelData& meshData, Options& op importedFileNames.Add(filename); #if COMPILE_WITH_ASSETS_IMPORTER auto assetPath = autoImportOutput / filename + ASSET_FILES_EXTENSION_WITH_DOT; - CreateMaterial::Options materialOptions; - materialOptions.Diffuse.Color = material.Diffuse.Color; - if (material.Diffuse.TextureIndex != -1) - materialOptions.Diffuse.Texture = data.Textures[material.Diffuse.TextureIndex].AssetID; - materialOptions.Diffuse.HasAlphaMask = material.Diffuse.HasAlphaMask; - materialOptions.Emissive.Color = material.Emissive.Color; - if (material.Emissive.TextureIndex != -1) - materialOptions.Emissive.Texture = data.Textures[material.Emissive.TextureIndex].AssetID; - materialOptions.Opacity.Value = material.Opacity.Value; - if (material.Opacity.TextureIndex != -1) - materialOptions.Opacity.Texture = data.Textures[material.Opacity.TextureIndex].AssetID; - if (material.Normals.TextureIndex != -1) - materialOptions.Normals.Texture = data.Textures[material.Normals.TextureIndex].AssetID; - if (material.TwoSided || material.Diffuse.HasAlphaMask) - materialOptions.Info.CullMode = CullMode::TwoSided; - if (!Math::IsOne(material.Opacity.Value) || material.Opacity.TextureIndex != -1) - materialOptions.Info.BlendMode = MaterialBlendMode::Transparent; - AssetsImportingManager::Create(AssetsImportingManager::CreateMaterialTag, assetPath, material.AssetID, &materialOptions); + if (options.ImportMaterialsAsInstances) { + LOG(Warning, "Did work poggers"); + if (AssetsImportingManager::Create(AssetsImportingManager::CreateMaterialInstanceTag, assetPath, material.AssetID)) + { + LOG(Error, "Failed to create material instance."); + return true; + } + else + { + MaterialInstance* materialInstance = (MaterialInstance*) LoadAsset(material.AssetID, ScriptingTypeHandle()); + if (materialInstance == nullptr) + { + LOG(Error, "Failed to find created material instance."); + return true; + } + + MaterialBase *materialInstanceOf = (MaterialBase*) LoadAsset(options.InstanceToImportAs, ScriptingTypeHandle()); + if (materialInstanceOf == nullptr) + { + LOG(Error, "Failed to find the material to create an instance of."); + return true; + } + + materialInstance->SetBaseMaterial(materialInstanceOf); + if (materialInstance->Save()) + { + LOG(Error, "Failed to save the material instance."); + return true; + } + } + } + else { + CreateMaterial::Options materialOptions; + materialOptions.Diffuse.Color = material.Diffuse.Color; + if (material.Diffuse.TextureIndex != -1) + materialOptions.Diffuse.Texture = data.Textures[material.Diffuse.TextureIndex].AssetID; + materialOptions.Diffuse.HasAlphaMask = material.Diffuse.HasAlphaMask; + materialOptions.Emissive.Color = material.Emissive.Color; + if (material.Emissive.TextureIndex != -1) + materialOptions.Emissive.Texture = data.Textures[material.Emissive.TextureIndex].AssetID; + materialOptions.Opacity.Value = material.Opacity.Value; + if (material.Opacity.TextureIndex != -1) + materialOptions.Opacity.Texture = data.Textures[material.Opacity.TextureIndex].AssetID; + if (material.Normals.TextureIndex != -1) + materialOptions.Normals.Texture = data.Textures[material.Normals.TextureIndex].AssetID; + if (material.TwoSided || material.Diffuse.HasAlphaMask) + materialOptions.Info.CullMode = CullMode::TwoSided; + if (!Math::IsOne(material.Opacity.Value) || material.Opacity.TextureIndex != -1) + materialOptions.Info.BlendMode = MaterialBlendMode::Transparent; + AssetsImportingManager::Create(AssetsImportingManager::CreateMaterialTag, assetPath, material.AssetID, &materialOptions); + } #endif } diff --git a/Source/ThirdParty/OpenFBX/ofbx.h b/Source/ThirdParty/OpenFBX/ofbx.h index 7066659e3..87dd5999f 100644 --- a/Source/ThirdParty/OpenFBX/ofbx.h +++ b/Source/ThirdParty/OpenFBX/ofbx.h @@ -1,4 +1,5 @@ #pragma once +#include namespace ofbx From 37fe1154a3a00e6259b14303b415a534e79e662c Mon Sep 17 00:00:00 2001 From: Menotdan <32620310+Menotdan@users.noreply.github.com> Date: Mon, 22 May 2023 10:12:00 -0400 Subject: [PATCH 005/103] Importing as instances works now --- Source/Engine/Content/Asset.h | 1 + Source/Engine/Content/Content.cpp | 5 +++ Source/Engine/Tools/ModelTool/ModelTool.cpp | 40 ++++++++------------- 3 files changed, 20 insertions(+), 26 deletions(-) diff --git a/Source/Engine/Content/Asset.h b/Source/Engine/Content/Asset.h index 2d2ba4b3f..0ecc6db3f 100644 --- a/Source/Engine/Content/Asset.h +++ b/Source/Engine/Content/Asset.h @@ -246,3 +246,4 @@ public: // Don't include Content.h but just Load method extern FLAXENGINE_API Asset* LoadAsset(const Guid& id, const ScriptingTypeHandle& type); +extern FLAXENGINE_API Asset* LoadAsset(const StringView& path, const ScriptingTypeHandle& type); diff --git a/Source/Engine/Content/Content.cpp b/Source/Engine/Content/Content.cpp index e58aa458d..f12619c52 100644 --- a/Source/Engine/Content/Content.cpp +++ b/Source/Engine/Content/Content.cpp @@ -449,6 +449,11 @@ FLAXENGINE_API Asset* LoadAsset(const Guid& id, const ScriptingTypeHandle& type) return Content::LoadAsync(id, type); } +FLAXENGINE_API Asset* LoadAsset(const StringView& path, const ScriptingTypeHandle& type) +{ + return Content::LoadAsync(path, type); +} + Asset* Content::LoadAsync(const StringView& path, MClass* type) { CHECK_RETURN(type, nullptr); diff --git a/Source/Engine/Tools/ModelTool/ModelTool.cpp b/Source/Engine/Tools/ModelTool/ModelTool.cpp index e15891a62..c3015ea30 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.cpp +++ b/Source/Engine/Tools/ModelTool/ModelTool.cpp @@ -864,40 +864,28 @@ bool ModelTool::ImportModel(const String& path, ModelData& meshData, Options& op #if COMPILE_WITH_ASSETS_IMPORTER auto assetPath = autoImportOutput / filename + ASSET_FILES_EXTENSION_WITH_DOT; if (options.ImportMaterialsAsInstances) { - LOG(Warning, "Did work poggers"); - if (AssetsImportingManager::Create(AssetsImportingManager::CreateMaterialInstanceTag, assetPath, material.AssetID)) - { - LOG(Error, "Failed to create material instance."); + LOG(Warning, "Adding material instance for {0}", assetPath); + + AssetsImportingManager::Create(AssetsImportingManager::CreateMaterialInstanceTag, assetPath); + MaterialInstance* materialInstance = (MaterialInstance*) LoadAsset(assetPath, MaterialInstance::TypeInitializer); + if (materialInstance->WaitForLoaded()) { + LOG(Error, "Failed to load material instance after creation. ({0})", assetPath); return true; } - else - { - MaterialInstance* materialInstance = (MaterialInstance*) LoadAsset(material.AssetID, ScriptingTypeHandle()); - if (materialInstance == nullptr) - { - LOG(Error, "Failed to find created material instance."); - return true; - } - MaterialBase *materialInstanceOf = (MaterialBase*) LoadAsset(options.InstanceToImportAs, ScriptingTypeHandle()); - if (materialInstanceOf == nullptr) - { - LOG(Error, "Failed to find the material to create an instance of."); - return true; - } - - materialInstance->SetBaseMaterial(materialInstanceOf); - if (materialInstance->Save()) - { - LOG(Error, "Failed to save the material instance."); - return true; - } + MaterialBase* materialInstanceOf = (MaterialBase*) LoadAsset(options.InstanceToImportAs, MaterialBase::TypeInitializer); + if (materialInstanceOf->WaitForLoaded()) { + LOG(Error, "Failed to load material to create an instance of. ({0})", options.InstanceToImportAs); + return true; } + + materialInstance->SetBaseMaterial(materialInstanceOf); + materialInstance->Save(); } else { CreateMaterial::Options materialOptions; materialOptions.Diffuse.Color = material.Diffuse.Color; - if (material.Diffuse.TextureIndex != -1) + if (material.Diffuse.TextureIndex != -1) materialOptions.Diffuse.Texture = data.Textures[material.Diffuse.TextureIndex].AssetID; materialOptions.Diffuse.HasAlphaMask = material.Diffuse.HasAlphaMask; materialOptions.Emissive.Color = material.Emissive.Color; From 4acfffeaf48dcf41e0bef7cf1ab8df4b59b72a61 Mon Sep 17 00:00:00 2001 From: Menotdan <32620310+Menotdan@users.noreply.github.com> Date: Mon, 22 May 2023 13:51:13 -0400 Subject: [PATCH 006/103] Make it so the material instances get linked to the material slots. --- Source/Engine/Tools/ModelTool/ModelTool.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Engine/Tools/ModelTool/ModelTool.cpp b/Source/Engine/Tools/ModelTool/ModelTool.cpp index c3015ea30..d1736e246 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.cpp +++ b/Source/Engine/Tools/ModelTool/ModelTool.cpp @@ -866,7 +866,7 @@ bool ModelTool::ImportModel(const String& path, ModelData& meshData, Options& op if (options.ImportMaterialsAsInstances) { LOG(Warning, "Adding material instance for {0}", assetPath); - AssetsImportingManager::Create(AssetsImportingManager::CreateMaterialInstanceTag, assetPath); + AssetsImportingManager::Create(AssetsImportingManager::CreateMaterialInstanceTag, assetPath, material.AssetID); MaterialInstance* materialInstance = (MaterialInstance*) LoadAsset(assetPath, MaterialInstance::TypeInitializer); if (materialInstance->WaitForLoaded()) { LOG(Error, "Failed to load material instance after creation. ({0})", assetPath); From 284c3d832a9212953777d80ff3c268fcaea43401 Mon Sep 17 00:00:00 2001 From: Menotdan <32620310+Menotdan@users.noreply.github.com> Date: Mon, 22 May 2023 14:26:20 -0400 Subject: [PATCH 007/103] fix a couple of bugs with importing without material instances --- .../Editor/Content/Import/ModelImportEntry.cs | 20 +++++++++++++++++-- Source/Engine/Content/Content.cpp | 2 ++ Source/Engine/Tools/ModelTool/ModelTool.cpp | 14 +++++++------ 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/Source/Editor/Content/Import/ModelImportEntry.cs b/Source/Editor/Content/Import/ModelImportEntry.cs index 8bdd7264a..88ace184a 100644 --- a/Source/Editor/Content/Import/ModelImportEntry.cs +++ b/Source/Editor/Content/Import/ModelImportEntry.cs @@ -437,6 +437,12 @@ namespace FlaxEditor.Content.Import internal void ToInternal(out InternalOptions options) { + Guid instanceToImportAsGuid = Guid.Empty; + if (InstanceToImportAs != null) + { + instanceToImportAsGuid = InstanceToImportAs.ID; + } + options = new InternalOptions { Type = Type, @@ -472,7 +478,7 @@ namespace FlaxEditor.Content.Import TriangleReduction = TriangleReduction, ImportMaterials = (byte)(ImportMaterials ? 1 : 0), ImportMaterialsAsInstances = (byte)(ImportMaterialsAsInstances ? 1 : 0), - InstanceToImportAs = InstanceToImportAs.ID, + InstanceToImportAs = instanceToImportAsGuid, ImportTextures = (byte)(ImportTextures ? 1 : 0), RestoreMaterialsOnReimport = (byte)(RestoreMaterialsOnReimport ? 1 : 0), GenerateSDF = (byte)(GenerateSDF ? 1 : 0), @@ -484,6 +490,16 @@ namespace FlaxEditor.Content.Import internal void FromInternal(ref InternalOptions options) { + Material instanceToImportAsMat = null; + if (options.InstanceToImportAs != Guid.Empty) + { + AssetInfo assetInfo; + if (FlaxEngine.Content.GetAssetInfo(options.InstanceToImportAs, out assetInfo)) + { + instanceToImportAsMat = FlaxEngine.Content.Load(options.InstanceToImportAs); + } + } + Type = options.Type; CalculateNormals = options.CalculateNormals != 0; SmoothingNormalsAngle = options.SmoothingNormalsAngle; @@ -516,7 +532,7 @@ namespace FlaxEditor.Content.Import TriangleReduction = options.TriangleReduction; ImportMaterials = options.ImportMaterials != 0; ImportMaterialsAsInstances = options.ImportMaterialsAsInstances != 0; - InstanceToImportAs = FlaxEngine.Content.Load(options.InstanceToImportAs); + InstanceToImportAs = instanceToImportAsMat; ImportTextures = options.ImportTextures != 0; RestoreMaterialsOnReimport = options.RestoreMaterialsOnReimport != 0; GenerateSDF = options.GenerateSDF != 0; diff --git a/Source/Engine/Content/Content.cpp b/Source/Engine/Content/Content.cpp index f12619c52..d4015da7b 100644 --- a/Source/Engine/Content/Content.cpp +++ b/Source/Engine/Content/Content.cpp @@ -30,6 +30,7 @@ #if ENABLE_ASSETS_DISCOVERY #include "Engine/Core/Collections/HashSet.h" #endif +#include TimeSpan Content::AssetsUpdateInterval = TimeSpan::FromMilliseconds(500); TimeSpan Content::AssetsUnloadInterval = TimeSpan::FromSeconds(10); @@ -1003,6 +1004,7 @@ Asset* Content::load(const Guid& id, const ScriptingTypeHandle& type, AssetInfo& if (!GetAssetInfo(id, assetInfo)) { LOG(Warning, "Invalid or missing asset ({0}, {1}).", id.ToString(Guid::FormatType::N), type.ToString()); + LOG(Warning, "{0}", DebugLog::GetStackTrace()); return nullptr; } diff --git a/Source/Engine/Tools/ModelTool/ModelTool.cpp b/Source/Engine/Tools/ModelTool/ModelTool.cpp index d1736e246..d5e5ebb10 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.cpp +++ b/Source/Engine/Tools/ModelTool/ModelTool.cpp @@ -863,18 +863,19 @@ bool ModelTool::ImportModel(const String& path, ModelData& meshData, Options& op importedFileNames.Add(filename); #if COMPILE_WITH_ASSETS_IMPORTER auto assetPath = autoImportOutput / filename + ASSET_FILES_EXTENSION_WITH_DOT; - if (options.ImportMaterialsAsInstances) { - LOG(Warning, "Adding material instance for {0}", assetPath); - + if (options.ImportMaterialsAsInstances) + { AssetsImportingManager::Create(AssetsImportingManager::CreateMaterialInstanceTag, assetPath, material.AssetID); MaterialInstance* materialInstance = (MaterialInstance*) LoadAsset(assetPath, MaterialInstance::TypeInitializer); - if (materialInstance->WaitForLoaded()) { + if (materialInstance->WaitForLoaded()) + { LOG(Error, "Failed to load material instance after creation. ({0})", assetPath); return true; } MaterialBase* materialInstanceOf = (MaterialBase*) LoadAsset(options.InstanceToImportAs, MaterialBase::TypeInitializer); - if (materialInstanceOf->WaitForLoaded()) { + if (materialInstanceOf->WaitForLoaded()) + { LOG(Error, "Failed to load material to create an instance of. ({0})", options.InstanceToImportAs); return true; } @@ -882,7 +883,8 @@ bool ModelTool::ImportModel(const String& path, ModelData& meshData, Options& op materialInstance->SetBaseMaterial(materialInstanceOf); materialInstance->Save(); } - else { + else + { CreateMaterial::Options materialOptions; materialOptions.Diffuse.Color = material.Diffuse.Color; if (material.Diffuse.TextureIndex != -1) From e3f004b831f5906b4867bd7dfea8a12b9e5c890c Mon Sep 17 00:00:00 2001 From: Menotdan <32620310+Menotdan@users.noreply.github.com> Date: Mon, 22 May 2023 14:26:55 -0400 Subject: [PATCH 008/103] remove extraneous stack trace print that i used for debugging --- Source/Engine/Content/Content.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Source/Engine/Content/Content.cpp b/Source/Engine/Content/Content.cpp index d4015da7b..026ae821c 100644 --- a/Source/Engine/Content/Content.cpp +++ b/Source/Engine/Content/Content.cpp @@ -1004,7 +1004,6 @@ Asset* Content::load(const Guid& id, const ScriptingTypeHandle& type, AssetInfo& if (!GetAssetInfo(id, assetInfo)) { LOG(Warning, "Invalid or missing asset ({0}, {1}).", id.ToString(Guid::FormatType::N), type.ToString()); - LOG(Warning, "{0}", DebugLog::GetStackTrace()); return nullptr; } From af3d9d0eb3acb07dcb078ff23cf08e96ecec1caf Mon Sep 17 00:00:00 2001 From: Menotdan <32620310+Menotdan@users.noreply.github.com> Date: Wed, 9 Aug 2023 15:28:47 -0400 Subject: [PATCH 009/103] Re-implement functionality for importing materials as instances. --- Source/Engine/Tools/ModelTool/ModelTool.cpp | 10 +++++++--- Source/Engine/Tools/ModelTool/ModelTool.h | 7 +++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Source/Engine/Tools/ModelTool/ModelTool.cpp b/Source/Engine/Tools/ModelTool/ModelTool.cpp index 13fc753af..dfc249c6a 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.cpp +++ b/Source/Engine/Tools/ModelTool/ModelTool.cpp @@ -385,6 +385,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); @@ -426,6 +428,8 @@ void ModelTool::Options::Deserialize(DeserializeStream& stream, ISerializeModifi DESERIALIZE(LODCount); DESERIALIZE(TriangleReduction); DESERIALIZE(ImportMaterials); + DESERIALIZE(ImportMaterialsAsInstances); + DESERIALIZE(InstanceToImportAs); DESERIALIZE(ImportTextures); DESERIALIZE(RestoreMaterialsOnReimport); DESERIALIZE(GenerateSDF); @@ -977,17 +981,17 @@ bool ModelTool::ImportModel(const String& path, ModelData& meshData, Options& op if (options.ImportMaterialsAsInstances) { AssetsImportingManager::Create(AssetsImportingManager::CreateMaterialInstanceTag, assetPath, material.AssetID); - MaterialInstance* materialInstance = (MaterialInstance*) LoadAsset(assetPath, MaterialInstance::TypeInitializer); + MaterialInstance* materialInstance = (MaterialInstance*)LoadAsset(assetPath, MaterialInstance::TypeInitializer); if (materialInstance->WaitForLoaded()) { LOG(Error, "Failed to load material instance after creation. ({0})", assetPath); return true; } - MaterialBase* materialInstanceOf = (MaterialBase*) LoadAsset(options.InstanceToImportAs, MaterialBase::TypeInitializer); + MaterialBase* materialInstanceOf = options.InstanceToImportAs; if (materialInstanceOf->WaitForLoaded()) { - LOG(Error, "Failed to load material to create an instance of. ({0})", options.InstanceToImportAs); + LOG(Error, "Failed to load material to create an instance of. ({0})", options.InstanceToImportAs->GetID()); return true; } diff --git a/Source/Engine/Tools/ModelTool/ModelTool.h b/Source/Engine/Tools/ModelTool/ModelTool.h index 992a929ca..f6aaefa2b 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.h +++ b/Source/Engine/Tools/ModelTool/ModelTool.h @@ -12,6 +12,7 @@ #include "Engine/Graphics/Models/SkeletonData.h" #include "Engine/Animations/AnimationData.h" #include +#include class JsonWriter; @@ -329,6 +330,12 @@ public: // If checked, the importer will create materials for model meshes as specified in the file. API_FIELD(Attributes="EditorOrder(400), EditorDisplay(\"Materials\"), VisibleIf(nameof(ShowGeometry))") bool ImportMaterials = true; + // If checked, the importer will create the model's materials as instances of a base material. + API_FIELD(Attributes = "EditorOrder(401), EditorDisplay(\"Materials\"), VisibleIf(nameof(ImportMaterials))") + bool ImportMaterialsAsInstances = false; + // The material to import the model's materials as an instance of. + API_FIELD(Attributes = "EditorOrder(402), EditorDisplay(\"Materials\"), VisibleIf(nameof(ImportMaterialsAsInstances))") + AssetReference InstanceToImportAs = (Material*) GPUDevice::Instance->GetDefaultMaterial(); // If checked, the importer will import texture files used by the model and any embedded texture resources. API_FIELD(Attributes="EditorOrder(410), EditorDisplay(\"Materials\"), VisibleIf(nameof(ShowGeometry))") bool ImportTextures = true; From 52e546b3ba936e66928ac46b2fab0d6bf0942df3 Mon Sep 17 00:00:00 2001 From: Menotdan <32620310+Menotdan@users.noreply.github.com> Date: Wed, 9 Aug 2023 15:29:14 -0400 Subject: [PATCH 010/103] fix unneeded include. --- Source/ThirdParty/OpenFBX/ofbx.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Source/ThirdParty/OpenFBX/ofbx.h b/Source/ThirdParty/OpenFBX/ofbx.h index 87dd5999f..7066659e3 100644 --- a/Source/ThirdParty/OpenFBX/ofbx.h +++ b/Source/ThirdParty/OpenFBX/ofbx.h @@ -1,5 +1,4 @@ #pragma once -#include namespace ofbx From 72488c4250a39e3f0381808c990f50a4341cb49e Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Tue, 22 Aug 2023 21:14:33 -0500 Subject: [PATCH 011/103] Update cs script temple to use non-indented namespace. --- Content/Editor/Scripting/ScriptTemplate.cs | 50 +++++++++---------- .../Editor/Content/Proxy/CSharpScriptProxy.cs | 2 +- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Content/Editor/Scripting/ScriptTemplate.cs b/Content/Editor/Scripting/ScriptTemplate.cs index 2a150306d..8d43ad590 100644 --- a/Content/Editor/Scripting/ScriptTemplate.cs +++ b/Content/Editor/Scripting/ScriptTemplate.cs @@ -3,34 +3,34 @@ using System.Collections.Generic; using FlaxEngine; namespace %namespace% + +/// +/// %class% Script. +/// +public class %class% : Script { - /// - /// %class% Script. - /// - public class %class% : Script + /// + public override void OnStart() { - /// - public override void OnStart() - { - // Here you can add code that needs to be called when script is created, just before the first game update - } - - /// - public override void OnEnable() - { - // Here you can add code that needs to be called when script is enabled (eg. register for events) - } + // Here you can add code that needs to be called when script is created, just before the first game update + } + + /// + public override void OnEnable() + { + // Here you can add code that needs to be called when script is enabled (eg. register for events) + } - /// - public override void OnDisable() - { - // Here you can add code that needs to be called when script is disabled (eg. unregister from events) - } + /// + public override void OnDisable() + { + // Here you can add code that needs to be called when script is disabled (eg. unregister from events) + } - /// - public override void OnUpdate() - { - // Here you can add code that needs to be called every frame - } + /// + public override void OnUpdate() + { + // Here you can add code that needs to be called every frame } } + diff --git a/Source/Editor/Content/Proxy/CSharpScriptProxy.cs b/Source/Editor/Content/Proxy/CSharpScriptProxy.cs index 24c44aa20..09440d43a 100644 --- a/Source/Editor/Content/Proxy/CSharpScriptProxy.cs +++ b/Source/Editor/Content/Proxy/CSharpScriptProxy.cs @@ -51,7 +51,7 @@ namespace FlaxEditor.Content var copyrightComment = string.IsNullOrEmpty(gameSettings.CopyrightNotice) ? string.Empty : string.Format("// {0}{1}{1}", gameSettings.CopyrightNotice, Environment.NewLine); scriptTemplate = scriptTemplate.Replace("%copyright%", copyrightComment); scriptTemplate = scriptTemplate.Replace("%class%", scriptName); - scriptTemplate = scriptTemplate.Replace("%namespace%", scriptNamespace); + scriptTemplate = scriptTemplate.Replace("%namespace%", $"{scriptNamespace};"); // Save File.WriteAllText(outputPath, scriptTemplate, Encoding.UTF8); From 3295d58684894d39945ee6e803b1f3fe237ab6de Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Tue, 22 Aug 2023 21:34:36 -0500 Subject: [PATCH 012/103] Simplify --- Content/Editor/Scripting/ScriptTemplate.cs | 2 +- Source/Editor/Content/Proxy/CSharpScriptProxy.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Content/Editor/Scripting/ScriptTemplate.cs b/Content/Editor/Scripting/ScriptTemplate.cs index 8d43ad590..663acf05f 100644 --- a/Content/Editor/Scripting/ScriptTemplate.cs +++ b/Content/Editor/Scripting/ScriptTemplate.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using FlaxEngine; -namespace %namespace% +namespace %namespace%; /// /// %class% Script. diff --git a/Source/Editor/Content/Proxy/CSharpScriptProxy.cs b/Source/Editor/Content/Proxy/CSharpScriptProxy.cs index 09440d43a..24c44aa20 100644 --- a/Source/Editor/Content/Proxy/CSharpScriptProxy.cs +++ b/Source/Editor/Content/Proxy/CSharpScriptProxy.cs @@ -51,7 +51,7 @@ namespace FlaxEditor.Content var copyrightComment = string.IsNullOrEmpty(gameSettings.CopyrightNotice) ? string.Empty : string.Format("// {0}{1}{1}", gameSettings.CopyrightNotice, Environment.NewLine); scriptTemplate = scriptTemplate.Replace("%copyright%", copyrightComment); scriptTemplate = scriptTemplate.Replace("%class%", scriptName); - scriptTemplate = scriptTemplate.Replace("%namespace%", $"{scriptNamespace};"); + scriptTemplate = scriptTemplate.Replace("%namespace%", scriptNamespace); // Save File.WriteAllText(outputPath, scriptTemplate, Encoding.UTF8); From 23b6b93726c371cb88d72013acc58998348cf3f6 Mon Sep 17 00:00:00 2001 From: Ruan Lucas <79365912+RuanLucasGD@users.noreply.github.com> Date: Fri, 15 Sep 2023 19:13:32 -0400 Subject: [PATCH 013/103] add collision type to model importer --- Source/Engine/Tools/ModelTool/ModelTool.cpp | 2 +- Source/Engine/Tools/ModelTool/ModelTool.h | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Source/Engine/Tools/ModelTool/ModelTool.cpp b/Source/Engine/Tools/ModelTool/ModelTool.cpp index 19f203667..922627b77 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.cpp +++ b/Source/Engine/Tools/ModelTool/ModelTool.cpp @@ -1079,7 +1079,7 @@ bool ModelTool::ImportModel(const String& path, ModelData& meshData, Options& op #if COMPILE_WITH_PHYSICS_COOKING // Create collision CollisionCooking::Argument arg; - arg.Type = CollisionDataType::TriangleMesh; + arg.Type = options.CollisionType; arg.OverrideModelData = &collisionModel; auto assetPath = autoImportOutput / StringUtils::GetFileNameWithoutExtension(path) + TEXT("Collision") ASSET_FILES_EXTENSION_WITH_DOT; if (CreateCollisionData::CookMeshCollision(assetPath, arg)) diff --git a/Source/Engine/Tools/ModelTool/ModelTool.h b/Source/Engine/Tools/ModelTool/ModelTool.h index 9dc5bf067..ab5f79ddf 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.h +++ b/Source/Engine/Tools/ModelTool/ModelTool.h @@ -6,6 +6,7 @@ #include "Engine/Core/Config.h" #include "Engine/Content/Assets/ModelBase.h" +#include "Engine/Physics/CollisionData.h" #if USE_EDITOR #include "Engine/Core/ISerializable.h" #include "Engine/Graphics/Models/ModelData.h" @@ -262,6 +263,9 @@ public: // If specified, all meshes which name starts with this prefix will be imported as a separate collision data (excluded used for rendering). API_FIELD(Attributes="EditorOrder(100), EditorDisplay(\"Geometry\"), VisibleIf(nameof(ShowGeometry))") String CollisionMeshesPrefix = TEXT(""); + // The type of collision that should be generated if has collision prefix especified + API_FIELD(Attributes = "EditorOrder(105), EditorDisplay(\"Geometry\"), VisibleIf(nameof(ShowGeometry))") + CollisionDataType CollisionType = CollisionDataType::TriangleMesh; public: // Transform From 5cc3e409025246917e6f4a8988f1acd64526fba5 Mon Sep 17 00:00:00 2001 From: Red Kitsune Date: Sun, 17 Sep 2023 20:28:34 +0200 Subject: [PATCH 014/103] Implemented better missing script handling --- Source/Engine/Level/Components/DummyScript.h | 67 ++++++++++++++++++++ Source/Engine/Level/SceneObjectsFactory.cpp | 3 + 2 files changed, 70 insertions(+) create mode 100644 Source/Engine/Level/Components/DummyScript.h diff --git a/Source/Engine/Level/Components/DummyScript.h b/Source/Engine/Level/Components/DummyScript.h new file mode 100644 index 000000000..380648f5a --- /dev/null +++ b/Source/Engine/Level/Components/DummyScript.h @@ -0,0 +1,67 @@ +#pragma once + +#include "Engine/Core/Cache.h" +#include "Engine/Scripting/Script.h" +#include "Engine/Scripting/ScriptingObjectReference.h" +#include "Engine/Serialization/JsonWriters.h" + +API_CLASS(Attributes="HideInEditor") class FLAXENGINE_API DummyScript : public Script +{ + API_AUTO_SERIALIZATION(); + DECLARE_SCRIPTING_TYPE(DummyScript); + +public: + API_PROPERTY(Attributes="ReadOnly") + FORCE_INLINE String GetMissingTypeName() const + { + if(Data.IsEmpty()) return TEXT(""); + + rapidjson_flax::Document doc; + doc.Parse(Data.ToStringAnsi().GetText()); + + String str (doc["TypeName"].GetString()); + + return str; + } + + API_PROPERTY() + void SetMissingTypeName(String value) + { + _missingTypeName = value; + } + + API_FIELD(Hidden, Attributes="HideInEditor") String Data; + + API_PROPERTY() + FORCE_INLINE ScriptingObjectReference