Пример #1
0
 void Start()
 {
     if (substrate == null)
     {
         substrate = new shatterMesh(GetComponent <MeshFilter>().mesh, new Vector3(0, 0, 0), true, substrateTemplate);
     }
 }
Пример #2
0
    public void shatter(List <shatterMesh> cells)
    {
        shatterMesh newSub = null;

        foreach (shatterMesh c in cells)
        {
            int otherOrigTris = c.triangles.Count;
            substrate.intersect(c);
            foreach (shatterTriangle t in substrate.triangles)
            {
                if (!t.isConsumed && !t.culled)
                {
                    shatterMesh fgf_res = floodGenerateFragment(t, c, otherOrigTris);
                    if (fgf_res != null)
                    {
                        newSub = fgf_res;
                    }
                }
            }

            //FOR DEBUG ONLY

            /*foreach (shatterTriangle t in c.triangles){
             *  if (!t.isConsumed && !t.culled){
             *      DEBUGcut(t);
             *  }
             * }*/
        }

        Destroy(gameObject);
    }
Пример #3
0
 public void cut(shatterMesh other, int stopCheck = -1)
 {
     activeCuts.Clear();
     if (stopCheck < 0)
     {
         stopCheck = other.triangles.Count;
     }
     for (int i = 0; i < stopCheck; i++)
     {
         int startStepTris = triangles.Count;
         for (int j = 0; j < startStepTris; j++)
         {
             if (!triangles[j].culled)
             {
                 cutTri(triangles[j], other.triangles[i]);
             }
         }
     }
     for (int i = 0; i < triangles.Count; i++)
     {
         triangles[i].populateAdjacent();
     }
     foreach (shatterVert v in activeCuts)
     {
         if (v.excludeEdges.Count != 2)
         {
             Debug.Log(v.excludeEdges.Count);
             Debug.Log(v.pos);
         }
     }
 }
Пример #4
0
 private void preparePatern(Vector3 offset)
 {
     foreach (Transform child in shatterPrefab.transform)
     {
         shatterMesh newCell = new shatterMesh(child.GetComponent <MeshFilter>().sharedMesh, offset + child.transform.position, false);
         cells.Add(newCell);
     }
 }
Пример #5
0
 //externality checks
 public void cullExternal(shatterMesh other, int stopCheck)
 {
     populateExternal(other, stopCheck);
     foreach (shatterTriangle t in triangles)
     {
         if (t.external)
         {
             //if (!t.culled && other.raycastExternalCheck(t,stopCheck)){
             t.cull();
         }
     }
 }
Пример #6
0
    private shatterMesh floodGenerateFragment(shatterTriangle first, shatterMesh other, int otherOrigTris)
    {
        List <shatterTriangle>  newSubstrateTris = new List <shatterTriangle>();
        List <shatterTriangle>  newCutTris       = new List <shatterTriangle>();
        Queue <shatterTriangle> flood            = new Queue <shatterTriangle>();

        flood.Enqueue(first);
        first.isConsumed = true;
        bool substrateExternType = first.external;

        while (flood.Count != 0)
        {
            shatterTriangle currentTri = flood.Dequeue();
            foreach (shatterTriangle a in currentTri.adjacent)
            {
                if (!a.isConsumed && !a.culled)
                {
                    if (!a.isSubstrate || (a.external == substrateExternType))
                    {
                        //when leaving cut mesh go into the substrate type you started at (otherwise shouldn't matter)
                        flood.Enqueue(a);
                        a.isConsumed = true;
                    }
                }
            }
            if (currentTri.isSubstrate)
            {
                newSubstrateTris.Add(currentTri);
            }
            else
            {
                newCutTris.Add(currentTri);
            }
        }
        foreach (shatterTriangle ct in newCutTris)
        {
            ct.isConsumed = false;
        }

        shatterMesh newshatter = generateFragment(newSubstrateTris, newCutTris, substrateExternType);

        Debug.Log(new Vector2(newSubstrateTris.Count, newCutTris.Count));
        Debug.Log(substrateExternType);
        if (substrateExternType)
        {
            return(null);
        }
        return(newshatter);
    }
Пример #7
0
    public void intersect(shatterMesh other)
    {
        int thisOrigTris  = triangles.Count;
        int otherOrigTris = other.triangles.Count;

        cut(other);
        populateExternal(other, other.triangles.Count);
        Debug.Log("other cuting");
        other.cut(this, thisOrigTris);
        other.cullExternal(this, thisOrigTris);
        for (int i = thisOrigTris; i < triangles.Count; i++)
        {
            triangles[i].populateAdjacentTunneled();
        }
    }
Пример #8
0
 private void populateExternal(shatterMesh other, int stopCheck)
 {
     foreach (shatterTriangle t in triangles)
     {
         if (!t.culled && !t.isConsumed)
         {
             t.external = other.raycastExternalCheck(t, stopCheck);
             externalFlood(t);
             Debug.Log("tanavast");
         }
     }
     foreach (shatterTriangle t in triangles)
     {
         t.isConsumed = false;
     }
 }