mirror of
https://github.com/xivdev/Penumbra.git
synced 2025-12-12 18:27:24 +01:00
Allow keeping existing mdl materials
This commit is contained in:
parent
d2f93f8562
commit
64aed56f7c
2 changed files with 32 additions and 5 deletions
|
|
@ -15,6 +15,8 @@ public partial class ModEditWindow
|
|||
public MdlFile Mdl { get; private set; }
|
||||
private List<string>[] _attributes;
|
||||
|
||||
public bool ImportKeepMaterials;
|
||||
|
||||
public List<Utf8GamePath>? GamePaths { get; private set; }
|
||||
public int GamePathIndex;
|
||||
|
||||
|
|
@ -110,6 +112,7 @@ public partial class ModEditWindow
|
|||
|
||||
/// <summary> Export model to an interchange format. </summary>
|
||||
/// <param name="outputPath"> Disk path to save the resulting file to. </param>
|
||||
/// <param name="mdlPath"> .mdl game path to resolve satellite files such as skeletons relative to. </param>
|
||||
public void Export(string outputPath, Utf8GamePath mdlPath)
|
||||
{
|
||||
IEnumerable<SklbFile> skeletons;
|
||||
|
|
@ -143,14 +146,37 @@ public partial class ModEditWindow
|
|||
{
|
||||
IoException = task.Exception?.ToString();
|
||||
if (task is { IsCompletedSuccessfully: true, Result: not null })
|
||||
{
|
||||
Initialize(task.Result);
|
||||
_dirty = true;
|
||||
}
|
||||
FinalizeImport(task.Result);
|
||||
PendingIo = false;
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary> Finalise the import of a .mdl, applying any post-import transformations and state updates. </summary>
|
||||
/// <param name="newMdl"> Model data to finalize. </param>
|
||||
private void FinalizeImport(MdlFile newMdl)
|
||||
{
|
||||
if (ImportKeepMaterials)
|
||||
MergeMaterials(newMdl, Mdl);
|
||||
|
||||
Initialize(newMdl);
|
||||
_dirty = true;
|
||||
}
|
||||
|
||||
/// <summary> Merge material configuration from the source onto the target. </summary>
|
||||
/// <param name="target"> Model that will be updated. </param>
|
||||
/// <param name="source"> Model to copy material configuration from. </param>
|
||||
public void MergeMaterials(MdlFile target, MdlFile source)
|
||||
{
|
||||
target.Materials = source.Materials;
|
||||
|
||||
for (var meshIndex = 0; meshIndex < target.Meshes.Length; meshIndex++)
|
||||
{
|
||||
target.Meshes[meshIndex].MaterialIndex = meshIndex < source.Meshes.Length
|
||||
? source.Meshes[meshIndex].MaterialIndex
|
||||
: (ushort)0;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary> Read a .sklb from the active collection or game. </summary>
|
||||
/// <param name="sklbPath"> Game path to the .sklb to load. </param>
|
||||
private SklbFile ReadSklb(string sklbPath)
|
||||
|
|
|
|||
|
|
@ -79,6 +79,8 @@ public partial class ModEditWindow
|
|||
|
||||
using (var frame = ImRaii.FramedGroup("Import", size, headerPreIcon: FontAwesomeIcon.FileImport))
|
||||
{
|
||||
ImGui.Checkbox("Keep current materials", ref tab.ImportKeepMaterials);
|
||||
|
||||
if (ImGuiUtil.DrawDisabledButton("Import from glTF", Vector2.Zero, "Imports a glTF file, overriding the content of this mdl.",
|
||||
tab.PendingIo))
|
||||
_fileDialog.OpenFilePicker("Load model from glTF.", "glTF{.gltf,.glb}", (success, paths) =>
|
||||
|
|
@ -86,7 +88,6 @@ public partial class ModEditWindow
|
|||
if (success && paths.Count > 0)
|
||||
tab.Import(paths[0]);
|
||||
}, 1, _mod!.ModPath.FullName, false);
|
||||
ImGui.Dummy(new Vector2(ImGui.GetFrameHeight()));
|
||||
}
|
||||
|
||||
if (_dragDropManager.CreateImGuiTarget("ModelDragDrop", out var files, out _) && GetFirstModel(files, out var importFile))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue