IEnumerable <UIVertex> getFillVeritces() { if (mLines == null) { yield break; } float z = 0f; for (int i = 0; i < mLines.Count; ++i) { LineSegement seg = mLines[i]; int totalLines = seg.LineCount; for (int j = mMinModifyIndex; j < totalLines; ++j) { Vector3 from; Vector3 to; seg.GetLine(j, out from, out to); Vector2 toTrim = to; Vector2 fromTrim = from; TrimItem(mFillRect.xMin, mFillRect.yMin, mFillRect.xMax, mFillRect.yMin, true, false, ref fromTrim, ref toTrim); to = new Vector3(toTrim.x, toTrim.y, to.z); from = new Vector3(fromTrim.x, fromTrim.y, from.z); Vector3 fromBottom = from; Vector3 toBottom = to; fromBottom.y = mFillRect.yMin; toBottom.y = mFillRect.yMin; float fromV = 1f; float toV = 1f; if (mStretchY == false) { fromV = Mathf.Abs((from.y - mFillRect.yMin) / mFillRect.height); toV = Mathf.Abs((to.y - mFillRect.yMin) / mFillRect.height); } float fromU = ((from.x - mFillRect.xMin) / mFillRect.width); float toU = ((to.x - mFillRect.xMin) / mFillRect.width); Vector2 uv1 = TransformUv(new Vector2(fromU, fromV)); Vector2 uv2 = TransformUv(new Vector2(toU, toV)); Vector2 uv3 = TransformUv(new Vector2(fromU, 0f)); Vector2 uv4 = TransformUv(new Vector2(toU, 0f)); UIVertex v1 = ChartCommon.CreateVertex(from, uv1, z); UIVertex v2 = ChartCommon.CreateVertex(to, uv2, z); UIVertex v3 = ChartCommon.CreateVertex(fromBottom, uv3, z); UIVertex v4 = ChartCommon.CreateVertex(toBottom, uv4, z); yield return(v1); yield return(v2); yield return(v3); yield return(v4); } } }
public static void Generate2dMesh(IChartMesh mesh, float startAngle, float angleSpan, float radius, float innerRadius, int segments) { float segmentAngle = angleSpan / segments; float currentAngle = startAngle; float segmenUv = 1f / segments; float currentUv = 0f; float cos = Mathf.Cos(currentAngle); float sin = Mathf.Sin(currentAngle); UIVertex prevInnerVertex = ChartCommon.CreateVertex(new Vector3(cos * innerRadius, sin * innerRadius, 0f), new Vector2(currentUv, 0f)); UIVertex prevOuterVertex = ChartCommon.CreateVertex(new Vector3(cos * radius, sin * radius, 0f), new Vector2(currentUv, 1f)); for (int i = 1; i < segments + 1; i++) { currentUv += segmenUv; currentAngle += segmentAngle; cos = Mathf.Cos(currentAngle); sin = Mathf.Sin(currentAngle); UIVertex innerVertex = ChartCommon.CreateVertex(new Vector3(cos * innerRadius, sin * innerRadius, 0f), new Vector2(currentUv, 0f)); UIVertex outerVertex = ChartCommon.CreateVertex(new Vector3(cos * radius, sin * radius, 0f), new Vector2(currentUv, 1f)); mesh.AddQuad(prevInnerVertex, innerVertex, prevOuterVertex, outerVertex); prevInnerVertex = innerVertex; prevOuterVertex = outerVertex; } }
public override void AddXYRect(Rect rect, int subMeshGroup, float depth) { Vector2[] uvs = GetUvs(rect); UIVertex leftTop = ChartCommon.CreateVertex(new Vector3(rect.xMin, rect.yMin, depth), uvs[0]); UIVertex rightTop = ChartCommon.CreateVertex(new Vector3(rect.xMax, rect.yMin, depth), uvs[1]); UIVertex leftBottom = ChartCommon.CreateVertex(new Vector3(rect.xMin, rect.yMax, depth), uvs[2]); UIVertex rightBottom = ChartCommon.CreateVertex(new Vector3(rect.xMax, rect.yMax, depth), uvs[3]); AddQuad(leftTop, rightTop, leftBottom, rightBottom); }
IEnumerable <UIVertex> getDotVeritces() { if (mLines == null) { yield break; } float z = 0f; float halfSize = mPointSize * 0.5f; for (int i = 0; i < mLines.Count; ++i) { LineSegement seg = mLines[i]; int total = seg.PointCount; for (int j = mMinModifyIndex; j < total; ++j) { Vector4 magPoint = seg.getPoint(j); if (magPoint.w == 0f) { continue; } Vector3 point = (Vector3)magPoint; halfSize = mPointSize * 0.5f; ProcesssPoint(ref magPoint, ref halfSize); Vector3 p1 = point + new Vector3(-halfSize, -halfSize, 0f); Vector3 p2 = point + new Vector3(halfSize, -halfSize, 0f); Vector3 p3 = point + new Vector3(-halfSize, halfSize, 0f); Vector3 p4 = point + new Vector3(halfSize, halfSize, 0f); Vector2 uv1 = new Vector2(0f, 0f); Vector2 uv2 = new Vector2(1f, 0f); Vector2 uv3 = new Vector2(0f, 1f); Vector2 uv4 = new Vector2(1f, 1f); UIVertex v1 = ChartCommon.CreateVertex(p1, uv1, z); UIVertex v2 = ChartCommon.CreateVertex(p2, uv2, z); UIVertex v3 = ChartCommon.CreateVertex(p3, uv3, z); UIVertex v4 = ChartCommon.CreateVertex(p4, uv4, z); if (ClipRect.HasValue == false || ClipRect.Value.Contains(p1) || ClipRect.Value.Contains(p2) || ClipRect.Value.Contains(p3) || ClipRect.Value.Contains(p4)) { yield return(v1); yield return(v2); yield return(v3); yield return(v4); } } } }
IEnumerable <UIVertex> getDotVeritces() { if (mLines == null) { yield break; } float z = 0f; float halfSize = mPointSize * 0.5f; for (int i = 0; i < mLines.Count; ++i) { LineSegement seg = mLines[i]; int total = seg.PointCount; for (int j = 0; j < total; ++j) { Vector4 magPoint = seg.getPoint(j); if (magPoint.w == 0f) { continue; } Vector3 point = (Vector3)magPoint; halfSize = mPointSize * 0.5f; if (magPoint.w >= 0f) { halfSize = magPoint.w * 0.5f; } Vector3 p1 = point + new Vector3(-halfSize, -halfSize, 0f); Vector3 p2 = point + new Vector3(halfSize, -halfSize, 0f); Vector3 p3 = point + new Vector3(-halfSize, halfSize, 0f); Vector3 p4 = point + new Vector3(halfSize, halfSize, 0f); Vector2 uv1 = new Vector2(0f, 0f); Vector2 uv2 = new Vector2(1f, 0f); Vector2 uv3 = new Vector2(0f, 1f); Vector2 uv4 = new Vector2(1f, 1f); UIVertex v1 = ChartCommon.CreateVertex(p1, uv1, z); UIVertex v2 = ChartCommon.CreateVertex(p2, uv2, z); UIVertex v3 = ChartCommon.CreateVertex(p3, uv3, z); UIVertex v4 = ChartCommon.CreateVertex(p4, uv4, z); yield return(v1); yield return(v2); yield return(v3); yield return(v4); } } }
public static void Generate2dMesh(UIVertex[] mesh, Vector2[] normals, float baseX1, float baseX2, float baseSize, float slopLeft, float slopeRight, float height, float startV, float endV) { float halfHeight = height * 0.5f; float halfWidth = baseSize * 0.5f; slopLeft = -Mathf.Clamp(slopLeft, -90, 90) + 90; slopeRight = Mathf.Clamp(slopeRight, -90, 90) + 90; float tanLeft = (1f / Mathf.Tan(slopLeft * Mathf.Deg2Rad)) * height; float tanRight = (1f / Mathf.Tan(slopeRight * Mathf.Deg2Rad)) * height; float leftPos = baseX1 + tanLeft; float rightPos = baseX2 + tanRight; leftPos = Mathf.Clamp(leftPos, 0, baseSize); rightPos = Mathf.Clamp(rightPos, 0, baseSize); if (leftPos > rightPos) { leftPos = rightPos = Mathf.Clamp(Mathf.Lerp(leftPos, rightPos, 0.5f), 0, baseSize); } UIVertex v1 = ChartCommon.CreateVertex(new Vector3(baseX1 - halfWidth, -halfHeight), new Vector2(0f, startV)); UIVertex v2 = ChartCommon.CreateVertex(new Vector3(baseX2 - halfWidth, -halfHeight), new Vector2(1f, startV)); UIVertex v3 = ChartCommon.CreateVertex(new Vector3(leftPos - halfWidth, halfHeight), new Vector2(0f, endV)); UIVertex v4 = ChartCommon.CreateVertex(new Vector3(rightPos - halfWidth, halfHeight), new Vector2(1f, endV)); normals[0] = ((Vector2.up + ChartCommon.Perpendicular(v3.position - v1.position).normalized) * 0.5f).normalized; normals[1] = ((Vector2.up + ChartCommon.Perpendicular(v2.position - v4.position).normalized) * 0.5f).normalized; normals[2] = ((Vector2.down + ChartCommon.Perpendicular(v3.position - v1.position).normalized) * 0.5f).normalized; normals[3] = ((Vector2.down + ChartCommon.Perpendicular(v2.position - v4.position).normalized) * 0.5f).normalized; mesh[0] = v1; mesh[1] = v2; mesh[2] = v3; mesh[3] = v4; }
public static void Generate3dMesh(WorldSpaceChartMesh mesh, float startAngle, float angleSpan, float radius, float innerRadius, int segments, float outerDepth, float innerDepth) { float maxDepth = Mathf.Max(outerDepth, innerDepth); float bottom = maxDepth * 0.5f; float innerUp = bottom - innerDepth; float outerUp = bottom - outerDepth; //float halfDepth = maxDepth * 0.5f; float segmentAngle = angleSpan / segments; float currentAngle = startAngle; float segmenUv = 1f / segments; float currentUv = 0f; float cos = Mathf.Cos(currentAngle); float sin = Mathf.Sin(currentAngle); UIVertex innerV = ChartCommon.CreateVertex(new Vector3(cos * innerRadius, sin * innerRadius, innerUp), new Vector2(currentUv, 0f)); UIVertex outerV = ChartCommon.CreateVertex(new Vector3(cos * radius, sin * radius, outerUp), new Vector2(currentUv, 1f)); int currentInner = mesh.AddVertex(innerV); int currentOuter = mesh.AddVertex(outerV); int prevInnerVertex = mesh.AddVertex(innerV); int prevOuterVertex = mesh.AddVertex(outerV); int prevOpeningVertex = mesh.AddVertex(innerV); int prevClosingVertex = mesh.AddVertex(outerV); innerV.position.z = bottom; outerV.position.z = bottom; int currentInnerDeep = mesh.AddVertex(innerV); int currentOuterDeep = mesh.AddVertex(outerV); int prevInnerVertexDeep = mesh.AddVertex(innerV); int prevOuterVertexDeep = mesh.AddVertex(outerV); mesh.AddTringle(currentInner, currentOuter, currentOuterDeep); mesh.AddTringle(currentOuterDeep, currentInnerDeep, currentInner); int prevOpeningVertexDeep = mesh.AddVertex(innerV); int prevClosingVertexDeep = mesh.AddVertex(outerV); for (int i = 1; i <= segments; i++) { currentUv += segmenUv; currentAngle += segmentAngle; cos = Mathf.Cos(currentAngle); sin = Mathf.Sin(currentAngle); UIVertex innerVertex = ChartCommon.CreateVertex(new Vector3(cos * innerRadius, sin * innerRadius, innerUp), new Vector2(currentUv, 0f)); UIVertex outerVertex = ChartCommon.CreateVertex(new Vector3(cos * radius, sin * radius, outerUp), new Vector2(currentUv, 1f)); int leftBottom = -1; int rightBottomAdded = -1; if (innerRadius > 0f) { rightBottomAdded = mesh.AddVertex(innerVertex); leftBottom = prevInnerVertex; } int leftTop = prevOuterVertex; int rightTop = mesh.AddVertex(outerVertex); int rightBottom = mesh.AddVertex(innerVertex); int rightTopAdded = mesh.AddVertex(outerVertex); innerVertex.position.z = bottom; outerVertex.position.z = bottom; int leftBottomDeep = -1; if (innerRadius > 0f) { leftBottomDeep = prevInnerVertexDeep; } int leftTopDeep = prevOuterVertexDeep; int rightTopDeep = mesh.AddVertex(outerVertex); int rightBottomDeep = mesh.AddVertex(innerVertex); int rightTopAddedDeep = mesh.AddVertex(outerVertex); mesh.AddTringle(rightBottom, rightTop, leftTop); mesh.AddTringle(leftTopDeep, rightTopDeep, rightBottomDeep); mesh.AddTringle(prevClosingVertexDeep, prevClosingVertex, rightTopAdded); mesh.AddTringle(rightTopAdded, rightTopAddedDeep, prevClosingVertexDeep); prevClosingVertex = rightTopAdded; prevClosingVertexDeep = rightTopAddedDeep; if (innerRadius > 0f) { int rightBottomAddedDeep = mesh.AddVertex(innerVertex); mesh.AddTringle(leftTop, leftBottom, rightBottom); mesh.AddTringle(rightBottomDeep, leftBottomDeep, leftTopDeep); mesh.AddTringle(rightBottomAdded, prevOpeningVertex, prevOpeningVertexDeep); mesh.AddTringle(prevOpeningVertexDeep, rightBottomAddedDeep, rightBottomAdded); prevOpeningVertexDeep = rightBottomAddedDeep; prevOpeningVertex = rightBottomAdded; } prevInnerVertex = rightBottom; prevOuterVertex = rightTop; prevInnerVertexDeep = rightBottomDeep; prevOuterVertexDeep = rightTopDeep; if (i == segments) { rightTopDeep = mesh.AddVertex(outerVertex); rightBottomDeep = mesh.AddVertex(innerVertex); innerVertex.position.z = innerUp; outerVertex.position.z = outerUp; rightTop = mesh.AddVertex(outerVertex); rightBottom = mesh.AddVertex(innerVertex); mesh.AddTringle(rightTopDeep, rightTop, rightBottom); mesh.AddTringle(rightBottom, rightBottomDeep, rightTopDeep); } } }
IEnumerable <UIVertex> getLineVertices() { if (mLines == null) { yield break; } float halfThickness = Thickness * 0.5f; float z = 0f; for (int i = 0; i < mLines.Count; ++i) { LineSegement seg = mLines[i]; int totalLines = seg.LineCount; Line? peek = null; Line? prev = null; float tileUv = 0f; float totalUv = 0f; for (int j = mMinModifyIndex; j < totalLines; ++j) { totalUv += (float)seg.GetLineMag(j); } for (int j = mMinModifyIndex; j < totalLines; ++j) { Line line; bool hasNext = j + 1 < totalLines; if (peek.HasValue) { line = peek.Value; } else { line = seg.GetLine(j, halfThickness, prev.HasValue, hasNext); } peek = null; if (j + 1 < totalLines) { peek = seg.GetLine(j + 1, halfThickness, true, j + 2 < totalLines); } Vector3 p1 = line.P1; Vector3 p2 = line.P2; Vector3 p3 = line.P3; Vector3 p4 = line.P4; Vector2 uv1 = new Vector2(tileUv * Tiling, 0f); Vector2 uv2 = new Vector2(tileUv * Tiling, 1f); tileUv += line.Mag / totalUv; Vector2 uv3 = new Vector2(tileUv * Tiling, 0f); Vector2 uv4 = new Vector2(tileUv * Tiling, 1f); UIVertex v1 = ChartCommon.CreateVertex(p1, uv1, z); UIVertex v2 = ChartCommon.CreateVertex(p2, uv2, z); UIVertex v3 = ChartCommon.CreateVertex(p3, uv3, z); UIVertex v4 = ChartCommon.CreateVertex(p4, uv4, z); yield return(v1); yield return(v2); yield return(v3); yield return(v4); if (peek.HasValue) { float myZ = z + 0.2f; Vector3 a1, a2; GetSide(line.To, line.Dir, line.Normal, halfThickness * 0.5f, halfThickness * 0.6f, v3.position.z, out a1, out a2); yield return(v3); yield return(v4); yield return(ChartCommon.CreateVertex(a1, v3.uv0, myZ)); yield return(ChartCommon.CreateVertex(a2, v4.uv0, myZ)); } if (prev.HasValue) { float myZ = z + 0.2f; Vector3 a1, a2; GetSide(line.From, -line.Dir, line.Normal, halfThickness * 0.5f, halfThickness * 0.6f, v1.position.z, out a1, out a2); yield return(ChartCommon.CreateVertex(a1, v1.uv0, myZ)); yield return(ChartCommon.CreateVertex(a2, v2.uv0, myZ)); yield return(v1); yield return(v2); } //z -= 0.05f; prev = line; } } }