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 }
public Cluster(int Index) { XBounds = new RealBounds(); YBounds = new RealBounds(); ZBounds = new RealBounds(); SectionIndex = Index; }
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); }
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 }
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()); }
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(); }
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(); }
public static void Write(this BinaryWriter writer, RealBounds bounds) { // Write a RealBounds object to the stream. writer.Write(bounds.lower); writer.Write(bounds.upper); }
public BoundingBox() { XBounds = YBounds = ZBounds = new RealBounds(float.PositiveInfinity, float.NegativeInfinity); UBounds = VBounds = new RealBounds(0, 1); }
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(); }
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."); } }
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(); }
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(); }