1
0
mirror of synced 2025-02-20 12:41:10 +01:00

Add option to export lm2 dark moon models

This commit is contained in:
KillzXGaming 2019-07-25 09:36:49 -04:00
parent 1fb66d4490
commit 5582f31c38
5 changed files with 65 additions and 5 deletions

View File

@ -12,6 +12,55 @@ using OpenTK;
namespace FirstPlugin.LuigisMansion.DarkMoon
{
public class LM2_ModelFolder : TreeNodeCustom, IContextMenuNode
{
public LM2_DICT DataDictionary;
public LM2_ModelFolder(LM2_DICT dict)
{
DataDictionary = dict;
Text = "Models";
}
public ToolStripItem[] GetContextMenuItems()
{
List<ToolStripItem> Items = new List<ToolStripItem>();
Items.Add(new ToolStripMenuItem("Export", null, ExportModelAction, Keys.Control | Keys.E));
return Items.ToArray();
}
private void ExportModelAction(object sender, EventArgs args)
{
ExportModel();
}
private void ExportModel()
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "Supported Formats|*.dae;";
if (sfd.ShowDialog() == DialogResult.OK)
{
ExportModel(sfd.FileName);
}
}
private void ExportModel(string FileName)
{
AssimpSaver assimp = new AssimpSaver();
ExportModelSettings settings = new ExportModelSettings();
List<STGenericMaterial> Materials = new List<STGenericMaterial>();
// foreach (var msh in DataDictionary.Renderer.Meshes)
// Materials.Add(msh.GetMaterial());
var model = new STGenericModel();
model.Materials = Materials;
model.Objects = DataDictionary.Renderer.Meshes;
assimp.SaveFromModel(model, FileName, new List<STGenericTexture>(), new STSkeleton());
}
}
public class LM2_Model : TreeNodeCustom
{
public LM2_DICT DataDictionary;

View File

@ -210,7 +210,6 @@ namespace FirstPlugin
long pos = reader.Position;
uint entryCount = reader.ReadUInt32();
Console.WriteLine($"entryCount {entryCount}");
uint[] Offsets = reader.ReadUInt32s((int)entryCount);
for (int i =0; i < entryCount; i++)

View File

@ -87,7 +87,7 @@ namespace Toolbox.Library
int MeshIndex = 0;
foreach (var obj in Meshes)
{
var mesh = SaveMesh((STGenericObject)obj, MeshIndex++, skeleton, NodeArray);
var mesh = SaveMesh((STGenericObject)obj, scene, MeshIndex++, skeleton, NodeArray);
scene.Meshes.Add(mesh);
}
Node geomNode = new Node(Path.GetFileNameWithoutExtension(FileName), scene.RootNode);
@ -102,11 +102,15 @@ namespace Toolbox.Library
scene.RootNode.Children.Add(geomNode);
}
private Mesh SaveMesh(STGenericObject genericObj, int index, STSkeleton skeleton, List<int> NodeArray)
private Mesh SaveMesh(STGenericObject genericObj, Scene scene, int index, STSkeleton skeleton, List<int> NodeArray)
{
//Assimp is weird so use mesh_# for the name. We'll change it back after save
Mesh mesh = new Mesh($"mesh_{ index }", PrimitiveType.Triangle);
mesh.MaterialIndex = genericObj.MaterialIndex;
if (genericObj.MaterialIndex < scene.MaterialCount && genericObj.MaterialIndex > 0)
mesh.MaterialIndex = genericObj.MaterialIndex;
else
mesh.MaterialIndex = 0;
List<Vector3D> textureCoords0 = new List<Vector3D>();
List<Vector3D> textureCoords1 = new List<Vector3D>();
@ -527,6 +531,14 @@ namespace Toolbox.Library
}
}
if (Materials.Count == 0)
{
Material material = new Material();
material.Name = "New Material";
scene.Materials.Add(material);
return;
}
foreach (var mat in Materials)
{
var genericMat = (STGenericMaterial)mat;
@ -585,7 +597,7 @@ namespace Toolbox.Library
Scene scene = new Scene();
scene.RootNode = new Node("Root");
var mesh = SaveMesh(genericObject,0, null, null);
var mesh = SaveMesh(genericObject, scene, 0, null, null);
mesh.MaterialIndex = 0;
scene.Meshes.Add(mesh);