private static void SplitNode(MeshTreeNode meshTreeNode, int numberOfFragments) { // TODO: Refactor this. Vector3 centerOfMass = MeshUpgrade.CalculateCenterOfMass(meshTreeNode.Mesh); meshTreeNode.CenterOfMass = centerOfMass; meshTreeNode.Mass = MeshUpgrade.CalculateMass(meshTreeNode.Mesh); if (numberOfFragments == NUMBER_OF_FRAGMENTS) { //Debug.Log(String.Format("CenterOfMass{0}", centerOfMass.ToString())); //Debug.Log(String.Format("Mass{0}", centerOfMass.ToString())); } if (numberOfFragments < NUMBER_OF_FRAGMENTS) { Vector3 random1 = centerOfMass + new Vector3(Random.Range(-0.5f, 0.5f), 0.5f, Random.Range(-0.5f, 0.5f)); Vector3 random2 = centerOfMass + new Vector3(Random.Range(-0.5f, 0.5f), 0.5f, Random.Range(-0.5f, 0.5f)); Plane planeCenter = new Plane(centerOfMass, random1, random2); Mesh[] slicedMeshResults = SliceMesh(planeCenter, meshTreeNode.Mesh); meshTreeNode.Left = new MeshTreeNode(slicedMeshResults[POSITIVE]); meshTreeNode.Right = new MeshTreeNode(slicedMeshResults[NEGATIVE]); numberOfFragments *= 2; SplitNode(meshTreeNode.Left, numberOfFragments); SplitNode(meshTreeNode.Right, numberOfFragments); } }
// TODO: Upgrade for non 2base version of number of fragments. private static void VisitAndGenerateMinimalMeshTrees(MeshTreeNode root) { if (root.IsLeaf()) { return; } VisitAndGenerateMinimalMeshTrees(root.Left); VisitAndGenerateMinimalMeshTrees(root.Right); if (root.Left.IsMinmal && root.Right.IsMinmal) { root.IsMinmal = true; } }
private static void InitMeshTreeNodes(MeshTreeNode rootTreeNode) { LinkedList <MeshTreeNode> nodesToVisit = new LinkedList <MeshTreeNode>(); nodesToVisit.AddLast(rootTreeNode); while (nodesToVisit.Count != 0) { MeshTreeNode visitNode = nodesToVisit.First.Value; nodesToVisit.RemoveFirst(); visitNode.Reset(); if (visitNode.Left != null) { nodesToVisit.AddLast(visitNode.Left); } if (visitNode.Right != null) { nodesToVisit.AddLast(visitNode.Right); } } }
List <MeshTreeNode> GetMinimalMeshTrees(BCRBGraph graph) { List <MeshTreeNode> minimalMeshTrees = new List <MeshTreeNode>(); LinkedList <MeshTreeNode> visitNodes = new LinkedList <MeshTreeNode>(); InitMeshTreeNodes(MeshTreeRoot); foreach (MeshTreeNode fragment in graph.Fragments) { fragment.IsMinmal = true; } VisitAndGenerateMinimalMeshTrees(MeshTreeRoot); visitNodes.AddLast(MeshTreeRoot); while (visitNodes.Count != 0) { MeshTreeNode visitNode = visitNodes.First.Value; visitNodes.RemoveFirst(); if (visitNode.IsMinmal) { minimalMeshTrees.Add(visitNode); } else { if (visitNode.Left != null) { visitNodes.AddLast(visitNode.Left); } if (visitNode.Right != null) { visitNodes.AddLast(visitNode.Right); } } } return(minimalMeshTrees); }