Ejemplo n.º 1
0
        public PrmChunk(byte[] data, int offset, BaseCTRChunk parent)
            : base(data, offset, parent)
        {
            Unknown1        = BitConverter.ToUInt32(ChunkData, 0x8);
            Unknown2        = BitConverter.ToUInt32(ChunkData, 0xC);
            DataType        = (Constants.PicaDataType)BitConverter.ToUInt32(ChunkData, 0x10);
            NumberOfIndices = BitConverter.ToUInt16(ChunkData, 0x14);
            FirstIndex      = BitConverter.ToUInt16(ChunkData, 0x16);

            DrawElementsType = DrawElementsType.UnsignedShort;
            ElementSize      = sizeof(ushort);

            switch (DataType)
            {
            case Constants.PicaDataType.UnsignedByte:
                DrawElementsType = DrawElementsType.UnsignedByte;
                ElementSize      = sizeof(byte);
                break;

            case Constants.PicaDataType.UnsignedShort:
                DrawElementsType = DrawElementsType.UnsignedShort;
                ElementSize      = sizeof(short);
                break;

            case Constants.PicaDataType.UnsignedInt:
                DrawElementsType = DrawElementsType.UnsignedInt;
                ElementSize      = sizeof(int);
                break;
            }
        }
Ejemplo n.º 2
0
        public MatsChunk(byte[] data, int offset, BaseCTRChunk parent)
            : base(data, offset, parent)
        {
            MaterialCount = BitConverter.ToUInt32(ChunkData, 0x8);

            int matDataSize = (BaseCTRChunk.IsMajora3D ? Material.DataSize_MM : Material.DataSize_OoT);

            Materials = new Material[MaterialCount];
            for (int i = 0; i < Materials.Length; i++) Materials[i] = new Material(ChunkData, 0xC + (i * matDataSize));

            TextureEnvSettings = new TextureEnvSetting[MaterialCount];
            for (int i = 0; i < TextureEnvSettings.Length; i++) TextureEnvSettings[i] = new TextureEnvSetting(ChunkData, 0xC + (int)(MaterialCount * matDataSize) + (i * TextureEnvSetting.DataSize));
        }
Ejemplo n.º 3
0
        public TexChunk(byte[] data, int offset, BaseCTRChunk parent)
            : base(data, offset, parent)
        {
            TextureCount = BitConverter.ToUInt32(ChunkData, 0x8);

            Textures = new Texture[TextureCount];
            for (int i = 0; i < Textures.Length; i++)
            {
                Textures[i] = new Texture(ChunkData, 0xC + (i * 0x24));
            }

            AreTexturesLoaded = false;
        }
Ejemplo n.º 4
0
        public MshsChunk(byte[] data, int offset, BaseCTRChunk parent)
            : base(data, offset, parent)
        {
            MeshCount = BitConverter.ToUInt32(ChunkData, 0x8);
            Unknown1  = BitConverter.ToUInt16(ChunkData, 0x0C);
            Unknown2  = BitConverter.ToUInt16(ChunkData, 0x0E);

            int meshDataSize = (BaseCTRChunk.IsMajora3D ? Mesh.DataSize_MM : Mesh.DataSize_OoT);

            Meshes = new Mesh[MeshCount];
            for (int i = 0; i < Meshes.Length; i++)
            {
                Meshes[i] = new Mesh(ChunkData, 0x10 + (i * meshDataSize));
            }
        }
Ejemplo n.º 5
0
        public PrmsChunk(byte[] data, int offset, BaseCTRChunk parent)
            : base(data, offset, parent)
        {
            Unknown1        = BitConverter.ToUInt32(ChunkData, 0x8);
            SkinningMode    = (SkinningModes)BitConverter.ToUInt16(ChunkData, 0xC);
            BoneIndexCount  = BitConverter.ToUInt16(ChunkData, 0xE);
            BoneIndexOffset = BitConverter.ToUInt32(ChunkData, 0x10);
            PrmOffset       = BitConverter.ToUInt32(ChunkData, 0x14);

            BoneIndices = new ushort[BoneIndexCount];
            for (int i = 0; i < BoneIndices.Length; i++)
            {
                BoneIndices[i] = BitConverter.ToUInt16(ChunkData, (int)(BoneIndexOffset + (i * 2)));
            }

            PrmChunk = new PrmChunk(ChunkData, (int)PrmOffset, this);
        }
Ejemplo n.º 6
0
        public SklChunk(byte[] data, int offset, BaseCTRChunk parent)
            : base(data, offset, parent)
        {
            BoneCount = BitConverter.ToUInt32(ChunkData, 0x8);
            Unknown2  = BitConverter.ToUInt32(ChunkData, 0xC);

            Bones = new Bone[BoneCount];
            for (int i = 0; i < Bones.Length; i++)
            {
                Bones[i] = new Bone(ChunkData, 0x10 + (i * (BaseCTRChunk.IsMajora3D ? Bone.DataSize_MM : Bone.DataSize_OoT)));
            }

            foreach (Bone bone in Bones.Where(x => x.ParentBoneID != -1))
            {
                bone.ParentBone = Bones.FirstOrDefault(x => x.BoneID == bone.ParentBoneID);
            }
        }
Ejemplo n.º 7
0
        public ShpChunk(byte[] data, int offset, BaseCTRChunk parent)
            : base(data, offset, parent)
        {
            SepdCount = BitConverter.ToUInt32(ChunkData, 0x8);
            Unknown1  = BitConverter.ToUInt32(ChunkData, 0xC);

            SepdOffsets = new ushort[SepdCount];
            for (int i = 0; i < SepdOffsets.Length; i++)
            {
                SepdOffsets[i] = BitConverter.ToUInt16(ChunkData, 0x10 + (i * 2));
            }

            SepdChunks = new SepdChunk[SepdCount];
            for (int i = 0; i < SepdChunks.Length; i++)
            {
                SepdChunks[i] = new SepdChunk(ChunkData, SepdOffsets[i], this);
            }
        }
Ejemplo n.º 8
0
        public CsabChunk(byte[] data, int offset, BaseCTRChunk parent)
            : base(data, offset, parent)
        {
            Unknown08          = BitConverter.ToUInt32(ChunkData, 0x08);
            Unknown0C          = BitConverter.ToUInt32(ChunkData, 0x0C);
            NumberOfAnimations = BitConverter.ToUInt32(ChunkData, 0x10);

            AnimationOffsets = new uint[NumberOfAnimations];
            for (int i = 0; i < AnimationOffsets.Length; i++)
            {
                AnimationOffsets[i] = BitConverter.ToUInt32(ChunkData, 0x14 + (i * sizeof(uint)));
            }

            Animations = new Animation[NumberOfAnimations];
            for (int i = 0; i < Animations.Length; i++)
            {
                Animations[i] = new Animation(this, (int)AnimationOffsets[i]);
            }
        }
Ejemplo n.º 9
0
        public VatrChunk(byte[] data, int offset, BaseCTRChunk parent)
            : base(data, offset, parent)
        {
            MaxVertexIndexOrSomething = BitConverter.ToUInt32(ChunkData, 0x8);

            int arrayCount = (BaseCTRChunk.IsMajora3D ? 9 : 8);

            Sizes   = new uint[arrayCount];
            Offsets = new uint[arrayCount];
            Arrays  = new byte[arrayCount][];

            for (int i = 0; i < arrayCount; i++)
            {
                Sizes[i]   = BitConverter.ToUInt32(ChunkData, 0xC + (i * 8));
                Offsets[i] = BitConverter.ToUInt32(ChunkData, 0x10 + (i * 8));

                Arrays[i] = new byte[Sizes[i]];
                Buffer.BlockCopy(ChunkData, (int)Offsets[i], Arrays[i], 0, (int)Sizes[i]);
            }
        }
Ejemplo n.º 10
0
        public CmbChunk(byte[] data, int offset, BaseCTRChunk parent)
            : base(data, offset, parent)
        {
            FileSize        = BitConverter.ToUInt32(ChunkData, 0x4);
            NumberOfChunks  = BitConverter.ToUInt32(ChunkData, 0x8);
            Unknown2        = BitConverter.ToUInt32(ChunkData, 0xC);
            CmbName         = Encoding.ASCII.GetString(ChunkData, 0x10, 16).TrimEnd('\0');
            NumberOfIndices = BitConverter.ToUInt32(ChunkData, 0x20);

            BaseCTRChunk.IsMajora3D = (NumberOfChunks == 0x0A);

            if (!BaseCTRChunk.IsMajora3D)
            {
                SklChunk  = new SklChunk(ChunkData, (int)BitConverter.ToUInt32(ChunkData, SklChunkPointer_OoT), this);
                MatsChunk = new MatsChunk(ChunkData, (int)BitConverter.ToUInt32(ChunkData, MatsChunkPointer_OoT), this);
                TexChunk  = new TexChunk(ChunkData, (int)BitConverter.ToUInt32(ChunkData, TexChunkPointer_OoT), this);
                SklmChunk = new SklmChunk(ChunkData, (int)BitConverter.ToUInt32(ChunkData, SklmChunkPointer_OoT), this);
                VatrChunk = new VatrChunk(ChunkData, (int)BitConverter.ToUInt32(ChunkData, VatrChunkPointer_OoT), this);

                vtxIdxOffset  = (int)BitConverter.ToUInt32(ChunkData, VertexIndicesPointer_OoT);
                texDataOffset = (int)BitConverter.ToUInt32(ChunkData, TextureDataPointer_OoT);
            }
            else
            {
                SklChunk  = new SklChunk(ChunkData, (int)BitConverter.ToUInt32(ChunkData, SklChunkPointer_MM), this);
                MatsChunk = new MatsChunk(ChunkData, (int)BitConverter.ToUInt32(ChunkData, MatsChunkPointer_MM), this);
                TexChunk  = new TexChunk(ChunkData, (int)BitConverter.ToUInt32(ChunkData, TexChunkPointer_MM), this);
                SklmChunk = new SklmChunk(ChunkData, (int)BitConverter.ToUInt32(ChunkData, SklmChunkPointer_MM), this);
                VatrChunk = new VatrChunk(ChunkData, (int)BitConverter.ToUInt32(ChunkData, VatrChunkPointer_MM), this);

                vtxIdxOffset  = (int)BitConverter.ToUInt32(ChunkData, VertexIndicesPointer_MM);
                texDataOffset = (int)BitConverter.ToUInt32(ChunkData, TextureDataPointer_MM);
            }

            Indices = new byte[NumberOfIndices * sizeof(ushort)];
            Buffer.BlockCopy(ChunkData, vtxIdxOffset, Indices, 0, Indices.Length);

            TextureData = new byte[ChunkData.Length - texDataOffset];
            Buffer.BlockCopy(ChunkData, texDataOffset, TextureData, 0, TextureData.Length);

            /* For information purposes, tho inexact if (probably) one array type isn't used by sepd (or smth) */
            TotalPrimitives = 0;
            foreach (SepdChunk sepd in SklmChunk.ShpChunk.SepdChunks)
            {
                TotalPrimitives += sepd.TotalPrimitives;
            }

            TotalVertices = TotalTexCoords = TotalColors = TotalNormals = 0;
            for (int i = 0; i < SklmChunk.ShpChunk.SepdChunks.Length; i++)
            {
                if (i == SklmChunk.ShpChunk.SepdChunks.Length - 1)
                {
                    SepdChunk sepdCurrent = SklmChunk.ShpChunk.SepdChunks[i];

                    if (VatrChunk.Sizes[VatrChunk.VertexArray_OoT] != 0)
                    {
                        TotalVertices += (int)((VatrChunk.Sizes[VatrChunk.VertexArray_OoT] - sepdCurrent.VertexArrayOffset) / sepdCurrent.VertexSize);
                    }
                    if (VatrChunk.Sizes[VatrChunk.TextureCoordArray_OoT] != 0)
                    {
                        TotalTexCoords += (int)((VatrChunk.Sizes[VatrChunk.TextureCoordArray_OoT] - sepdCurrent.TextureCoordArrayOffset) / sepdCurrent.TexCoordSize);
                    }
                    if (VatrChunk.Sizes[VatrChunk.ColorArray_OoT] != 0)
                    {
                        TotalColors += (int)((VatrChunk.Sizes[VatrChunk.ColorArray_OoT] - sepdCurrent.ColorArrayOffset) / sepdCurrent.ColorSize);
                    }
                    if (VatrChunk.Sizes[VatrChunk.NormalArray_OoT] != 0)
                    {
                        TotalNormals += (int)((VatrChunk.Sizes[VatrChunk.NormalArray_OoT] - sepdCurrent.NormalArrayOffset) / sepdCurrent.NormalSize);
                    }
                }
                else
                {
                    SepdChunk sepdCurrent = SklmChunk.ShpChunk.SepdChunks[i];
                    SepdChunk sepdNext    = SklmChunk.ShpChunk.SepdChunks[i + 1];

                    if (VatrChunk.Sizes[VatrChunk.VertexArray_OoT] != 0)
                    {
                        TotalVertices += (int)((sepdNext.VertexArrayOffset - sepdCurrent.VertexArrayOffset) / sepdCurrent.VertexSize);
                    }
                    if (VatrChunk.Sizes[VatrChunk.TextureCoordArray_OoT] != 0)
                    {
                        TotalTexCoords += (int)((sepdNext.TextureCoordArrayOffset - sepdCurrent.TextureCoordArrayOffset) / sepdCurrent.TexCoordSize);
                    }
                    if (VatrChunk.Sizes[VatrChunk.ColorArray_OoT] != 0)
                    {
                        TotalColors += (int)((sepdNext.ColorArrayOffset - sepdCurrent.ColorArrayOffset) / sepdCurrent.ColorSize);
                    }
                    if (VatrChunk.Sizes[VatrChunk.NormalArray_OoT] != 0)
                    {
                        TotalNormals += (int)((sepdNext.NormalArrayOffset - sepdCurrent.NormalArrayOffset) / sepdCurrent.NormalSize);
                    }
                }
            }
        }
Ejemplo n.º 11
0
        public SepdChunk(byte[] data, int offset, BaseCTRChunk parent)
            : base(data, offset, parent)
        {
            PrmsCount      = BitConverter.ToUInt16(ChunkData, 0x08);
            Unknown0A      = BitConverter.ToUInt16(ChunkData, 0x0A);
            UnknownFloat0C = BitConverter.ToSingle(ChunkData, 0x0C);
            UnknownFloat10 = BitConverter.ToSingle(ChunkData, 0x10);
            UnknownFloat14 = BitConverter.ToSingle(ChunkData, 0x14);
            Unknown18      = BitConverter.ToUInt32(ChunkData, 0x18);
            Unknown1C      = BitConverter.ToUInt32(ChunkData, 0x1C);
            Unknown20      = BitConverter.ToUInt32(ChunkData, 0x20);

            int arrayCount = (BaseCTRChunk.IsMajora3D ? 9 : 8);

            ArrayOffsets   = new uint[arrayCount];
            ArrayScales    = new float[arrayCount];
            ArrayDataTypes = new Constants.PicaDataType[arrayCount];
            ArrayUnknown1  = new ushort[arrayCount];
            ArrayUnknown2  = new uint[arrayCount];
            ArrayUnknown3  = new uint[arrayCount];
            ArrayUnknown4  = new uint[arrayCount];
            ArrayUnknown5  = new uint[arrayCount];

            for (int i = 0; i < arrayCount; i++)
            {
                ArrayOffsets[i]   = BitConverter.ToUInt32(ChunkData, 0x24 + (i * 0x1C));
                ArrayScales[i]    = BitConverter.ToSingle(ChunkData, 0x28 + (i * 0x1C));
                ArrayDataTypes[i] = (Constants.PicaDataType)BitConverter.ToUInt16(ChunkData, 0x2C + (i * 0x1C));
                ArrayUnknown1[i]  = BitConverter.ToUInt16(ChunkData, 0x2E + (i * 0x1C));
                ArrayUnknown2[i]  = BitConverter.ToUInt32(ChunkData, 0x30 + (i * 0x1C));
                ArrayUnknown3[i]  = BitConverter.ToUInt32(ChunkData, 0x34 + (i * 0x1C));
                ArrayUnknown4[i]  = BitConverter.ToUInt32(ChunkData, 0x38 + (i * 0x1C));
                ArrayUnknown5[i]  = BitConverter.ToUInt32(ChunkData, 0x3C + (i * 0x1C));
            }

            Unknown_104OoT_120MM = BitConverter.ToUInt32(ChunkData, !BaseCTRChunk.IsMajora3D ? 0x104 : 0x120);

            int prmsDataOffset = (!BaseCTRChunk.IsMajora3D ? 0x108 : 0x124);

            PrmsChunks = new PrmsChunk[PrmsCount];
            for (int i = 0; i < PrmsChunks.Length; i++)
            {
                PrmsChunks[i] = new PrmsChunk(ChunkData, (int)BitConverter.ToUInt16(ChunkData, prmsDataOffset + (i * 2)), this);
            }

            switch (NormalArrayDataType)
            {
            case Constants.PicaDataType.Byte:
            case Constants.PicaDataType.UnsignedByte:
                NormalPointerType = NormalPointerType.Byte;
                NormalSize        = (sizeof(byte) * 3);
                break;

            case Constants.PicaDataType.Short:
            case Constants.PicaDataType.UnsignedShort:
                NormalPointerType = NormalPointerType.Short;
                NormalSize        = (sizeof(ushort) * 3);
                break;

            case Constants.PicaDataType.Int:
            case Constants.PicaDataType.UnsignedInt:
                NormalPointerType = NormalPointerType.Int;
                NormalSize        = (sizeof(uint) * 3);
                break;

            case Constants.PicaDataType.Float:
                NormalPointerType = NormalPointerType.Float;
                NormalSize        = (sizeof(float) * 3);
                break;
            }

            switch (ColorArrayDataType)
            {
            case Constants.PicaDataType.Byte:
                ColorPointerType = ColorPointerType.Byte;
                ColorSize        = (sizeof(sbyte) * 4);
                break;

            case Constants.PicaDataType.UnsignedByte:
                ColorPointerType = ColorPointerType.UnsignedByte;
                ColorSize        = (sizeof(byte) * 4);
                break;

            case Constants.PicaDataType.Short:
                ColorPointerType = ColorPointerType.Short;
                ColorSize        = (sizeof(short) * 4);
                break;

            case Constants.PicaDataType.UnsignedShort:
                ColorPointerType = ColorPointerType.UnsignedShort;
                ColorSize        = (sizeof(ushort) * 4);
                break;

            case Constants.PicaDataType.Int:
                ColorPointerType = ColorPointerType.Int;
                ColorSize        = (sizeof(int) * 4);
                break;

            case Constants.PicaDataType.UnsignedInt:
                ColorPointerType = ColorPointerType.UnsignedInt;
                ColorSize        = (sizeof(uint) * 4);
                break;

            case Constants.PicaDataType.Float:
                ColorPointerType = ColorPointerType.Float;
                ColorSize        = (sizeof(float) * 4);
                break;
            }

            switch (TextureCoordArrayDataType)
            {
            case Constants.PicaDataType.Byte:
            case Constants.PicaDataType.UnsignedByte:
                /* Needs conversion to short during rendering! */
                TexCoordPointerType = TexCoordPointerType.Short;
                TexCoordSize        = (sizeof(byte) * 2);
                break;

            case Constants.PicaDataType.Short:
            case Constants.PicaDataType.UnsignedShort:
                TexCoordPointerType = TexCoordPointerType.Short;
                TexCoordSize        = (sizeof(ushort) * 2);
                break;

            case Constants.PicaDataType.Int:
            case Constants.PicaDataType.UnsignedInt:
                TexCoordPointerType = TexCoordPointerType.Int;
                TexCoordSize        = (sizeof(uint) * 2);
                break;

            case Constants.PicaDataType.Float:
                TexCoordPointerType = TexCoordPointerType.Float;
                TexCoordSize        = (sizeof(float) * 2);
                break;
            }

            switch (VertexArrayDataType)
            {
            case Constants.PicaDataType.Byte:
            case Constants.PicaDataType.UnsignedByte:
                /* Needs conversion to short during rendering! */
                VertexPointerType = VertexPointerType.Short;
                VertexSize        = (sizeof(byte) * 3);
                break;

            case Constants.PicaDataType.Short:
            case Constants.PicaDataType.UnsignedShort:
                VertexPointerType = VertexPointerType.Short;
                VertexSize        = (sizeof(ushort) * 3);
                break;

            case Constants.PicaDataType.Int:
            case Constants.PicaDataType.UnsignedInt:
                VertexPointerType = VertexPointerType.Int;
                VertexSize        = (sizeof(uint) * 3);
                break;

            case Constants.PicaDataType.Float:
                VertexPointerType = VertexPointerType.Float;
                VertexSize        = (sizeof(float) * 3);
                break;
            }

            switch (BoneIndexLookupArrayDataType)
            {
            case Constants.PicaDataType.Byte:
            case Constants.PicaDataType.UnsignedByte:
                BoneIndexLookupSize = sizeof(byte);
                break;

            case Constants.PicaDataType.Short:
            case Constants.PicaDataType.UnsignedShort:
                BoneIndexLookupSize = sizeof(ushort);
                break;

            case Constants.PicaDataType.Int:
            case Constants.PicaDataType.UnsignedInt:
                BoneIndexLookupSize = sizeof(uint);
                break;

            case Constants.PicaDataType.Float:
                BoneIndexLookupSize = sizeof(float);
                break;
            }

            /* For information purposes */
            TotalPrimitives = 0;
            foreach (PrmsChunk prms in PrmsChunks)
            {
                TotalPrimitives += (prms.PrmChunk.NumberOfIndices / 3);
            }
        }
 public SklmChunk(byte[] data, int offset, BaseCTRChunk parent)
     : base(data, offset, parent)
 {
     MshsChunk = new MshsChunk(ChunkData, (int)BitConverter.ToUInt32(ChunkData, MshsChunkPointer), this);
     ShpChunk  = new ShpChunk(ChunkData, (int)BitConverter.ToUInt32(ChunkData, ShpChunkPointer), this);
 }