public void CalculateBevelOutline(List <Vector2> vertices, float strokeWidth, ref List <Vector3> verts, ref List <Vector2> uvs, ref List <int> tris) { int n = vertices.Count; int initIndex = verts.Count; int i = 0; int vertNum = initIndex; float pFactor = 0, nFactor = 0; Vector2 pVer = vertices[n - 1]; Vector2 cVer = vertices[0]; Vector2 nVer = vertices[1]; float pDis = Vector2.Distance(pVer, cVer); float nDis; // = Vector2.Distance(cVer, nVer); // int sign = ForceEarCut.ComputeSpannedAreaSign(pVer, cVer, nVer); Vector2 firstSkewPoint = pVer; Debug.LogError(gameObject.name + " is going on to enter while ... ! "); while (i < n + 1) { nDis = Vector2.Distance(cVer, nVer); if (nDis < strokeWidth) { pDis = Vector2.Distance(pVer, nVer); i++; // cVer = nVer; nVer = vertices[i % n]; continue; } pFactor = pDis / strokeWidth; nFactor = nDis / strokeWidth; Vector2 perPC = CGAlgorithm.Perp(pVer, cVer, strokeWidth); Vector2 perCN = CGAlgorithm.Perp(cVer, nVer, strokeWidth); int sign = ForceEarCut.ComputeSpannedAreaSign(pVer, cVer, nVer); if (sign < 0) { // sign < 0 : // p // \ // \ // === c --> n === Vector2 skewPoint = cVer + perPC; //CGAlgorithm.Intersect2D_2SkewSegments(pVer + perPC, cVer + perPC , cVer + perCN, nVer + perCN, ref skewPoint) ; if (CGAlgorithm.Intersect2D_2SkewSegments(pVer + perPC, cVer + perPC, cVer + perCN, nVer + perCN, ref skewPoint)) { if (vertNum > initIndex) { verts[vertNum - 1] = skewPoint; } verts.Add(pVer); verts.Add(skewPoint); verts.Add(cVer); verts.Add(nVer + perCN); uvs.Add(new Vector2(0, 0)); uvs.Add(new Vector2(1, pFactor)); uvs.Add(new Vector2(0, pFactor)); uvs.Add(new Vector2(1, pFactor + nFactor)); if (_facing == Facing.FACE_FORWARD) { tris.Add(vertNum); tris.Add(vertNum + 2); tris.Add(vertNum + 1); tris.Add(vertNum + 2); tris.Add(vertNum + 3); tris.Add(vertNum + 1); } else if (_facing == Facing.FACE_BACK) { tris.Add(vertNum); tris.Add(vertNum + 1); tris.Add(vertNum + 2); tris.Add(vertNum + 2); tris.Add(vertNum + 1); tris.Add(vertNum + 3); } vertNum += 4; } } else { // or sign > 0 : // p // / // / // === n <-- c === // // }else{ //--------------------------------------------------------------------------- verts.Add(pVer); verts.Add(cVer + perPC); verts.Add(cVer); verts.Add(cVer + perCN); verts.Add(nVer + perCN); uvs.Add(new Vector2(0, 0)); uvs.Add(new Vector2(1, pFactor)); uvs.Add(new Vector2(0, pFactor)); uvs.Add(new Vector2(1, pFactor)); uvs.Add(new Vector2(1, pFactor + nFactor)); if (_facing == Facing.FACE_FORWARD) { tris.Add(vertNum); tris.Add(vertNum + 2); tris.Add(vertNum + 1); tris.Add(vertNum + 2); tris.Add(vertNum + 3); tris.Add(vertNum + 1); tris.Add(vertNum + 2); tris.Add(vertNum + 4); tris.Add(vertNum + 3); } else if (_facing == Facing.FACE_BACK) { tris.Add(vertNum); tris.Add(vertNum + 1); tris.Add(vertNum + 2); tris.Add(vertNum + 2); tris.Add(vertNum + 1); tris.Add(vertNum + 3); tris.Add(vertNum + 2); tris.Add(vertNum + 3); tris.Add(vertNum + 4); } vertNum += 5; } i++; pVer = cVer; cVer = nVer; nVer = vertices[i % n]; pDis = nDis; } }
public void CalculateMeshData(List <Vector2> vertices, float strokeWidth, ref List <Vector3> verts, ref List <Vector2> uvs, ref List <int> tris) { int n = vertices.Count; int initIndex = verts.Count; int i = 0; int vertNum = initIndex; float pFactor = 0, nFactor = 0; Vector2 pVer = vertices[n - 1]; Vector2 cVer = vertices[0]; Vector2 nVer = vertices[1]; float pDis = Vector2.Distance(pVer, cVer); float nDis; // = Vector2.Distance(cVer, nVer); // int sign = ForceEarCut.ComputeSpannedAreaSign(pVer, cVer, nVer); Vector2 firstSkewPoint = pVer; while (i < n + 1) { nDis = Vector2.Distance(cVer, nVer); if (nDis < strokeWidth) { pDis = Vector2.Distance(pVer, nVer); i++; // cVer = nVer; nVer = vertices[i % n]; continue; } pFactor = pDis / strokeWidth; nFactor = nDis / strokeWidth; Vector2 perPC = CGAlgorithm.Perp(pVer, cVer, strokeWidth); Vector2 perCN = CGAlgorithm.Perp(cVer, nVer, strokeWidth); Vector2 skewPoint = cVer + perPC; //CGAlgorithm.Intersect2D_2SkewSegments(pVer + perPC, cVer + perPC , cVer + perCN, nVer + perCN, ref skewPoint) ; Vector2 pcDir = (cVer - pVer).normalized * strokeWidth * 5; Vector2 cnDir = (cVer - nVer).normalized * strokeWidth * 5; if (CGAlgorithm.Intersect2D_2SkewSegments( pVer + perPC, cVer + perPC + pcDir, cVer + perCN + cnDir, nVer + perCN, ref skewPoint)) { if (vertNum == initIndex) { firstSkewPoint = skewPoint; } else { verts[vertNum - 1] = skewPoint; } verts.Add(pVer); verts.Add(skewPoint); verts.Add(cVer); if (i == n) { verts.Add(firstSkewPoint); } else { verts.Add(nVer); //(nVer + perCN); } uvs.Add(new Vector2(0, 0)); uvs.Add(new Vector2(1, pFactor)); uvs.Add(new Vector2(0, pFactor)); uvs.Add(new Vector2(1, pFactor + nFactor)); if (_facing == Facing.FACE_FORWARD) { tris.Add(vertNum); tris.Add(vertNum + 2); tris.Add(vertNum + 1); tris.Add(vertNum + 2); tris.Add(vertNum + 3); tris.Add(vertNum + 1); } else if (_facing == Facing.FACE_BACK) { tris.Add(vertNum); tris.Add(vertNum + 1); tris.Add(vertNum + 2); tris.Add(vertNum + 2); tris.Add(vertNum + 1); tris.Add(vertNum + 3); } vertNum += 4; } else { Debug.LogError("Outline .... no intersect???"); } i++; pVer = cVer; cVer = nVer; nVer = vertices[i % n]; pDis = nDis; } }