Exemplo n.º 1
0
    public shatterTriangle(shatterVert v1, shatterVert v2, shatterVert v3, bool isSubstrateTri)
    {
        verts = new List <shatterVert>();
        verts.Add(v1);
        verts.Add(v2);
        verts.Add(v3);
        storedIntersects = new List <shatterVert>();
        adjacent         = new List <shatterTriangle>();
        isSubstrate      = isSubstrateTri;

        norm = Vector3.Cross(v2.pos - v1.pos, v3.pos - v1.pos);
        norm = Vector3.Normalize(norm);

        up = Vector3.Cross(norm, Vector3.right);
        if (Vector3.Magnitude(up) < largeEpsilon)
        {
            up = Vector3.Cross(norm, Vector3.up);
        }
        up    = Vector3.Normalize(up);
        right = Vector3.Cross(up, norm);

        Vector2 ac = collapse(v2.pos - v1.pos);
        Vector2 bd = collapse(v3.pos - v1.pos);

        p02D = collapse(v1.pos);
        a    = ac[0];
        b    = bd[0];
        c    = ac[1];
        d    = bd[1];
        det  = 1 / (a * d - b * c);
        area = getArea();
    }
Exemplo n.º 2
0
    public shatterVert intersect(shatterVert l1V, shatterVert l2V)
    {
        Vector3 l1             = l1V.pos;
        Vector3 l2             = l2V.pos;
        Vector3 lv             = l2 - l1;
        Vector3 lo             = l1 - verts[0].pos;
        float   loDist         = Vector3.Dot(lo, norm);
        float   lvAlign        = Vector3.Dot(lv, norm);
        float   travelT        = -loDist / lvAlign;
        float   parallelMetric = Vector3.Dot(Vector3.Normalize(lo), norm);

        if (travelT > 1 || travelT < 0 || Mathf.Abs(lvAlign) < largeEpsilon)
        {
            return(null);
        }

        Vector3 proj  = l1 + lv * travelT;
        Vector2 proj2 = collapse(proj) - p02D;
        Vector2 bari  = new Vector2(d * proj2[0] - b * proj2[1], a * proj2[1] - c * proj2[0]);

        bari = det * bari;
        float w = 1 - bari[0] - bari[1];

        if (bari[0] < -epsilon || bari[1] < -epsilon || w < -epsilon)
        {
            return(null);
        }

        Vector2     UV  = verts[2].uv * bari[0] + verts[1].uv * bari[1] + verts[0].uv * w;
        shatterVert res = new shatterVert(proj, UV);

        res.projenitorEdges.Add(l1V);
        res.projenitorEdges.Add(l2V);
        return(res);
    }
Exemplo n.º 3
0
    public bool raycastExternalCheck(shatterTriangle toMeasure, int stopCheck = -1)
    {
        Vector3            tPos          = (toMeasure.verts[0].pos + toMeasure.verts[1].pos + toMeasure.verts[2].pos) / 3;
        int                intersects    = 0;
        List <shatterVert> ignores       = new List <shatterVert>();
        shatterVert        infinity      = new shatterVert(new Vector3(99999, 99999, 99999), new Vector2(0, 0));
        shatterVert        toMeasureVert = new shatterVert(tPos, new Vector2(0, 0));

        if (stopCheck < 0)
        {
            stopCheck = triangles.Count;
        }
        for (int i = 0; i < stopCheck; i++)
        {
            shatterTriangle tri   = triangles[i];
            shatterVert     found = tri.intersect(toMeasureVert, infinity);
            if (found != null && Vector3.Magnitude(found.pos - tPos) < epsilon)
            {
                return(false);
            }
            if (found != null && Vector3.Dot(found.pos - tPos, new Vector3(1, 1, 1)) > 0 && getDuplicate(found.pos, ignores) == -1)
            {
                intersects += 1;
                ignores.Add(found);
                //Debug.Log(found.pos);
            }
        }
        return(intersects % 2 == 0);
    }
Exemplo n.º 4
0
 public shatterVert(shatterVert other)
 {
     pos             = other.pos;
     uv              = other.uv;
     faces           = new List <shatterTriangle>();
     excludeEdges    = new List <shatterVert>();
     projenitorEdges = new List <shatterVert>();
 }
Exemplo n.º 5
0
    public shatterEdge(shatterVert v1, shatterVert v2)
    {
        verts = new List <shatterVert>();
        verts.Add(v1);
        verts.Add(v2);

        /*if (v1.generatorEdge != null && v2.generatorEdge != null){
         *  if (v1.generatorEdge.faces.Contains)
         * }*/
    }
Exemplo n.º 6
0
 public void absorb(shatterVert other)
 {
     /*if (other.excludeEdges.Count != 0){
      *  Debug.Log(other.excludeEdges.Count);
      *  Debug.Log(other == this);
      * }*/
     pos = (pos + other.pos) / 2.0f;
     if (other.intersectTunnel != null && intersectTunnel == null)
     {
         intersectTunnel = other.intersectTunnel;
         intersectTunnel.intersectTunnel = this;
     }
 }
Exemplo n.º 7
0
 private void repairTri1(shatterTriangle triangle, shatterVert inter)
 {
     for (int i = 0; i < 3; i++)
     {
         if (nonLinear(triangle.verts[i].pos, triangle.verts[(i + 1) % 3].pos, inter.pos))
         {
             shatterTriangle newTri = new shatterTriangle(triangle.verts[i], triangle.verts[(i + 1) % 3], inter, triangle.isSubstrate);
             newTri.storedIntersects = triangle.storedIntersects;
             triangles.Add(newTri);
         }
     }
     triangle.cull();
 }
Exemplo n.º 8
0
    private void cutTri(shatterTriangle tri, shatterTriangle other)
    {
        float parallelMetric = Vector3.Dot(tri.norm, other.norm);

        if (parallelMetric > 1 - epsilon || parallelMetric < epsilon - 1)
        {
            return;
        }

        List <shatterVert> intersects = new List <shatterVert>();

        for (int i = 0; i < 3; i++)
        {
            shatterVert intersect = tri.intersect(other.verts[i], other.verts[(i + 1) % 3]);
            if (intersect != null && getDuplicate(intersect.pos, intersects) == -1)
            {
                int dup = getDuplicate(intersect.pos, tri.storedIntersects);
                if (dup != -1)
                {
                    tri.storedIntersects[dup].absorb(intersect);
                    intersect = tri.storedIntersects[dup];
                }
                intersects.Add(intersect);
                other.storedIntersects.Add(other.portIn(intersect));
            }
            shatterVert intersectOther = other.intersect(tri.verts[i], tri.verts[(i + 1) % 3]);
            if (intersectOther != null && getDuplicate(intersectOther.pos, intersects) == -1)
            {
                shatterVert intersectThis = null;
                int         dup           = getDuplicate(intersectOther.pos, tri.storedIntersects);
                if (dup != -1)
                {
                    tri.storedIntersects[dup].absorb(intersectOther);
                    intersectThis = tri.storedIntersects[dup];
                }
                else
                {
                    intersectThis = tri.portIn(intersectOther);
                }
                intersects.Add(intersectThis);
                other.storedIntersects.Add(intersectOther);
            }
        }

        if (intersects.Count != 0)
        {
            repairTri(tri, intersects);
        }
    }
Exemplo n.º 9
0
    public shatterVert portIn(shatterVert v)
    {
        Vector2 proj2 = collapse(v.pos) - p02D;
        Vector2 bari  = new Vector2(d * proj2[0] - b * proj2[1], a * proj2[1] - c * proj2[0]);

        bari = det * bari;
        float       w      = 1 - bari[0] - bari[1];
        Vector2     UV     = verts[2].uv * bari[0] + verts[1].uv * bari[1] + verts[0].uv * w;
        shatterVert ported = new shatterVert(v.pos, UV);

        ported.intersectTunnel = v;
        v.intersectTunnel      = ported;
        ported.intersectTunnel = v;
        ported.projenitorEdges = v.projenitorEdges;
        return(ported);
    }
Exemplo n.º 10
0
 private void considerConnection(shatterTriangle t, shatterVert v)
 {
     if (!adjacent.Contains(t))
     {
         int seenIndex = seenOnce.IndexOf(t);
         if (seenIndex != -1)
         {
             if (!(seenOnceVerts[seenIndex].excludeEdges.Contains(v) || v.excludeEdges.Contains(seenOnceVerts[seenIndex])))
             {
                 adjacent.Add(t);
                 t.adjacent.Add(this);
             }
         }
         else
         {
             seenOnce.Add(t);
             seenOnceVerts.Add(v);
         }
     }
 }