Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Runtime.InteropServices;
- using System.Text;
- using System.Threading.Tasks;
- using PhilLibX.IO;
- namespace TyrantLib
- {
- public partial class ResidentEvil2
- {
- public class Material
- {
- #region Constants
- /// <summary>
- /// PFB Magic Number/FourCC
- /// </summary>
- public const int Magic = 0x46444D;
- #endregion
- /// <summary>
- /// Material File Header
- /// </summary>
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- public struct Header
- {
- /// <summary>
- /// Magic
- /// </summary>
- public uint Magic { get; set; }
- /// <summary>
- /// Unknown, probably version
- /// </summary>
- public ushort Unknown { get; set; }
- /// <summary>
- /// Number of Materials
- /// </summary>
- public int MaterialCount { get; set; }
- /// <summary>
- /// Null Padding
- /// </summary>
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
- public byte[] Padding;
- }
- /// <summary>
- /// Material Entry
- /// </summary>
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- public struct MaterialEntry
- {
- /// <summary>
- /// Offsets to the name of the Material
- /// </summary>
- public long NameOffset { get; set; }
- /// <summary>
- /// Unknown bytes (What looks like a hash and some constants)
- /// </summary>
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
- public byte[] Unknown;
- /// <summary>
- /// Number of Textures
- /// </summary>
- public int TextureCount { get; set; }
- /// <summary>
- /// Null Padding
- /// </summary>
- private long Padding { get; set; }
- /// <summary>
- /// Unknown Offset
- /// </summary>
- public long UnknownOffset { get; set; }
- /// <summary>
- /// Pointer to the Texture Entries
- /// </summary>
- public long TexturesOffset { get; set; }
- /// <summary>
- /// Unknown Offsets
- /// </summary>
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
- public byte[] UnknownOffsets;
- }
- /// <summary>
- /// Texture File Entry
- /// </summary>
- public struct TextureEntry
- {
- /// <summary>
- /// Offset to Texture Type String (BaseColor, etc.)
- /// </summary>
- public long TextureTypeOffset { get; set; }
- /// <summary>
- /// Hash of some kind, doesn't match MurMur results
- /// </summary>
- public long Hash { get; set; }
- /// <summary>
- /// Texture Name Offset
- /// </summary>
- public long TextureNameOffset { get; set; }
- }
- /// <summary>
- /// Loads Materials from the Material File
- /// </summary>
- public static Dictionary<string, Dictionary<string, string>> LoadMaterialsFromFile(Stream stream)
- {
- // Create reader
- using (var reader = new BinaryReader(stream))
- {
- var results = new Dictionary<string, Dictionary<string, string>>();
- // Read Header
- var header = reader.ReadStruct<Header>();
- // Read Materials
- var materials = reader.ReadArray<MaterialEntry>(header.MaterialCount);
- // Loop through them
- foreach(var material in materials)
- {
- // Read Material Name
- reader.Seek(material.NameOffset, SeekOrigin.Begin);
- string materialName = reader.ReadUTF16NullTerminatedString();
- // Set texture list
- results[materialName] = new Dictionary<string, string>();
- // Read Textures
- reader.Seek(material.TexturesOffset, SeekOrigin.Begin);
- var textures = reader.ReadArray<TextureEntry>(material.TextureCount);
- // Loop through them
- foreach(var texture in textures)
- {
- // Read Texture Type
- reader.Seek(texture.TextureTypeOffset, SeekOrigin.Begin);
- string textureType = reader.ReadUTF16NullTerminatedString();
- // Read Name
- reader.Seek(texture.TextureNameOffset, SeekOrigin.Begin);
- string textureName = reader.ReadUTF16NullTerminatedString();
- // Set it
- results[materialName][textureType] = textureName;
- }
- }
- // Done
- return results;
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement