コード例 #1
0
        public scenario_structure_bsp(CacheBase Cache, CacheBase.IndexItem Tag)
        {
            cache = Cache;
            int          Address = Tag.Offset;
            EndianReader Reader  = Cache.Reader;

            Reader.SeekTo(Address);

            Reader.SeekTo(Address + 68);
            XBounds = new RealBounds(Reader.ReadSingle(), Reader.ReadSingle());
            YBounds = new RealBounds(Reader.ReadSingle(), Reader.ReadSingle());
            ZBounds = new RealBounds(Reader.ReadSingle(), Reader.ReadSingle());

            #region Clusters Block
            Reader.SeekTo(Address + 172);
            int iCount  = Reader.ReadInt32();
            int iOffset = Reader.ReadInt32() - Tag.Magic;
            for (int i = 0; i < iCount; i++)
            {
                ModelSections.Add(new ModelSection(Cache, Tag, iOffset + 176 * i, null)
                {
                    FacesIndex = i, VertsIndex = i, NodeIndex = 255
                });
                Clusters.Add(new Cluster(i));
            }
            #endregion

            #region Shaders Block
            Reader.SeekTo(Address + 180);
            iCount  = Reader.ReadInt32();
            iOffset = Reader.ReadInt32() - Tag.Magic;
            for (int i = 0; i < iCount; i++)
            {
                Shaders.Add(new Halo2Xbox.render_model.Shader(Cache, iOffset + 32 * i));
            }
            #endregion

            #region ModelParts Block
            Reader.SeekTo(Address + 328);
            iCount  = Reader.ReadInt32();
            iOffset = Reader.ReadInt32() - Tag.Magic;
            for (int i = 0; i < iCount; i++)
            {
                ModelSections.Add(new ModelSection(Cache, Tag, iOffset + 200 * i, BoundingBoxes)
                {
                    FacesIndex = i + Clusters.Count, VertsIndex = i + Clusters.Count, NodeIndex = 255
                });
            }
            #endregion

            #region GeometryInstances Block
            Reader.SeekTo(Address + 336);
            iCount  = Reader.ReadInt32();
            iOffset = Reader.ReadInt32() - Tag.Magic;
            for (int i = 0; i < iCount; i++)
            {
                GeomInstances.Add(new InstancedGeometry(Cache, iOffset + 88 * i, Clusters.Count));
            }
            #endregion
        }
コード例 #2
0
            public Cluster(int Index)
            {
                XBounds = new RealBounds();
                YBounds = new RealBounds();
                ZBounds = new RealBounds();

                SectionIndex = Index;
            }
コード例 #3
0
        public static RealBounds ReadRealBounds(this BinaryReader reader)
        {
            // Read a RealBounds object from the stream.
            RealBounds bounds = new RealBounds();

            bounds.lower = reader.ReadSingle();
            bounds.upper = reader.ReadSingle();

            return(bounds);
        }
コード例 #4
0
        public scenario_structure_bsp(CacheBase Cache, CacheBase.IndexItem Tag)
        {
            cache = Cache;
            int          Address = Tag.Offset;
            EndianReader Reader  = Cache.Reader;

            Reader.SeekTo(Address + 0xE0);
            XBounds = new RealBounds(Reader.ReadSingle(), Reader.ReadSingle());
            YBounds = new RealBounds(Reader.ReadSingle(), Reader.ReadSingle());
            ZBounds = new RealBounds(Reader.ReadSingle(), Reader.ReadSingle());

            Reader.SeekTo(Address + 0x110);
            indexCount  = Reader.ReadInt32() * 3;
            indexOffset = Reader.ReadInt32() - Tag.Magic;

            #region Lightmaps Block
            Reader.SeekTo(Address + 0x11C);
            int iCount  = Reader.ReadInt32();
            int iOffset = Reader.ReadInt32() - Tag.Magic;
            for (int i = 0; i < iCount; i++)
            {
                ModelSections.Add(new Lightmap(cache, iOffset + 32 * i, Tag.Magic)
                {
                    VertsIndex = i, FacesIndex = i, NodeIndex = 255
                });
            }
            #endregion

            #region Create Shader List
            var sIDs = new List <int>();
            for (int i = 0; i < ModelSections.Count; i++)
            {
                var section = ModelSections[i];
                for (int j = 0; j < section.Submeshes.Count; j++)
                {
                    var mesh = (Lightmap.Material)section.Submeshes[j];

                    if (!sIDs.Contains(mesh.shaderID))
                    {
                        sIDs.Add(mesh.shaderID);
                    }
                    mesh.ShaderIndex = sIDs.IndexOf(mesh.shaderID);
                }
            }
            foreach (int ID in sIDs)
            {
                Shaders.Add(new Shader(ID));
            }
            for (int i = 0; i < ModelSections.Count; i++)
            {
                Clusters.Add(new Cluster(i));
            }
            #endregion
        }
コード例 #5
0
ファイル: render_model.cs プロジェクト: YeeB3Warned/Delegate
            public BoundingBox(CacheBase Cache, int Address)
            {
                EndianReader Reader = Cache.Reader;

                Reader.SeekTo(Address);

                XBounds = new RealBounds(Reader.ReadSingle(), Reader.ReadSingle());
                YBounds = new RealBounds(Reader.ReadSingle(), Reader.ReadSingle());
                ZBounds = new RealBounds(Reader.ReadSingle(), Reader.ReadSingle());
                UBounds = new RealBounds(Reader.ReadSingle(), Reader.ReadSingle());
                VBounds = new RealBounds(Reader.ReadSingle(), Reader.ReadSingle());
            }
コード例 #6
0
            public Cluster(CacheBase Cache, int Address)
            {
                EndianReader Reader = Cache.Reader;
                Reader.SeekTo(Address);

                XBounds = new RealBounds(Reader.ReadSingle(), Reader.ReadSingle());
                YBounds = new RealBounds(Reader.ReadSingle(), Reader.ReadSingle());
                ZBounds = new RealBounds(Reader.ReadSingle(), Reader.ReadSingle());

                Reader.SeekTo(Address + 172);
                SectionIndex = Reader.ReadInt16();
            }
コード例 #7
0
        public scenario_structure_bsp(CacheBase Cache, int Address)
        {
            cache = Cache;
            EndianReader Reader = Cache.Reader;

            Reader.SeekTo(Address);

            #region sldt ID
            //sldt's sections address will be used instead of the one in sbsp
            int sectionAddress = 0;
            foreach (var item in Cache.IndexItems)
            {
                if (item.ClassCode == "scnr")
                {
                    Reader.SeekTo(item.Offset + 20);
                    int cnt = Reader.ReadInt32();
                    int ptr = Reader.ReadInt32() - Cache.Magic;

                    int bspIndex = 0;

                    for (int i = 0; i < cnt; i++)
                    {
                        Reader.SeekTo(ptr + 108 * i + 12);
                        if (Cache.IndexItems.GetItemByID(Reader.ReadInt32()).Offset == Address)
                        {
                            bspIndex = i;
                            break;
                        }
                    }

                    Reader.SeekTo(item.Offset + 1776 + 12);
                    int sldtID      = Reader.ReadInt32();
                    int sldtAddress = Cache.IndexItems.GetItemByID(sldtID).Offset;

                    Reader.SeekTo(sldtAddress + 4);
                    cnt = Reader.ReadInt32();
                    ptr = Reader.ReadInt32() - Cache.Magic;

                    for (int i = 0; i < cnt; i++)
                    {
                        Reader.SeekTo(ptr + 436 * i + 2);

                        if (Reader.ReadInt16() != bspIndex)
                        {
                            continue;
                        }

                        Reader.SeekTo(ptr + 436 * i + 312);
                        sectionAddress = Reader.ReadInt32() - Cache.Magic;

                        Reader.SeekTo(ptr + 436 * i + 428);
                        geomRawID = Reader.ReadInt32();
                    }

                    break;
                }
            }
            #endregion

            Reader.SeekTo(Address + 60);
            XBounds = new RealBounds(Reader.ReadSingle(), Reader.ReadSingle());
            YBounds = new RealBounds(Reader.ReadSingle(), Reader.ReadSingle());
            ZBounds = new RealBounds(Reader.ReadSingle(), Reader.ReadSingle());

            #region Clusters Block
            Reader.SeekTo(Address + 180);
            int iCount  = Reader.ReadInt32();
            int iOffset = Reader.ReadInt32() - Cache.Magic;
            for (int i = 0; i < iCount; i++)
            {
                Clusters.Add(new Cluster(Cache, iOffset + 220 * i));
            }
            #endregion

            #region Shaders Block
            Reader.SeekTo(Address + 192);
            iCount  = Reader.ReadInt32();
            iOffset = Reader.ReadInt32() - Cache.Magic;
            for (int i = 0; i < iCount; i++)
            {
                Shaders.Add(new Halo3Beta.render_model.Shader(Cache, iOffset + 36 * i));
            }
            #endregion

            #region GeometryInstances Block
            Reader.SeekTo(Address + 432);
            iCount  = Reader.ReadInt32();
            iOffset = Reader.ReadInt32() - Cache.Magic;
            for (int i = 0; i < iCount; i++)
            {
                GeomInstances.Add(new InstancedGeometry(Cache, iOffset + 120 * i));
            }
            #endregion

            Reader.SeekTo(Address + 580);
            RawID1 = Reader.ReadInt32();

            #region ModelSections Block
            Reader.SeekTo(Address + 740);
            iCount  = Reader.ReadInt32();
            iOffset = Reader.ReadInt32() - Cache.Magic;
            for (int i = 0; i < iCount; i++)
            {
                ModelSections.Add(new Halo3Beta.render_model.ModelSection(Cache, sectionAddress + 76 * i));
            }
            #endregion

            #region Bounding Boxes Block
            Reader.SeekTo(Address + 752);
            iCount  = Reader.ReadInt32();
            iOffset = Reader.ReadInt32() - Cache.Magic;
            for (int i = 0; i < iCount; i++)
            {
                BoundingBoxes.Add(new Halo3Beta.render_model.BoundingBox(Cache, iOffset + 44 * i));
            }
            #endregion

            Reader.SeekTo(Address + 860);
            RawID2 = Reader.ReadInt32();

            Reader.SeekTo(Address + 892);
            RawID3 = Reader.ReadInt32();
        }
コード例 #8
0
 public static void Write(this BinaryWriter writer, RealBounds bounds)
 {
     // Write a RealBounds object to the stream.
     writer.Write(bounds.lower);
     writer.Write(bounds.upper);
 }
コード例 #9
0
 public BoundingBox()
 {
     XBounds = YBounds = ZBounds = new RealBounds(float.PositiveInfinity, float.NegativeInfinity);
     UBounds = VBounds = new RealBounds(0, 1);
 }
コード例 #10
0
        public scenario_structure_bsp(CacheBase Cache, int Address)
        {
            cache = Cache;
            EndianReader Reader = Cache.Reader;

            Reader.SeekTo(Address);

            #region sldt/lbsp ID
            //lbsp's sections address will be used instead of the one in sbsp
            int sectionAddress = 0;
            int sectionCount   = 0;
            foreach (var item in Cache.IndexItems)
            {
                if (item.ClassCode == "scnr")
                {
                    Reader.SeekTo(item.Offset + 76);
                    int cnt = Reader.ReadInt32();
                    int ptr = Reader.ReadInt32() - Cache.Magic;

                    int bspIndex = 0;

                    for (int i = 0; i < cnt; i++)
                    {
                        Reader.SeekTo(ptr + 172 * i + 12);
                        if (Cache.IndexItems.GetItemByID(Reader.ReadInt32()).Offset == Address)
                        {
                            bspIndex = i;
                            break;
                        }
                    }

                    Reader.SeekTo(item.Offset + 1844 + 12);
                    int sldtID      = Reader.ReadInt32();
                    int sldtAddress = Cache.IndexItems.GetItemByID(sldtID).Offset;

                    Reader.SeekTo(sldtAddress + 4);
                    cnt = Reader.ReadInt32();
                    ptr = Reader.ReadInt32() - Cache.Magic;

                    Reader.SeekTo(ptr + 32 * bspIndex + 12);
                    int lbspID      = Reader.ReadInt32();
                    int lbspAddress = Cache.IndexItems.GetItemByID(lbspID).Offset;

                    Reader.SeekTo(lbspAddress + 124);
                    sectionCount   = Reader.ReadInt32();
                    sectionAddress = Reader.ReadInt32() - Cache.Magic;

                    Reader.SeekTo(lbspAddress + 268);
                    geomRawID = Reader.ReadInt32();
                    break;
                }
            }
            #endregion

            Reader.SeekTo(Address + 236);
            XBounds = new RealBounds(Reader.ReadSingle(), Reader.ReadSingle());
            YBounds = new RealBounds(Reader.ReadSingle(), Reader.ReadSingle());
            ZBounds = new RealBounds(Reader.ReadSingle(), Reader.ReadSingle());

            #region Clusters Block
            Reader.SeekTo(Address + 308);
            int iCount  = Reader.ReadInt32();
            int iOffset = Reader.ReadInt32() - Cache.Magic;
            for (int i = 0; i < iCount; i++)
            {
                Clusters.Add(new Cluster(Cache, iOffset + 140 * i));
            }
            #endregion

            #region Shaders Block
            Reader.SeekTo(Address + 320);
            iCount  = Reader.ReadInt32();
            iOffset = Reader.ReadInt32() - Cache.Magic;
            for (int i = 0; i < iCount; i++)
            {
                Shaders.Add(new ReachRetail.render_model.Shader(Cache, iOffset + 44 * i));
            }
            #endregion

            #region GeometryInstances Block
            Reader.SeekTo(Address + 608);
            iCount  = Reader.ReadInt32();
            iOffset = Reader.ReadInt32() - Cache.Magic;
            for (int i = 0; i < iCount; i++)
            {
                GeomInstances.Add(new InstancedGeometry(Cache, iOffset + 4 * i));
            }

            #region Load Fixup Data
            Reader.SeekTo(Address + 1298);
            int id    = Reader.ReadUInt16();
            var entry = Cache.zone.RawEntries[id];
            var er    = new EndianReader(new MemoryStream(Cache.zone.FixupData), EndianFormat.BigEndian);
            int addr  = entry.Fixups[entry.Fixups.Count - 10].Offset;

            for (int i = 0; i < GeomInstances.Count; i++)
            {
                er.SeekTo(entry.FixupOffset + addr + 156 * i);
                var geom = GeomInstances[i];

                geom.TransformScale = er.ReadSingle();

                geom.TransformMatrix.m11 = er.ReadSingle();
                geom.TransformMatrix.m12 = er.ReadSingle();
                geom.TransformMatrix.m13 = er.ReadSingle();

                geom.TransformMatrix.m21 = er.ReadSingle();
                geom.TransformMatrix.m22 = er.ReadSingle();
                geom.TransformMatrix.m23 = er.ReadSingle();

                geom.TransformMatrix.m31 = er.ReadSingle();
                geom.TransformMatrix.m32 = er.ReadSingle();
                geom.TransformMatrix.m33 = er.ReadSingle();

                geom.TransformMatrix.m41 = er.ReadSingle();
                geom.TransformMatrix.m42 = er.ReadSingle();
                geom.TransformMatrix.m43 = er.ReadSingle();

                er.ReadUInt16();
                er.ReadUInt16();
                er.ReadUInt16();
                geom.SectionIndex = er.ReadUInt16();
            }
            er.Close();
            er.Dispose();
            #endregion
            #endregion

            Reader.SeekTo(Address + 796);
            RawID1 = Reader.ReadInt32();

            Reader.SeekTo(Address + 976);
            RawID2 = Reader.ReadInt32();

            #region ModelParts Block
            Reader.SeekTo(Address + 1100);
            iCount  = Reader.ReadInt32();
            iOffset = Reader.ReadInt32() - Cache.Magic;
            if (sectionAddress == -Cache.Magic)
            {
                sectionAddress = iOffset;                                 //null address in lbsp
            }
            for (int i = 0; i < iCount; i++)
            {
                ModelSections.Add(new ReachRetail.render_model.ModelSection(Cache, sectionAddress + 92 * i));
            }
            #endregion

            #region Bounding Boxes Block
            Reader.SeekTo(Address + 1112);
            iCount  = Reader.ReadInt32();
            iOffset = Reader.ReadInt32() - Cache.Magic;
            for (int i = 0; i < iCount; i++)
            {
                BoundingBoxes.Add(new ReachRetail.render_model.BoundingBox(Cache, iOffset + 52 * i));
            }
            #endregion

            Reader.SeekTo(Address + 1244);
            RawID3 = Reader.ReadInt32();
        }
コード例 #11
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.");
            }
        }
コード例 #12
0
        public scenario_structure_bsp(CacheBase Cache, int Address)
        {
            cache = Cache;
            EndianReader Reader = Cache.Reader;

            Reader.SeekTo(Address);

            #region sldt/lbsp ID
            //lbsp's sections address will be used instead of the one in sbsp
            int sectionAddress = 0;
            foreach (var item in Cache.IndexItems)
            {
                if (item.ClassCode == "scnr")
                {
                    Reader.SeekTo(item.Offset + 68);
                    int cnt = Reader.ReadInt32();
                    int ptr = Reader.ReadInt32() - Cache.Magic;

                    int bspIndex = 0;

                    for (int i = 0; i < cnt; i++)
                    {
                        Reader.SeekTo(ptr + 168 * i + 12);
                        if (Cache.IndexItems.GetItemByID(Reader.ReadInt32()).Offset == Address)
                        {
                            bspIndex = i;
                            break;
                        }
                    }

                    Reader.SeekTo(item.Offset + 1828 + 12);
                    int sldtID      = Reader.ReadInt32();
                    var sldt        = Cache.IndexItems.GetItemByID(sldtID);
                    int sldtAddress = Cache.IndexItems.GetItemByID(sldtID).Offset;

                    Reader.SeekTo(sldtAddress + 4);
                    cnt = Reader.ReadInt32();
                    ptr = Reader.ReadInt32() - Cache.Magic;

                    Reader.SeekTo(ptr + 32 * bspIndex + 12);
                    int lbspID      = Reader.ReadInt32();
                    var lbsp        = Cache.IndexItems.GetItemByID(lbspID);
                    int lbspAddress = Cache.IndexItems.GetItemByID(lbspID).Offset;

                    Reader.SeekTo(lbspAddress + 116);
                    sectionAddress = Reader.ReadInt32() - Cache.Magic;

                    Reader.SeekTo(lbspAddress + 244);
                    geomRawID = Reader.ReadInt32();
                    break;
                }
            }
            #endregion

            Reader.SeekTo(Address + 236);
            XBounds = new RealBounds(Reader.ReadSingle(), Reader.ReadSingle());
            YBounds = new RealBounds(Reader.ReadSingle(), Reader.ReadSingle());
            ZBounds = new RealBounds(Reader.ReadSingle(), Reader.ReadSingle());

            #region Clusters Block
            Reader.SeekTo(Address + 308);
            int iCount  = Reader.ReadInt32();
            int iOffset = Reader.ReadInt32() - Cache.Magic;
            for (int i = 0; i < iCount; i++)
            {
                Clusters.Add(new Cluster(Cache, iOffset + 288 * i));
            }
            #endregion

            #region Shaders Block
            Reader.SeekTo(Address + 320);
            iCount  = Reader.ReadInt32();
            iOffset = Reader.ReadInt32() - Cache.Magic;
            for (int i = 0; i < iCount; i++)
            {
                Shaders.Add(new ReachBeta.render_model.Shader(Cache, iOffset + 44 * i));
            }
            #endregion

            #region GeometryInstances Block
            Reader.SeekTo(Address + 620);
            iCount  = Reader.ReadInt32();
            iOffset = Reader.ReadInt32() - Cache.Magic;
            for (int i = 0; i < iCount; i++)
            {
                GeomInstances.Add(new InstancedGeometry(Cache, iOffset + 168 * i));
            }
            #endregion

            Reader.SeekTo(Address + 796);
            RawID1 = Reader.ReadInt32();

            Reader.SeekTo(Address + 976);
            RawID2 = Reader.ReadInt32();

            #region ModelParts Block
            Reader.SeekTo(Address + 1112);
            iCount  = Reader.ReadInt32();
            iOffset = Reader.ReadInt32() - Cache.Magic;
            for (int i = 0; i < iCount; i++)
            {
                ModelSections.Add(new ReachBeta.render_model.ModelSection(Cache, sectionAddress + 92 * i));
            }
            #endregion

            #region Bounding Boxes Block
            Reader.SeekTo(Address + 1124);
            iCount  = Reader.ReadInt32();
            iOffset = Reader.ReadInt32() - Cache.Magic;
            for (int i = 0; i < iCount; i++)
            {
                BoundingBoxes.Add(new ReachBeta.render_model.BoundingBox(Cache, iOffset + 52 * i));
            }
            #endregion

            Reader.SeekTo(Address + 1244);
            RawID3 = Reader.ReadInt32();
        }
コード例 #13
0
        private void loadBspTag(CacheBase Cache, CacheBase.IndexItem Tag, bool Specular, bool Force)
        {
            if (!this.Enabled)
            {
                this.Enabled = true;
            }
            tvRegions.Nodes.Clear();
            if (renderer1.Running)
            {
                renderer1.Stop("Loading...");
            }
            Refresh();

            cache = Cache;
            tag   = Tag;

            sbsp         = DefinitionsManager.sbsp(cache, tag);
            sbsp.BSPName = Path.GetFileNameWithoutExtension(tag.Filename + "." + tag.ClassCode);
            sbsp.LoadRaw();

            isWorking = true;

            #region Build Tree
            TreeNode ClusterNode = new TreeNode("Clusters")
            {
                Checked = true
            };
            foreach (var clust in sbsp.Clusters)
            {
                if (clust.SectionIndex >= sbsp.ModelSections.Count)
                {
                    continue;
                }
                if (sbsp.ModelSections[clust.SectionIndex].Submeshes.Count > 0)
                {
                    ClusterNode.Nodes.Add(new TreeNode(sbsp.Clusters.IndexOf(clust).ToString("D3"))
                    {
                        Tag = clust, Checked = true
                    });
                }
            }
            if (ClusterNode.Nodes.Count > 0)
            {
                tvRegions.Nodes.Add(ClusterNode);
            }

            TreeNode IGnode = new TreeNode("Instances")
            {
                Checked = true
            };
            foreach (var IG in sbsp.GeomInstances)
            {
                if (IG.SectionIndex >= sbsp.ModelSections.Count)
                {
                    continue;
                }
                if (sbsp.ModelSections[IG.SectionIndex].Submeshes.Count > 0)
                {
                    IGnode.Nodes.Add(new TreeNode(IG.Name)
                    {
                        Tag = IG, Checked = true
                    });
                }
            }
            if (IGnode.Nodes.Count > 0)
            {
                tvRegions.Nodes.Add(IGnode);
            }

            tvRegions.Sort(); //much easier for looking through IGs
            #endregion

            isWorking = false;

            #region Load Stuff
            LoadShaders(false);
            LoadSections();

            foreach (var clust in sbsp.Clusters)
            {
                AddCluster(clust, Force);
            }

            foreach (var ig in sbsp.GeomInstances)
            {
                AddGeomInstance(ig, Force);
            }
            #endregion

            #region BoundingBox Stuff
            PerspectiveCamera camera = (PerspectiveCamera)renderer1.Viewport.Camera;

            var XBounds = new RealBounds(float.MaxValue, float.MinValue);
            var YBounds = new RealBounds(float.MaxValue, float.MinValue);
            var ZBounds = new RealBounds(float.MaxValue, float.MinValue);

            #region Get Bounds
            foreach (var c in sbsp.Clusters)
            {
                if (c.SectionIndex >= sbsp.ModelSections.Count)
                {
                    continue;
                }
                if (sbsp.ModelSections[c.SectionIndex].Submeshes.Count == 0)
                {
                    continue;
                }

                if (c.XBounds.Min < XBounds.Min)
                {
                    XBounds.Min = c.XBounds.Min;
                }
                if (c.YBounds.Min < YBounds.Min)
                {
                    YBounds.Min = c.YBounds.Min;
                }
                if (c.ZBounds.Min < ZBounds.Min)
                {
                    ZBounds.Min = c.ZBounds.Min;
                }

                if (c.XBounds.Max > XBounds.Max)
                {
                    XBounds.Max = c.XBounds.Max;
                }
                if (c.YBounds.Max > YBounds.Max)
                {
                    YBounds.Max = c.YBounds.Max;
                }
                if (c.ZBounds.Max > ZBounds.Max)
                {
                    ZBounds.Max = c.ZBounds.Max;
                }
            }

            //foreach (var bb in sbsp.BoundingBoxes)
            //{
            //    if (bb.XBounds.Min < XBounds.Min) XBounds.Min = bb.XBounds.Min;
            //    if (bb.YBounds.Min < YBounds.Min) YBounds.Min = bb.YBounds.Min;
            //    if (bb.ZBounds.Min < ZBounds.Min) ZBounds.Min = bb.ZBounds.Min;

            //    if (bb.XBounds.Max > XBounds.Max) XBounds.Max = bb.XBounds.Max;
            //    if (bb.YBounds.Max > YBounds.Max) YBounds.Max = bb.YBounds.Max;
            //    if (bb.ZBounds.Max > ZBounds.Max) ZBounds.Max = bb.ZBounds.Max;
            //}
            #endregion

            double pythagoras3d = Math.Sqrt(
                Math.Pow(XBounds.Length, 2) +
                Math.Pow(YBounds.Length, 2) +
                Math.Pow(ZBounds.Length, 2));

            if (double.IsInfinity(pythagoras3d) || pythagoras3d == 0) //no clusters
            {
                XBounds = sbsp.XBounds;
                YBounds = sbsp.YBounds;
                ZBounds = sbsp.ZBounds;

                pythagoras3d = Math.Sqrt(
                    Math.Pow(XBounds.Length, 2) +
                    Math.Pow(YBounds.Length, 2) +
                    Math.Pow(ZBounds.Length, 2));
            }

            if (XBounds.Length / 2 > (YBounds.Length)) //side view
            {
                var p = new Point3D(
                    XBounds.MidPoint,
                    YBounds.Max + pythagoras3d * 0.5,
                    ZBounds.MidPoint);
                renderer1.MoveCamera(p, new Vector3D(0, 0, -2));
            }
            else //normal camera position
            {
                var p = new Point3D(
                    XBounds.Max + pythagoras3d * 0.5,
                    YBounds.MidPoint,
                    ZBounds.MidPoint);
                renderer1.MoveCamera(p, new Vector3D(-1, 0, 0));
            }

            renderer1.CameraSpeed    = Math.Ceiling(pythagoras3d * 3) / 1000;
            renderer1.MaxCameraSpeed = Math.Ceiling(pythagoras3d * 3) * 5 / 1000;
            renderer1.MaxPosition    = new Point3D(
                sbsp.XBounds.Max + pythagoras3d * 2,
                sbsp.YBounds.Max + pythagoras3d * 2,
                sbsp.ZBounds.Max + pythagoras3d * 2);
            renderer1.MinPosition = new Point3D(
                sbsp.XBounds.Min - pythagoras3d * 2,
                sbsp.YBounds.Min - pythagoras3d * 2,
                sbsp.ZBounds.Min - pythagoras3d * 2);
            renderer1.FarPlaneMin = pythagoras3d * 0.1;
            renderer1.FarPlane    = pythagoras3d;
            renderer1.FarPlaneMax = pythagoras3d;
            #endregion

            renderer1.Start();
            RenderSelected();
        }