private static Bitmap ToBitmap(byte[] xifile) { Level5_XI xi = new Level5_XI(); xi.Open(xifile); return(xi.ToBitmap()); }
public static GenericTexture ToGenericTexture(byte[] xifile) { GenericTexture tex = new GenericTexture(); Level5_XI xi = new Level5_XI(); xi.Open(xifile); if (xi.SwitchFile && xi.ImageFormat == 0x1D) { tex.Mipmaps.Add(xi.BuildImageDataFromBlock(8)[0]); tex.InternalFormat = OpenTK.Graphics.OpenGL.PixelInternalFormat.CompressedRgbS3tcDxt1Ext; tex.Width = (uint)xi.Height; tex.Height = (uint)xi.Width; } else if (xi.SwitchFile && xi.ImageFormat == 0x1F) { tex.Mipmaps.Add(xi.BuildImageDataFromBlock(16)[0]); tex.InternalFormat = OpenTK.Graphics.OpenGL.PixelInternalFormat.CompressedRgbaS3tcDxt5Ext; tex.Width = (uint)xi.Height; tex.Height = (uint)xi.Width; } else if (xi.SwitchFile && xi.ImageFormat == 0x1) { tex.Mipmaps.Add(xi.BuildImageData()[0]); tex.InternalFormat = OpenTK.Graphics.OpenGL.PixelInternalFormat.Rgb8; tex.PixelFormat = OpenTK.Graphics.OpenGL.PixelFormat.Rgb; tex.Width = (uint)xi.Height; tex.Height = (uint)xi.Width; } else { var texture = xi.ToBitmap(); tex.FromBitmap(texture); texture.Dispose(); } return(tex); }
public GenericModel ToGenericModel() { var model = new GenericModel(); var skel = new GenericSkeleton(); model.Skeleton = skel; Level5_Resource resourceFile = null; var textureList = new List <GenericTexture>(); foreach (var f in Files) { //Console.WriteLine(f.Key); if (f.Key.EndsWith("RES.bin")) { resourceFile = new Level5_Resource(f.Value); model.Name = resourceFile.ModelName; } if (f.Key.EndsWith(".mbn")) { skel.Bones.Add(Level5_MBN.ToBone(f.Value)); } if (f.Key.EndsWith(".prm")) { model.Meshes.Add(Level5_PRM.ToGenericMesh(f.Value)); } if (f.Key.EndsWith(".atr")) { } if (f.Key.EndsWith(".xi")) { var tex = Level5_XI.ToGenericTexture(f.Value); tex.Name = f.Key; textureList.Add(tex); } } if (resourceFile == null) { return(model); } // add materials foreach (var mat in resourceFile.Materials) { GenericMaterial material = new GenericMaterial(); material.TextureDiffuse = mat.TexName; model.MaterialBank.Add(mat.Name, material); } // add textures for (int i = 0; i < textureList.Count; i++) { model.TextureBank.Add(resourceFile.TextureNames[i], textureList[i]); } // fix bones foreach (var bone in skel.Bones) { bone.Name = resourceFile.GetResourceName((uint)bone.ID); bone.ID = 0; } foreach (var bone in skel.Bones) { if (bone.ParentIndex == 0) { bone.ParentIndex = -1; } else { var parentName = resourceFile.GetResourceName((uint)bone.ParentIndex); bone.ParentIndex = skel.Bones.FindIndex(e => e.Name.Equals(parentName)); } } var boneIndex = 0; foreach (var bone in skel.Bones) { if (bone.Name.Equals("")) { bone.Name = "Bone_" + boneIndex++; } } foreach (var mesh in model.Meshes) { for (int i = 0; i < mesh.VertexCount; i++) { var vertex = mesh.Vertices[i]; Vector4 newBones = new Vector4(); for (int j = 0; j < 4; j++) { if (vertex.Weights[j] > 0) { var hash = BitConverter.ToUInt32(BitConverter.GetBytes(vertex.Bones[j]), 0); newBones[j] = skel.Bones.FindIndex(e => e.Name == resourceFile.GetResourceName(hash)); } } vertex.Bones = newBones; mesh.Vertices[i] = vertex; } } return(model); }