コード例 #1
0
        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);
        }
コード例 #2
0
ファイル: ModelViewer.cs プロジェクト: YeeB3Warned/Delegate
 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;
     }
 }
コード例 #3
0
        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);
        }
コード例 #4
0
        public static Bitmap GetBitmapByTag(PakFile Pak, PakFile.PakTag Item, PixelFormat PF)
        {
            var pict = new Texture(Pak, Item);

            return(GetBitmapByTag(Pak, pict, PF));
        }
コード例 #5
0
        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
            }
        }
コード例 #6
0
ファイル: S3DExplorer.cs プロジェクト: YeeB3Warned/Delegate
        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;
        }
コード例 #7
0
ファイル: S3DExplorer.cs プロジェクト: YeeB3Warned/Delegate
        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;
            }
        }
コード例 #8
0
ファイル: ModelViewer.cs プロジェクト: YeeB3Warned/Delegate
        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();
        }
コード例 #9
0
        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();
        }