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); } } }
protected void GenerateKoch(Vector3[] positions, bool outwards, float generatorMultiplier) { lineSegements.Clear(); for (int i = 0; i < positions.Length - 1; i++) { LineSegement line = new LineSegement(); line.StartPosition = positions[i]; if (i == positions.Length - 1) { line.EndPosition = positions[0]; } else { line.EndPosition = positions[i + 1]; } line.Direction = Vector3.Normalize(line.EndPosition - line.StartPosition); line.Length = Vector3.Distance(line.EndPosition, line.StartPosition); lineSegements.Add(line); } List <Vector3> newPos = new List <Vector3>(); List <Vector3> targetPos = new List <Vector3>(); for (int i = 0; i < lineSegements.Count; i++) { newPos.Add(lineSegements[i].StartPosition); targetPos.Add(lineSegements[i].StartPosition); for (int j = 1; j < keys.Length - 1; j++) { float moveAmount = lineSegements[i].Length * keys[j].time; float heightAmount = (lineSegements[i].Length * keys[j].value) * generatorMultiplier; Vector3 movePos = lineSegements[i].StartPosition + (lineSegements[i].Direction * moveAmount); Vector3 d; if (outwards) { d = Quaternion.AngleAxis(-90, rotateAxis) * lineSegements[i].Direction; } else { d = Quaternion.AngleAxis(90, rotateAxis) * lineSegements[i].Direction; } newPos.Add(movePos); targetPos.Add(movePos + (d * heightAmount)); } } newPos.Add(lineSegements[0].StartPosition); targetPos.Add(lineSegements[0].StartPosition); position = new Vector3[newPos.Count]; targetPosition = new Vector3[targetPos.Count]; position = newPos.ToArray(); targetPosition = targetPos.ToArray(); bezierPosition = BezierCurve(targetPosition, bezierVertexCount); generationCount++; }
void PickDot(Vector3 mouse, out int segment, out int point) { float minDist = Mathf.Infinity; segment = -1; point = -1; if (mLines == null) { return; } float mag = mPointSize; for (int i = 0; i < mLines.Count; ++i) { LineSegement seg = mLines[i]; int total = seg.PointCount; for (int j = 0; j < total; ++j) { Vector4 p = seg.getPoint(j); if (p.w == 0f) { continue; } float dist = (mouse - ((Vector3)p)).sqrMagnitude; if (dist < minDist) { mag = p.w; if (mag < 0f) { mag = mPointSize; } minDist = dist; segment = i; point = j; } } } float sensitivity = 10f; if (mControl != null) { sensitivity = mControl.Sensitivity; } float thresh = mag + sensitivity; if ((ViewRect.HasValue && !ViewRect.Value.Contains(mouse)) || minDist > thresh * thresh) { segment = -1; point = -1; } }
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); } } }
/// <summary> /// sets the lines for this renderer /// </summary> /// <param name="lines"></param> internal void SetLines(List <LineSegement> lines) { // mUseCache = false; mLines = lines; mMinX = float.PositiveInfinity; mMinY = float.PositiveInfinity; mMaxX = float.NegativeInfinity; mMaxY = float.NegativeInfinity; mControl = GetComponentInParent <SensitivityControl>(); if (mLines != null) { for (int i = 0; i < mLines.Count; i++) { LineSegement seg = mLines[i]; int totalPoints = seg.PointCount; for (int j = 0; j < totalPoints; j++) { Vector3 point = seg.getPoint(j); mMinX = Mathf.Min(mMinX, point.x); mMinY = Mathf.Min(mMinY, point.y); mMaxX = Mathf.Max(mMaxX, point.x); mMaxY = Mathf.Max(mMaxY, point.y); } } } SetAllDirty(); mIsMouseIn = false; for (int i = 0; i < mHoverObjectes.Count; i++) { mHoverObjectes[i].gameObject.SetActive(false); mHoverFreeObjects.Add(mHoverObjectes[i]); } mHoverObjectes.Clear(); if (mCurrentHover != null) { mCurrentHover.gameObject.SetActive(false); mHoverFreeObjects.Add(mCurrentHover); mCurrentHover = null; } mPickedI = mPickedJ = -1; Rebuild(CanvasUpdate.PreRender); }
void PickLine(Vector3 mouse, out int segment, out int line) { float minDist = Mathf.Infinity; segment = -1; line = -1; if (mLines == null) { return; } for (int i = 0; i < mLines.Count; ++i) { LineSegement seg = mLines[i]; int total = seg.LineCount; for (int j = 0; j < total; ++j) { Vector3 from; Vector3 to; seg.GetLine(j, out from, out to); float dist = ChartCommon.SegmentPointSqrDistance(from, to, mouse); if (dist < minDist) { minDist = dist; segment = i; line = j; } } } float sensitivity = 10f; if (mControl != null) { sensitivity = mControl.Sensitivity; } float thresh = (Thickness + sensitivity); if ((ViewRect.HasValue && !ViewRect.Value.Contains(mouse)) || minDist > thresh * thresh) { segment = -1; line = -1; } }
internal void ModifyLines(List <Vector4> lines) { //mUseCache = false; if (mLines.Count == 0) { mLines.Add(new LineSegement(lines.ToArray())); return; } //bool regenerate = false; //if(mLines[0].) mLines[0].ModifiyLines(lines); mMinX = float.PositiveInfinity; mMinY = float.PositiveInfinity; mMaxX = float.NegativeInfinity; mMaxY = float.NegativeInfinity; mControl = GetComponentInParent <SensitivityControl>(); if (mLines != null) { for (int i = 0; i < mLines.Count; i++) { LineSegement seg = mLines[i]; int totalPoints = seg.PointCount; for (int j = 0; j < totalPoints; j++) { Vector3 point = seg.getPoint(j); mMinX = Mathf.Min(mMinX, point.x); mMinY = Mathf.Min(mMinY, point.y); mMaxX = Mathf.Max(mMaxX, point.x); mMaxY = Mathf.Max(mMaxY, point.y); } } // lines.Add() } SetVerticesDirty(); Rebuild(CanvasUpdate.PostLayout); mForceMouseMove = true; }
/// <summary> /// finds the minimum and maximum values of the currently set data /// </summary> void FindBoundingValues() { mMinX = float.PositiveInfinity; mMinY = float.PositiveInfinity; mMaxX = float.NegativeInfinity; mMaxY = float.NegativeInfinity; // this part finds the bounding box of the lines if (mLines != null) { for (int i = 0; i < mLines.Count; i++) { LineSegement seg = mLines[i]; int totalPoints = seg.PointCount; for (int j = 0; j < totalPoints; j++) { Vector3 point = seg.getPoint(j); mMinX = Mathf.Min(mMinX, point.x); mMinY = Mathf.Min(mMinY, point.y); mMaxX = Mathf.Max(mMaxX, point.x); mMaxY = Mathf.Max(mMaxY, point.y); } } } }
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; } } }