From df430831010f85b7970b5ec790107ef4ee726f81 Mon Sep 17 00:00:00 2001 From: ackwell Date: Wed, 27 Dec 2023 01:21:26 +1100 Subject: [PATCH] export per example --- Penumbra/Import/Models/ModelManager.cs | 45 +++++++++++++++++++ Penumbra/Penumbra.csproj | 2 + Penumbra/Services/ServiceManager.cs | 4 +- .../UI/AdvancedWindow/ModEditWindow.Models.cs | 8 ++++ Penumbra/UI/AdvancedWindow/ModEditWindow.cs | 4 +- Penumbra/packages.lock.json | 23 ++++++++++ 6 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 Penumbra/Import/Models/ModelManager.cs diff --git a/Penumbra/Import/Models/ModelManager.cs b/Penumbra/Import/Models/ModelManager.cs new file mode 100644 index 00000000..33ad9249 --- /dev/null +++ b/Penumbra/Import/Models/ModelManager.cs @@ -0,0 +1,45 @@ +using Penumbra.GameData.Files; +using SharpGLTF.Geometry; +using SharpGLTF.Geometry.VertexTypes; +using SharpGLTF.Materials; +using SharpGLTF.Scenes; + +namespace Penumbra.Import.Models; + +public sealed class ModelManager +{ + public ModelManager() + { + // + } + + // TODO: Consider moving import/export onto an async queue, check ../textures/texturemanager + + public void ExportToGltf(/* MdlFile mdl, */string path) + { + var mesh = new MeshBuilder("mesh"); + + var material1 = new MaterialBuilder() + .WithDoubleSide(true) + .WithMetallicRoughnessShader() + .WithChannelParam(KnownChannel.BaseColor, KnownProperty.RGBA, new Vector4(1, 0, 0, 1)); + var primitive1 = mesh.UsePrimitive(material1); + primitive1.AddTriangle(new VertexPosition(-10, 0, 0), new VertexPosition(10, 0, 0), new VertexPosition(0, 10, 0)); + primitive1.AddTriangle(new VertexPosition(10, 0, 0), new VertexPosition(-10, 0, 0), new VertexPosition(0, -10, 0)); + + var material2 = new MaterialBuilder() + .WithDoubleSide(true) + .WithMetallicRoughnessShader() + .WithChannelParam(KnownChannel.BaseColor, KnownProperty.RGBA, new Vector4(1, 0, 1, 1)); + var primitive2 = mesh.UsePrimitive(material2); + primitive2.AddQuadrangle(new VertexPosition(-5, 0, 3), new VertexPosition(0, -5, 3), new VertexPosition(5, 0, 3), new VertexPosition(0, 5, 3)); + + var scene = new SceneBuilder(); + scene.AddRigidMesh(mesh, Matrix4x4.Identity); + + var model = scene.ToGltf2(); + model.SaveGLTF(path); + + // TODO: Draw the rest of the owl. + } +} diff --git a/Penumbra/Penumbra.csproj b/Penumbra/Penumbra.csproj index ec433113..122e17b5 100644 --- a/Penumbra/Penumbra.csproj +++ b/Penumbra/Penumbra.csproj @@ -72,6 +72,8 @@ + + diff --git a/Penumbra/Services/ServiceManager.cs b/Penumbra/Services/ServiceManager.cs index 73be8834..5a107060 100644 --- a/Penumbra/Services/ServiceManager.cs +++ b/Penumbra/Services/ServiceManager.cs @@ -8,6 +8,7 @@ using Penumbra.Collections.Cache; using Penumbra.Collections.Manager; using Penumbra.GameData; using Penumbra.GameData.Data; +using Penumbra.Import.Models; using Penumbra.Import.Textures; using Penumbra.Interop.PathResolving; using Penumbra.Interop.ResourceLoading; @@ -185,7 +186,8 @@ public static class ServiceManager .AddSingleton() .AddSingleton() .AddSingleton() - .AddSingleton(); + .AddSingleton() + .AddSingleton(); private static IServiceCollection AddApi(this IServiceCollection services) => services.AddSingleton() diff --git a/Penumbra/UI/AdvancedWindow/ModEditWindow.Models.cs b/Penumbra/UI/AdvancedWindow/ModEditWindow.Models.cs index e4646d07..80831dab 100644 --- a/Penumbra/UI/AdvancedWindow/ModEditWindow.Models.cs +++ b/Penumbra/UI/AdvancedWindow/ModEditWindow.Models.cs @@ -5,6 +5,7 @@ using OtterGui.Raii; using OtterGui.Widgets; using Penumbra.GameData; using Penumbra.GameData.Files; +using Penumbra.Import.Models; using Penumbra.String.Classes; namespace Penumbra.UI.AdvancedWindow; @@ -13,6 +14,8 @@ public partial class ModEditWindow { private const int MdlMaterialMaximum = 4; + private readonly ModelManager _models; + private readonly FileEditor _modelTab; private string _modelNewMaterial = string.Empty; @@ -31,6 +34,11 @@ public partial class ModEditWindow ); } + if (ImGui.Button("bingo bango")) + { + _models.ExportToGltf("C:\\Users\\ackwell\\blender\\gltf-tests\\bingo.gltf"); + } + var ret = false; ret |= DrawModelMaterialDetails(tab, disabled); diff --git a/Penumbra/UI/AdvancedWindow/ModEditWindow.cs b/Penumbra/UI/AdvancedWindow/ModEditWindow.cs index 365c4a4a..1a3d9182 100644 --- a/Penumbra/UI/AdvancedWindow/ModEditWindow.cs +++ b/Penumbra/UI/AdvancedWindow/ModEditWindow.cs @@ -12,6 +12,7 @@ using Penumbra.Collections.Manager; using Penumbra.Communication; using Penumbra.GameData.Enums; using Penumbra.GameData.Files; +using Penumbra.Import.Models; using Penumbra.Import.Textures; using Penumbra.Interop.ResourceTree; using Penumbra.Interop.Services; @@ -563,7 +564,7 @@ public partial class ModEditWindow : Window, IDisposable public ModEditWindow(PerformanceTracker performance, FileDialogService fileDialog, ItemSwapTab itemSwapTab, IDataManager gameData, Configuration config, ModEditor editor, ResourceTreeFactory resourceTreeFactory, MetaFileManager metaFileManager, StainService stainService, ActiveCollections activeCollections, DalamudServices dalamud, ModMergeTab modMergeTab, - CommunicatorService communicator, TextureManager textures, IDragDropManager dragDropManager, GameEventManager gameEvents, + CommunicatorService communicator, TextureManager textures, ModelManager models, IDragDropManager dragDropManager, GameEventManager gameEvents, ChangedItemDrawer changedItemDrawer) : base(WindowBaseLabel) { @@ -579,6 +580,7 @@ public partial class ModEditWindow : Window, IDisposable _communicator = communicator; _dragDropManager = dragDropManager; _textures = textures; + _models = models; _fileDialog = fileDialog; _gameEvents = gameEvents; _materialTab = new FileEditor(this, gameData, config, _editor.Compactor, _fileDialog, "Materials", ".mtrl", diff --git a/Penumbra/packages.lock.json b/Penumbra/packages.lock.json index eed5d7c8..cef49e9c 100644 --- a/Penumbra/packages.lock.json +++ b/Penumbra/packages.lock.json @@ -26,6 +26,21 @@ "resolved": "0.33.0", "contentHash": "FlHfpTAADzaSlVCBF33iKJk9UhOr3Xj+r5LXbW2GzqYr0SrhiOf6shLX2LC2fqs7g7d+YlwKbBXqWFtb+e7icw==" }, + "SharpGLTF.Core": { + "type": "Direct", + "requested": "[1.0.0-alpha0030, )", + "resolved": "1.0.0-alpha0030", + "contentHash": "HVL6PcrM0H/uEk96nRZfhtPeYvSFGHnni3g1aIckot2IWVp0jLMH5KWgaWfsatEz4Yds3XcdSLUWmJZivDBUPA==" + }, + "SharpGLTF.Toolkit": { + "type": "Direct", + "requested": "[1.0.0-alpha0030, )", + "resolved": "1.0.0-alpha0030", + "contentHash": "nsoJWAFhXgEky9bVCY0zLeZVDx+S88u7VjvuebvMb6dJiNyFOGF6FrrMHiJe+x5pcVBxxlc3VoXliBF7r/EqYA==", + "dependencies": { + "SharpGLTF.Runtime": "1.0.0-alpha0030" + } + }, "SixLabors.ImageSharp": { "type": "Direct", "requested": "[2.1.2, )", @@ -46,6 +61,14 @@ "resolved": "5.0.0", "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" }, + "SharpGLTF.Runtime": { + "type": "Transitive", + "resolved": "1.0.0-alpha0030", + "contentHash": "Ysn+fyj9EVXj6mfG0BmzSTBGNi/QvcnTrMd54dBMOlI/TsMRvnOY3JjTn0MpeH2CgHXX4qogzlDt4m+rb3n4Og==", + "dependencies": { + "SharpGLTF.Core": "1.0.0-alpha0030" + } + }, "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", "resolved": "5.0.0",