コード例 #1
0
ファイル: Mdl.cs プロジェクト: bonomali/Ibasa
 internal HitBox(int bone, int group, Boxf boundingBox, string name)
 {
     Bone        = bone;
     Group       = group;
     BoundingBox = boundingBox;
     Name        = name;
 }
コード例 #2
0
ファイル: Mdl.cs プロジェクト: bonomali/Ibasa
        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));
        }
コード例 #3
0
ファイル: Mdl.cs プロジェクト: bonomali/Ibasa
        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);
        }
コード例 #4
0
ファイル: Mdl.cs プロジェクト: Frassle/Ibasa
 internal HitBox(int bone, int group, Boxf boundingBox, string name)
 {
     Bone = bone;
     Group = group;
     BoundingBox = boundingBox;
     Name = name;
 }
コード例 #5
0
ファイル: Mdl.cs プロジェクト: Frassle/Ibasa
        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);
        }
コード例 #6
0
ファイル: Mdl.cs プロジェクト: Frassle/Ibasa
        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);
        }