internal HitBox(int bone, int group, Boxf boundingBox, string name) { Bone = bone; Group = group; BoundingBox = boundingBox; Name = name; }
ImmutableArray <HitBox> LoadHitBoxes(Ibasa.IO.BinaryReader reader, int count) { long offset = reader.BaseStream.Position; HitBox[] hitBoxes = new HitBox[count]; for (int i = 0; i < count; ++i) { reader.BaseStream.Position = offset; int bone = reader.ReadInt32(); int group = reader.ReadInt32(); Boxf box = new Boxf( new Point3f(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()), new Size3f(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle())); long nameOffset = offset + reader.ReadInt32(); reader.Seek(8 * 4, SeekOrigin.Current); //skip 8 ints offset = reader.BaseStream.Position; reader.BaseStream.Position = nameOffset; string name = LoadString(reader); hitBoxes[i] = new HitBox(bone, group, box, name); } return(new ImmutableArray <HitBox>(hitBoxes)); }
private void Load(Stream stream) { var reader = new Ibasa.IO.BinaryReader(stream, Encoding.ASCII); long baseOffset = reader.BaseStream.Position; string signature = Encoding.ASCII.GetString(reader.ReadBytes(4)); if (signature != "IDST") { throw new InvalidDataException("File signature does not match 'IDST'."); } Version = reader.ReadInt32(); if ((Version < 44 || Version > 49)) { throw new InvalidDataException(string.Format("File version {0} does not match 44 to 49.", Version)); } Checksum = reader.ReadInt32(); Name = Encoding.ASCII.GetString(reader.ReadBytes(64)).Trim('\0'); int length = reader.ReadInt32(); //file length EyePosition = new Vector3f(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); IlluminationPosition = new Vector3f(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); Hull = new Boxf( new Point3f(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()), new Size3f(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle())); ViewHull = new Boxf( new Point3f(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()), new Size3f(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle())); Flags = (MdlFlags)reader.ReadInt32(); int bonesCount = reader.ReadInt32(); long bonesOffset = baseOffset + reader.ReadInt32(); int boneControllersCount = reader.ReadInt32(); long boneControllersOffset = baseOffset + reader.ReadInt32(); int hitBoxSetsCount = reader.ReadInt32(); long hitBoxSetsOffset = baseOffset + reader.ReadInt32(); int localAnimCount = reader.ReadInt32(); long localAnimOffset = baseOffset + reader.ReadInt32(); int localSeqCount = reader.ReadInt32(); long localSeqOffset = baseOffset + reader.ReadInt32(); int activityListVersion = reader.ReadInt32(); int eventsIndexed = reader.ReadInt32(); int texturesCount = reader.ReadInt32(); long texturesOffset = baseOffset + reader.ReadInt32(); int cdTexturesCount = reader.ReadInt32(); long cdTexturesOffset = baseOffset + reader.ReadInt32(); int skinRefsCount = reader.ReadInt32(); int skinFamiliesCount = reader.ReadInt32(); long skinOffset = baseOffset + reader.ReadInt32(); int bodyPartsCount = reader.ReadInt32(); long bodyPartsOffset = baseOffset + reader.ReadInt32(); int localAttachmentsCount = reader.ReadInt32(); long localAttachmentsOffset = baseOffset + reader.ReadInt32(); int localNodesCount = reader.ReadInt32(); long localNodesOffset = baseOffset + reader.ReadInt32(); long localNodesNameOffset = baseOffset + reader.ReadInt32(); int flexDescsCount = reader.ReadInt32(); long flexDescsOffset = baseOffset + reader.ReadInt32(); int flexControllersCount = reader.ReadInt32(); long flexControllersOffset = baseOffset + reader.ReadInt32(); int flexRulesCount = reader.ReadInt32(); long flexRulesOffset = baseOffset + reader.ReadInt32(); int ikChainsCount = reader.ReadInt32(); long ikChainsOffset = baseOffset + reader.ReadInt32(); int mouthsCount = reader.ReadInt32(); long mouthsOffset = baseOffset + reader.ReadInt32(); //=== //Start reading from offsets //=== reader.BaseStream.Position = bonesOffset; Bones = LoadBones(reader, bonesCount); reader.BaseStream.Position = boneControllersOffset; BoneControllers = LoadBoneControllers(reader, boneControllersCount); //reader.BaseStream.Position = hitBoxSetsOffset; //HitBoxSets = LoadHitBoxSets(reader, hitBoxSetsCount); reader.BaseStream.Position = localAnimOffset; LocalAnimations = LoadLocalAnimations(reader, localAnimCount); reader.BaseStream.Position = localSeqOffset; LocalSequences = LoadLocalSequences(reader, localSeqCount); reader.BaseStream.Position = texturesOffset; Textures = LoadTextures(reader, texturesCount); reader.BaseStream.Position = cdTexturesOffset; CdTextures = LoadStringTable(reader, cdTexturesCount, baseOffset); //skin refs //TODO reader.BaseStream.Position = bodyPartsOffset; BodyParts = LoadBodyParts(reader, bodyPartsCount); }
ImmutableArray<HitBox> LoadHitBoxes(Ibasa.IO.BinaryReader reader, int count) { long offset = reader.BaseStream.Position; HitBox[] hitBoxes = new HitBox[count]; for (int i = 0; i < count; ++i) { reader.BaseStream.Position = offset; int bone = reader.ReadInt32(); int group = reader.ReadInt32(); Boxf box = new Boxf( new Point3f(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()), new Size3f(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle())); long nameOffset = offset + reader.ReadInt32(); reader.Seek(8*4, SeekOrigin.Current); //skip 8 ints offset = reader.BaseStream.Position; reader.BaseStream.Position = nameOffset; string name = LoadString(reader); hitBoxes[i] = new HitBox(bone, group, box, name); } return new ImmutableArray<HitBox>(hitBoxes); }
private void Load(Stream stream) { var reader = new Ibasa.IO.BinaryReader(stream, Encoding.ASCII); long baseOffset = reader.BaseStream.Position; string signature = Encoding.ASCII.GetString(reader.ReadBytes(4)); if (signature != "IDST") throw new InvalidDataException("File signature does not match 'IDST'."); Version = reader.ReadInt32(); if ((Version < 44 || Version > 49)) throw new InvalidDataException(string.Format("File version {0} does not match 44 to 49.", Version)); Checksum = reader.ReadInt32(); Name = Encoding.ASCII.GetString(reader.ReadBytes(64)).Trim('\0'); int length = reader.ReadInt32(); //file length EyePosition = new Vector3f(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); IlluminationPosition = new Vector3f(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); Hull = new Boxf( new Point3f(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()), new Size3f(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle())); ViewHull = new Boxf( new Point3f(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()), new Size3f(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle())); Flags = (MdlFlags)reader.ReadInt32(); int bonesCount = reader.ReadInt32(); long bonesOffset = baseOffset + reader.ReadInt32(); int boneControllersCount = reader.ReadInt32(); long boneControllersOffset = baseOffset + reader.ReadInt32(); int hitBoxSetsCount = reader.ReadInt32(); long hitBoxSetsOffset = baseOffset + reader.ReadInt32(); int localAnimCount = reader.ReadInt32(); long localAnimOffset = baseOffset + reader.ReadInt32(); int localSeqCount = reader.ReadInt32(); long localSeqOffset = baseOffset + reader.ReadInt32(); int activityListVersion = reader.ReadInt32(); int eventsIndexed = reader.ReadInt32(); int texturesCount = reader.ReadInt32(); long texturesOffset = baseOffset + reader.ReadInt32(); int cdTexturesCount = reader.ReadInt32(); long cdTexturesOffset = baseOffset + reader.ReadInt32(); int skinRefsCount = reader.ReadInt32(); int skinFamiliesCount = reader.ReadInt32(); long skinOffset = baseOffset + reader.ReadInt32(); int bodyPartsCount = reader.ReadInt32(); long bodyPartsOffset = baseOffset + reader.ReadInt32(); int localAttachmentsCount = reader.ReadInt32(); long localAttachmentsOffset = baseOffset + reader.ReadInt32(); int localNodesCount = reader.ReadInt32(); long localNodesOffset = baseOffset + reader.ReadInt32(); long localNodesNameOffset = baseOffset + reader.ReadInt32(); int flexDescsCount = reader.ReadInt32(); long flexDescsOffset = baseOffset + reader.ReadInt32(); int flexControllersCount = reader.ReadInt32(); long flexControllersOffset = baseOffset + reader.ReadInt32(); int flexRulesCount = reader.ReadInt32(); long flexRulesOffset = baseOffset + reader.ReadInt32(); int ikChainsCount = reader.ReadInt32(); long ikChainsOffset = baseOffset + reader.ReadInt32(); int mouthsCount = reader.ReadInt32(); long mouthsOffset = baseOffset + reader.ReadInt32(); //=== //Start reading from offsets //=== reader.BaseStream.Position = bonesOffset; Bones = LoadBones(reader, bonesCount); reader.BaseStream.Position = boneControllersOffset; BoneControllers = LoadBoneControllers(reader, boneControllersCount); //reader.BaseStream.Position = hitBoxSetsOffset; //HitBoxSets = LoadHitBoxSets(reader, hitBoxSetsCount); reader.BaseStream.Position = localAnimOffset; LocalAnimations = LoadLocalAnimations(reader, localAnimCount); reader.BaseStream.Position = localSeqOffset; LocalSequences = LoadLocalSequences(reader, localSeqCount); reader.BaseStream.Position = texturesOffset; Textures = LoadTextures(reader, texturesCount); reader.BaseStream.Position = cdTexturesOffset; CdTextures = LoadStringTable(reader, cdTexturesCount, baseOffset); //skin refs //TODO reader.BaseStream.Position = bodyPartsOffset; BodyParts = LoadBodyParts(reader, bodyPartsCount); }