public ChanceTree Extract(ChanceTree ct, int position)
        {
            if (position >= ct.PlayersCount)
            {
                throw new ArgumentOutOfRangeException(
                          string.Format("Position {0} is out of range (players count: {1})", position, ct.PlayersCount));
            }
            _position = position;

            WalkUFTreePP <ChanceTree, Context> wt = new WalkUFTreePP <ChanceTree, Context>();

            wt.OnNodeBegin = OnNodeBegin;

            _nodeCount = 0;
            _tempRoot  = new TempNode {
                Card = -1, Probab = 1
            };

            wt.Walk(ct);

            ChanceTree newTree = new ChanceTree(_nodeCount + 1);

            // Reset memory to clear results.
            newTree.SetNodesMemory(0);

            _nodeCount = 0;
            CopyFromTemp(newTree, _tempRoot, 0);

            // Overwrite root position
            newTree.Nodes[0].Position = 1;

            newTree.Version.Description = String.Format("Player {0} chance tree from {1}", position, ct.Version.Description);

            return(newTree);
        }
Example #2
0
        private void treeView1_DoubleClick(object sender, EventArgs e)
        {
            TempNode tempNode = (TempNode)this.treeView1.SelectedNode;

            if (tempNode == null)
            {
                return;
            }
            string arg_1B_0 = tempNode.NodeID;
            string arg_22_0 = tempNode.Text;
            string filePath = tempNode.FilePath;
            string nodeType = tempNode.NodeType;
            string a;

            if ((a = nodeType) != null && (a == "tt" || a == "cmt" || a == "vb" || a == "aspx" || a == "cs"))
            {
                if (filePath.Trim() != "")
                {
                    string text = filePath.Replace(this.TemplateFolder + "\\", "");
                    if (!this.hasTheFile(text))
                    {
                        this.listBoxTemplate.Items.Add(text);
                    }
                }
                else
                {
                    MessageBox.Show("所选文件已经不存在!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                }
            }
            this.CheckTemplate();
        }
Example #3
0
 private void 打开ToolStripMenuItem_Click(object sender, EventArgs e)
 {
     try
     {
         TempNode SelNode  = (TempNode)this.treeView1.SelectedNode;
         string   selstr   = SelNode.Text;
         string   filepath = SelNode.FilePath;
         if (filepath.Trim() != "")
         {
             CodeTemplate codetempfrm = (CodeTemplate)Application.OpenForms["CodeTemplate"];
             if (codetempfrm != null)
             {
                 codetempfrm.SettxtTemplate(filepath);
             }
             else
             {
                 MessageBox.Show("尚未打开模版代码生成编辑器!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
             }
         }
         else
         {
             MessageBox.Show("所选文件已经不存在!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
         }
     }
     catch (System.Exception ex)
     {
         MessageBox.Show(ex.Message);
     }
 }
        void OnNodeBegin(ChanceTree tree, Context[] stack, int depth)
        {
            Context context = stack[depth];
            Int64   n       = context.NodeIdx;

            if (depth == 0)
            {
                stack[depth].CurTempNode = _tempRoot;
            }
            else
            {
                stack[depth].CurTempNode = stack[depth - 1].CurTempNode;
            }

            if (tree.Nodes[n].Position == _position)
            {
                int      card = tree.Nodes[n].Card;
                TempNode childTempNode;
                if (!stack[depth].CurTempNode.Children.TryGetValue(card, out childTempNode))
                {
                    childTempNode = new TempNode {
                        Card = card
                    };
                    stack[depth].CurTempNode.Children.Add(card, childTempNode);
                    _nodeCount++;
                }
                childTempNode.Probab    += tree.Nodes[n].Probab;
                stack[depth].CurTempNode = childTempNode;
            }
        }
Example #5
0
 /// -----------------------------------------------------------------------------
 /// <summary>
 ///
 /// </summary>
 /// <param name="writer"></param>
 /// <remarks>
 /// </remarks>
 /// <history>
 ///     [jbrinkman]	5/6/2004	Created
 /// </history>
 /// -----------------------------------------------------------------------------
 protected override void RenderChildren(HtmlTextWriter writer)
 {
     foreach (MenuNode TempNode in m_objMenu.MenuNodes)
     {
         TempNode.Render(writer);
     }
 }
Example #6
0
        //邦定任意节点
        public void CreateNode(int parentid, TreeNode parentnode, DataTable dt)
        {
            DataRow[] drs = dt.Select("ParentID= " + parentid); //选出所有子节点
            foreach (DataRow r in drs)
            {
                string nodeid   = r["NodeID"].ToString();
                string text     = r["Text"].ToString();
                string filepath = r["FilePath"].ToString();
                string nodetype = r["NodeType"].ToString();

                TempNode node = new TempNode(text);
                node.NodeID   = nodeid;
                node.NodeType = nodetype;
                node.FilePath = filepath;
                if (nodetype == "folder")
                {
                    node.ImageIndex         = 0;
                    node.SelectedImageIndex = 1;
                }
                else
                {
                    node.ImageIndex         = 2;
                    node.SelectedImageIndex = 2;
                }

                parentnode.Nodes.Add(node);

                int sonparentid = int.Parse(nodeid);// or =location
                CreateNode(sonparentid, node, dt);
            }//endforeach
        }
Example #7
0
 private void  除ToolStripMenuItem_Click(object sender, EventArgs e)
 {
     try
     {
         TempNode tempNode = (TempNode)this.treeView1.SelectedNode;
         string   arg_17_0 = tempNode.NodeID;
         string   arg_1E_0 = tempNode.Text;
         string   filePath = tempNode.FilePath;
         string   nodeType = tempNode.NodeType;
         if ((nodeType == "tt" || nodeType == "cmt" || nodeType == "aspx" || nodeType == "cs" || nodeType == "vb") && File.Exists(filePath))
         {
             File.Delete(filePath);
         }
         if (nodeType == "folder")
         {
             DirectoryInfo directoryInfo = new DirectoryInfo(filePath);
             if (directoryInfo.Exists)
             {
                 directoryInfo.Delete();
             }
         }
         this.treeView1.Nodes.Remove(tempNode);
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message);
     }
 }
            public void CommitResult()
            {
                TempNode  tempNode  = File.TempNodes[memberName];
                TempValue tempValue = tempNode?[$"{path}/{index}"];

                tempValue?.Commit(Result);
            }
Example #9
0
 private void 模版ToolStripMenuItem_Click(object sender, EventArgs e)
 {
     try
     {
         TempNode tempNode = (TempNode)this.treeView1.SelectedNode;
         string   text     = tempNode.FilePath + "\\新建模板.cmt";
         string   text2    = "新建模板";
         text = this.GetFileName(tempNode.FilePath, text2, out text2);
         StreamWriter streamWriter = new StreamWriter(text, false, Encoding.UTF8);
         streamWriter.Close();
         TempNode tempNode2 = new TempNode(text2 + ".cmt");
         tempNode2.FilePath           = text;
         tempNode2.NodeType           = "cmt";
         tempNode2.ImageIndex         = 2;
         tempNode2.SelectedImageIndex = 2;
         tempNode.Nodes.Add(tempNode2);
         this.treeView1.SelectedNode = tempNode2;
         this.treeView1.LabelEdit    = true;
         if (!tempNode2.IsEditing)
         {
             tempNode2.BeginEdit();
         }
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message);
     }
 }
Example #10
0
 private void 文件夹ToolStripMenuItem_Click(object sender, EventArgs e)
 {
     try
     {
         TempNode tempNode = (TempNode)this.treeView1.SelectedNode;
         string   text     = tempNode.FilePath + "\\新文件夹";
         if (!Directory.Exists(text))
         {
             Directory.CreateDirectory(text);
         }
         TempNode tempNode2 = new TempNode("新文件夹");
         tempNode2.FilePath           = text;
         tempNode2.NodeType           = "folder";
         tempNode2.ImageIndex         = 0;
         tempNode2.SelectedImageIndex = 1;
         tempNode.Nodes.Add(tempNode2);
         tempNode.Expand();
         this.treeView1.SelectedNode = tempNode2;
         this.treeView1.LabelEdit    = true;
         if (!tempNode2.IsEditing)
         {
             tempNode2.BeginEdit();
         }
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message);
     }
 }
Example #11
0
 private void 编辑查看ToolStripMenuItem_Click(object sender, EventArgs e)
 {
     try
     {
         TempNode tempNode = (TempNode)this.treeView1.SelectedNode;
         string   arg_17_0 = tempNode.NodeID;
         string   text     = tempNode.Text;
         string   filePath = tempNode.FilePath;
         string   nodeType = tempNode.NodeType;
         if (filePath.Trim() != "" && nodeType != "folder")
         {
             if (File.Exists(filePath))
             {
                 this.mainfrm.AddTabPage(text, new CodeEditor(filePath, nodeType, false));
             }
         }
         else
         {
             MessageBox.Show("所选文件已经不存在!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
         }
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message);
     }
 }
Example #12
0
 /// -----------------------------------------------------------------------------
 /// <summary>
 ///
 /// </summary>
 /// <param name="writer"></param>
 /// <remarks>
 /// </remarks>
 /// <history>
 ///     [jbrinkman]	5/6/2004	Created
 /// </history>
 /// -----------------------------------------------------------------------------
 protected override void RenderChildren(HtmlTextWriter writer)
 {
     foreach (TreeNode TempNode in _tree.TreeNodes)
     {
         TempNode.Render(writer);
     }
 }
Example #13
0
        private void  除ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                TempNode SelNode  = (TempNode)this.treeView1.SelectedNode;
                string   nodeid   = SelNode.NodeID;
                string   text     = SelNode.Text;
                string   filepath = SelNode.FilePath;
                string   nodetype = SelNode.NodeType;

                //从ds删除一条数据
                foreach (DataRow row in ds.Tables[0].Select("NodeID='" + nodeid + "'"))
                {
                    ds.Tables[0].Rows.Remove(row);
                }
                ds.Tables[0].AcceptChanges();
                ds.WriteXml(tempfilepath);
                if (nodetype == "file")
                {
                    if (File.Exists(filepath))
                    {
                        File.Delete(filepath);
                    }
                }

                //删除节点
                treeView1.Nodes.Remove(SelNode);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
Example #14
0
        //新建模版文件
        private void 模版ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                TempNode SelNode = (TempNode)this.treeView1.SelectedNode;
                string   nodeid  = SelNode.NodeID;

                int orderid = 1;
                if (SelNode != null)
                {
                    orderid = SelNode.Nodes.Count + 1;
                }
                string newNodeid = GetMaxNodeID(ds.Tables[0]);
                //向ds增加一条数据
                DataRow newRow = ds.Tables[0].NewRow();
                newRow["NodeID"] = newNodeid;
                newRow["Text"]   = "新建模版";
                string filepath = "新建模版.cmt";
                if ((settings.TemplateFolder != null) && (settings.TemplateFolder != ""))
                {
                    filepath = settings.TemplateFolder + "\\" + filepath;
                }
                else
                {
                    filepath = "Template\\新建模版.cmt";
                }

                // 是否已经存在
                //while (File.Exists(filepath))
                //{
                //}

                newRow["FilePath"] = filepath;
                newRow["NodeType"] = "file";
                newRow["ParentID"] = nodeid;
                newRow["OrderID"]  = orderid;
                ds.Tables[0].Rows.Add(newRow);
                ds.Tables[0].AcceptChanges();
                ds.WriteXml(tempfilepath);

                File.Create(filepath);

                //在treeview上增加一个节点
                TempNode node = new TempNode("新建模版");
                node.NodeID             = newNodeid;
                node.ParentID           = nodeid;
                node.FilePath           = filepath;
                node.NodeType           = "file";
                node.ImageIndex         = 2;
                node.SelectedImageIndex = 2;
                SelNode.Nodes.Add(node);
                SelNode.Expand();
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void Btn_ClassSetting_Click(object sender, RoutedEventArgs e)
        {
            if (CurrentResourceInfo.BaseType == null)
            {
                EditorCommon.MessageBox.Show("找不到当前Macross的基类");
                return;
            }

            if (mClassSettingPropertiesClassInstance == null)
            {
                var atts   = CurrentResourceInfo.BaseType.GetCustomAttributes(typeof(EngineNS.Editor.Editor_MacrossClassAttribute), true);
                var att    = atts[0] as EngineNS.Editor.Editor_MacrossClassAttribute;
                var csType = att.CSType;
                List <CodeGenerateSystem.Base.CustomPropertyInfo> cpInfos = new List <CodeGenerateSystem.Base.CustomPropertyInfo>();

                var baseTypeCPInfo = new CodeGenerateSystem.Base.CustomPropertyInfo()
                {
                    PropertyName = "BaseType",
                    PropertyType = typeof(Type),
                    DefaultValue = CurrentResourceInfo.BaseType,
                    CurrentValue = CurrentResourceInfo.BaseType,
                };
                // Editor.Editor_BaseTypeDefine 限定类型基类
                baseTypeCPInfo.PropertyAttributes.Add(new EngineNS.Editor.Editor_TypeFilterAttribute(EngineNS.Editor.Editor_TypeFilterAttribute.enTypeFilter.Class, EngineNS.Editor.Editor_MacrossClassAttribute.enMacrossType.Inheritable));

                cpInfos.Add(baseTypeCPInfo);

                var initParam = new CodeGenerateSystem.Base.ConstructionParams()
                {
                    CSType = csType,
                };
                var tempNode = new TempNode(initParam);
                mClassSettingPropertiesClassInstance = CodeGenerateSystem.Base.PropertyClassGenerator.CreateClassInstanceFromCustomPropertys(cpInfos, tempNode, "MCSetting_" + EngineNS.Editor.Assist.GetValuedGUIDString(Guid.NewGuid()), false);
                var classType = mClassSettingPropertiesClassInstance.GetType();
                //var classType = CodeGenerateSystem.Base.PropertyClassGenerator.CreateTypeFromCustomPropertys(cpInfos, "MacrossClassSettingDynamicAssembly", );
                //mClassSettingPropertiesClassInstance = System.Activator.CreateInstance(classType) as CodeGenerateSystem.Base.GeneratorClassBase;
                //mClassSettingPropertiesClassInstance.CSType = csType;
                foreach (var cpInfo in cpInfos)
                {
                    var pro = classType.GetProperty(cpInfo.PropertyName);
                    pro.SetValue(mClassSettingPropertiesClassInstance, cpInfo.CurrentValue, null);
                }

                mClassSettingPropertiesClassInstance.OnPropertyChangedAction = (propertyName, newValue, oldValue) =>
                {
                    switch (propertyName)
                    {
                    case "BaseType":
                        CurrentResourceInfo.ResetBaseType((Type)newValue);
                        break;
                    }
                };
            }

            var ctrl = LinksTabControl.SelectedContent as MacrossLinkControl;

            ctrl.PG.Instance = mClassSettingPropertiesClassInstance;
        }
        public void CanDetermineIfHierarchyContainsANodeType()
        {
            TempNode node = new TempNode("Child");
            ApplicationNode.AddNode(node);
            node.AddNode(new TestNode("Child2"));
            node.Nodes[0].AddNode(new TempNode("Child"));

            Assert.IsTrue(Hierarchy.ContainsNodeType(typeof(TempNode)));
        }
		public void CreatingHierarchyWithPopulatedRootNodeSetsSites()
		{
			ConfigurationApplicationNode node1 = new ConfigurationApplicationNode(ConfigurationApplicationFile.FromCurrentAppDomain());
			TempNode node2 = new TempNode("2");
			node1.AddNode(node2);
			ConfigurationUIHierarchy hierarchy = new ConfigurationUIHierarchy(node1, ServiceProvider);

			Assert.IsNotNull(node2.Site);
		}
Example #18
0
        public void CreatingHierarchyWithPopulatedRootNodeSetsSites()
        {
            ConfigurationApplicationNode node1 = new ConfigurationApplicationNode(ConfigurationApplicationFile.FromCurrentAppDomain());
            TempNode node2 = new TempNode("2");

            node1.AddNode(node2);
            ConfigurationUIHierarchy hierarchy = new ConfigurationUIHierarchy(node1, ServiceProvider);

            Assert.IsNotNull(node2.Site);
        }
Example #19
0
        public void FindGrandChildNodeByType()
        {
            TempNode node = new TempNode("Child");

            ApplicationNode.AddNode(node);
            node.AddNode(new TempNode("Child"));
            IList <ConfigurationNode> foundNodes = Hierarchy.FindNodesByType(typeof(TempNode));

            Assert.AreEqual(2, foundNodes.Count);
        }
Example #20
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="writer"></param>
        /// <remarks>
        /// </remarks>
        /// <history>
        ///     [jbrinkman]	5/6/2004	Created
        /// </history>
        protected override void RenderChildren(HtmlTextWriter writer)
        {
            MenuNode TempNode;

            foreach (MenuNode tempLoopVar_TempNode in m_objMenu.MenuNodes)
            {
                TempNode = tempLoopVar_TempNode;
                TempNode.Render(writer);
            }
        }
Example #21
0
        public void CanDetermineIfAParentInTheHierarchyContainsANodeType()
        {
            TempNode node = new TempNode("Child");

            ApplicationNode.AddNode(node);
            node.AddNode(new TestNode("Child2"));
            node.Nodes[0].AddNode(new TempNode("Child"));

            Assert.IsTrue(Hierarchy.ContainsNodeType(node, typeof(TempNode)));
        }
Example #22
0
        public void TempNodeGet()
        {
            TempNode n1, n2;

            n1 = new TempNode(71, 111);
            n2 = new TempNode(7.1, 21.1);

            Assert.IsTrue(n1.GetTemperature() == (byte)111);
            Assert.IsTrue(n2.GetTemperature() == (byte)111);
            Assert.IsTrue(n2.GetTime() == (byte)71);
        }
Example #23
0
        public void TempNodeCompareTo()
        {
            TempNode n1, n2, n3;

            n1 = new TempNode(71, 111);
            n2 = new TempNode(7.1, 21.1);
            n3 = new TempNode(17.4, 25.5);

            Assert.IsTrue(n1.CompareTo(n2) == 0);
            Assert.IsTrue(n1.CompareTo(n3) < 0);
            Assert.IsTrue(n3.CompareTo(n2) > 0);
        }
Example #24
0
        public void FindByTypeGrandGrandChildTest()
        {
            TempNode node = new TempNode("Child");

            ApplicationNode.AddNode(node);
            TempNode deepNode = new TempNode("Child");

            node.AddNode(deepNode);
            deepNode.AddNode(new AnotherNode("Another"));
            IList <ConfigurationNode> foundNodes = Hierarchy.FindNodesByType(typeof(AnotherNode));

            Assert.AreEqual(1, foundNodes.Count);
        }
Example #25
0
        private void CreateFolderTree(string templateFolder)
        {
            this.treeView1.Nodes.Clear();
            TempNode tempNode = new TempNode("代码模版");

            tempNode.NodeType           = "root";
            tempNode.FilePath           = templateFolder;
            tempNode.ImageIndex         = 0;
            tempNode.SelectedImageIndex = 0;
            tempNode.Expand();
            this.treeView1.Nodes.Add(tempNode);
            this.LoadFolderTree(tempNode, templateFolder);
        }
 public override bool Equals(Object obj)
 {
     //Check for null and compare run-time types.
     if ((obj == null) || !this.GetType().Equals(obj.GetType()))
     {
         return(false);
     }
     else
     {
         TempNode other = (TempNode)obj;
         return((x == other.x) && (y == other.y) && (z == other.z));
     }
 }
Example #27
0
        private void AddNode(List <TempNode> children, TempNode node)
        {
            foreach (var root in children)
            {
                if (IsChild(root, node))
                {
                    AddNode(root.Children, node);
                    return;
                }
            }

            children.Add(node);
        }
Example #28
0
        public async Task MigrateToLowestThenHighest()
        {
            using (var ipfs = new TempNode())
            {
                var migrator = new MigrationManager(ipfs);
                await migrator.MirgrateToVersionAsync(0);

                Assert.AreEqual(0, migrator.CurrentVersion);

                await migrator.MirgrateToVersionAsync(migrator.LatestVersion);

                Assert.AreEqual(migrator.LatestVersion, migrator.CurrentVersion);
            }
        }
        void CopyFromTemp(ChanceTree newTree, TempNode tempNode, int depth)
        {
            newTree.SetDepth(_nodeCount, (byte)depth);
            newTree.Nodes[_nodeCount].Card     = tempNode.Card;
            newTree.Nodes[_nodeCount].Probab   = tempNode.Probab;
            newTree.Nodes[_nodeCount].Position = 0;
            _nodeCount++;
            List <int> cards = new List <int>(tempNode.Children.Keys.ToArray());

            cards.Sort();
            foreach (int card in cards)
            {
                CopyFromTemp(newTree, tempNode.Children[card], depth + 1);
            }
        }
Example #30
0
        public void TempNodeEquals()
        {
            TempNode n1, n2, n3, n4;

            n1 = new TempNode(71, 111);
            n2 = new TempNode(7.1, 21.1);
            n3 = new TempNode(71, 200);
            n4 = new TempNode(n1);

            Assert.AreEqual(n1, n2);
            Assert.AreEqual(n1, n3);
            Assert.AreEqual(n3, n2);
            Assert.AreEqual(n1, n4);
            Assert.IsTrue(n1.GetTemperature() == n2.GetTemperature());
            Assert.IsFalse(n3.GetTemperature() == n2.GetTemperature());
        }
Example #31
0
        private void treeView1_DoubleClick(object sender, EventArgs e)
        {
            TempNode tempNode = (TempNode)this.treeView1.SelectedNode;
            string   arg_17_0 = tempNode.NodeID;
            string   nodeType = tempNode.NodeType;
            string   a;

            if ((a = nodeType) != null)
            {
                if (!(a == "tt") && !(a == "cmt") && !(a == "vb") && !(a == "aspx") && !(a == "cs"))
                {
                    return;
                }
                this.打开生成ToolStripMenuItem_Click(sender, e);
            }
        }
Example #32
0
        public void FindByTypeTwoTopSearchFromOneLowerChildTest()
        {
            TempNode node = new TempNode("Child");

            ApplicationNode.AddNode(node);
            TempNode node2 = new TempNode("Child");
            TempNode node3 = new TempNode("Child");

            ApplicationNode.AddNode(node2);
            node2.AddNode(node3);
            node3.AddNode(new AnotherNode("Child"));
            node3.AddNode(new AnotherNode("Another"));
            IList <ConfigurationNode> foundNodes = Hierarchy.FindNodesByType(typeof(AnotherNode));

            Assert.AreEqual(2, foundNodes.Count);
        }
        public void FindGrandChildNodeByType()
        {
            TempNode node = new TempNode("Child");
            ApplicationNode.AddNode(node);
            node.AddNode(new TempNode("Child"));
            IList<ConfigurationNode> foundNodes = Hierarchy.FindNodesByType(typeof(TempNode));

            Assert.AreEqual(2, foundNodes.Count);
        }
        public void FindByTypeGrandGrandChildTest()
        {
            TempNode node = new TempNode("Child");
            ApplicationNode.AddNode(node);
            TempNode deepNode = new TempNode("Child");
            node.AddNode(deepNode);
            deepNode.AddNode(new AnotherNode("Another"));
            IList<ConfigurationNode> foundNodes = Hierarchy.FindNodesByType(typeof(AnotherNode));

            Assert.AreEqual(1, foundNodes.Count);
        }
        public void FindByTypeTwoTopSearchFromOneLowerChildTest()
        {
            TempNode node = new TempNode("Child");
            ApplicationNode.AddNode(node);
            TempNode node2 = new TempNode("Child");
            TempNode node3 = new TempNode("Child");
            ApplicationNode.AddNode(node2);
            node2.AddNode(node3);
            node3.AddNode(new AnotherNode("Child"));
            node3.AddNode(new AnotherNode("Another"));
            IList<ConfigurationNode> foundNodes = Hierarchy.FindNodesByType(typeof(AnotherNode));

            Assert.AreEqual(2, foundNodes.Count);
        }
 public static int Add(ref TempNode newNode, TempNode* tempNodes, ref int count)
 {
     tempNodes[count] = newNode;
     return count++;
 }
        unsafe void CollapseTree(int depthRemaining, TempNode* tempNodes, int tempNodeIndex, int* nodeChildren, ref int childCount, BoundingBox* nodeBounds, int* leafCounts)
        {
            var tempNode = tempNodes + tempNodeIndex;
            if (tempNode->A >= 0)
            {

                //Internal node.
                if (depthRemaining > 0)
                {
                    depthRemaining -= 1;
                    CollapseTree(depthRemaining, tempNodes, tempNode->A, nodeChildren, ref childCount, nodeBounds, leafCounts);
                    CollapseTree(depthRemaining, tempNodes, tempNode->B, nodeChildren, ref childCount, nodeBounds, leafCounts);
                }
                else
                {
                    //Reached the bottom of the recursion. Add the collected children.
                    int a = childCount++;
                    int b = childCount++;

                    nodeBounds[a] = tempNodes[tempNode->A].BoundingBox;
                    nodeBounds[b] = tempNodes[tempNode->B].BoundingBox;
                    //If the child is a leaf, collapse it. Slightly less annoying to handle it here than later.
                    //This is a byproduct of the awkward data layout for tempnodes...
                    if (tempNodes[tempNode->A].A >= 0)
                        nodeChildren[a] = tempNode->A;
                    else
                        nodeChildren[a] = tempNodes[tempNode->A].A; //It's a leaf.
                    if (tempNodes[tempNode->B].A >= 0)
                        nodeChildren[b] = tempNode->B;
                    else
                        nodeChildren[b] = tempNodes[tempNode->B].A; //It's a leaf. Leaf index is always stored in A...

                    leafCounts[a] = tempNodes[tempNode->A].LeafCount;
                    leafCounts[b] = tempNodes[tempNode->B].LeafCount;

                }

            }
            else
            {
                //Leaf node.
                var index = childCount++;
                nodeBounds[index] = tempNode->BoundingBox;
                nodeChildren[index] = tempNode->A;
                leafCounts[index] = tempNode->LeafCount;
            }
        }
        unsafe int BuildStagingChild(int parent, int indexInParent, TempNode* tempNodes, int tempNodeIndex, int collapseCount,
            Node* stagingNodes, ref int stagingNodeCount, out float treeletCost)
        {
            //Get ready to build a staging node out of this.

            var internalNodeIndex = stagingNodeCount++;
            var internalNode = stagingNodes + internalNodeIndex;
            internalNode->Parent = parent;
            internalNode->IndexInParent = indexInParent;
            internalNode->ChildCount = 0;

            var internalNodeChildren = &internalNode->ChildA;
            var internalNodeBounds = &internalNode->A;

            CollapseTree(collapseCount, tempNodes, tempNodeIndex, internalNodeChildren, ref internalNode->ChildCount, internalNodeBounds, &internalNode->LeafCountA);

            treeletCost = 0;
            //ValidateLeafNodeIndices();

            //The node now contains valid bounding boxes, but the children indices are not yet valid. They're pointing into the tempnodes.
            //Reify each one in sequence.
            for (int i = 0; i < internalNode->ChildCount; ++i)
            {
                treeletCost += ComputeBoundsMetric(ref internalNodeBounds[i]);
                //The internalNodeChildren[i] can be negative, as a result of a subtree being encountered in CollapseTree.
                //tempNodes[internalNodeChildren[i]].A is never negative for any internal node (internalNodeChildren[i] >= 0),
                //because we pre-collapsed that reference in CollapseTree for convenience.

                if (internalNodeChildren[i] >= 0)
                {
                    //It's still an internal node.
                    float childTreeletCost;
                    var childIndex = BuildStagingChild(internalNodeIndex, i, tempNodes, internalNodeChildren[i], collapseCount, stagingNodes, ref stagingNodeCount, out childTreeletCost);
                    treeletCost += childTreeletCost;

                    internalNodeChildren[i] = childIndex;

                }
                //If it's a subtree, then we don't need to change it at all.
            }
            return internalNodeIndex;
        }