Exemplo n.º 1
0
 public void onLineHitBarrier(GameObject gameObject)
 {
     MovingLines--;
     linesConnectedwithBarriers++;
     if (linesConnectedwithBarriers == 2)
     {
         SceneManager.CollisionPoint collisionPoint = SceneManager.instance.AddCollidingObject(new GameObject[] { line1.gameObject, line2.gameObject }, transform.localPosition, false);
         MeshGenerator.instance.generateMesh(collisionPoint);
     }
 }
Exemplo n.º 2
0
    public void generateMesh(SceneManager.CollisionPoint startPoint)
    {
        List <CollisionNode> collisionGraph = new List <CollisionNode>();

        // TODO: do the same search for collision tracker2
        CollisionNode collisionNode1 = new CollisionNode();

        collisionNode1.objs           = startPoint.objects;
        collisionNode1.CollisionPoint = startPoint.point;

        collisionGraph.Add(collisionNode1);

        List <GameObject> exploredObjects = new List <GameObject>();

        List <CollisionNode>[] completeRoutes = new List <CollisionNode> [2];

        // breadth first search for graph creation
        int i = 0;

        while (i < collisionGraph.Count)
        {
            List <CollisionNode> collisionsAlreadyInGraph = new List <CollisionNode>();
            // loop through both of the objects of the node
            foreach (GameObject exploringObj in collisionGraph[i].objs)
            {
                // if the object looking into has already been explored, then there is no need to explore it
                if (exploredObjects.Exists(n => n.GetInstanceID() == exploringObj.GetInstanceID()))
                {
                    continue;
                }

                // find the objects the current node object is colliding with. Add it to the collision graph if it does not exist yet
                foreach (SceneManager.CollisionPoint collisionPoint in SceneManager.instance.collisionPoints)
                {
                    // we only want to explore the collisions that involve the object we are currently exploring
                    if (!Array.Exists(collisionPoint.objects, o => o.GetInstanceID() == exploringObj.GetInstanceID()))
                    {
                        continue;
                    }

                    // if the collision already exists in our collision graph then we do not want to add it again
                    if (collisionGraph.Exists(n => n.CollisionPoint == collisionPoint.point) && collisionGraph.Count >= 4)
                    {
                        collisionsAlreadyInGraph.Add(collisionGraph.Find(n => n.CollisionPoint == collisionPoint.point));

                        // while exploring an object, if at least 2 of the collisions for that obejct are already in the collision graph then the graph has circled and a mesh can be made
                        // TODO: What happens when collisionsAlreadyInGraph has more than 2 count
                        if (collisionsAlreadyInGraph.Count == 2)
                        {
                            VerticesAndMeshes vAndM   = getListOfConnectingGameObjects(collisionGraph, collisionsAlreadyInGraph);
                            GameObject        meshObj = Instantiate(topMesh, Vector3.zero, Quaternion.identity);
                            TopMesh           mesh    = meshObj.GetComponent <TopMesh>();
                            bool wasMeshCreated       = mesh.generateMesh(vAndM.vertices);

                            // if the mesh intersects one of the sweets, delete it.
                            // otherwise merge it with the meshes that it intersects with and break because it is only possible for 1 top mesh to be successfully created

                            if (wasMeshCreated)
                            {
                                Debug.Log("Merging Meshes");

                                // remove any border corner collisions that are covered by the topmesh
                                foreach (SceneManager.CollisionPoint point in SceneManager.instance.collisionPoints)
                                {
                                    if (Array.Exists(vAndM.vertices, v => new Vector2(v.x, v.y) == point.point) && point.isBorder == true)
                                    {
                                        Debug.Log(SceneManager.instance.collisionPoints.RemoveAll(cp => cp.point == point.point));
                                    }
                                }
                                Debug.Log("done");
                                mergeMeshes(vAndM.meshes, topMesh);

                                // it is only possible for one top mesh to be generated successfully. So if it was generated then there is no need to continue
                                return;
                            }


                            // }
                        }
                        continue;
                    }

                    // the object that the object we are exploring is colliding with
                    GameObject childObj = Array.Find(collisionPoint.objects, o => o.GetInstanceID() != exploringObj.GetInstanceID());

                    // create a new node and add it to the graph
                    CollisionNode newNode = new CollisionNode();
                    newNode.objs           = collisionPoint.objects;
                    newNode.parentNode     = collisionGraph[i];
                    newNode.CollisionPoint = collisionPoint.point;
                    collisionGraph.Add(newNode);
                }
                exploredObjects.Add(exploringObj);
            }
            i++;
        }

        // if a top mesh was not generated, then merge the two growing lines
        foreach (SceneManager.CollisionPoint collisionPoint in SceneManager.instance.collisionPoints)
        {
            // if (collisionPoint.objects.con)
        }
    }