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; } }
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)); }
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; }
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)); } }
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); }
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); } }
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); } }
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]); } }
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]); } }
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); } } } }
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); }