Beispiel #1
0
        public CANM(EndianBinaryReader er)
        {
            Signature = er.ReadString(Encoding.ASCII, 4);
            if (Signature != "CANM") throw new SignatureNotCorrectException(Signature, "CANM", er.BaseStream.Position);
            Revision = er.ReadUInt32();
            NameOffset = (UInt32)er.BaseStream.Position + er.ReadUInt32();
            TargetAnimationGroupNameOffset = (UInt32)er.BaseStream.Position + er.ReadUInt32();
            LoopMode = er.ReadUInt32();
            FrameSize = er.ReadSingle();
            NrMemberAnimations = er.ReadUInt32();
            MemberAnimationDictOffset = (UInt32)er.BaseStream.Position + er.ReadUInt32();
            NrUserDataEntries = er.ReadUInt32();
            UserDataOffset = er.ReadUInt32();

            long curpos = er.BaseStream.Position;
            er.BaseStream.Position = NameOffset;
            Name = er.ReadStringNT(Encoding.ASCII);
            er.BaseStream.Position = TargetAnimationGroupNameOffset;
            TargetAnimationGroupName = er.ReadStringNT(Encoding.ASCII);
            er.BaseStream.Position = MemberAnimationDictOffset;
            MemberAnimationDictionary = new DICT(er);

            MemberAnimations = new MemberAnimationData[NrMemberAnimations];
            for (int i = 0; i < NrMemberAnimations; i++)
            {
                er.BaseStream.Position = MemberAnimationDictionary[i].DataOffset;
                MemberAnimations[i] = new MemberAnimationData(er);
            }

            er.BaseStream.Position = curpos;
        }
Beispiel #2
0
        public CANM(EndianBinaryReader er)
        {
            Signature = er.ReadString(Encoding.ASCII, 4);
            if (Signature != "CANM")
            {
                throw new SignatureNotCorrectException(Signature, "CANM", er.BaseStream.Position);
            }
            Revision   = er.ReadUInt32();
            NameOffset = (UInt32)er.BaseStream.Position + er.ReadUInt32();
            TargetAnimationGroupNameOffset = (UInt32)er.BaseStream.Position + er.ReadUInt32();
            LoopMode                  = er.ReadUInt32();
            FrameSize                 = er.ReadSingle();
            NrMemberAnimations        = er.ReadUInt32();
            MemberAnimationDictOffset = (UInt32)er.BaseStream.Position + er.ReadUInt32();
            NrUserDataEntries         = er.ReadUInt32();
            UserDataOffset            = er.ReadUInt32();

            long curpos = er.BaseStream.Position;

            er.BaseStream.Position = NameOffset;
            Name = er.ReadStringNT(Encoding.ASCII);
            er.BaseStream.Position    = TargetAnimationGroupNameOffset;
            TargetAnimationGroupName  = er.ReadStringNT(Encoding.ASCII);
            er.BaseStream.Position    = MemberAnimationDictOffset;
            MemberAnimationDictionary = new DICT(er);

            MemberAnimations = new MemberAnimationData[NrMemberAnimations];
            for (int i = 0; i < NrMemberAnimations; i++)
            {
                er.BaseStream.Position = MemberAnimationDictionary[i].DataOffset;
                MemberAnimations[i]    = new MemberAnimationData(er);
            }

            er.BaseStream.Position = curpos;
        }
Beispiel #3
0
            public DATA(EndianBinaryReader er)
            {
                Signature = er.ReadString(Encoding.ASCII, 4);
                if (Signature != "DATA")
                {
                    throw new SignatureNotCorrectException(Signature, "DATA", er.BaseStream.Position - 4);
                }
                SectionSize       = er.ReadUInt32();
                DictionaryEntries = new DictionaryInfo[16];
                for (int i = 0; i < 16; i++)
                {
                    DictionaryEntries[i] = new DictionaryInfo(er);
                }
                Dictionaries = new DICT[16];
                for (int i = 0; i < 16; i++)
                {
                    if (i == 15 && DictionaryEntries[i].NrItems == 0x54434944)
                    {
                        DictionaryEntries[i].NrItems = 0;
                        DictionaryEntries[i].Offset  = 0;
                    }
                    if (DictionaryEntries[i].Offset != 0)
                    {
                        long curpos = er.BaseStream.Position;
                        er.BaseStream.Position = DictionaryEntries[i].Offset;
                        Dictionaries[i]        = new DICT(er);
                        er.BaseStream.Position = curpos;
                    }
                    else
                    {
                        Dictionaries[i] = null;
                    }
                }

                if (Dictionaries[0] != null)
                {
                    Models = new CMDL[Dictionaries[0].Count];
                    for (int i = 0; i < Dictionaries[0].Count; i++)
                    {
                        long curpos = er.BaseStream.Position;
                        er.BaseStream.Position = Dictionaries[0][i].DataOffset;
                        Models[i] = new CMDL(er);
                        er.BaseStream.Position = curpos;
                    }
                }

                if (Dictionaries[1] != null)
                {
                    Textures = new TXOB[Dictionaries[1].Count];
                    for (int i = 0; i < Dictionaries[1].Count; i++)
                    {
                        long curpos = er.BaseStream.Position;
                        er.BaseStream.Position = Dictionaries[1][i].DataOffset;
                        Textures[i]            = TXOB.FromStream(er);             //new TXOB(er);
                        er.BaseStream.Position = curpos;
                    }
                }
                if (Dictionaries[9] != null)
                {
                    SkeletonAnimations = new CANM[Dictionaries[9].Count];
                    for (int i = 0; i < Dictionaries[9].Count; i++)
                    {
                        long curpos = er.BaseStream.Position;
                        er.BaseStream.Position = Dictionaries[9][i].DataOffset;
                        SkeletonAnimations[i]  = new CANM(er);
                        er.BaseStream.Position = curpos;
                    }
                }
                if (Dictionaries[10] != null)
                {
                    MaterialAnimations = new CANM[Dictionaries[10].Count];
                    for (int i = 0; i < Dictionaries[10].Count; i++)
                    {
                        long curpos = er.BaseStream.Position;
                        er.BaseStream.Position = Dictionaries[10][i].DataOffset;
                        MaterialAnimations[i]  = new CANM(er);
                        er.BaseStream.Position = curpos;
                    }
                }
                if (Dictionaries[11] != null)
                {
                    VisibilityAnimations = new CANM[Dictionaries[11].Count];
                    for (int i = 0; i < Dictionaries[11].Count; i++)
                    {
                        long curpos = er.BaseStream.Position;
                        er.BaseStream.Position  = Dictionaries[11][i].DataOffset;
                        VisibilityAnimations[i] = new CANM(er);
                        er.BaseStream.Position  = curpos;
                    }
                }
            }
Beispiel #4
0
 public DATA()
 {
     Signature         = "DATA";
     DictionaryEntries = new DictionaryInfo[16];
     Dictionaries      = new DICT[16];
 }
Beispiel #5
0
        public CMDL(EndianBinaryReader er)
        {
            Type = er.ReadUInt32();
            Signature = er.ReadString(Encoding.ASCII, 4);
            if (Signature != "CMDL") throw new SignatureNotCorrectException(Signature, "CMDL", er.BaseStream.Position);
            Revision = er.ReadUInt32();
            NameOffset = (UInt32)er.BaseStream.Position + er.ReadUInt32();
            Unknown2 = er.ReadUInt32();
            Unknown3 = er.ReadUInt32();
            Flags = er.ReadUInt32();
            IsBranchVisible = er.ReadUInt32() == 1;
            NrChildren = er.ReadUInt32();
            Unknown7 = er.ReadUInt32();
            NrAnimationGroupDescriptions = er.ReadUInt32();
            AnimationGroupDescriptionsDictOffset =er.ReadUInt32();
            if (AnimationGroupDescriptionsDictOffset != 0) AnimationGroupDescriptionsDictOffset += (UInt32)er.BaseStream.Position - 4;
            Scale = er.ReadVector3();
            Rotation = er.ReadVector3();
            Translation = er.ReadVector3();
            LocalMatrix = er.ReadSingles(4 * 3);
            WorldMatrix = er.ReadSingles(4 * 3);
            NrMeshes = er.ReadUInt32();
            MeshOffsetsOffset = (UInt32)er.BaseStream.Position + er.ReadUInt32();
            NrMaterials = er.ReadUInt32();
            MaterialsDictOffset = (UInt32)er.BaseStream.Position + er.ReadUInt32();
            NrShapes = er.ReadUInt32();
            ShapeOffsetsOffset = (UInt32)er.BaseStream.Position + er.ReadUInt32();
            NrMeshNodes = er.ReadUInt32();
            MeshNodeVisibilitiesDictOffset = er.ReadUInt32();
            if (MeshNodeVisibilitiesDictOffset != 0) MeshNodeVisibilitiesDictOffset += (UInt32)er.BaseStream.Position - 4;
            Unknown23 = er.ReadUInt32();
            Unknown24 = er.ReadUInt32();
            Unknown25 = er.ReadUInt32();
            if ((Type & 0x80) != 0) SkeletonInfoSOBJOffset = (UInt32)er.BaseStream.Position + er.ReadUInt32();

            long curpos = er.BaseStream.Position;
            er.BaseStream.Position = NameOffset;
            Name = er.ReadStringNT(Encoding.ASCII);
            if (AnimationGroupDescriptionsDictOffset != 0)
            {
                er.BaseStream.Position = AnimationGroupDescriptionsDictOffset;
                AnimationInfoDict = new DICT(er);
            }
            er.BaseStream.Position = MeshOffsetsOffset;
            MeshOffsets = new UInt32[NrMeshes];
            for (int i = 0; i < NrMeshes; i++)
            {
                MeshOffsets[i] = (UInt32)er.BaseStream.Position + er.ReadUInt32();
            }
            er.BaseStream.Position = MaterialsDictOffset;
            MaterialsDict = new DICT(er);

            Materials = new MTOB[NrMaterials];
            for (int i = 0; i < NrMaterials; i++)
            {
                er.BaseStream.Position = MaterialsDict[i].DataOffset;
                Materials[i] = new MTOB(er);
            }

            er.BaseStream.Position = ShapeOffsetsOffset;
            ShapeOffsets = new UInt32[NrShapes];
            for (int i = 0; i < NrShapes; i++)
            {
                ShapeOffsets[i] = (UInt32)er.BaseStream.Position + er.ReadUInt32();
            }

            if (MeshNodeVisibilitiesDictOffset != 0)
            {
                er.BaseStream.Position = MeshNodeVisibilitiesDictOffset;
                MeshNodeVisibilitiesDict = new DICT(er);
            }

            AnimationGroupDescriptions = new GraphicsAnimationGroup[NrAnimationGroupDescriptions];
            for (int i = 0; i < NrAnimationGroupDescriptions; i++)
            {
                er.BaseStream.Position = AnimationInfoDict[i].DataOffset;
                AnimationGroupDescriptions[i] = new GraphicsAnimationGroup(er);
            }

            Meshes = new Mesh[NrMeshes];
            for (int i = 0; i < NrMeshes; i++)
            {
                er.BaseStream.Position = MeshOffsets[i];
                Meshes[i] = new Mesh(er);
            }

            Shapes = new SeparateDataShape[NrShapes];
            for (int i = 0; i < NrShapes; i++)
            {
                er.BaseStream.Position = ShapeOffsets[i];
                Shapes[i] = new SeparateDataShape(er);
            }

            MeshNodeVisibilities = new MeshNodeVisibilityCtr[NrMeshNodes];
            for (int i = 0; i < NrMeshNodes; i++)
            {
                er.BaseStream.Position = MeshNodeVisibilitiesDict[i].DataOffset;
                MeshNodeVisibilities[i] = new MeshNodeVisibilityCtr(er);
            }

            if ((Type & 0x80) != 0)
            {
                er.BaseStream.Position = SkeletonInfoSOBJOffset;
                Skeleton = new SkeletonCtr(er);
            }

            er.BaseStream.Position = curpos;
        }
Beispiel #6
0
            public GraphicsAnimationGroup(EndianBinaryReader er)
            {
                Type = er.ReadUInt32();
                Flags = (GraphicsAnimGroupFlags)er.ReadUInt32();
                NameOffset = (UInt32)er.BaseStream.Position + er.ReadUInt32();
                MemberType = (GraphicsMemberType)er.ReadUInt32();
                NrMembers = er.ReadUInt32();
                MemberInfoDICTOffset = (UInt32)er.BaseStream.Position + er.ReadUInt32();
                NrBlendOperations = er.ReadUInt32();
                BlendOperationArrayOffset = (UInt32)er.BaseStream.Position + er.ReadUInt32();
                EvaluationTiming = (AnimGroupEvaluationTiming)er.ReadUInt32();

                long curpos = er.BaseStream.Position;
                er.BaseStream.Position = NameOffset;
                Name = er.ReadStringNT(Encoding.ASCII);
                er.BaseStream.Position = MemberInfoDICTOffset;
                MemberInfoDICT = new DICT(er);
                er.BaseStream.Position = BlendOperationArrayOffset;
                BlendOperations = er.ReadUInt32s((int)NrBlendOperations);

                AnimationGroupMembers = new AnimationGroupMember[NrMembers];
                for (int i = 0; i < NrMembers; i++)
                {
                    er.BaseStream.Position = MemberInfoDICT[i].DataOffset;
                    AnimationGroupMembers[i] = AnimationGroupMember.FromStream(er);
                }
                er.BaseStream.Position = curpos;
            }
Beispiel #7
0
            public SkeletonCtr(EndianBinaryReader er)
            {
                Type = er.ReadUInt32();
                Signature = er.ReadString(Encoding.ASCII, 4);
                if (Signature != "SOBJ") throw new SignatureNotCorrectException(Signature, "SOBJ", er.BaseStream.Position);
                Revision = er.ReadUInt32();
                NameOffset = (UInt32)er.BaseStream.Position + er.ReadUInt32();
                Unknown2 = er.ReadUInt32();
                Unknown3 = er.ReadUInt32();
                NrBones = er.ReadUInt32();
                BoneDictionaryOffset = (UInt32)er.BaseStream.Position + er.ReadUInt32();
                RootBoneOffset = (UInt32)er.BaseStream.Position + er.ReadUInt32();
                ScalingRule = (SkeletonScalingRule)er.ReadUInt32();
                Flags = (SkeletonFlags)er.ReadUInt32();

                long curpos = er.BaseStream.Position;
                er.BaseStream.Position = NameOffset;
                Name = er.ReadStringNT(Encoding.ASCII);
                er.BaseStream.Position = BoneDictionaryOffset;
                BoneDictionary = new DICT(er);
                Bones = new Bone[NrBones];
                for (int i = 0; i < NrBones; i++)
                {
                    er.BaseStream.Position = BoneDictionary[i].DataOffset;
                    Bones[i] = new Bone(er);
                }
                er.BaseStream.Position = curpos;
            }