Ejemplo n.º 1
0
 public TriangleMesh(VerticeMesh _first, VerticeMesh _second, VerticeMesh _third, int _indexMesh)
 {
     first     = _first;
     second    = _second;
     third     = _third;
     indexMesh = _indexMesh;
 }
    public void Convert()
    {
        List <TriangleMesh> trianglesMeshv2 = trianglesMesh;
        List <VerticeMesh>  verticesMeshv2  = verticesMesh;

        triangulation.ForEach(triangleTriangulation => {
            if (triangleTriangulation.first.origin.index < 0 || triangleTriangulation.second.origin.index < 0 || triangleTriangulation.third.origin.index < 0)
            {
                return;
            }
            VerticeMesh first  = verticesMeshv2.Find(verticeMesh => verticeMesh.indexMesh == triangleTriangulation.first.origin.index);
            VerticeMesh second = verticesMeshv2.Find(verticeMesh => verticeMesh.indexMesh == triangleTriangulation.second.origin.index);
            VerticeMesh third  = verticesMeshv2.Find(verticeMesh => verticeMesh.indexMesh == triangleTriangulation.third.origin.index);
            trianglesMeshv2.Add(new TriangleMesh(first, second, third, -1));
        });
        List <Vector3> verticesFinal  = new List <Vector3>();
        List <int>     trianglesFinal = new List <int>();

        Vector3[] vert = new Vector3[verticesMesh.Count()];
        verticesMesh.ForEach(verticeMesh => {
            vert[verticeMesh.indexMesh] = verticeMesh.position;
        });


        trianglesMesh.ForEach(triangleMesh => {
            trianglesFinal.Add(triangleMesh.first.indexMesh);
            trianglesFinal.Add(triangleMesh.second.indexMesh);
            trianglesFinal.Add(triangleMesh.third.indexMesh);
        });

        mesh.Clear();
        mesh.vertices  = vert;
        mesh.triangles = trianglesFinal.ToArray();


        mesh.RecalculateBounds();
        mesh.RecalculateNormals();
        mesh.RecalculateTangents();
    }
Ejemplo n.º 3
0
    public void Destruction(Vector3 impact, float radiusExplosion, Vector3 impactDir)
    {
        //ConvertMeshToVerticesAndTriangles(mesh);

        // -- START VERTICE DELETION --
        for (int i = 0; i < verticesMesh.Count; i++)
        {
            verticesMesh[i].toBeDeleted = Vector3.Distance(verticesMesh[i].position * transform.localScale.x, impact - transform.position) < radiusExplosion;
        }

        List <VerticeMesh> verticesToBeDeleted = verticesMesh.FindAll(verticeMesh => verticeMesh.toBeDeleted == true);
        int numVerticesToBeDeleted             = 0;
        int numTrianglesToBeDeleted            = 0;
        List <VerticeMesh> verticesEdgeHole    = new List <VerticeMesh>();

        for (int i = 0; i < verticesToBeDeleted.Count; i++)
        {
            List <TriangleMesh> trianglesToCheck = verticesToBeDeleted[i].triangles;

            while (trianglesToCheck.Count > 0)
            {
                TriangleMesh triangle = trianglesToCheck[0];

                if (triangle.first.toBeDeleted)
                {
                    triangle.first.triangles.Remove(triangle);
                }
                else
                {
                    if (!verticesEdgeHole.Exists(verticeEdgeHole => verticeEdgeHole == triangle.first))
                    {
                        verticesEdgeHole.Add(triangle.first);
                    }
                }
                if (triangle.second.toBeDeleted)
                {
                    triangle.second.triangles.Remove(triangle);
                }
                else
                {
                    if (!verticesEdgeHole.Exists(verticeEdgeHole => verticeEdgeHole == triangle.second))
                    {
                        verticesEdgeHole.Add(triangle.second);
                    }
                }
                if (triangle.third.toBeDeleted)
                {
                    triangle.third.triangles.Remove(triangle);
                }
                else
                {
                    if (!verticesEdgeHole.Exists(verticeEdgeHole => verticeEdgeHole == triangle.third))
                    {
                        verticesEdgeHole.Add(triangle.third);
                    }
                }
                trianglesMesh.Remove(triangle);
                numTrianglesToBeDeleted++;
            }
        }

        numVerticesToBeDeleted = verticesMesh.RemoveAll(verticeMesh => verticeMesh.toBeDeleted == true);

        int indexVerticeMesh = 0;

        verticesMesh.ForEach(verticeMesh => verticeMesh.indexMesh = indexVerticeMesh++);

        /*for (int i = 0; i < verticesEdgeHole.Count ; i++) {
         *  for (int j = i + 1; j < verticesEdgeHole.Count; j++) {
         *      if (verticesEdgeHole[i].position.x == verticesEdgeHole[j].position.x && verticesEdgeHole[i].position.y == verticesEdgeHole[j].position.y && verticesEdgeHole[i].position.z == verticesEdgeHole[j].position.z) {
         *          verticesEdgeHole.Remove(verticesEdgeHole[j]);
         *          j--;
         *      }
         *  }
         * }*/


        // ---- END VERTICE DELETION ----
        //verticesEdgeHole
        //verticesMesh
        //trianglesMesh

        // START CREATING HOLE VERTICES
        Vector3            dirHole      = new Vector3(0, 0, 0);
        Vector3            impactScaled = impact * 0.2f;
        List <VerticeMesh> layerHole    = new List <VerticeMesh>();
        List <VerticeMesh> newLayerHole = new List <VerticeMesh>();
        List <VerticeMesh> verticesHole = new List <VerticeMesh>();

        verticesEdgeHole.ForEach(verticeEdgeHole => {
            dirHole += (verticeEdgeHole.position - impactScaled);
        });
        dirHole /= verticesEdgeHole.Count;
        dirHole.Normalize();

        Vector3 pointToConverge        = dirHole * (radiusExplosion / transform.localScale.x) * 0.3f;
        Vector3 pointToConvergeInverse = -dirHole * (radiusExplosion / transform.localScale.x) * 0.3f;


        for (int i = 1000; i < verticesEdgeHole.Count; i += 2)
        {
            VerticeMesh verticeHole = new VerticeMesh(verticesEdgeHole[i].position, indexVerticeMesh++);
            verticeHole.position = Vector3.Lerp(verticeHole.position, pointToConverge, (Random.Range(0.2f, 0.24f)));
            verticesHole.Add(verticeHole);
        }


        layerHole = verticesEdgeHole;

        for (int i = 3; i < 3; i++)
        {
            for (int j = 0; j < layerHole.Count; j++)
            {
                if (j % i == 0)
                {
                    VerticeMesh verticeMesh = new VerticeMesh(Vector3.Lerp(layerHole[j].position, pointToConverge, i * (0.20f + Random.Range(-0.02f, 0.02f))), indexVerticeMesh++);
                    newLayerHole.Add(verticeMesh);
                }
            }
            verticesHole = verticesHole.Concat(newLayerHole).ToList();
            layerHole    = newLayerHole;
            newLayerHole = new List <VerticeMesh>();
        }

        verticesMesh = verticesMesh.Concat(verticesHole).ToList();
        verticesHole = verticesHole.Concat(verticesEdgeHole).ToList();

        // ---- END CREATING HOLE VERTICES ----

        // START BOWYER WATSON WITH EDGE VERTICES AND VERTICES GENERATED



        Vector3 firstVectorPlane  = Vector3.Cross(impactDir, Vector3.up);
        Vector3 secondVectorPlane = Vector3.Cross(impactDir, firstVectorPlane);
        Plane   plane             = new Plane(firstVectorPlane, secondVectorPlane);

        plane.DrawPlane(impact, 5f, 10f);
        //plane.normal = dirHole;
        List <Vertice> verticeForTriangulation = new List <Vertice>();

        List <Vector3> pointsToCustomMesh = new List <Vector3>();

        verticesHole.ForEach(verticeHole => {
            verticeForTriangulation.Add(new Vertice(PointProjectedInPlane(verticeHole.position, plane.normal), verticeHole.indexMesh));
            verticeHole.position = PointProjectedInPlane(verticeHole.position, plane.normal);
            pointsToCustomMesh.Add(verticeHole.position);
        });

        GameObject.Find("CustomMesh").GetComponent <CustomMesh>().points       = pointsToCustomMesh;
        GameObject.Find("CustomMesh").GetComponent <CustomMesh>().plane        = plane;
        GameObject.Find("CustomMesh").GetComponent <CustomMesh>().centerSphere = impactScaled;
        GameObject.Find("CustomMesh").GetComponent <CustomMesh>().radiusSphere = radiusExplosion / transform.localScale.x;
        GameObject.Find("CustomMesh").GetComponent <CustomMesh>().Startv2();


        //currentTriangulation = new List<Triangle>();
        //currentVertices = new List<Vertice>();

        // SUPER TRIANGLE



        //CREATE VERTICES, PROJECT THEM INTO A PLANE AND ADD TO ARRAYS
        //int indexVertices = 0;
        //List<Vertice> verticesProjectedInPlane = new List<Vertice>();

        /*points.ForEach(point => {
         *  Vertice newVerticeProjected = new Vertice(PointProjectedInPlane(point, plane.normal), indexVertices);
         *  Vertice newVerticeMesh = new Vertice(point, indexVertices);
         *  Instantiate(_verticePrefab, point * transform.localScale.x + transform.position, Quaternion.identity);
         *
         *  verticesProjectedInPlane.Add(newVerticeProjected);
         *  currentVertices.Add(newVerticeMesh);
         *  indexVertices++;
         * });*/

        Triangle superTriangle = GetSuperTriangle(plane);

        List <Triangle> triangulation = BowyerWatson(verticeForTriangulation, plane, superTriangle);



        // ---- END BOWYER WATSON WITH EDGE VERTICES AND VERTICES GENERATED ----

        // START CONVERTING VERTICE AND TRIANGLE DESTRUCTION + RECONSTRUCTION WITH BOWYER-WATSON TO MESH

        Vector3[] meshVertices;
        int[]     meshTriangles;

        //trianglesMesh = new List<TriangleMesh>();
        for (int i = 0; i < triangulation.Count; i++)
        {
            VerticeMesh  first           = verticesMesh.Find(verticeMesh => verticeMesh.indexMesh == triangulation[i].first.origin.index);
            VerticeMesh  second          = verticesMesh.Find(verticeMesh => verticeMesh.indexMesh == triangulation[i].second.origin.index);
            VerticeMesh  third           = verticesMesh.Find(verticeMesh => verticeMesh.indexMesh == triangulation[i].third.origin.index);
            TriangleMesh newTriangleMesh = new TriangleMesh(first, second, third, i);
            trianglesMesh.Add(newTriangleMesh);
            first.triangles.Add(newTriangleMesh);
            second.triangles.Add(newTriangleMesh);
            third.triangles.Add(newTriangleMesh);
        }
        ConvertTrianglesToMeshVerticesAndTriangles(verticesMesh, trianglesMesh, out meshVertices, out meshTriangles);

        mesh.Clear();
        mesh.vertices  = meshVertices;
        mesh.triangles = meshTriangles;


        mesh.RecalculateBounds();
        mesh.RecalculateNormals();
        mesh.RecalculateTangents();

        // ---- END CONVERTING VERTICE AND TRIANGLE DESTRUCTION + RECONSTRUCTION WITH BOWYER-WATSON TO MESH ----
    }
Ejemplo n.º 4
0
    private IEnumerator Reconstructing()
    {
        while (verticeIndex < verticesMesh.Count)
        {
            List <VerticeMesh> newLayer = new List <VerticeMesh>();
            newLayer      = verticesMesh.GetRange(verticeIndex, countByLayer);
            verticeIndex += countByLayer;
            verticesDraw  = verticesDraw.Concat(newLayer).ToList();


            trianglesDraw = new List <TriangleMesh>();

            for (int i = 0; i < trianglesMesh.Count; i++)
            {
                bool isAllVerticesPresent = true;
                isAllVerticesPresent &= verticesDraw.Exists(verticeDraw => verticeDraw.indexMesh == trianglesMesh[i].first.indexMesh);
                isAllVerticesPresent &= verticesDraw.Exists(verticeDraw => verticeDraw.indexMesh == trianglesMesh[i].second.indexMesh);
                isAllVerticesPresent &= verticesDraw.Exists(verticeDraw => verticeDraw.indexMesh == trianglesMesh[i].third.indexMesh);

                if (isAllVerticesPresent)
                {
                    trianglesDraw.Add(trianglesMesh[i]);
                }
            }

            List <VerticeMesh> edgeHole = new List <VerticeMesh>();

            for (int i = 0; i < verticesDraw.Count; i++)
            {
                bool isAllTrianlesPresent = true;
                for (int j = 0; j < verticesDraw[i].triangles.Count; j++)
                {
                    if (!trianglesDraw.Exists(triangleDraw => triangleDraw == verticesDraw[i].triangles[j]))
                    {
                        isAllTrianlesPresent = false;
                        break;
                    }
                }
                if (!isAllTrianlesPresent)
                {
                    edgeHole.Add(verticesDraw[i]);
                }
            }


            Vector3[] meshVertices;
            int[]     meshTriangles;
            Plane     plane = new Plane(Vector3.forward, Vector3.right);

            List <Vertice> verticesForTriangulation = new List <Vertice>();

            for (int i = 0; i < edgeHole.Count; i++)
            {
                verticesForTriangulation.Add(new Vertice(PointProjectedInPlane(edgeHole[i].position, plane.normal), edgeHole[i].indexMesh));
            }

            List <Triangle> triangulation = BowyerWatson(verticesForTriangulation, plane, GetSuperTriangle(plane));

            for (int i = 0; i < triangulation.Count; i++)
            {
                VerticeMesh  first           = verticesMesh.Find(verticeMesh => verticeMesh.indexMesh == triangulation[i].first.origin.index);
                VerticeMesh  second          = verticesMesh.Find(verticeMesh => verticeMesh.indexMesh == triangulation[i].second.origin.index);
                VerticeMesh  third           = verticesMesh.Find(verticeMesh => verticeMesh.indexMesh == triangulation[i].third.origin.index);
                TriangleMesh newTriangleMesh = new TriangleMesh(first, second, third, i);
                trianglesDraw.Add(newTriangleMesh);
            }

            ConvertTrianglesToMeshVerticesAndTriangles(verticesMesh, trianglesDraw, out meshVertices, out meshTriangles);

            mesh.Clear();
            mesh.vertices  = meshVertices;
            mesh.triangles = meshTriangles;


            mesh.RecalculateBounds();
            mesh.RecalculateNormals();
            mesh.RecalculateTangents();

            yield return(new WaitForSeconds(speedReconstruction));
        }
    }
    public void Destruction(Vector3 impact, float radiusExplosion, Vector3 impactDir)
    {
        //ConvertMeshToVerticesAndTriangles(mesh);

        // -- START VERTICE DELETION --
        for (int i = 0; i < verticesMesh.Count; i++)
        {
            verticesMesh[i].toBeDeleted = Vector3.Distance(verticesMesh[i].position * transform.localScale.x, impact - transform.position) < radiusExplosion;
        }

        List <VerticeMesh> verticesToBeDeleted = verticesMesh.FindAll(verticeMesh => verticeMesh.toBeDeleted == true);
        int numVerticesToBeDeleted             = 0;
        int numTrianglesToBeDeleted            = 0;
        List <VerticeMesh> verticesEdgeHole    = new List <VerticeMesh>();

        for (int i = 0; i < verticesToBeDeleted.Count; i++)
        {
            List <TriangleMesh> trianglesToCheck = verticesToBeDeleted[i].triangles;

            while (trianglesToCheck.Count > 0)
            {
                TriangleMesh triangle = trianglesToCheck[0];

                if (triangle.first.toBeDeleted)
                {
                    triangle.first.triangles.Remove(triangle);
                }
                else
                {
                    if (!verticesEdgeHole.Exists(verticeEdgeHole => verticeEdgeHole == triangle.first))
                    {
                        verticesEdgeHole.Add(triangle.first);
                    }
                }
                if (triangle.second.toBeDeleted)
                {
                    triangle.second.triangles.Remove(triangle);
                }
                else
                {
                    if (!verticesEdgeHole.Exists(verticeEdgeHole => verticeEdgeHole == triangle.second))
                    {
                        verticesEdgeHole.Add(triangle.second);
                    }
                }
                if (triangle.third.toBeDeleted)
                {
                    triangle.third.triangles.Remove(triangle);
                }
                else
                {
                    if (!verticesEdgeHole.Exists(verticeEdgeHole => verticeEdgeHole == triangle.third))
                    {
                        verticesEdgeHole.Add(triangle.third);
                    }
                }
                trianglesMesh.Remove(triangle);
                numTrianglesToBeDeleted++;
            }
        }

        numVerticesToBeDeleted = verticesMesh.RemoveAll(verticeMesh => verticeMesh.toBeDeleted == true);

        int indexVerticeMesh = 0;

        verticesMesh.ForEach(verticeMesh => verticeMesh.indexMesh = indexVerticeMesh++);



        // ---- END VERTICE DELETION ----
        //verticesEdgeHole
        //verticesMesh
        //trianglesMesh

        // START CREATING HOLE VERTICES
        Vector3 dirHole      = new Vector3(0, 0, 0);
        Vector3 impactScaled = impact * 0.2f;

        verticesEdgeHole.ForEach(verticeEdgeHole => {
            dirHole += (verticeEdgeHole.position - impactScaled);
        });
        dirHole /= verticesEdgeHole.Count;
        dirHole.Normalize();

        Vector3 pointToConverge = dirHole * (radiusExplosion / transform.localScale.x) * 0.3f;

        List <VerticeMesh> layerHole    = new List <VerticeMesh>();
        List <VerticeMesh> newLayerHole = new List <VerticeMesh>();
        List <VerticeMesh> verticesHole = new List <VerticeMesh>();

        layerHole = verticesEdgeHole;
        verticesEdgeHole.ForEach(verticeEdgeHole => {
            verticeEdgeHole.position = Vector3.Lerp(verticeEdgeHole.position, pointToConverge, (Random.Range(0, 0.9f)));
        });
        for (float i = 0; i < verticesEdgeHole.Count; i += 0.5f)
        {
            verticesEdgeHole.RemoveAt(Mathf.FloorToInt(i));
        }
        for (int i = 3; i < 3; i++)
        {
            for (int j = 0; j < layerHole.Count; j++)
            {
                if (j % i == 0)
                {
                    VerticeMesh verticeMesh = new VerticeMesh(Vector3.Lerp(layerHole[j].position, pointToConverge, i * (0.20f + Random.Range(-0.02f, 0.02f))), indexVerticeMesh++);
                    newLayerHole.Add(verticeMesh);
                }
            }
            verticesHole = verticesHole.Concat(newLayerHole).ToList();
            layerHole    = newLayerHole;
            newLayerHole = new List <VerticeMesh>();
        }

        verticesMesh = verticesMesh.Concat(verticesHole).ToList();
        verticesHole = verticesHole.Concat(verticesEdgeHole).ToList();

        // ---- END CREATING HOLE VERTICES ----

        // START BOWYER WATSON WITH EDGE VERTICES AND VERTICES GENERATED



        Vector3 firstVectorPlane  = Vector3.Cross(impactDir, Vector3.up);
        Vector3 secondVectorPlane = Vector3.Cross(impactDir, firstVectorPlane);
        Plane   plane             = new Plane(firstVectorPlane, secondVectorPlane);

        plane.DrawPlane(impact, 5f, 10f);
        //plane.normal = dirHole;
        List <Vertice> verticeForTriangulation = new List <Vertice>();

        List <Vector3> pointsToCustomMesh = new List <Vector3>();

        verticesHole.ForEach(verticeHole => {
            verticeForTriangulation.Add(new Vertice(verticeHole.position, verticeHole.indexMesh));
            pointsToCustomMesh.Add(verticeHole.position);
        });

        GameObject.Find("CustomMesh").GetComponent <CustomMesh>().points = pointsToCustomMesh;
        GameObject.Find("CustomMesh").GetComponent <CustomMesh>().plane  = plane;
        GameObject.Find("CustomMesh").GetComponent <CustomMesh>().Startv2();

        //StartCoroutine(BowyerWatsonv3(verticeForTriangulation, plane));

        // ---- END BOWYER WATSON WITH EDGE VERTICES AND VERTICES GENERATED ----

        // START CONVERTING VERTICE AND TRIANGLE DESTRUCTION + RECONSTRUCTION WITH BOWYER-WATSON TO MESH



        // ---- END CONVERTING VERTICE AND TRIANGLE DESTRUCTION + RECONSTRUCTION WITH BOWYER-WATSON TO MESH ----
    }