예제 #1
0
    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);
        }
    }
예제 #2
0
    // 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;
        }
    }
예제 #3
0
    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);
            }
        }
    }
예제 #4
0
    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);
    }