public override void Load(Stream fileStream) { // Header var reader = new BINAReader(fileStream); Header = reader.ReadHeader(); VertexCountOffsetOffset = reader.ReadUInt32(); //Refered to in LibS06 as `geometry_address` PostFaceOffset = reader.ReadUInt32(); //Refered to in LibS06 as `mopp_code_address` VertexCountOffset = reader.ReadUInt32(); //Refered to in LibS06 as `vertex_section_address` FaceCountOffset = reader.ReadUInt32(); //Refered to in LibS06 as `face_section_address` VertexCount = reader.ReadUInt32(); //Vertexes for (int i = 0; i < VertexCount; i++) { Vertices.Add(reader.ReadVector3()); } //Faces FaceCount = reader.ReadUInt32(); for (int i = 0; i < FaceCount; i++) { S06CollisionFace face = new S06CollisionFace(); face.Vertex1 = reader.ReadUInt16(); face.Vertex2 = reader.ReadUInt16(); face.Vertex3 = reader.ReadUInt16(); reader.JumpAhead(2); face.Flags = reader.ReadUInt32(); Faces.Add(face); } }
public override void Load(Stream fileStream) { // Header var reader = new BINAReader(fileStream); reader.ReadHeader(); string sig = reader.ReadSignature(4); if (sig != Signature) { throw new InvalidSignatureException(Signature, sig); } uint texturePos = reader.ReadUInt32(); uint placeholderEntries = reader.ReadUInt32(); reader.JumpTo(reader.ReadUInt32(), false); long pos = reader.BaseStream.Position; // Texture reader.JumpTo(texturePos, false); string texture = reader.ReadNullTerminatedString(); reader.JumpTo(pos, true); // Placeholders for (uint i = 0; i < placeholderEntries; ++i) { S06FontPictureUV fontPicture = new S06FontPictureUV(); Texture = texture; uint placeholderEntry = reader.ReadUInt32(); fontPicture.X = reader.ReadUInt16(); fontPicture.Y = reader.ReadUInt16(); fontPicture.Width = reader.ReadUInt16(); fontPicture.Height = reader.ReadUInt16(); pos = reader.BaseStream.Position; reader.JumpTo(placeholderEntry, false); fontPicture.Placeholder = reader.ReadNullTerminatedString(); reader.JumpTo(pos, true); Entries.Add(fontPicture); } }
public void Read(BINAReader reader, bool readChildIndices = true) { long nameOffset = reader.ReadInt64(); long dataOffset = reader.ReadInt64(); long childIndexTableOffset = reader.ReadInt64(); ParentIndex = reader.ReadInt32(); Index = reader.ReadInt32(); DataIndex = reader.ReadInt32(); ushort childCount = reader.ReadUInt16(); bool hasData = reader.ReadBoolean(); byte fullPathSize = reader.ReadByte(); // Not counting this node in // Read name if (nameOffset != 0) { Name = reader.GetString((uint)nameOffset); } // (MINOR HACK) Store data offset in Data // to be read later, avoiding some Seeks if (hasData && dataOffset != 0) { Data = dataOffset; } // Read Child Indices if (!readChildIndices) { return; } long curPos = reader.BaseStream.Position; reader.JumpTo(childIndexTableOffset); ChildIndices.Capacity = childCount; for (int i = 0; i < childCount; ++i) { ChildIndices.Add(reader.ReadInt32()); } reader.JumpTo(curPos); }
protected SetObject ReadObject(BINAReader reader, Dictionary <string, SetObjectType> objectTemplates) { var obj = new SetObject(); ulong padding1 = reader.ReadUInt64(); long objTypeOffset = reader.ReadInt64(); long objNameOffset = reader.ReadInt64(); ushort id = reader.ReadUInt16(); ushort groupID = reader.ReadUInt16(); ushort parentID = reader.ReadUInt16(); ushort parentGroupID = reader.ReadUInt16(); obj.CustomData.Add("ParentID", new SetObjectParam( typeof(ushort), parentID)); obj.CustomData.Add("ParentGroupID", new SetObjectParam( typeof(ushort), parentGroupID)); obj.ObjectID = id; obj.CustomData.Add("GroupID", new SetObjectParam( typeof(ushort), groupID)); var pos = reader.ReadVector3(); var rot = reader.ReadVector3(); var childPosOffset = reader.ReadVector3(); var childRotOffset = reader.ReadVector3(); obj.CustomData.Add("ChildPosOffset", new SetObjectParam( typeof(Vector3), childPosOffset)); obj.CustomData.Add("ChildRotOffset", new SetObjectParam( typeof(Vector3), childRotOffset)); obj.Transform.Position = pos; obj.Transform.Rotation = new Quaternion(rot, true); long extraParamsOffset = reader.ReadInt64(); ulong unknownCount1 = reader.ReadUInt64(); ulong unknownCount2 = reader.ReadUInt64(); ulong padding3 = reader.ReadUInt64(); long objParamsOffset = reader.ReadInt64(); // Unknown Count Checks if (unknownCount1 != unknownCount2) { Console.WriteLine( "WARNING: UnknownCount1 ({0}) != UnknownCount2 ({1})", unknownCount1, unknownCount2); } if (unknownCount1 > 1) { Console.WriteLine( "WARNING: UnknownCount1 > 1 ({0})", unknownCount1); } // Extra Parameter Offsets var extraParamOffsets = new long[unknownCount1]; reader.JumpTo(extraParamsOffset, false); for (uint i = 0; i < unknownCount1; ++i) { extraParamOffsets[i] = reader.ReadInt64(); ulong padding5 = reader.ReadUInt64(); // TODO: Make sure this is correct } // Extra Parameters for (uint i = 0; i < unknownCount1; ++i) { reader.JumpTo(extraParamOffsets[i], false); ulong padding6 = reader.ReadUInt64(); long extraParamNameOffset = reader.ReadInt64(); ulong extraParamLength = reader.ReadUInt64(); long extraParamDataOffset = reader.ReadInt64(); // Extra Parameter Data reader.JumpTo(extraParamDataOffset, false); var data = reader.ReadBytes((int)extraParamLength); // Extra Parameter Name reader.JumpTo(extraParamNameOffset, false); string name = reader.ReadNullTerminatedString(); // Parse Data switch (name) { case "RangeSpawning": { obj.CustomData.Add("RangeIn", new SetObjectParam( typeof(float), BitConverter.ToSingle(data, 0))); obj.CustomData.Add("RangeOut", new SetObjectParam( typeof(float), BitConverter.ToSingle(data, 4))); continue; } } Console.WriteLine($"WARNING: Unknown extra parameter type {name}"); obj.CustomData.Add(name, new SetObjectParam( data.GetType(), data)); } // Object Name reader.JumpTo(objNameOffset, false); string objName = reader.ReadNullTerminatedString(); obj.CustomData.Add("Name", new SetObjectParam(typeof(string), objName)); // Object Type reader.JumpTo(objTypeOffset, false); string objType = reader.ReadNullTerminatedString(); obj.ObjectType = objType; if (!objectTemplates.ContainsKey(objType)) { Console.WriteLine( "WARNING: Skipped {0} because there is no template for type {1}!", objName, objType); Console.WriteLine("Params at: {0:X}", objParamsOffset + reader.Offset); return(null); } //Console.WriteLine("\"{1}\" Params at: {0:X}", // objParamsOffset + reader.Offset, objName); var template = objectTemplates[objType]; // Object Parameters reader.JumpTo(objParamsOffset, false); foreach (var param in template.Parameters) { obj.Parameters.Add(ReadParameter(reader, param)); } // Additional Padding var rawDataLenExtra = template.GetExtra("RawByteLength"); if (uint.TryParse(rawDataLenExtra?.Value, out var rawLength)) { uint paramLen = (uint)(reader.BaseStream.Position - objParamsOffset - reader.Offset); if (paramLen != rawLength) { obj.CustomData.Add("RawByteLength", new SetObjectParam( typeof(uint), rawLength)); } } // Padding Checks if (padding1 != 0) { Console.WriteLine($"WARNING: Obj Padding1 != 0 ({padding1})"); } if (padding3 != 0) { Console.WriteLine($"WARNING: Obj Padding3 != 0 ({padding3})"); } return(obj); }