public void LoadBitmapTag(PakFile Pak, PakFile.PakTag Item) { exportAllImagesToolStripMenuItem.Visible = false; pak = Pak; item = Item; pict = new Texture(pak, item); lstBitmaps.Items.Clear(); var list = new List <Bitmap>() { GetBitmapByTag(pak, pict, PixelFormat.Format32bppArgb) }; var map = list[0]; for (int i = 0; i < list.Count; i++) { lstBitmaps.Items.Add(new ListViewItem(new string[] { i.ToString(), pict.Width.ToString(), pict.Height.ToString(), "S3DPICT".ToString(), pict.Format.ToString() }) { Tag = (list[i] == null) ? GetErrorImage() : list[i] }); } lstBitmaps.FocusedItem = lstBitmaps.Items[0]; lstBitmaps_SelectedIndexChanged(null, null); }
public void LoadModelTag(PakFile Pak, PakFile.PakTag Item, bool Specular, bool Force) { try { Clear(); loadModelTag(Pak, Item, Specular, Force); } catch (Exception ex) { renderer1.ClearViewport(); Clear(); renderer1.Stop("Loading failed: " + ex.Message); tvRegions.Nodes.Clear(); this.Enabled = false; } }
public static void SaveImage(string Filename, PakFile Pak, PakFile.PakTag Item, BitmapFormat Format, bool Alpha) { var pict = new Texture(Pak, Item); SaveImage(Filename, Pak, pict, Format, Alpha); }
public static Bitmap GetBitmapByTag(PakFile Pak, PakFile.PakTag Item, PixelFormat PF) { var pict = new Texture(Pak, Item); return(GetBitmapByTag(Pak, pict, PF)); }
public void LoadTag(PakFile Pak, PakFile.PakTag Tag) { tabMeta.Controls.Clear(); tabMeta.Controls.Add(vS3D); vS3D.Dock = DockStyle.Fill; if (vMode == null) { vMode = new ModelViewer(); //this cant go in the constructor because the //tabModel.Controls.Clear(); //ElementHost in the ModelViewer requires an tabModel.Controls.Add(vMode); //STA thread, whereas the map open thread vMode.Dock = DockStyle.Fill; //is MTA because it's done via ThreadPool vMode.DefaultModeFormat = settings.ModeFormat; vMode.TagExtracted += new TagExtractedEventHandler(extractor_TagExtracted); vMode.ErrorExtracting += new ErrorExtractingEventHandler(extractor_ErrorExtracting); } else { vMode.Clear(); } if (vSbsp == null) { vSbsp = new BSPViewer(); //tabModel.Controls.Clear(); tabModel.Controls.Add(vSbsp); vSbsp.Dock = DockStyle.Fill; vSbsp.DefaultModeFormat = settings.ModeFormat; vSbsp.TagExtracted += new TagExtractedEventHandler(extractor_TagExtracted); vSbsp.ErrorExtracting += new ErrorExtractingEventHandler(extractor_ErrorExtracting); } else { vSbsp.Clear(); } pak = Pak; item = Tag; metaLoaded = rawLoaded = modelLoaded = false; vMode.RenderBackColor = settings.ViewerColour; vSbsp.RenderBackColor = settings.ViewerColour; vSbsp.TextureScale = settings.pakScale / 100f; switch (item.Class) { #region bitmaps case TagType.Textures: case TagType.TexturesMips64: tabControl1.TabPages.Remove(tabModel); tabRaw.Controls.Clear(); if (!tabControl1.TabPages.Contains(tabRaw)) { tabControl1.TabPages.Add(tabRaw); } tabRaw.Controls.Add(eBitm); eBitm.Dock = DockStyle.Fill; if (tabControl1.SelectedTab == tabRaw) { eBitm.LoadBitmapTag(pak, item); rawLoaded = true; } break; #endregion #region models case TagType.Templates: tabControl1.TabPages.Remove(tabRaw); vMode.Visible = true; vSbsp.Visible = false; //if (!tabControl1.TabPages.Contains(tabRaw)) // tabControl1.TabPages.Add(tabRaw); if (!tabControl1.TabPages.Contains(tabModel)) { tabControl1.TabPages.Add(tabModel); } //tabRaw.Controls.Add(eMode); //eMode.Dock = DockStyle.Fill; //tabModel.Controls.Clear(); //tabModel.Controls.Add(vMode); //vMode.Dock = DockStyle.Fill; if (tabControl1.SelectedTab == tabMeta) { //vMeta.LoadTagMeta(cache, tag, settings.Flags.HasFlag(SettingsFlags.ShowInvisibles), settings.pluginFolder); vS3D.LoadModelHierarchy(pak, item); metaLoaded = true; } //else if (tabControl1.SelectedTab == tabRaw) //{ // eMode.DataFolder = settings.dataFolder; // eMode.PermFilter = settings.permFilter; // eMode.LoadModelTag(cache, tag); // rawLoaded = true; //} else if (tabControl1.SelectedTab == tabModel) { //vMode.RenderBackColor = settings.ViewerColour; vMode.PermutationFilter = new List <string>(settings.permFilter.Split(' ')); vMode.LoadModelTag(pak, item, settings.Flags.HasFlag(SettingsFlags.LoadSpecular), settings.Flags.HasFlag(SettingsFlags.ForceLoadModels)); modelLoaded = true; } break; #endregion #region bsps case TagType.Scene: tabControl1.TabPages.Remove(tabRaw); vMode.Visible = false; vSbsp.Visible = true; if (!tabControl1.TabPages.Contains(tabModel)) { tabControl1.TabPages.Add(tabModel); } //tabRaw.Controls.Add(eSbsp); //eMode.Dock = DockStyle.Fill; //tabModel.Controls.Clear(); //tabModel.Controls.Add(vSbsp); //vSbsp.Dock = DockStyle.Fill; if (tabControl1.SelectedTab == tabMeta) { //vMeta.LoadTagMeta(cache, tag, settings.Flags.HasFlag(SettingsFlags.ShowInvisibles), settings.pluginFolder); vS3D.LoadModelHierarchy(pak, item); metaLoaded = true; } //else if (tabControl1.SelectedTab == tabRaw) //{ // eMode.DataFolder = settings.dataFolder; // eMode.PermFilter = settings.permFilter; // eMode.LoadModelTag(cache, tag); // rawLoaded = true; //} if (tabControl1.SelectedTab == tabModel) { vSbsp.LoadBSPTag(pak, item, settings.Flags.HasFlag(SettingsFlags.ForceLoadModels)); modelLoaded = true; } break; #endregion #region other default: tabControl1.TabPages.Remove(tabModel); tabControl1.TabPages.Remove(tabRaw); vS3D.DisplayTagInfo(pak, item); break; #endregion } }
public void LoadModelHierarchy(PakFile Pak, PakFile.PakTag Item) { pak = Pak; item = Item; bool useInherit = (item.Class == TagType.Scene); switch (item.Class) { case TagType.Templates: model = new Template(Pak, item, false); break; case TagType.Scene: model = new Scene(Pak, item, false); break; default: return; } tvSub.Nodes.Clear(); richTextBox1.Clear(); splitContainer1.Panel1Collapsed = false; var root = new TreeNode(model.Name) { Tag = model, ImageIndex = 7, SelectedImageIndex = 7 }; #region Materials var mNode = new TreeNode("Materials") { ImageIndex = 1, SelectedImageIndex = 1 }; int i = 0; foreach (var mat in model.Materials) { mNode.Nodes.Add(new TreeNode("[" + (i++).ToString("d3") + "] " + mat.Reference) { ImageIndex = 2, SelectedImageIndex = 2, Tag = mat }); } root.Nodes.Add(mNode); #endregion #region Scripts if (item.Class == TagType.Scene) { var sNode = new TreeNode("Scripts") { ImageIndex = 1, SelectedImageIndex = 1 }; i = 0; foreach (var sc in ((Scene)model).Scripts) { sNode.Nodes.Add(new TreeNode("[" + (i++).ToString("d3") + "]") { ImageIndex = 7, SelectedImageIndex = 7, Tag = sc }); } root.Nodes.Add(sNode); } #endregion var nList = new List <TreeNode>(); var dic = new Dictionary <int, TreeNode>(); foreach (var obj in model.Objects) { var node = new TreeNode("[" + obj._B903.ID.ToString("d3") + "] " + obj._B903.Name) { Tag = obj }; if (obj._B903.VertCount > 0 || obj.Submeshes != null) { node.ImageIndex = node.SelectedImageIndex = 3; } if (obj._B903.VertCount == 0 && obj.Submeshes != null || obj.isInheritor) { node.ImageIndex = node.SelectedImageIndex = 4; } if (node.ImageIndex > 0 || !useInherit) { dic.Add(obj._B903.ID, node); } } foreach (var pair in dic) { var obj = (Node)pair.Value.Tag; int id = (obj._2901 != null) ? obj._2901.InheritID : obj.ParentID; if (id == -1) { nList.Add(pair.Value); continue; } TreeNode pNode; if (dic.TryGetValue(id, out pNode)) { pNode.Nodes.Add(pair.Value); } else { nList.Add(pair.Value); } } root.Nodes.AddRange(nList.ToArray()); tvSub.Nodes.Add(root); root.Expand(); if (!useInherit) { foreach (TreeNode node in root.Nodes) { node.Expand(); } } tvSub.SelectedNode = root; }
public void DisplayTagInfo(PakFile Pak, PakFile.PakTag Item) { pak = Pak; item = Item; var reader = pak.Reader; int baseAddress = item.Offset; reader.SeekTo(baseAddress); richTextBox1.Clear(); splitContainer1.Panel1Collapsed = true; richTextBox1.Text += "base address:\t" + baseAddress.ToString() + "\r\n"; switch (item.Class) { #region None case TagType.None: case TagType.AnimStream: richTextBox1.Text = reader.ReadString(reader.ReadInt32()); break; #endregion #region SceneData case TagType.SceneData: var data = Pak.SceneData; richTextBox1.Text += "Header:\t" + "[" + BitConverter.ToString(data.unmapped0, 0).Replace("-", string.Empty) + "]\r\n"; richTextBox1.Text += string.Format("x0700:\t\t{0:d4}\r\n", data.x0700, leString(data.x0700, 2)); richTextBox1.Text += string.Format("xADDE:\t\t{0:d4}\r\n", data.xADDE, leString(data.xADDE, 2)); richTextBox1.Text += "=======Bounds=======\r\n"; richTextBox1.Text += string.Format( "{0,13:F6}\t{1,13:F6}\t{2,13:F6}\r\n{3,13:F6}\t{4,13:F6}\t{5,13:F6}\r\n", data.unkBounds.XBounds.Min, data.unkBounds.YBounds.Min, data.unkBounds.ZBounds.Min, data.unkBounds.XBounds.Max, data.unkBounds.YBounds.Max, data.unkBounds.ZBounds.Max); richTextBox1.Text += "\r\n"; richTextBox1.Text += string.Format("Index Count:\t{0:d5}\r\n", data.indices.Count); richTextBox1.Text += string.Format("Struct Count:\t{0:d5}\r\n", data.unkS0.Count); richTextBox1.Text += "Footer:\t" + "[" + BitConverter.ToString(data.unmapped1, 0).Replace("-", string.Empty) + "]\r\n"; richTextBox1.Text += "\r\n"; richTextBox1.Text += "=======Indices=======\r\n"; for (int i = 0; i < Math.Min(data.indices.Count, 650); i++) { richTextBox1.Text += data.indices[i].ToString("d5") + ((i % 12 == 11) ? "\r\n" : " "); } richTextBox1.Text += "\r\n\r\n"; richTextBox1.Text += "=======???????=======\r\n"; for (int x = 0; x < Math.Min(data.unkS0.Count, 650); x++) { var dat = data.unkS0[x]; for (int i = 0; i < 12; i += 3) { int a = dat.unk0[i + 0]; int b = dat.unk0[i + 1]; int c = dat.unk0[i + 2]; richTextBox1.Text += string.Format("{0} [{1,6}, {2,6}, {3,6}]", (((i + 1) % 12 == 1) ? x.ToString("d5") : " "), a.ToString("d5"), b.ToString("d5"), c.ToString("d5")) + (((i + 1) % 6 == 5) ? "\r\n" : ""); //richTextBox1.Text += string.Format("{0} [{1,4}, {2,4}, {3,4}]", (((i + 1) % 12 == 1) ? x.ToString("d5") : " "), // leString(a, 2), leString(b, 2), leString(c, 2)) // + (((i + 1) % 6 == 5) ? "\r\n" : ""); } richTextBox1.Text += "\r\n"; continue; for (int i = 0; i < 12; i += 3) { float a = dat.unk0[i + 0]; float b = dat.unk0[i + 1]; float c = dat.unk0[i + 2]; a = (a + (float)0x7FFF) / (float)0xFFFF; b = (b + (float)0x7FFF) / (float)0xFFFF; c = (c + (float)0x7FFF) / (float)0xFFFF; //a = a * data.unkBounds.XBounds.Length + data.unkBounds.XBounds.Min; //b = b * data.unkBounds.YBounds.Length + data.unkBounds.YBounds.Min; //c = c * data.unkBounds.ZBounds.Length + data.unkBounds.ZBounds.Min; richTextBox1.Text += string.Format("{0} [{1,11}, {2,11}, {3,11}]", (((i + 1) % 12 == 1) ? x.ToString("d5") : " "), a.ToString("f6"), b.ToString("f6"), c.ToString("f6")) + (((i + 1) % 6 == 5) ? "\r\n" : ""); } richTextBox1.Text += "\r\n"; } break; #endregion #region Strings case TagType.Strings: richTextBox1.Text = Encoding.Unicode.GetString(reader.ReadBytes(Item.Size)); break; #endregion #region SceneCDT case TagType.SceneCDT: var cdt = Pak.SceneCDT; richTextBox1.Text += string.Format("Header:\t[{0}]\r\n", BitConverter.ToString(cdt.unmapped0, 0).Replace("-", string.Empty)); richTextBox1.Text += "\r\n"; richTextBox1.Text += string.Format("Set Count:\t{0:d5}\r\n", cdt.sets.Count.ToString("d5")); foreach (var set in cdt.sets) { richTextBox1.Text += "\r\n=======DataSet=======\r\n"; richTextBox1.Text += string.Format("Struct Count:\t{0:d5}\r\n\r\n", set.unkS0.Count.ToString("d5")); if (set.unkS0.Count == 0) { continue; } richTextBox1.Text += string.Format("FaceTotal:\t{0:d8}\t({1})\r\n", set.unk0, leString(set.unk0, 4)); richTextBox1.Text += string.Format("MinBound:\t{0}\r\n", set.MinBound.ToString()); richTextBox1.Text += string.Format("unkf0:\t\t{0:F6}\r\n", set.unkf0); richTextBox1.Text += string.Format("DataLength:\t{0:d8}\t({1})\r\n", set.DataLength, leString(set.DataLength, 4)); richTextBox1.Text += "\r\n\r\n"; richTextBox1.Text += "\r\n=======Set Structs=======\r\n"; for (int i = 0; i < Math.Min(set.unkS0.Count, 250); i++) { var dat = set.unkS0[i]; richTextBox1.Text += string.Format("NodeID:\t{0:d4}\t\t({1})\r\n", dat.NodeID, leString(dat.NodeID, 2)); richTextBox1.Text += string.Format("NodeFaces:\t{0:d6}\t\t({1})\r\n", dat.NodeFaces, leString(dat.NodeFaces, 4)); richTextBox1.Text += string.Format("unk1:\t\t{0:d6}\t\t({1})\r\n", dat.unk1, leString(dat.unk1, 4)); richTextBox1.Text += string.Format("unkf0:\t\t{0:F4}\r\n\r\n", dat.unkf0); } richTextBox1.Text += "\r\n\r\n"; } break; #endregion default: richTextBox1.Text += "\r\n [NO DATA]"; break; } }
private void loadModelTag(PakFile Pak, PakFile.PakTag Item, bool Specular, bool Force) { if (!this.Enabled) { this.Enabled = true; } tvRegions.Nodes.Clear(); if (renderer1.Running) { renderer1.Stop("Loading..."); } Refresh(); pak = Pak; item = Item; atpl = new Template(pak, item, true); isWorking = true; #region Build Tree TreeNode pNode = new TreeNode(atpl.Name) { Tag = atpl }; foreach (var obj in atpl.Objects) { if (obj._B903.VertCount == 0 /*&& obj.Submeshes == null*/) { continue; } //if (obj.BoundingBox.Length == 0) continue; pNode.Nodes.Add(new TreeNode(obj._B903.Name) { Tag = obj }); } if (pNode.Nodes.Count > 0) { tvRegions.Nodes.Add(pNode); } foreach (TreeNode node in tvRegions.Nodes) { node.Nodes[0].Checked = node.Checked = true; } #endregion isWorking = false; LoadS3DShaders(Specular); LoadS3DMeshes(Force); #region BoundingBox Stuff PerspectiveCamera camera = (PerspectiveCamera)renderer1.Viewport.Camera; var bb = new render_model.BoundingBox(); //bb.XBounds = new RealBounds(float.PositiveInfinity, float.NegativeInfinity); //bb.YBounds = new RealBounds(float.PositiveInfinity, float.NegativeInfinity); //bb.ZBounds = new RealBounds(float.PositiveInfinity, float.NegativeInfinity); //foreach (var obj in atpl.Objects) //{ // if (obj.VertCount == 0) continue; // bb.XBounds.Min = Math.Min(bb.XBounds.Min, obj.BoundingBox.XBounds.Min); // bb.YBounds.Min = Math.Min(bb.YBounds.Min, obj.BoundingBox.YBounds.Min); // bb.ZBounds.Min = Math.Min(bb.ZBounds.Min, obj.BoundingBox.ZBounds.Min); // bb.XBounds.Max = Math.Max(bb.XBounds.Max, obj.BoundingBox.XBounds.Max); // bb.YBounds.Max = Math.Max(bb.YBounds.Max, obj.BoundingBox.YBounds.Max); // bb.ZBounds.Max = Math.Max(bb.ZBounds.Max, obj.BoundingBox.ZBounds.Max); //} //bb.XBounds = new RealBounds(0, 50); //bb.YBounds = new RealBounds(0, 50); //bb.ZBounds = new RealBounds(0, 50); bb.XBounds = atpl.RenderBounds.XBounds; bb.YBounds = atpl.RenderBounds.ZBounds; bb.ZBounds = atpl.RenderBounds.YBounds; if (bb.XBounds.Length / 2 > (bb.YBounds.Length)) //side view for long models like weapons { var p = new Point3D( bb.XBounds.MidPoint, bb.YBounds.Max + bb.Length * 0.75, bb.ZBounds.MidPoint); renderer1.MoveCamera(p, new Vector3D(0, 0, -2)); } else //normal camera position { var p = new Point3D( bb.XBounds.Max + bb.Length * 0.75, bb.YBounds.MidPoint, bb.ZBounds.MidPoint); renderer1.MoveCamera(p, new Vector3D(-1, 0, 0)); } renderer1.CameraSpeed = Math.Ceiling(bb.Length * 5) / 1000; renderer1.MaxCameraSpeed = Math.Ceiling(bb.Length * 5) * 7 / 1000; renderer1.MaxPosition = new Point3D( bb.XBounds.Max + bb.Length * 3, bb.YBounds.Max + bb.Length * 3, bb.ZBounds.Max + bb.Length * 3); renderer1.MinPosition = new Point3D( bb.XBounds.Min - bb.Length * 3, bb.YBounds.Min - bb.Length * 3, bb.ZBounds.Min - bb.Length * 3); renderer1.FarPlaneMin = 100; renderer1.FarPlane = 1000; renderer1.FarPlaneMax = 5000; #endregion RenderSelected(); renderer1.Start(); }
private void loadBspTag(PakFile Pak, PakFile.PakTag Item, bool Specular, bool Force) { if (!this.Enabled) { this.Enabled = true; } tvRegions.Nodes.Clear(); if (renderer1.Running) { renderer1.Stop("Loading..."); } Refresh(); pak = Pak; item = Item; atpl = new Scene(pak, item, true); var shList = new List <int>(); isWorking = true; SceneCDT cdt = null; foreach (var tag in pak.PakItems) { if (tag.Class == TagType.SceneCDT) { cdt = new SceneCDT(pak, tag); break; } } List <int> IDs = new List <int>(); foreach (var dat in cdt.sets[0].unkS0) { IDs.Add(dat.NodeID); } #region Build Tree #region non-shared nodes TreeNode pNode = new TreeNode(atpl.Name) { Tag = atpl }; foreach (var obj in atpl.Objects) { if (obj.isInherited || obj.isInheritor) { continue; } if (obj._2E01 == null) { continue; } pNode.Nodes.Add(new TreeNode(obj._B903.Name) { Tag = obj }); foreach (var sub in obj.Submeshes) { if (!shList.Contains(sub.MaterialIndex)) { shList.Add(sub.MaterialIndex); } } } if (pNode.Nodes.Count > 0) { tvRegions.Nodes.Add(pNode); } #endregion #region shared nodes foreach (var pObj in atpl.Objects) { if (!pObj.isInherited) { continue; } TreeNode iNode = new TreeNode(pObj._B903.Name) { Tag = pObj }; foreach (var cObj in atpl.Objects) { if (!cObj.isInheritor) { continue; } if (cObj._2901.InheritID == pObj._B903.ID) { var newnode = new TreeNode(string.Format("[{0}] {1}", cObj._B903.ID.ToString("d4"), cObj._B903.Name)) { Tag = cObj }; iNode.Nodes.Add(newnode); if (IDs.Contains(cObj._B903.ID)) { newnode.Checked = iNode.Checked = true; } foreach (var sub in cObj.Submeshes) { if (!shList.Contains(sub.MaterialIndex)) { shList.Add(sub.MaterialIndex); } } } } if (iNode.Nodes.Count > 0) { tvRegions.Nodes.Add(iNode); } } #endregion //foreach (TreeNode node in tvRegions.Nodes) // node.Nodes[0].Checked = node.Checked = true; //tvRegions.Sort(); //much easier for looking through IGs #endregion isWorking = false; #region Load Stuff LoadS3DShaders(false, shList); LoadS3DMeshes(Force); #endregion #region BoundingBox Stuff PerspectiveCamera camera = (PerspectiveCamera)renderer1.Viewport.Camera; var XBounds = atpl._2002.Bounds.XBounds; var YBounds = atpl._2002.Bounds.ZBounds; var ZBounds = atpl._2002.Bounds.YBounds; #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( atpl.RenderBounds.XBounds.Max + pythagoras3d * 2, atpl.RenderBounds.YBounds.Max + pythagoras3d * 2, atpl.RenderBounds.ZBounds.Max + pythagoras3d * 2); renderer1.MinPosition = new Point3D( atpl.RenderBounds.XBounds.Min - pythagoras3d * 2, atpl.RenderBounds.YBounds.Min - pythagoras3d * 2, atpl.RenderBounds.ZBounds.Min - pythagoras3d * 2); renderer1.FarPlaneMin = 100; renderer1.FarPlane = 1000; renderer1.FarPlaneMax = 5000; #endregion renderer1.Start(); RenderSelected(); }