示例#1
0
    private void MakeFace(int indBaseTr, int inFaceId, TSide fromSide)
    {
        arrTris[indBaseTr].faceId = inFaceId;

        TSide[] trSides = SidesToFind(indBaseTr, fromSide);

        for (int i = 0; i < trSides.Length; i++)
        {
            int indFindTr = FindEmptyTrByEdge(indBaseTr, trSides[i]);

            if ((indFindTr > -1) && ((arrTris[indBaseTr].normalTr - arrTris[indFindTr].normalTr).sqrMagnitude < planarTolerance))
            {
                MakeFace(indFindTr, inFaceId, trSides[i]);
            }
            else
            {
                int dblEdge = FindEdgeBySide(edges[inFaceId], trSides[i]);
                if (dblEdge < 0)
                {
                    edges[inFaceId].Add(new Edge {
                        indTr = indBaseTr, side = trSides[i], isEmpty = true
                    });
                }
                else
                {
                    edges[inFaceId].RemoveAt(dblEdge);
                }
            }
        }
    }
示例#2
0
    private int FindEdgeBySide(List <Edge> listEdges, TSide side)
    {
        int res = -1;

        for (int i = 0; i < listEdges.Count; i++)
        {
            if (side.Equal(listEdges[i].side))
            {
                res = i; break;
            }
        }

        return(res);
    }
示例#3
0
    private int FindEmptyTrByEdge(int indBaseTr, TSide side)
    {
        int res = -1;

        for (int i = 0; i < arrTris.Length; i++)
        {
            if ((i != indBaseTr) && (arrTris[i].faceId == -1))
            {
                if (side.Equal(arrTris[i].indA, arrTris[i].indB) ||
                    side.Equal(arrTris[i].indB, arrTris[i].indC) ||
                    side.Equal(arrTris[i].indC, arrTris[i].indA))
                {
                    res = i;
                    break;
                }
            }
        }

        return(res);
    }
示例#4
0
    private TSide[] SidesToFind(int indTr, TSide fromSide)
    {
        TSide[] res;

        if (fromSide == null)
        {
            res = new TSide[3] {
                new TSide {
                    a = arrTris[indTr].indA, b = arrTris[indTr].indB
                },
                new TSide {
                    a = arrTris[indTr].indB, b = arrTris[indTr].indC
                },
                new TSide {
                    a = arrTris[indTr].indC, b = arrTris[indTr].indA
                }
            };
        }
        else
        {
            res = new TSide[2];

            if (fromSide.Equal(arrTris[indTr].indA, arrTris[indTr].indB))
            {
                res = new TSide[2] {
                    new TSide {
                        a = arrTris[indTr].indB, b = arrTris[indTr].indC
                    },
                    new TSide {
                        a = arrTris[indTr].indC, b = arrTris[indTr].indA
                    }
                };
            }

            if (fromSide.Equal(arrTris[indTr].indB, arrTris[indTr].indC))
            {
                res = new TSide[2] {
                    new TSide {
                        a = arrTris[indTr].indA, b = arrTris[indTr].indB
                    },
                    new TSide {
                        a = arrTris[indTr].indC, b = arrTris[indTr].indA
                    }
                };
            }

            if (fromSide.Equal(arrTris[indTr].indC, arrTris[indTr].indA))
            {
                res = new TSide[2] {
                    new TSide {
                        a = arrTris[indTr].indA, b = arrTris[indTr].indB
                    },
                    new TSide {
                        a = arrTris[indTr].indB, b = arrTris[indTr].indC
                    }
                };
            }
        }

        return(res);
    }
示例#5
0
 public bool Equal(TSide inSide)
 {
     return(((a == inSide.a) && (b == inSide.b)) || ((a == inSide.b) && (b == inSide.a)));
 }
 public Matrix4 Projection(TSide side)
 {
     return(_projection[side == TSide.Left ? 0 : 1]);
 }
 public Matrix4 View(TSide side)
 {
     return(_views[side == TSide.Left ? 0 : 1]);
 }