コード例 #1
0
ファイル: SceneCDT.cs プロジェクト: YeeB3Warned/Delegate
            public DataSet(PakFile Pak, PakFile.PakTag Item)
            {
                var reader = Pak.Reader;

                var count = reader.ReadInt32();

                if (count == 0)
                {
                    return;
                }

                for (int i = 0; i < count; i++)
                {
                    unkS0.Add(new struct0(Pak, Item));
                }

                unk0 = reader.ReadInt32(); //total faces

                MinBound = new RealQuat(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());

                unkf0      = reader.ReadSingle();
                DataLength = reader.ReadInt32();

                reader.ReadBytes(DataLength); //unmapped
            }
コード例 #2
0
ファイル: Blocks.cs プロジェクト: YeeB3Warned/Delegate
        public BoundsBlock_1D01(EndianReader reader)
            : base(reader, 0x1D01)
        {
            DataCount = reader.ReadInt32();
            var min = new RealQuat(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
            var max = new RealQuat(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());

            Data.XBounds = new RealBounds(min.x, max.x);
            Data.YBounds = new RealBounds(min.y, max.y);
            Data.ZBounds = new RealBounds(min.z, max.z);
        }
コード例 #3
0
ファイル: Blocks.cs プロジェクト: YeeB3Warned/Delegate
        public VertexBlock_F100(EndianReader reader, bool loadMesh, int geomUnk01)
            : base(reader, 0xF100)
        {
            DataCount = reader.ReadInt32();
            Data      = new Vertex[DataCount];
            if (DataCount == 0)
            {
                return;
            }

            if (geomUnk01 != 134 && geomUnk01 != 142)
            {
                CentreX = reader.ReadInt16();
                CentreY = reader.ReadInt16();
                CentreZ = reader.ReadInt16();
                RadiusX = reader.ReadInt16();
                RadiusY = reader.ReadInt16();
                RadiusZ = reader.ReadInt16();
            }

            if (!loadMesh)
            {
                reader.SeekTo(EOBOffset);
            }
            else
            {
                for (int i = 0; i < DataCount; i++)
                {
                    Vertex v;

                    if (geomUnk01 == 134 || geomUnk01 == 142)
                    {
                        v = new Vertex()
                        {
                            FormatName = "S3D_World"
                        };
                        var data = new RealQuat(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
                        v.Values.Add(new VertexValue(data, VertexValue.ValueType.Float32_3, "position", 0));
                    }
                    else
                    {
                        v = new Vertex()
                        {
                            FormatName = "S3D_Compressed"
                        };
                        var data = new RealQuat(reader.ReadInt16(), reader.ReadInt16(), reader.ReadInt16(), reader.ReadInt16());
                        v.Values.Add(new VertexValue(data, VertexValue.ValueType.Int16_N4, "position", 0));
                    }
                    Data[i] = v;
                }
            }
        }
コード例 #4
0
                public Sprite(CacheBase Cache, int Address)
                {
                    EndianReader Reader = Cache.Reader;

                    Reader.SeekTo(Address);

                    SubmapIndex = Reader.ReadInt32();
                    Reader.ReadInt32();
                    Left     = Reader.ReadSingle();
                    Right    = Reader.ReadSingle();
                    Top      = Reader.ReadSingle();
                    Bottom   = Reader.ReadSingle();
                    RegPoint = new RealQuat(
                        Reader.ReadSingle(),
                        Reader.ReadSingle());
                }
コード例 #5
0
ファイル: Blocks.cs プロジェクト: YeeB3Warned/Delegate
 public Block_1A01(EndianReader reader, bool loadSkin, Vertex[] Vertices)
     : base(reader, 0x1A01)
 {
     if (!loadSkin)
     {
         reader.Skip(Vertices.Length * 4);
     }
     else
     {
         foreach (var v in Vertices)
         {
             var val = RealQuat.FromUByteN4(reader.ReadUInt32());
             v.Values.Add(new VertexValue(val, VertexValue.ValueType.UInt8_4, "blendweight", 0));
         }
     }
 }
コード例 #6
0
ファイル: Blocks.cs プロジェクト: YeeB3Warned/Delegate
        public Block_2002(EndianReader reader)
            : base(reader, 0x2002)
        {
            unk0 = reader.ReadInt32(); // ]
            unk1 = reader.ReadInt32(); // ] unknown purpose, often all 60
            unk2 = reader.ReadInt32(); // ]

            var min = new RealQuat(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
            var max = new RealQuat(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());

            Bounds = new RealBoundingBox()
            {
                XBounds = new RealBounds(min.x, max.x),
                YBounds = new RealBounds(min.y, max.y),
                ZBounds = new RealBounds(min.z, max.z),
            };
            unkPos0 = new RealQuat(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
        }
コード例 #7
0
ファイル: render_model.cs プロジェクト: YeeB3Warned/Delegate
            public Node(CacheBase Cache, int Address)
            {
                EndianReader Reader = Cache.Reader;

                Reader.SeekTo(Address);

                Name = Cache.Strings.GetItemByID(Reader.ReadInt16());
                Reader.ReadInt16();
                ParentIndex      = Reader.ReadInt16();
                FirstChildIndex  = Reader.ReadInt16();
                NextSiblingIndex = Reader.ReadInt16();
                Reader.ReadInt16();
                Position = new RealQuat(
                    Reader.ReadSingle(),
                    Reader.ReadSingle(),
                    Reader.ReadSingle());
                Rotation = new RealQuat(
                    Reader.ReadSingle(),
                    Reader.ReadSingle(),
                    Reader.ReadSingle(),
                    Reader.ReadSingle());

                TransformScale = Reader.ReadSingle();

                TransformMatrix = new Matrix();

                TransformMatrix.m11 = Reader.ReadSingle();
                TransformMatrix.m12 = Reader.ReadSingle();
                TransformMatrix.m13 = Reader.ReadSingle();

                TransformMatrix.m21 = Reader.ReadSingle();
                TransformMatrix.m22 = Reader.ReadSingle();
                TransformMatrix.m23 = Reader.ReadSingle();

                TransformMatrix.m31 = Reader.ReadSingle();
                TransformMatrix.m32 = Reader.ReadSingle();
                TransformMatrix.m33 = Reader.ReadSingle();

                TransformMatrix.m41 = Reader.ReadSingle();
                TransformMatrix.m42 = Reader.ReadSingle();
                TransformMatrix.m43 = Reader.ReadSingle();

                DistanceFromParent = Reader.ReadSingle();
            }
コード例 #8
0
ファイル: Blocks.cs プロジェクト: YeeB3Warned/Delegate
        public Block_3301(EndianReader reader, bool loadSkin, Vertex[] Vertices)
            : base(reader, 0x3301)
        {
            FirstNodeID = reader.ReadInt16();
            NodeCount   = reader.ReadInt16();

            if (!loadSkin)
            {
                reader.Skip(Vertices.Length * 4);
            }
            else
            {
                foreach (var v in Vertices)
                {
                    var val = RealQuat.FromUByte4(reader.ReadUInt32());
                    nodes.Add(val);
                    v.Values.Add(new VertexValue(val, VertexValue.ValueType.UInt8_4, "blendindices", 0));
                }
            }
        }
コード例 #9
0
                public Marker(CacheBase Cache, int Address)
                {
                    EndianReader Reader = Cache.Reader;

                    Reader.SeekTo(Address);

                    RegionIndex      = Reader.ReadByte();
                    PermutationIndex = Reader.ReadByte();
                    NodeIndex        = Reader.ReadByte();
                    Reader.ReadByte();
                    Position = new RealQuat(
                        Reader.ReadSingle(),
                        Reader.ReadSingle(),
                        Reader.ReadSingle());
                    Rotation = new RealQuat(
                        -Reader.ReadSingle(),
                        -Reader.ReadSingle(),
                        -Reader.ReadSingle(),
                        Reader.ReadSingle());
                }
コード例 #10
0
            public Node(CacheBase Cache, int Address)
            {
                EndianReader Reader = Cache.Reader;

                Reader.SeekTo(Address);

                Name             = Reader.ReadNullTerminatedString(32);
                NextSiblingIndex = Reader.ReadInt16();
                FirstChildIndex  = Reader.ReadInt16();
                ParentIndex      = Reader.ReadInt16();
                Reader.ReadInt16();
                Position = new RealQuat(
                    Reader.ReadSingle(),
                    Reader.ReadSingle(),
                    Reader.ReadSingle());
                Rotation = new RealQuat(
                    -Reader.ReadSingle(),
                    -Reader.ReadSingle(),
                    -Reader.ReadSingle(),
                    Reader.ReadSingle());

                DistanceFromParent = Reader.ReadSingle();
            }
コード例 #11
0
ファイル: SceneData.cs プロジェクト: YeeB3Warned/Delegate
        public SceneData(PakFile Pak, PakFile.PakTag Item)
        {
            var reader = Pak.Reader;

            reader.EndianType = EndianFormat.LittleEndian;
            reader.SeekTo(Item.Offset);

            unmapped0 = reader.ReadBytes(16);
            x0700     = reader.ReadInt16(); //0700
            xADDE     = reader.ReadInt16(); //ADDE

            var min = new RealQuat(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
            var max = new RealQuat(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());

            unkBounds = new RealBoundingBox()
            {
                XBounds = new RealBounds(min.x, max.x),
                YBounds = new RealBounds(min.y, max.y),
                ZBounds = new RealBounds(min.z, max.z),
            };

            var count = reader.ReadInt32(); //always bsp object count + 1

            indices = new List <int>();
            for (int i = 0; i < count; i++)
            {
                indices.Add(reader.ReadInt32()); //last value is always struct0 count
            }
            count = reader.ReadInt32();
            unkS0 = new List <struct0>();
            for (int i = 0; i < count; i++)
            {
                unkS0.Add(new struct0(Pak, Item));
            }

            unmapped1 = reader.ReadBytes(13); //always the same
        }
コード例 #12
0
ファイル: Blocks.cs プロジェクト: YeeB3Warned/Delegate
        public RealQuat Data; //assumed rotation

        public Block_FB02(EndianReader reader)
            : base(reader, 0xFB02)
        {
            Data = new RealQuat(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
        }
コード例 #13
0
ファイル: Template.cs プロジェクト: YeeB3Warned/Delegate
        public Template(PakFile Pak, PakFile.PakTag Item, bool loadMesh)
        {
            var reader = Pak.Reader;

            reader.EndianType   = EndianFormat.LittleEndian;
            reader.StreamOrigin = Item.Offset;
            reader.SeekTo(0);

            reader.ReadInt16(); //E402
            reader.ReadInt32(); //filesize (EOB offset?)

            #region Block E502
            reader.ReadInt16(); //E502
            reader.ReadInt32(); //EOB offset
            reader.ReadInt32(); //LPTA (probs part of the string)
            Name = reader.ReadNullTerminatedString();
            reader.ReadByte();  //00
            #endregion

            #region Block 1603
            reader.ReadInt16();  //1603
            reader.ReadInt32();  //EOB offset
            reader.ReadBytes(3); //02 01 01
            #endregion

            #region Block 5501
            reader.ReadInt16(); //5501
            reader.ReadInt32(); //address

            int count = reader.ReadInt32();
            Materials = new List <MatRefBlock_5601>();
            for (int i = 0; i < count; i++)
            {
                Materials.Add(new MatRefBlock_5601(reader));
            }
            #endregion

            reader.ReadInt16(); //0100
            reader.ReadInt32(); //address

            #region Block F000
            xF000 = reader.ReadInt16();
            reader.ReadInt32(); //EOB offset
            x2C01 = reader.ReadInt16();
            reader.ReadInt32(); //EOB offset

            count   = reader.ReadInt32();
            Objects = new List <Node>();
            for (int i = 0; i < count; i++)
            {
                Objects.Add(new Node(reader, loadMesh));
            }

            foreach (var obj in Objects)
            {
                if (obj.isInheritor)
                {
                    Objects[obj._2901.InheritID].isInherited = true;
                }
            }
            #endregion

            reader.ReadInt16(); //0100
            reader.ReadInt32(); //address

            #region Block E802
            reader.ReadInt16(); //E802
            reader.ReadInt32(); //address

            count = reader.ReadInt32();
            for (int i = 0; i < count; i++)
            {
                Bones.Add(new BoneBlock_E902(reader));
            }
            #endregion

            //havent mapped this block, assumed anim/sound related
            _E602 = new unkBlock_XXXX(reader, 0xE602);

            reader.ReadInt16(); //0100
            reader.ReadInt32(); //address

            if (reader.PeekUInt16() == 0xBA01)
            {
                unkStrBlk = new StringBlock_BA01(reader);
            }

            //contains data count, havent seen used
            _1D02 = new unkBlock_XXXX(reader, 0x1D02);

            //int16 count, [int16, int16] * count
            if (reader.PeekUInt16() == 0x1103)
            {
                _1103 = new unkBlock_XXXX(reader, 0x1103);
            }

            //contains null term string, used on IGA models
            _0403 = new unkBlock_XXXX(reader, 0x0403);

            if (reader.PeekUInt16() == 0x0503)
            {
                _0503 = new Block_0503(reader);
            }

            #region Block 0803
            reader.ReadInt16(); //0803
            reader.ReadInt32(); //address to end of bounds values
            reader.ReadInt32(); //bounds count?
            var min = new RealQuat(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
            var max = new RealQuat(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());

            RenderBounds         = new RealBoundingBox();
            RenderBounds.XBounds = new RealBounds(min.x, max.x);
            RenderBounds.YBounds = new RealBounds(min.y, max.y);
            RenderBounds.ZBounds = new RealBounds(min.z, max.z);
            #endregion

            _0E03 = new Block_0E03(reader);

            //contains length prefixed string
            if (reader.PeekUInt16() == 0x1203)
            {
                _1203 = new unkBlock_XXXX(reader, 0x1203);
            }

            reader.ReadInt16(); //0100
            reader.ReadInt32(); //address to EOF

            reader.StreamOrigin = 0;
        }
コード例 #14
0
ファイル: render_model.cs プロジェクト: YeeB3Warned/Delegate
        public override void LoadRaw()
        {
            if (RawLoaded)
            {
                return;
            }

            for (int i = 0; i < ModelSections.Count; i++)
            {
                var section = (Halo2Xbox.render_model.ModelSection)ModelSections[i];
                var data    = cache.GetRawFromID(section.rawOffset, section.rawSize);
                var ms      = new MemoryStream(data);
                var reader  = new EndianReader(ms, Endian.EndianFormat.LittleEndian);

                #region Read Submeshes
                for (int j = 0; j < section.rSize[0] / 72; j++)
                {
                    var mesh = new ModelSection.Submesh();
                    reader.SeekTo(section.hSize + section.rOffset[0] + j * 72 + 4);
                    mesh.ShaderIndex = reader.ReadUInt16();
                    mesh.FaceIndex   = reader.ReadUInt16();
                    mesh.FaceCount   = reader.ReadUInt16();
                    section.Submeshes.Add(mesh);
                }
                #endregion

                reader.SeekTo(40);
                section.Indices  = new int[reader.ReadUInt16()];
                section.Vertices = new Vertex[section.vertcount];

                var facetype = 5;
                if (section.facecount * 3 == section.Indices.Length)
                {
                    facetype = 3;
                }
                IndexInfoList.Add(new IndexBufferInfo()
                {
                    FaceFormat = facetype
                });
                VertInfoList.Add(new VertexBufferInfo()
                {
                    VertexCount = section.vertcount
                });

                #region Get Resource Indices
                int iIndex = 0, vIndex = 0, uIndex = 0, nIndex = 0, bIndex = 0;

                for (int j = 0; j < section.rType.Length; j++)
                {
                    switch (section.rType[j] & 0x0000FFFF)
                    {
                    case 32: iIndex = j;
                        break;

                    case 56:
                        switch ((section.rType[j] & 0xFFFF0000) >> 16)
                        {
                        case 0: vIndex = j;
                            break;

                        case 1: uIndex = j;
                            break;

                        case 2: nIndex = j;
                            break;
                        }
                        break;

                    case 100: bIndex = j;
                        break;
                    }
                }
                #endregion

                reader.SeekTo(108);
                int   bCount = reader.ReadUInt16();
                int[] bArr   = new int[bCount];
                if (bCount > 0)
                {
                    reader.SeekTo(section.hSize + section.rOffset[bIndex]);
                    for (int j = 0; j < bCount; j++)
                    {
                        bArr[j] = reader.ReadByte();
                    }
                }

                #region Read Vertices
                for (int j = 0; j < section.vertcount; j++)
                {
                    reader.SeekTo(section.hSize + section.rOffset[vIndex] + ((section.rSize[vIndex] / section.vertcount) * j));
                    var v = new Vertex()
                    {
                        FormatName = ""
                    };
                    var p = new RealQuat(
                        ((float)reader.ReadInt16() + (float)0x7FFF) / (float)0xFFFF,
                        ((float)reader.ReadInt16() + (float)0x7FFF) / (float)0xFFFF,
                        ((float)reader.ReadInt16() + (float)0x7FFF) / (float)0xFFFF, 0);

                    v.Values.Add(new VertexValue(p, 0, "position", 0));

                    var b = new RealQuat();
                    var w = new RealQuat();

                    switch (section.type)
                    {
                    case 1:
                        switch (section.bones)
                        {
                        case 0:
                            section.NodeIndex = 0;
                            break;

                        case 1:
                            section.NodeIndex = (bCount > 0) ? bArr[0] : 0;
                            break;
                        }
                        section.Vertices[j] = v;
                        continue;

                    case 2:
                        switch (section.bones)
                        {
                        case 1:
                            b = new RealQuat(reader.ReadByte(), reader.ReadByte(), 0, 0);
                            w = new RealQuat(1, 0, 0, 0);
                            break;
                        }
                        break;

                    case 3:
                        switch (section.bones)
                        {
                        case 2:
                            reader.ReadInt16();
                            b = new RealQuat(reader.ReadByte(), reader.ReadByte(), 0, 0);
                            w = new RealQuat((float)reader.ReadByte() / 255f, (float)reader.ReadByte() / 255f, 0, 0);
                            break;

                        case 3:
                            b = new RealQuat(reader.ReadByte(), reader.ReadByte(), reader.ReadByte(), 0);
                            w = new RealQuat((float)reader.ReadByte() / 255f, (float)reader.ReadByte() / 255f, (float)reader.ReadByte() / 255f, 0);
                            break;

                        case 4:
                            reader.ReadInt16();
                            b = new RealQuat(reader.ReadByte(), reader.ReadByte(), reader.ReadByte(), reader.ReadByte());
                            w = new RealQuat((float)reader.ReadByte() / 255f, (float)reader.ReadByte() / 255f, (float)reader.ReadByte() / 255f, (float)reader.ReadByte() / 255f);
                            break;
                        }
                        break;
                    }

                    if (bCount > 0)
                    {
                        b.a = (w.a == 0) ? 0 : bArr[(int)b.a];
                        b.b = (w.b == 0) ? 0 : bArr[(int)b.b];
                        b.c = (w.c == 0) ? 0 : bArr[(int)b.c];
                        b.d = (w.d == 0) ? 0 : bArr[(int)b.d];
                    }

                    v.Values.Add(new VertexValue(b, 0, "blendindices", 0));
                    v.Values.Add(new VertexValue(w, 0, "blendweight", 0));

                    section.Vertices[j] = v;
                }
                #endregion

                #region Read UVs and Normals
                for (int j = 0; j < section.vertcount; j++)
                {
                    reader.SeekTo(section.hSize + section.rOffset[uIndex] + (4 * j));
                    var v  = section.Vertices[j];
                    var uv = new RealQuat(((float)reader.ReadInt16() + (float)0x7FFF) / (float)0xFFFF, ((float)reader.ReadInt16() + (float)0x7FFF) / (float)0xFFFF);
                    v.Values.Add(new VertexValue(uv, 0, "texcoords", 0));
                }

                for (int j = 0; j < section.vertcount; j++)
                {
                    reader.SeekTo(section.hSize + section.rOffset[nIndex] + (12 * j));
                    var v = section.Vertices[j];
                    var n = RealQuat.FromHenDN3(reader.ReadUInt32());
                    v.Values.Add(new VertexValue(n, 0, "normal", 0));
                }
                #endregion

                ModelFunctions.DecompressVertex(ref section.Vertices, BoundingBoxes[0]);

                reader.SeekTo(section.hSize + section.rOffset[iIndex]);
                for (int j = 0; j < section.Indices.Length; j++)
                {
                    section.Indices[j] = reader.ReadUInt16();
                }
            }

            RawLoaded = true;
        }
コード例 #15
0
        public override void Reload(int ParentAddress)
        {
            foreach (Control c in this.Controls)
            {
                c.Visible = true;
            }

            var reader = cache.Reader;

            int offset;

            try { offset = int.Parse(value.Node.Attributes["offset"].Value); }
            catch { offset = Convert.ToInt32(value.Node.Attributes["offset"].Value, 16); }

            reader.SeekTo(ParentAddress + offset);

            switch (value.Type)
            {
            case iValue.ValueType.ShortBounds:
                var sbounds = new RealBounds(reader.ReadInt16(), reader.ReadInt16());

                lblA.Text = "";
                txtA.Text = sbounds.Min.ToString();
                lblB.Text = "to";
                txtB.Text = sbounds.Max.ToString();

                lblC.Visible = txtC.Visible = lblD.Visible = txtD.Visible = btnColour.Visible = false;

                lblDesc.Visible = true;
                break;

            case iValue.ValueType.RealBounds:
                var rbounds = new RealBounds(reader.ReadSingle(), reader.ReadSingle());

                lblA.Text = "";
                txtA.Text = rbounds.Min.ToString();
                lblB.Text = "to";
                txtB.Text = rbounds.Max.ToString();

                lblC.Visible = txtC.Visible = lblD.Visible = txtD.Visible = btnColour.Visible = false;

                lblDesc.Visible = true;
                break;

            case iValue.ValueType.ShortPoint2D:
                var sp2 = new RealQuat(reader.ReadInt16(), reader.ReadInt16());

                lblA.Text = "x";
                txtA.Text = sp2.x.ToString();
                lblB.Text = "y";
                txtB.Text = sp2.y.ToString();

                lblC.Visible = txtC.Visible = lblD.Visible = txtD.Visible = btnColour.Visible = false;
                break;

            case iValue.ValueType.RealPoint2D:
                var p2 = new RealQuat(reader.ReadSingle(), reader.ReadSingle());

                lblA.Text = "x";
                txtA.Text = p2.x.ToString();
                lblB.Text = "y";
                txtB.Text = p2.y.ToString();

                lblC.Visible = txtC.Visible = lblD.Visible = txtD.Visible = btnColour.Visible = false;
                break;

            case iValue.ValueType.RealPoint3D:
                var p3 = new RealQuat(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());

                lblA.Text = "x";
                txtA.Text = p3.x.ToString();
                lblB.Text = "y";
                txtB.Text = p3.y.ToString();
                lblC.Text = "z";
                txtC.Text = p3.z.ToString();

                lblD.Visible = txtD.Visible = btnColour.Visible = false;
                break;

            case iValue.ValueType.RealPoint4D:
                var p4 = new RealQuat(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());

                lblA.Text = "x";
                txtA.Text = p4.x.ToString();
                lblB.Text = "y";
                txtB.Text = p4.y.ToString();
                lblC.Text = "z";
                txtC.Text = p4.z.ToString();
                lblD.Text = "w";
                txtD.Text = p4.w.ToString();

                btnColour.Visible = false;
                break;

            case iValue.ValueType.RealVector2D:
                var v2 = new RealQuat(reader.ReadSingle(), reader.ReadSingle());

                lblA.Text = "i";
                txtA.Text = v2.i.ToString();
                lblB.Text = "j";
                txtB.Text = v2.j.ToString();

                lblC.Visible = txtC.Visible = lblD.Visible = txtD.Visible = btnColour.Visible = false;
                break;

            case iValue.ValueType.RealVector3D:
                var v3 = new RealQuat(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());

                lblA.Text = "i";
                txtA.Text = v3.i.ToString();
                lblB.Text = "j";
                txtB.Text = v3.j.ToString();
                lblC.Text = "k";
                txtC.Text = v3.k.ToString();

                lblD.Visible = txtD.Visible = btnColour.Visible = false;
                break;

            case iValue.ValueType.RealVector4D:
                var v4 = new RealQuat(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());

                lblA.Text = "i";
                txtA.Text = v4.i.ToString();
                lblB.Text = "j";
                txtB.Text = v4.j.ToString();
                lblC.Text = "k";
                txtC.Text = v4.k.ToString();
                lblD.Text = "w";
                txtD.Text = v4.w.ToString();

                btnColour.Visible = false;
                break;

            case iValue.ValueType.Colour32RGB:
                var c1 = Color.FromArgb((int)(255 * reader.ReadSingle()), (int)(255 * reader.ReadSingle()), (int)(255 * reader.ReadSingle()));

                lblA.Text = "r";
                txtA.Text = ((float)c1.R / 255).ToString();
                lblB.Text = "g";
                txtB.Text = ((float)c1.G / 255).ToString();
                lblC.Text = "b";
                txtC.Text = ((float)c1.B / 255).ToString();

                lblD.Visible = txtD.Visible = false;

                btnColour.BackColor = c1;
                break;

            case iValue.ValueType.Colour32ARGB:
                var c2 = Color.FromArgb((int)(255 * reader.ReadSingle()), (int)(255 * reader.ReadSingle()), (int)(255 * reader.ReadSingle()), (int)(255 * reader.ReadSingle()));

                lblA.Text = "a";
                txtA.Text = ((float)c2.A / 255).ToString();
                lblB.Text = "r";
                txtB.Text = ((float)c2.R / 255).ToString();
                lblC.Text = "g";
                txtC.Text = ((float)c2.G / 255).ToString();
                lblD.Text = "b";
                txtD.Text = ((float)c2.B / 255).ToString();

                btnColour.BackColor = c2;
                break;

            default:
                throw new InvalidOperationException("Cannot load " + value.Type.ToString() + " values using mMultiValue.");
            }
        }
コード例 #16
0
        public override void LoadRaw()
        {
            if (RawLoaded)
            {
                return;
            }

            #region Clusters
            for (int i = 0; i < Clusters.Count; i++)
            {
                var section = (Halo2Xbox.scenario_structure_bsp.ModelSection)ModelSections[i];

                if (section.rSize.Length == 0 || section.vertcount == 0)
                {
                    IndexInfoList.Add(new mode.IndexBufferInfo());
                    continue;
                }

                var data   = cache.GetRawFromID(section.rawOffset, section.rawSize);
                var ms     = new MemoryStream(data);
                var reader = new EndianReader(ms, Endian.EndianFormat.LittleEndian);

                #region Read Submeshes
                for (int j = 0; j < section.rSize[0] / 72; j++)
                {
                    var mesh = new mode.ModelSection.Submesh();
                    reader.SeekTo(section.hSize + section.rOffset[0] + j * 72 + 4);
                    mesh.ShaderIndex = reader.ReadUInt16();
                    mesh.FaceIndex   = reader.ReadUInt16();
                    mesh.FaceCount   = reader.ReadUInt16();
                    section.Submeshes.Add(mesh);
                }
                #endregion

                #region Get Resource Indices
                int iIndex = 0, vIndex = 0, uIndex = 0, nIndex = 0, bIndex = 0;

                for (int j = 0; j < section.rType.Length; j++)
                {
                    switch (section.rType[j] & 0x0000FFFF)
                    {
                    case 32: iIndex = j;
                        break;

                    case 56:
                        switch ((section.rType[j] & 0xFFFF0000) >> 16)
                        {
                        case 0: vIndex = j;
                            break;

                        case 1: uIndex = j;
                            break;

                        case 2: nIndex = j;
                            break;
                        }
                        break;

                    case 100: bIndex = j;
                        break;
                    }
                }
                #endregion

                section.Vertices = new Vertex[section.vertcount];
                for (int j = 0; j < section.vertcount; j++)
                {
                    reader.SeekTo(section.hSize + section.rOffset[vIndex] + ((section.rSize[vIndex] / section.vertcount) * j));
                    var v = new Vertex();
                    var p = new RealQuat(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());

                    v.Values.Add(new VertexValue(p, 0, "position", 0));
                    section.Vertices[j] = v;
                }

                #region Read UVs and Normals
                for (int j = 0; j < section.vertcount; j++)
                {
                    reader.SeekTo(section.hSize + section.rOffset[uIndex] + (8 * j));
                    var v  = section.Vertices[j];
                    var uv = new RealQuat(reader.ReadSingle(), 1 - reader.ReadSingle());
                    v.Values.Add(new VertexValue(uv, 0, "texcoords", 0));
                }

                for (int j = 0; j < section.vertcount; j++)
                {
                    reader.SeekTo(section.hSize + section.rOffset[uIndex + 1] + (12 * j));
                    var v = section.Vertices[j];
                    var n = RealQuat.FromHenDN3(reader.ReadUInt32());
                    v.Values.Add(new VertexValue(n, 0, "normal", 0));
                }
                #endregion

                reader.SeekTo(40);
                section.Indices = new int[reader.ReadUInt16()];
                reader.SeekTo(section.hSize + section.rOffset[iIndex]);
                for (int j = 0; j < section.Indices.Length; j++)
                {
                    section.Indices[j] = reader.ReadUInt16();
                }

                var facetype = 5;
                if (section.facecount * 3 == section.Indices.Length)
                {
                    facetype = 3;
                }
                IndexInfoList.Add(new mode.IndexBufferInfo()
                {
                    FaceFormat = facetype
                });
            }
            #endregion

            #region Instances
            if (GeomInstances.Count == 0)
            {
                RawLoaded = true; return;
            }
            for (int i = GeomInstances[0].SectionIndex; i < ModelSections.Count; i++)
            {
                var section   = (Halo2Xbox.scenario_structure_bsp.ModelSection)ModelSections[i];
                var geomIndex = i - Clusters.Count;

                if (section.rSize.Length == 0 || section.vertcount == 0)
                {
                    IndexInfoList.Add(new mode.IndexBufferInfo());
                    continue;
                }

                var data   = cache.GetRawFromID(section.rawOffset, section.rawSize);
                var ms     = new MemoryStream(data);
                var reader = new EndianReader(ms, Endian.EndianFormat.LittleEndian);

                #region Read Submeshes
                for (int j = 0; j < section.rSize[0] / 72; j++)
                {
                    var mesh = new mode.ModelSection.Submesh();
                    reader.SeekTo(section.hSize + section.rOffset[0] + j * 72 + 4);
                    mesh.ShaderIndex = reader.ReadUInt16();
                    mesh.FaceIndex   = reader.ReadUInt16();
                    mesh.FaceCount   = reader.ReadUInt16();
                    section.Submeshes.Add(mesh);
                }
                #endregion

                #region Get Resource Indices
                int iIndex = 0, vIndex = 0, uIndex = 0, nIndex = 0, bIndex = 0;

                for (int j = 0; j < section.rType.Length; j++)
                {
                    switch (section.rType[j] & 0x0000FFFF)
                    {
                    case 32: iIndex = j;
                        break;

                    case 56:
                        switch ((section.rType[j] & 0xFFFF0000) >> 16)
                        {
                        case 0: vIndex = j;
                            break;

                        case 1: uIndex = j;
                            break;

                        case 2: nIndex = j;
                            break;
                        }
                        break;

                    case 100: bIndex = j;
                        break;
                    }
                }
                #endregion

                section.Vertices = new Vertex[section.vertcount];
                for (int j = 0; j < section.vertcount; j++)
                {
                    reader.SeekTo(section.hSize + section.rOffset[vIndex] + ((section.rSize[vIndex] / section.vertcount) * j));
                    var v = new Vertex();
                    var p = new RealQuat(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());

                    v.Values.Add(new VertexValue(p, 0, "position", 0));
                    section.Vertices[j] = v;
                }

                #region Read UVs and Normals
                for (int j = 0; j < section.vertcount; j++)
                {
                    reader.SeekTo(section.hSize + section.rOffset[uIndex] + (8 * j));
                    var v  = section.Vertices[j];
                    var uv = new RealQuat(reader.ReadSingle(), 1 - reader.ReadSingle());
                    v.Values.Add(new VertexValue(uv, 0, "texcoords", 0));
                    //DecompressVertex(ref v, BoundingBoxes[geomIndex]);
                }

                for (int j = 0; j < section.vertcount; j++)
                {
                    reader.SeekTo(section.hSize + section.rOffset[nIndex] + (12 * j));
                    var v = section.Vertices[j];
                    var n = RealQuat.FromHenDN3(reader.ReadUInt32());
                    v.Values.Add(new VertexValue(n, 0, "normal", 0));
                }
                #endregion

                reader.SeekTo(40);
                section.Indices = new int[reader.ReadUInt16()];
                reader.SeekTo(section.hSize + section.rOffset[iIndex]);
                for (int j = 0; j < section.Indices.Length; j++)
                {
                    section.Indices[j] = reader.ReadUInt16();
                }

                var facetype = 5;
                if (section.facecount * 3 == section.Indices.Length)
                {
                    facetype = 3;
                }
                IndexInfoList.Add(new mode.IndexBufferInfo()
                {
                    FaceFormat = facetype
                });
            }
            #endregion

            RawLoaded = true;
        }
コード例 #17
0
ファイル: Blocks.cs プロジェクト: YeeB3Warned/Delegate
        public UVDataBlock_3001(EndianReader reader, bool loadMesh, Vertex[] Vertices)
            : base(reader, 0x3001)
        {
            DataCount = reader.ReadInt32();         //vCount

            x2E00             = reader.ReadInt16(); //2E00
            reader.EndianType = EndianFormat.BigEndian;

            unkUV0   = reader.ReadInt16(); //flags? 0x1C00 when world
            unkUV1   = reader.ReadByte();
            unkUV2   = reader.ReadByte();
            unkUV3   = reader.ReadByte();
            unkUV4   = reader.ReadByte(); //0x00 when world, else 0x20
            DataSize = reader.ReadByte();

            if (!loadMesh)
            {
                reader.SeekTo(EOBOffset);
            }
            else
            {
                for (int i = 0; i < DataCount; i++)
                {
                    RealQuat tex0 = new RealQuat();

                    #region switch
                    switch (DataSize)
                    {
                    case 8:
                        tex0 = RealQuat.FromUByteN4(reader.ReadUInt32());
                        reader.Skip(0);
                        break;

                    case 12:
                        reader.Skip(4);
                        break;

                    case 16:
                        reader.Skip(12);
                        break;

                    case 20:
                        reader.Skip(16);
                        break;

                    case 24:
                        reader.Skip(16);
                        break;

                    case 28:
                        reader.Skip(20);
                        break;

                    case 32:
                        reader.Skip(16);
                        break;

                    case 36:
                        reader.Skip(24);
                        break;

                    case 44:
                        reader.Skip(28);
                        break;
                    }
                    #endregion

                    int u = reader.ReadInt16();
                    int v = reader.ReadInt16();

                    //var tex0 = new RealQuat(((float)a + (float)0) / (float)0xFFFF, ((float)b + (float)0) / (float)0xFFFF);
                    var tex1 = new RealQuat((float)u / (float)(0x7FFF), (float)v / (float)(0x7FFF));

                    #region switch
                    switch (DataSize)
                    {
                    case 8:
                        reader.Skip(0);
                        break;

                    case 12:
                        reader.Skip(4);
                        break;

                    case 16:
                        reader.Skip(0);
                        break;

                    case 20:
                        reader.Skip(0);
                        break;

                    case 24:
                        reader.Skip(4);
                        break;

                    case 28:
                        reader.Skip(4);
                        break;

                    case 32:
                        reader.Skip(12);
                        break;

                    case 36:
                        reader.Skip(8);
                        break;

                    case 44:
                        reader.Skip(12);
                        break;
                    }
                    #endregion

                    //Vertices[i].Values.Add(new VertexValue(tex0, 0, "normal", 0));
                    Vertices[i].Values.Add(new VertexValue(tex1, VertexValue.ValueType.Int16_N2, "texcoords", 0));
                }
            }

            reader.EndianType = EndianFormat.LittleEndian;
        }
コード例 #18
0
        public override void LoadRaw()
        {
            if (RawLoaded)
            {
                return;
            }

            var reader = cache.Reader;

            #region Read Indices
            int[] indices = new int[indexCount];
            reader.SeekTo(indexOffset);
            for (int i = 0; i < indexCount; i++)
            {
                indices[i] = reader.ReadUInt16();
            }
            #endregion

            for (int i = 0; i < ModelSections.Count; i++)
            {
                var section   = ModelSections[i];
                var tempVerts = new List <Vertex>();

                if (section.Submeshes.Count == 0)
                {
                    continue;
                }

                #region Read Vertices
                for (int j = 0; j < section.Submeshes.Count; j++)
                {
                    var mesh = (Lightmap.Material)section.Submeshes[j];

                    reader.SeekTo(mesh.vertsOffset);
                    for (int k = 0; k < mesh.VertexCount; k++)
                    {
                        var v = new Vertex()
                        {
                            FormatName = "Halo1PC_World"
                        };
                        var position = new RealQuat(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
                        var normal   = new RealQuat(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
                        var binormal = new RealQuat(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
                        var tangent  = new RealQuat(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
                        var texcoord = new RealQuat(reader.ReadSingle(), 1f - reader.ReadSingle());

                        v.Values.Add(new VertexValue(position, VertexValue.ValueType.Float32_3, "position", 0));
                        v.Values.Add(new VertexValue(normal, VertexValue.ValueType.Float32_3, "normal", 0));
                        v.Values.Add(new VertexValue(binormal, VertexValue.ValueType.Float32_3, "binormal", 0));
                        v.Values.Add(new VertexValue(tangent, VertexValue.ValueType.Float32_3, "tangent", 0));
                        v.Values.Add(new VertexValue(texcoord, VertexValue.ValueType.Float32_2, "texcoords", 0));

                        tempVerts.Add(v);
                    }
                }
                #endregion

                #region Copy & Translate Indices
                int offset = section.Submeshes[0].FaceIndex;
                section.Indices = new int[section.TotalFaceCount];
                Array.Copy(indices, offset, section.Indices, 0, section.TotalFaceCount);
                section.Vertices = tempVerts.ToArray();

                int pos = 0;
                for (int j = 0; j < section.Submeshes.Count; j++)
                {
                    var mesh = section.Submeshes[j];
                    mesh.FaceIndex -= offset;

                    for (int k = 0; k < mesh.FaceCount; k++)
                    {
                        section.Indices[k + mesh.FaceIndex] += pos;
                    }

                    Array.Reverse(section.Indices, mesh.FaceIndex, mesh.FaceCount);
                    pos += mesh.VertexCount;
                }
                #endregion

                IndexInfoList.Add(new mode.IndexBufferInfo()
                {
                    FaceFormat = 3
                });
                VertInfoList.Add(new mode.VertexBufferInfo()
                {
                    VertexCount = section.TotalVertexCount
                });
            }

            RawLoaded = true;
        }
コード例 #19
0
        public override void LoadRaw()
        {
            if (RawLoaded)
            {
                return;
            }

            var bb     = BoundingBoxes[0];
            var IH     = (Halo1PC.CacheFile.CacheIndexHeader)cache.IndexHeader;
            var reader = cache.Reader;

            for (int i = 0; i < ModelSections.Count; i++)
            {
                var section = ModelSections[i];

                List <int>    tIndices  = new List <int>();
                List <Vertex> tVertices = new List <Vertex>();

                for (int j = 0; j < section.Submeshes.Count; j++)
                {
                    var submesh = (Halo1PC.gbxmodel.ModelSection.Submesh)section.Submeshes[j];

                    #region Read Indices
                    submesh.FaceIndex = tIndices.Count;
                    var strip = new List <int>();

                    reader.SeekTo(submesh.FaceOffset + IH.vertDataOffset + IH.indexDataOffset);
                    for (int k = 0; k < submesh.FaceCount; k++)
                    {
                        strip.Add(reader.ReadUInt16() + tVertices.Count);
                    }

                    strip = ModelFunctions.GetTriangleList(strip.ToArray(), 0, strip.Count, 5);
                    strip.Reverse();
                    submesh.FaceCount = strip.Count;
                    tIndices.AddRange(strip);
                    #endregion

                    #region Read Vertices
                    reader.SeekTo(submesh.VertOffset + IH.vertDataOffset);
                    for (int k = 0; k < submesh.VertexCount; k++)
                    {
                        var v = new Vertex()
                        {
                            FormatName = "Halo1PC_Skinned"
                        };
                        var position = new RealQuat(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
                        var normal   = new RealQuat(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
                        var binormal = new RealQuat(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
                        var tangent  = new RealQuat(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
                        var texcoord = new RealQuat(reader.ReadSingle() * uScale, 1f - reader.ReadSingle() * vScale);
                        var nodes    = (Flags.Values[1]) ?
                                       new RealQuat(submesh.LocalNodes[reader.ReadInt16()], submesh.LocalNodes[reader.ReadInt16()], 0, 0) :
                                       new RealQuat(reader.ReadInt16(), reader.ReadInt16(), 0, 0);
                        var weights = new RealQuat(reader.ReadSingle(), reader.ReadSingle(), 0, 0);

                        v.Values.Add(new VertexValue(position, VertexValue.ValueType.Float32_3, "position", 0));
                        v.Values.Add(new VertexValue(normal, VertexValue.ValueType.Float32_3, "normal", 0));
                        v.Values.Add(new VertexValue(binormal, VertexValue.ValueType.Float32_3, "binormal", 0));
                        v.Values.Add(new VertexValue(tangent, VertexValue.ValueType.Float32_3, "tangent", 0));
                        v.Values.Add(new VertexValue(texcoord, VertexValue.ValueType.Float32_2, "texcoords", 0));
                        v.Values.Add(new VertexValue(nodes, VertexValue.ValueType.Int16_N2, "blendindices", 0));
                        v.Values.Add(new VertexValue(weights, VertexValue.ValueType.Float32_2, "blendweight", 0));

                        tVertices.Add(v);

                        bb.XBounds.Min = Math.Min(bb.XBounds.Min, position.x);
                        bb.XBounds.Max = Math.Max(bb.XBounds.Max, position.x);
                        bb.YBounds.Min = Math.Min(bb.YBounds.Min, position.y);
                        bb.YBounds.Max = Math.Max(bb.YBounds.Max, position.y);
                        bb.ZBounds.Min = Math.Min(bb.ZBounds.Min, position.z);
                        bb.ZBounds.Max = Math.Max(bb.ZBounds.Max, position.z);
                    }
                    #endregion
                }

                section.Indices  = tIndices.ToArray();
                section.Vertices = tVertices.ToArray();

                IndexInfoList.Add(new IndexBufferInfo()
                {
                    FaceFormat = 3
                });
                VertInfoList.Add(new VertexBufferInfo()
                {
                    VertexCount = section.TotalVertexCount
                });
            }

            RawLoaded = true;
        }
コード例 #20
0
        public override void LoadRaw()
        {
            if (RawLoaded)
            {
                return;
            }

            var mode   = this;
            var data   = cache.GetRawFromID(mode.RawID);
            var ms     = new MemoryStream(data);
            var reader = new EndianReader(ms, Endian.EndianFormat.BigEndian);

            var validParts = new Dictionary <int, mode.ModelSection>();

            LoadFixups();

            if (mode.IndexInfoList.Count == 0)
            {
                throw new Exception("Geometry contains no faces");
            }

            #region Read Vertices
            for (int i = 0; i < mode.ModelSections.Count; i++)
            {
                var section = mode.ModelSections[i];
                if (section.Submeshes.Count == 0)
                {
                    continue;
                }

                if (section.VertsIndex >= 0 && section.VertsIndex < mode.VertInfoList.Count)
                {
                    reader.SeekTo(mode.VertInfoList[section.VertsIndex].Offset);
                }

                if (cache.vertexNode == null)
                {
                    throw new NotSupportedException("No vertex definitions found for " + cache.Version.ToString());
                }

                #region Get Vertex Definition
                XmlNode formatNode = null;
                foreach (XmlNode node in cache.vertexNode.ChildNodes)
                {
                    if (Convert.ToInt32(node.Attributes["type"].Value, 16) == section.VertexFormat)
                    {
                        formatNode = node;
                        break;
                    }
                }

                if (formatNode == null)
                {
                    throw new NotSupportedException("Format " + section.VertexFormat.ToString() + " not found in definition for " + cache.Version.ToString());
                }
                #endregion


                mode.ModelSection validPart;
                if (validParts.TryGetValue(section.VertsIndex, out validPart))
                {
                    section.Vertices = validPart.Vertices;
                    continue;
                }
                else
                {
                    validParts.Add(section.VertsIndex, section);
                }

                section.Vertices = new Vertex[mode.VertInfoList[section.VertsIndex].VertexCount];

                #region Get Vertices
                for (int j = 0; j < mode.VertInfoList[section.VertsIndex].VertexCount; j++)
                {
                    section.Vertices[j] = new Vertex(reader, formatNode);
                    ModelFunctions.DecompressVertex(ref section.Vertices[j], mode.BoundingBoxes[0]);

                    #region fixups
                    var         vert = section.Vertices[j];
                    VertexValue v;

                    #region rigid fix
                    if (section.NodeIndex != 255 && !mode.Flags.Values[18])
                    {
                        vert.Values.Add(new VertexValue(new RealQuat(section.NodeIndex, 0, 0, 0), VertexValue.ValueType.Int8_N4, "blendindices", 0));
                        vert.Values.Add(new VertexValue(new RealQuat(1, 0, 0, 0), VertexValue.ValueType.Int8_N4, "blendweight", 0));
                    }
                    #endregion

                    #region flag 18 fix
                    if (mode.Flags.Values[18])
                    {
                        VertexValue w;
                        var         hasWeights = vert.TryGetValue("blendweight", 0, out w);

                        if (!hasWeights)
                        {
                            w = new VertexValue(new RealQuat(1, 0, 0, 0), VertexValue.ValueType.Int8_N4, "blendweight", 0);
                        }

                        if (vert.TryGetValue("blendindices", 0, out v))
                        {
                            v.Data.a = w.Data.a == 0 ? 0 : mode.NodeIndexGroups[i].NodeIndices[(int)v.Data.a].Index;
                            v.Data.b = w.Data.b == 0 ? 0 : mode.NodeIndexGroups[i].NodeIndices[(int)v.Data.b].Index;
                            v.Data.c = w.Data.c == 0 ? 0 : mode.NodeIndexGroups[i].NodeIndices[(int)v.Data.c].Index;
                            v.Data.d = w.Data.d == 0 ? 0 : mode.NodeIndexGroups[i].NodeIndices[(int)v.Data.d].Index;
                        }
                        else
                        {
                            v        = new VertexValue(new RealQuat(0, 0, 0, 0), VertexValue.ValueType.Int8_N4, "blendindices", 0);
                            v.Data.a = mode.NodeIndexGroups[i].NodeIndices[0].Index;
                            vert.Values.Add(v);
                            vert.Values.Add(w);
                        }
                    }
                    #endregion

                    #region rigid_boned fix
                    if (!vert.TryGetValue("blendweight", 0, out v) && vert.TryGetValue("blendindices", 0, out v))
                    {
                        var q = new RealQuat(
                            v.Data.a == 0 ? 0 : 1,
                            v.Data.b == 0 ? 0 : 1,
                            v.Data.c == 0 ? 0 : 1,
                            v.Data.d == 0 ? 0 : 1);
                        vert.Values.Add(new VertexValue(q, VertexValue.ValueType.Int8_N4, "blendweight", 0));
                    }
                    #endregion

                    #endregion
                }
                #endregion
            }
            #endregion

            validParts.Clear();

            #region Read Indices
            for (int i = 0; i < mode.ModelSections.Count; i++)
            {
                var section = mode.ModelSections[i];
                if (section.Submeshes.Count == 0)
                {
                    continue;
                }

                if (section.FacesIndex >= 0 && section.FacesIndex < mode.IndexInfoList.Count)
                {
                    reader.SeekTo(mode.IndexInfoList[section.FacesIndex].Offset);
                }

                mode.ModelSection validPart;
                if (validParts.TryGetValue(section.FacesIndex, out validPart))
                {
                    section.Indices = validPart.Indices;
                    continue;
                }
                else
                {
                    validParts.Add(section.FacesIndex, section);
                }

                section.Indices = new int[section.TotalFaceCount];
                for (int j = 0; j < section.TotalFaceCount; j++)
                {
                    section.Indices[j] = (mode.VertInfoList[section.VertsIndex].VertexCount > 0xFFFF) ? reader.ReadInt32() : reader.ReadUInt16();
                }
            }
            #endregion

            LoadModelExtras();

            mode.RawLoaded = true;
        }