mirror of
https://github.com/KillzXGaming/Switch-Toolbox
synced 2024-11-10 07:04:36 +00:00
Cleanup file location a bit. Fix LM3 faces for certain formats
This commit is contained in:
parent
1472c4e112
commit
d54c835bc4
16 changed files with 119 additions and 45 deletions
Binary file not shown.
|
@ -200,6 +200,40 @@ namespace FirstPlugin.LuigisMansion.DarkMoon
|
|||
currentModel.BufferStart = chunkEntry.Entry.ChunkOffset;
|
||||
currentModel.BufferSize = chunkEntry.Entry.ChunkSize;
|
||||
break;
|
||||
case SubDataType.BoneData:
|
||||
if (chunk.ChunkSize > 0x40 && currentModel.Skeleton == null)
|
||||
{
|
||||
using (var boneReader = new FileReader(chunkEntry.FileData))
|
||||
{
|
||||
currentModel.Skeleton = new STSkeleton();
|
||||
DrawableContainer.Drawables.Add(currentModel.Skeleton);
|
||||
|
||||
uint numBones = chunk.ChunkSize / 68;
|
||||
for (int i = 0; i < numBones; i++)
|
||||
{
|
||||
boneReader.SeekBegin(i * 68);
|
||||
STBone bone = new STBone(currentModel.Skeleton);
|
||||
bone.position = new float[3] { 0, 0, 0 };
|
||||
bone.rotation = new float[4] { 0, 0, 0, 1 };
|
||||
bone.scale = new float[3] { 0.2f, 0.2f, 0.2f };
|
||||
|
||||
boneReader.SeekBegin(52 + (i * 68));
|
||||
var Position = new OpenTK.Vector3(boneReader.ReadSingle(), boneReader.ReadSingle(), boneReader.ReadSingle());
|
||||
Position = OpenTK.Vector3.TransformPosition(Position, OpenTK.Matrix4.CreateRotationX(OpenTK.MathHelper.DegreesToRadians(90)));
|
||||
bone.position[0] = Position.X;
|
||||
bone.position[2] = Position.Y;
|
||||
bone.position[1] = Position.Z;
|
||||
|
||||
|
||||
bone.RotationType = STBone.BoneRotationType.Euler;
|
||||
currentModel.Skeleton.bones.Add(bone);
|
||||
}
|
||||
|
||||
currentModel.Skeleton.reset();
|
||||
currentModel.Skeleton.update();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SubDataType.VertexStartPointers:
|
||||
using (var vtxPtrReader = new FileReader(chunkEntry.FileData))
|
||||
{
|
|
@ -32,6 +32,7 @@ namespace FirstPlugin.LuigisMansion.DarkMoon
|
|||
VertexStartPointers = 0x1201B004,
|
||||
ModelTransform = 0x1301B001, //Matrix4x4. 0x40 in size
|
||||
MeshBuffers = 0x1301B005, //vertex and index buffer
|
||||
BoneData = 0x1201B102,
|
||||
MaterialName = 0x1201B333,
|
||||
MeshIndexTable = 0x1201B007,
|
||||
MessageData = 0x12027020,
|
|
@ -68,6 +68,8 @@ namespace FirstPlugin.LuigisMansion.DarkMoon
|
|||
public List<LM2_Mesh> Meshes = new List<LM2_Mesh>();
|
||||
public List<uint> VertexBufferPointers = new List<uint>();
|
||||
|
||||
public STSkeleton Skeleton;
|
||||
|
||||
public uint BufferStart;
|
||||
public uint BufferSize;
|
||||
|
|
@ -44,7 +44,7 @@ namespace FirstPlugin.LuigisMansion3
|
|||
//Load the first chunk table
|
||||
//These point to sections which usually have magic and a hash
|
||||
//The chunk table afterwards contains the data itself
|
||||
while (tableReader.ReadUInt16() == ChunkInfoIdenfier)
|
||||
while (!tableReader.EndOfStream && tableReader.ReadUInt16() == ChunkInfoIdenfier)
|
||||
{
|
||||
tableReader.ReadUInt16();
|
||||
|
||||
|
@ -62,8 +62,6 @@ namespace FirstPlugin.LuigisMansion3
|
|||
//This increases by 2 each chunk info, however the starting value is not 0
|
||||
//Note the last entry does not have this
|
||||
entry.Unknown3 = tableReader.ReadUInt32();
|
||||
|
||||
Console.WriteLine("ChunkOffset " + entry.ChunkOffset);
|
||||
}
|
||||
|
||||
if (ChunkEntries.Count > 0)
|
|
@ -272,14 +272,16 @@ namespace FirstPlugin.LuigisMansion3
|
|||
currentTexture.Index = ImageHeaderIndex;
|
||||
currentTexture.Read(textureReader);
|
||||
if (DebugMode)
|
||||
currentTexture.Text = $"Texture {ImageHeaderIndex} {currentTexture.TexFormat.ToString("X")} {currentTexture.Unknown.ToString("X")}";
|
||||
currentTexture.Text = $"Texture {ImageHeaderIndex} {currentTexture.Unknown} {currentTexture.Unknown2} {currentTexture.Unknown3.ToString("X")}";
|
||||
else
|
||||
currentTexture.Text = $"Texture {currentTexture.ID2.ToString("X")}";
|
||||
|
||||
if (HashNames.ContainsKey(currentTexture.ID2))
|
||||
currentTexture.Text = HashNames[currentTexture.ID2];
|
||||
|
||||
textureFolder.Nodes.Add(currentTexture);
|
||||
Renderer.TextureList.Add(currentTexture);
|
||||
if (!Renderer.TextureList.ContainsKey(currentTexture.ID2.ToString("x")))
|
||||
Renderer.TextureList.Add(currentTexture.ID2.ToString("x"), currentTexture);
|
||||
|
||||
TextureHashes.Add(currentTexture.ID2);
|
||||
|
||||
|
@ -360,7 +362,7 @@ namespace FirstPlugin.LuigisMansion3
|
|||
case SubDataType.BoneData:
|
||||
if (chunk.ChunkSize > 0x40 && currentModel.Skeleton == null)
|
||||
{
|
||||
/* chunkEntry.DataFile = File052Data;
|
||||
chunkEntry.DataFile = File052Data;
|
||||
using (var boneReader = new FileReader(chunkEntry.FileData))
|
||||
{
|
||||
currentModel.Skeleton = new STSkeleton();
|
||||
|
@ -389,7 +391,7 @@ namespace FirstPlugin.LuigisMansion3
|
|||
|
||||
currentModel.Skeleton.reset();
|
||||
currentModel.Skeleton.update();
|
||||
}*/
|
||||
}
|
||||
}
|
||||
break;
|
||||
case (SubDataType)0x5012:
|
||||
|
@ -421,7 +423,7 @@ namespace FirstPlugin.LuigisMansion3
|
|||
foreach (var model in modelFolder.Nodes)
|
||||
{
|
||||
((LM3_Model)currentModel).ModelInfo.Read(new FileReader(
|
||||
currentModel.ModelInfo.Data), currentModel.Meshes, TextureHashes);
|
||||
currentModel.ModelInfo.Data), currentModel, currentModel.Meshes, TextureHashes);
|
||||
}
|
||||
|
||||
if (havokFolder.Nodes.Count > 0)
|
||||
|
@ -532,7 +534,7 @@ namespace FirstPlugin.LuigisMansion3
|
|||
{
|
||||
if (Entry.ChunkSize == 0)
|
||||
return new System.IO.MemoryStream();
|
||||
else if (Entry.ChunkOffset + Entry.ChunkSize < DataFile?.Length)
|
||||
else if (Entry.ChunkOffset + Entry.ChunkSize <= DataFile?.Length)
|
||||
return new SubStream(DataFile, Entry.ChunkOffset, Entry.ChunkSize);
|
||||
else
|
||||
return new System.IO.MemoryStream();
|
||||
|
@ -670,7 +672,7 @@ namespace FirstPlugin.LuigisMansion3
|
|||
}
|
||||
else if (DecompressedSize == 0)
|
||||
return new System.IO.MemoryStream();
|
||||
else if (Offset + DecompressedSize < reader.BaseStream.Length)
|
||||
else if (Offset + DecompressedSize <= reader.BaseStream.Length)
|
||||
return new SubStream(reader.BaseStream, Offset, DecompressedSize);
|
||||
}
|
||||
}
|
|
@ -24,8 +24,6 @@ namespace FirstPlugin.LuigisMansion3
|
|||
public enum IndexFormat : ushort
|
||||
{
|
||||
Index_16 = 0x0,
|
||||
Index_32 = 0x1,
|
||||
Index_32_ = 0x2,
|
||||
Index_8 = 0x8000,
|
||||
}
|
||||
|
|
@ -63,6 +63,8 @@ namespace FirstPlugin.LuigisMansion3
|
|||
|
||||
public class LM3_Model : TreeNodeCustom, IContextMenuNode
|
||||
{
|
||||
public List<uint> TextureHashes = new List<uint>();
|
||||
|
||||
public LM3_DICT DataDictionary;
|
||||
public LM3_ModelInfo ModelInfo;
|
||||
public List<LM3_Mesh> Meshes = new List<LM3_Mesh>();
|
||||
|
@ -211,6 +213,24 @@ namespace FirstPlugin.LuigisMansion3
|
|||
|
||||
using (var reader = new FileReader(DataDictionary.GetFileBufferData()))
|
||||
{
|
||||
TreeNode texturesList = new TreeNode("Texture Maps");
|
||||
for (int t = 0; t < TextureHashes.Count; t++)
|
||||
{
|
||||
if (DataDictionary.Renderer.TextureList.ContainsKey(TextureHashes[t].ToString("x")))
|
||||
{
|
||||
var tex = DataDictionary.Renderer.TextureList[TextureHashes[t].ToString("x")];
|
||||
texturesList.Nodes.Add(new TreeNode(tex.Text)
|
||||
{
|
||||
ImageKey = tex.ImageKey,
|
||||
SelectedImageKey = tex.ImageKey,
|
||||
Tag = tex
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (texturesList.Nodes.Count > 0)
|
||||
Nodes.Add(texturesList);
|
||||
|
||||
for (int i = 0; i < Meshes.Count; i++)
|
||||
{
|
||||
LM3_Mesh mesh = Meshes[i];
|
||||
|
@ -226,6 +246,7 @@ namespace FirstPlugin.LuigisMansion3
|
|||
RenderedMeshes.Add(genericObj);
|
||||
|
||||
Nodes.Add(genericObj);
|
||||
|
||||
DataDictionary.Renderer.Meshes.Add(genericObj);
|
||||
|
||||
STGenericPolygonGroup polyGroup = new STGenericPolygonGroup();
|
||||
|
@ -265,10 +286,10 @@ namespace FirstPlugin.LuigisMansion3
|
|||
for (int f = 0; f < mesh.IndexCount; f++)
|
||||
polyGroup.faces.Add(reader.ReadUInt16());
|
||||
break;
|
||||
case IndexFormat.Index_32:
|
||||
/* case IndexFormat.Index_32:
|
||||
for (int f = 0; f < mesh.IndexCount; f++)
|
||||
polyGroup.faces.Add((int)reader.ReadUInt32());
|
||||
break;
|
||||
break;*/
|
||||
}
|
||||
|
||||
Console.WriteLine($"Mesh {genericObj.Text} Format {formatInfo.Format} BufferLength {formatInfo.BufferLength}");
|
||||
|
@ -407,43 +428,43 @@ namespace FirstPlugin.LuigisMansion3
|
|||
{
|
||||
public byte[] Data;
|
||||
|
||||
public void Read(FileReader reader, List<LM3_Mesh> Meshes, List<uint> Hashes)
|
||||
public void Read(FileReader reader, LM3_Model model, List<LM3_Mesh> Meshes, List<uint> Hashes)
|
||||
{
|
||||
List<uint> ModelTexHashes = new List<uint>();
|
||||
uint meshSize = (uint)(reader.BaseStream.Length / Meshes.Count);
|
||||
|
||||
//Read entire section till i find a matching texture hash
|
||||
while (!reader.EndOfStream && reader.Position < reader.BaseStream.Length - 4)
|
||||
{
|
||||
uint HashIDCheck = reader.ReadUInt32();
|
||||
if (Hashes.Contains(HashIDCheck))
|
||||
{
|
||||
using (reader.TemporarySeek(8, System.IO.SeekOrigin.Current))
|
||||
if (!model.TextureHashes.Contains(HashIDCheck))
|
||||
model.TextureHashes.Add(HashIDCheck);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* for (int i = 0; i < Meshes.Count; i++)
|
||||
{
|
||||
reader.SeekBegin(i * meshSize);
|
||||
while (!reader.EndOfStream && reader.Position < reader.BaseStream.Length - 4)
|
||||
{
|
||||
uint HashIDCheck = reader.ReadUInt32();
|
||||
if (Hashes.Contains(HashIDCheck))
|
||||
{
|
||||
uint unk = reader.ReadUInt32();
|
||||
if (unk == 0xF880BD9F)
|
||||
Console.WriteLine("HashCheck " + HashIDCheck);
|
||||
Meshes[i].Material = new LM3_Material();
|
||||
var texUnit = 1;
|
||||
Meshes[i].Material.TextureMaps.Add(new STGenericMatTexture()
|
||||
{
|
||||
ModelTexHashes.Add(HashIDCheck);
|
||||
}
|
||||
textureUnit = texUnit++,
|
||||
Type = STGenericMatTexture.TextureType.Diffuse,
|
||||
Name = HashIDCheck.ToString("x"),
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < Meshes.Count; i++)
|
||||
{
|
||||
if (ModelTexHashes.Count > i)
|
||||
{
|
||||
uint TextureHashID = ModelTexHashes[i];
|
||||
|
||||
Meshes[i].Material = new LM3_Material();
|
||||
var texUnit = 1;
|
||||
Meshes[i].Material.TextureMaps.Add(new STGenericMatTexture()
|
||||
{
|
||||
textureUnit = texUnit++,
|
||||
Type = STGenericMatTexture.TextureType.Diffuse,
|
||||
Name = TextureHashID.ToString("x"),
|
||||
});
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -570,6 +591,9 @@ namespace FirstPlugin.LuigisMansion3
|
|||
IndexStartOffset = reader.ReadUInt32();
|
||||
IndexCount = reader.ReadUInt16();
|
||||
IndexFormat = reader.ReadEnum<IndexFormat>(false);
|
||||
if (IndexFormat != (IndexFormat)0x8000 && IndexFormat != 0)
|
||||
IndexFormat = IndexFormat.Index_16;
|
||||
|
||||
VertexCount = reader.ReadUInt32();
|
||||
reader.ReadUInt32(); //unknown
|
||||
BufferPtrOffset = reader.ReadUInt16(); //I believe this might be for the buffer pointers. It shifts by 4 for each mesh
|
|
@ -101,7 +101,7 @@ namespace FirstPlugin.LuigisMansion3
|
|||
Console.WriteLine("Unknown Format!" + TexFormat.ToString("X"));
|
||||
}
|
||||
|
||||
MipCount = 1;
|
||||
MipCount = numMips;
|
||||
ArrayCount = numArray;
|
||||
|
||||
properties = new POWEProperties();
|
13
File_Format_Library/FileFormats/NLG/PunchOutWii/PO_DICT.cs
Normal file
13
File_Format_Library/FileFormats/NLG/PunchOutWii/PO_DICT.cs
Normal file
|
@ -0,0 +1,13 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FirstPlugin.PunchOutWii
|
||||
{
|
||||
public class PO_DICT
|
||||
{
|
||||
|
||||
}
|
||||
}
|
|
@ -14,7 +14,7 @@ namespace FirstPlugin.LuigisMansion3
|
|||
{
|
||||
public class LM3_Renderer : GenericModelRenderer
|
||||
{
|
||||
public List<TexturePOWE> TextureList = new List<TexturePOWE>();
|
||||
public Dictionary<string, TexturePOWE> TextureList = new Dictionary<string, TexturePOWE>();
|
||||
|
||||
public override void OnRender(GLControl control)
|
||||
{
|
||||
|
@ -27,12 +27,11 @@ namespace FirstPlugin.LuigisMansion3
|
|||
GL.BindTexture(TextureTarget.Texture2D, RenderTools.defaultTex.RenderableTex.TexID);
|
||||
|
||||
string activeTex = tex.Name;
|
||||
|
||||
foreach (var texture in TextureList)
|
||||
{
|
||||
if (texture.ID2.ToString("x") == tex.Name)
|
||||
if (TextureList.ContainsKey(tex.Name))
|
||||
{
|
||||
BindGLTexture(tex, shader, texture);
|
||||
BindGLTexture(tex, shader, TextureList[tex.Name]);
|
||||
return tex.textureUnit + 1;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -222,6 +222,9 @@ namespace Toolbox.Library.Forms
|
|||
((TreeNodeCustom)node).OnClick(treeViewCustom1);
|
||||
}
|
||||
|
||||
if (node.Tag != null && node.Tag is TreeNodeCustom)
|
||||
((TreeNodeCustom)node.Tag).OnClick(treeViewCustom1);
|
||||
|
||||
//Check if it is renderable for updating the viewport
|
||||
if (IsRenderable(node))
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue