protected void UpdateCameraPosition() { //if (cameraRotation.x > maxCameraRotationX) cameraRotation.x = 0; //changed value here //else if (cameraRotation.x < 0) cameraRotation.x = 0; float rx = 90 - 0; if (rx > 89.9) { rx = 89.9f; } double px = Math.Cos(rx * Mathf.Deg2Rad) * cameraDistance; double py = Math.Sin(rx * Mathf.Deg2Rad) * cameraDistance; double pz = Math.Cos(cameraRotation.y * Mathf.Deg2Rad) * px; px = Math.Sin(cameraRotation.y * Mathf.Deg2Rad) * px; Vector3 targetPosition = transform.position; if (this is OnlineMapsTileSetControl) { Vector3 offset = new Vector3(map.tilesetSize.x / -2, 0, map.tilesetSize.y / 2); OnlineMapsTileSetControl control = OnlineMapsTileSetControl.instance; if (control.smoothZoom && control.smoothZoomStarted) { targetPosition = originalPosition; } if (control.useElevation && control.elevationZoomRange.InRange(map.zoom)) { double tlx, tly, brx, bry; map.GetCorners(out tlx, out tly, out brx, out bry); float yScale = control.GetBestElevationYScale(tlx, tly, brx, bry); if (cameraAdjustTo == OnlineMapsCameraAdjust.maxElevationInArea) { offset.y = control.GetMaxElevationValue(yScale); } else { offset.y = control.GetElevationValue(targetPosition.x, targetPosition.z, yScale, tlx, tly, brx, bry); } } offset.Scale(control.smoothZoomStarted? control.originalScale: transform.lossyScale); targetPosition += transform.rotation * offset; } Vector3 oldPosition = activeCamera.transform.position; Vector3 newPosition = transform.rotation * new Vector3((float)px, (float)py, (float)pz) + targetPosition; activeCamera.transform.position = newPosition; activeCamera.transform.LookAt(targetPosition); if (oldPosition != newPosition && OnCameraControl != null) { OnCameraControl(); } }
public override void Update(double tlx, double tly, double brx, double bry, int zoom) { if (instance == null) { Debug.Log("No instance"); return; } if (!range.InRange(zoom)) { enabled = false; } else if (position.y > tly || position.y < bry) { enabled = false; } else if (tlx < brx && (position.x < tlx || position.x > brx)) { enabled = false; } else if (tlx > brx && position.x < tlx && position.x > brx) { enabled = false; } else { enabled = true; } if (!enabled) { return; } if (_prefab != prefab) { Reinit(tlx, tly, brx, bry, zoom); } double mx, my; OnlineMapsUtils.LatLongToTiled(position.x, position.y, zoom, out mx, out my); double ttlx, ttly, tbrx, tbry; OnlineMapsUtils.LatLongToTiled(tlx, tly, zoom, out ttlx, out ttly); OnlineMapsUtils.LatLongToTiled(brx, bry, zoom, out tbrx, out tbry); int maxX = (2 << zoom) / 2; OnlineMaps api = OnlineMaps.instance; Bounds bounds = api.GetComponent <Collider>().bounds; double sx = tbrx - ttlx; if (sx < 0) { sx += maxX; } double mpx = mx - ttlx; if (mpx < 0) { mpx += maxX; } double px = mpx / sx; double pz = (ttly - my) / (ttly - tbry); _relativePosition = new Vector3((float)px, 0, (float)pz); if (OnlineMapsControlBase.instance is OnlineMapsTileSetControl) { px = -api.tilesetSize.x / 2 - (px - 0.5) * api.tilesetSize.x; pz = api.tilesetSize.y / 2 + (pz - 0.5) * api.tilesetSize.y; } else { Vector3 center = bounds.center; Vector3 size = bounds.size; px = center.x - (px - 0.5) * size.x - api.transform.position.x; pz = center.z + (pz - 0.5) * size.z - api.transform.position.z; } Vector3 oldPosition = instance.transform.localPosition; float y = 0; if (OnlineMapsControlBase.instance is OnlineMapsTileSetControl) { OnlineMapsTileSetControl control = OnlineMapsTileSetControl.instance; y = control.GetElevationValue((float)px, (float)pz, control.GetBestElevationYScale(tlx, tly, brx, bry), tlx, tly, brx, bry); } Vector3 newPosition = new Vector3((float)px, y, (float)pz); instance.transform.localPosition = newPosition; if (oldPosition != newPosition && OnPositionChanged != null) { OnPositionChanged(this); } }
protected void DrawActivePoints(OnlineMapsTileSetControl control, ref List <Vector2> activePoints, ref List <Vector3> verticles, ref List <Vector3> normals, ref List <int> triangles, ref List <Vector2> uv, float weight) { if (activePoints.Count < 2) { activePoints.Clear(); return; } List <Vector3> side1 = new List <Vector3>(); List <Vector3> side2 = new List <Vector3>(); for (int i = 0; i < activePoints.Count; i++) { Vector3 p = new Vector3(-activePoints[i].x, 0, activePoints[i].y); if (i == 0) { float a = OnlineMapsUtils.Angle2DRad(p, new Vector3(-activePoints[i + 1].x, 0, activePoints[i + 1].y), 90); Vector3 off = new Vector3(Mathf.Cos(a) * weight, 0, Mathf.Sin(a) * weight); Vector3 s1 = p + off; Vector3 s2 = p - off; s1.y = control.GetElevationValue(s1.x, s1.z, bestElevationYScale, tlx, tly, brx, bry); s2.y = control.GetElevationValue(s2.x, s2.z, bestElevationYScale, tlx, tly, brx, bry); side1.Add(s1); side2.Add(s2); } else if (i == activePoints.Count - 1) { float a = OnlineMapsUtils.Angle2DRad(new Vector3(-activePoints[i - 1].x, 0, activePoints[i - 1].y), p, 90); Vector3 off = new Vector3(Mathf.Cos(a) * weight, 0, Mathf.Sin(a) * weight); Vector3 s1 = p + off; Vector3 s2 = p - off; s1.y = control.GetElevationValue(s1.x, s1.z, bestElevationYScale, tlx, tly, brx, bry); s2.y = control.GetElevationValue(s2.x, s2.z, bestElevationYScale, tlx, tly, brx, bry); side1.Add(s1); side2.Add(s2); } else { Vector3 p1 = new Vector3(-activePoints[i - 1].x, 0, activePoints[i - 1].y); Vector3 p2 = new Vector3(-activePoints[i + 1].x, 0, activePoints[i + 1].y); float a1 = OnlineMapsUtils.Angle2DRad(p1, p, 90); float a2 = OnlineMapsUtils.Angle2DRad(p, p2, 90); Vector3 off1 = new Vector3(Mathf.Cos(a1) * weight, 0, Mathf.Sin(a1) * weight); Vector3 off2 = new Vector3(Mathf.Cos(a2) * weight, 0, Mathf.Sin(a2) * weight); Vector3 p21 = p + off1; Vector3 p22 = p - off1; Vector3 p31 = p + off2; Vector3 p32 = p - off2; int state1, state2; Vector2 is1 = OnlineMapsUtils.GetIntersectionPointOfTwoLines(p1 + off1, p21, p31, p2 + off2, out state1); Vector2 is2 = OnlineMapsUtils.GetIntersectionPointOfTwoLines(p1 - off1, p22, p32, p2 - off2, out state2); if (state1 == 1) { side1.Add(new Vector3(is1.x, control.GetElevationValue(is1.x, is1.y, bestElevationYScale, tlx, tly, brx, bry), is1.y)); } if (state2 == 1) { side2.Add(new Vector3(is2.x, control.GetElevationValue(is2.x, is2.y, bestElevationYScale, tlx, tly, brx, bry), is2.y)); } } } for (int i = 0; i < Mathf.Min(side1.Count, side2.Count) - 1; i++) { int ti = verticles.Count; verticles.Add(side1[i]); verticles.Add(side1[i + 1]); verticles.Add(side2[i + 1]); verticles.Add(side2[i]); normals.Add(Vector3.up); normals.Add(Vector3.up); normals.Add(Vector3.up); normals.Add(Vector3.up); uv.Add(new Vector2(0, 0)); uv.Add(new Vector2(0, 1)); uv.Add(new Vector2(1, 1)); uv.Add(new Vector2(1, 0)); triangles.Add(ti); triangles.Add(ti + 1); triangles.Add(ti + 2); triangles.Add(ti); triangles.Add(ti + 2); triangles.Add(ti + 3); } activePoints.Clear(); }
/// <summary> /// Updates marker instance. /// </summary> /// <param name="map">Reference to the map</param> /// <param name="control">Reference to the control</param> /// <param name="bounds">Bounds of the map mesh</param> /// <param name="tlx">Longitude of top-left corner of the map</param> /// <param name="tly">Latitude of top-left corner of the map</param> /// <param name="brx">Longitude of botton-right corner of the map</param> /// <param name="bry">Latitude of botton-right corner of the map</param> /// <param name="zoom">Zoom of the map</param> /// <param name="ttlx">Tile X of top-left corner of the map</param> /// <param name="ttly">Tile Y of top-left corner of the map</param> /// <param name="tbrx">Tile X of botton-right corner of the map</param> /// <param name="tbry">Tile Y of botton-right corner of the map</param> /// <param name="bestYScale">Best y scale for current map view</param> public void Update(OnlineMaps map, OnlineMapsControlBase3D control, Bounds bounds, double tlx, double tly, double brx, double bry, int zoom, double ttlx, double ttly, double tbrx, double tbry, float bestYScale) { if (!enabled) { return; } if (instance == null) { Init(map.transform); } if (!range.InRange(zoom)) { visible = false; } else if (checkMapBoundaries) { if (latitude > tly || latitude < bry) { visible = false; } else if (tlx < brx && (longitude < tlx || longitude > brx)) { visible = false; } else if (tlx > brx && longitude < tlx && longitude > brx) { visible = false; } else { visible = true; } } else { visible = true; } if (!visible) { return; } if (_prefab != prefab) { Reinit(tlx, tly, brx, bry, zoom); } double mx, my; map.projection.CoordinatesToTile(longitude, latitude, zoom, out mx, out my); int maxX = 1 << zoom; double sx = tbrx - ttlx; double mpx = mx - ttlx; if (sx < 0) { sx += maxX; } if (checkMapBoundaries) { if (mpx < 0) { mpx += maxX; } else if (mpx > maxX) { mpx -= maxX; } } else { double dx1 = Math.Abs(mpx - ttlx); double dx2 = Math.Abs(mpx - tbrx); double dx3 = Math.Abs(mpx - tbrx + maxX); if (dx1 > dx2 && dx1 > dx3) { mpx += maxX; } } double px = mpx / sx; double pz = (ttly - my) / (ttly - tbry); _relativePosition = new Vector3((float)px, 0, (float)pz); OnlineMapsTileSetControl tsControl = control as OnlineMapsTileSetControl; if (tsControl != null) { px = -map.tilesetSize.x / 2 - (px - 0.5) * map.tilesetSize.x; pz = map.tilesetSize.y / 2 + (pz - 0.5) * map.tilesetSize.y; } else { Vector3 center = bounds.center; Vector3 size = bounds.size; px = center.x - (px - 0.5) * size.x / map.transform.lossyScale.x - map.transform.position.x; pz = center.z + (pz - 0.5) * size.z / map.transform.lossyScale.z - map.transform.position.z; } Vector3 oldPosition = instance.transform.localPosition; float y = 0; if (altitude.HasValue) { y = altitude.Value * bestYScale; if (tsControl != null) { if (tsControl.elevationBottomMode == OnlineMapsTileSetControl.ElevationBottomMode.minValue) { y -= tsControl.elevationMinValue * bestYScale; } y *= tsControl.elevationScale; } } else if (tsControl != null) { y = tsControl.GetElevationValue((float)px, (float)pz, bestYScale, tlx, tly, brx, bry); } Vector3 newPosition = new Vector3((float)px, y, (float)pz); if (oldPosition != newPosition) { instance.transform.localPosition = newPosition; } }
protected void DrawActivePoints(OnlineMapsTileSetControl control, ref List<Vector2> activePoints, ref List<Vector3> verticles, ref List<Vector3> normals, ref List<int> triangles, ref List<Vector2> uv, float weight) { if (activePoints.Count < 2) { activePoints.Clear(); return; } List<Vector3> side1 = new List<Vector3>(); List<Vector3> side2 = new List<Vector3>(); for (int i = 0; i < activePoints.Count; i++) { Vector3 p = new Vector3(-activePoints[i].x, 0, activePoints[i].y); if (i == 0) { float a = OnlineMapsUtils.Angle2DRad(p, new Vector3(-activePoints[i + 1].x, 0, activePoints[i + 1].y), 90); Vector3 off = new Vector3(Mathf.Cos(a) * weight, 0, Mathf.Sin(a) * weight); Vector3 s1 = p + off; Vector3 s2 = p - off; s1.y = control.GetElevationValue(s1.x, s1.z, bestElevationYScale, tlx, tly, brx, bry); s2.y = control.GetElevationValue(s2.x, s2.z, bestElevationYScale, tlx, tly, brx, bry); side1.Add(s1); side2.Add(s2); } else if (i == activePoints.Count - 1) { float a = OnlineMapsUtils.Angle2DRad(new Vector3(-activePoints[i - 1].x, 0, activePoints[i - 1].y), p, 90); Vector3 off = new Vector3(Mathf.Cos(a) * weight, 0, Mathf.Sin(a) * weight); Vector3 s1 = p + off; Vector3 s2 = p - off; s1.y = control.GetElevationValue(s1.x, s1.z, bestElevationYScale, tlx, tly, brx, bry); s2.y = control.GetElevationValue(s2.x, s2.z, bestElevationYScale, tlx, tly, brx, bry); side1.Add(s1); side2.Add(s2); } else { Vector3 p1 = new Vector3(-activePoints[i - 1].x, 0, activePoints[i - 1].y); Vector3 p2 = new Vector3(-activePoints[i + 1].x, 0, activePoints[i + 1].y); float a1 = OnlineMapsUtils.Angle2DRad(p1, p, 90); float a2 = OnlineMapsUtils.Angle2DRad(p, p2, 90); Vector3 off1 = new Vector3(Mathf.Cos(a1) * weight, 0, Mathf.Sin(a1) * weight); Vector3 off2 = new Vector3(Mathf.Cos(a2) * weight, 0, Mathf.Sin(a2) * weight); Vector3 p21 = p + off1; Vector3 p22 = p - off1; Vector3 p31 = p + off2; Vector3 p32 = p - off2; int state1, state2; Vector2 is1 = OnlineMapsUtils.GetIntersectionPointOfTwoLines(p1 + off1, p21, p31, p2 + off2, out state1); Vector2 is2 = OnlineMapsUtils.GetIntersectionPointOfTwoLines(p1 - off1, p22, p32, p2 - off2, out state2); if (state1 == 1) side1.Add(new Vector3(is1.x, control.GetElevationValue(is1.x, is1.y, bestElevationYScale, tlx, tly, brx, bry), is1.y)); if (state2 == 1) side2.Add(new Vector3(is2.x, control.GetElevationValue(is2.x, is2.y, bestElevationYScale, tlx, tly, brx, bry), is2.y)); } } for (int i = 0; i < Mathf.Min(side1.Count, side2.Count) - 1; i++) { int ti = verticles.Count; verticles.Add(side1[i]); verticles.Add(side1[i + 1]); verticles.Add(side2[i + 1]); verticles.Add(side2[i]); normals.Add(Vector3.up); normals.Add(Vector3.up); normals.Add(Vector3.up); normals.Add(Vector3.up); uv.Add(new Vector2(0, 0)); uv.Add(new Vector2(0, 1)); uv.Add(new Vector2(1, 1)); uv.Add(new Vector2(1, 0)); triangles.Add(ti); triangles.Add(ti + 1); triangles.Add(ti + 2); triangles.Add(ti); triangles.Add(ti + 2); triangles.Add(ti + 3); } activePoints.Clear(); }
protected void DrawActivePoints(OnlineMapsTileSetControl control, ref List <Vector2> activePoints, ref List <Vector3> vertices, ref List <Vector3> normals, ref List <int> triangles, ref List <Vector2> uv, float width) { if (activePoints.Count < 2) { activePoints.Clear(); return; } float w2 = width * 2; Vector3 prevS1 = Vector3.zero; Vector3 prevS2 = Vector3.zero; int c = activePoints.Count - 1; bool extraPointAdded = false; for (int i = 0; i < activePoints.Count; i++) { float px = -activePoints[i].x; float pz = activePoints[i].y; Vector3 s1; Vector3 s2; if (i == 0 || i == c) { float p1x, p1z, p2x, p2z; if (i == 0) { p1x = px; p1z = pz; p2x = -activePoints[i + 1].x; p2z = activePoints[i + 1].y; } else { p1x = -activePoints[i - 1].x; p1z = activePoints[i - 1].y; p2x = px; p2z = pz; } float a = OnlineMapsUtils.Angle2DRad(p1x, p1z, p2x, p2z, 90); float offX = Mathf.Cos(a) * width; float offZ = Mathf.Sin(a) * width; float s1x = px + offX; float s1z = pz + offZ; float s2x = px - offX; float s2z = pz - offZ; float s1y = control.GetElevationValue(s1x, s1z, bestElevationYScale, tlx, tly, brx, bry); float s2y = control.GetElevationValue(s2x, s2z, bestElevationYScale, tlx, tly, brx, bry); s1 = new Vector3(s1x, s1y, s1z); s2 = new Vector3(s2x, s2y, s2z); } else { float p1x = -activePoints[i - 1].x; float p1z = activePoints[i - 1].y; float p2x = -activePoints[i + 1].x; float p2z = activePoints[i + 1].y; float a1 = OnlineMapsUtils.Angle2DRad(p1x, p1z, px, pz, 90); float a3 = OnlineMapsUtils.AngleOfTriangle(activePoints[i - 1], activePoints[i + 1], activePoints[i]) * Mathf.Rad2Deg; if (a3 < 60 && !extraPointAdded) { activePoints.Insert(i + 1, Vector2.Lerp(activePoints[i], activePoints[i + 1], 0.001f)); activePoints[i] = Vector2.Lerp(activePoints[i], activePoints[i - 1], 0.001f); c++; i--; extraPointAdded = true; continue; } extraPointAdded = false; float a2 = OnlineMapsUtils.Angle2DRad(px, pz, p2x, p2z, 90); float off1x = Mathf.Cos(a1) * width; float off1z = Mathf.Sin(a1) * width; float off2x = Mathf.Cos(a2) * width; float off2z = Mathf.Sin(a2) * width; float p21x = px + off1x; float p21z = pz + off1z; float p22x = px - off1x; float p22z = pz - off1z; float p31x = px + off2x; float p31z = pz + off2z; float p32x = px - off2x; float p32z = pz - off2z; float is1x, is1z, is2x, is2z; int state1 = OnlineMapsUtils.GetIntersectionPointOfTwoLines(p1x + off1x, p1z + off1z, p21x, p21z, p31x, p31z, p2x + off2x, p2z + off2z, out is1x, out is1z); int state2 = OnlineMapsUtils.GetIntersectionPointOfTwoLines(p1x - off1x, p1z - off1z, p22x, p22z, p32x, p32z, p2x - off2x, p2z - off2z, out is2x, out is2z); if (state1 == 1 && state2 == 1) { float o1x = is1x - px; float o1z = is1z - pz; float o2x = is2x - px; float o2z = is2z - pz; float m1 = Mathf.Sqrt(o1x * o1x + o1z * o1z); float m2 = Mathf.Sqrt(o2x * o2x + o2z * o2z); if (m1 > w2) { is1x = o1x / m1 * w2 + px; is1z = o1z / m1 * w2 + pz; } if (m2 > w2) { is2x = o2x / m2 * w2 + px; is2z = o2z / m2 * w2 + pz; } s1 = new Vector3(is1x, control.GetElevationValue(is1x, is1z, bestElevationYScale, tlx, tly, brx, bry), is1z); s2 = new Vector3(is2x, control.GetElevationValue(is2x, is2z, bestElevationYScale, tlx, tly, brx, bry), is2z); } else { float po1x = p1x + off1x; float po1z = p1z + off1z; float po2x = p2x - off1x; float po2z = p2z - off1z; s1 = new Vector3(po1x, control.GetElevationValue(po1x, po1z, bestElevationYScale, tlx, tly, brx, bry), po1z); s2 = new Vector3(po2x, control.GetElevationValue(po2x, po2z, bestElevationYScale, tlx, tly, brx, bry), po2z); } } if (i > 0) { AddLineSegment(vertices, normals, triangles, uv, s1, s2, prevS1, prevS2); } prevS1 = s1; prevS2 = s2; } activePoints.Clear(); }
protected void DrawActivePoints(OnlineMapsTileSetControl control, ref List <Vector2> activePoints, ref List <Vector3> verticles, ref List <Vector3> normals, ref List <int> triangles, ref List <Vector2> uv, float weight) { if (activePoints.Count < 2) { activePoints.Clear(); return; } float w2 = weight * 2; Vector3 prevS1 = Vector3.zero; Vector3 prevS2 = Vector3.zero; int c = activePoints.Count - 1; for (int i = 0; i < activePoints.Count; i++) { float px = -activePoints[i].x; float pz = activePoints[i].y; Vector3 s1 = Vector3.zero; Vector3 s2 = Vector3.zero; if (i == 0 || i == c) { float p1x, p1z, p2x, p2z; if (i == 0) { p1x = px; p1z = pz; p2x = -activePoints[i + 1].x; p2z = activePoints[i + 1].y; } else { p1x = -activePoints[i - 1].x; p1z = activePoints[i - 1].y; p2x = px; p2z = pz; } float a = OnlineMapsUtils.Angle2DRad(p1x, p1z, p2x, p2z, 90); float offX = Mathf.Cos(a) * weight; float offZ = Mathf.Sin(a) * weight; float s1x = px + offX; float s1z = pz + offZ; float s2x = px - offX; float s2z = pz - offZ; float s1y = control.GetElevationValue(s1x, s1z, bestElevationYScale, tlx, tly, brx, bry); float s2y = control.GetElevationValue(s2x, s2z, bestElevationYScale, tlx, tly, brx, bry); s1 = new Vector3(s1x, s1y, s1z); s2 = new Vector3(s2x, s2y, s2z); } else { float p1x = -activePoints[i - 1].x; float p1z = activePoints[i - 1].y; float p2x = -activePoints[i + 1].x; float p2z = activePoints[i + 1].y; float a1 = OnlineMapsUtils.Angle2DRad(p1x, p1z, px, pz, 90); float a2 = OnlineMapsUtils.Angle2DRad(px, pz, p2x, p2z, 90); float off1x = Mathf.Cos(a1) * weight; float off1z = Mathf.Sin(a1) * weight; float off2x = Mathf.Cos(a2) * weight; float off2z = Mathf.Sin(a2) * weight; float p21x = px + off1x; float p21z = pz + off1z; float p22x = px - off1x; float p22z = pz - off1z; float p31x = px + off2x; float p31z = pz + off2z; float p32x = px - off2x; float p32z = pz - off2z; float is1x, is1z, is2x, is2z; int state1 = OnlineMapsUtils.GetIntersectionPointOfTwoLines(p1x + off1x, p1z + off1z, p21x, p21z, p31x, p31z, p2x + off2x, p2z + off2z, out is1x, out is1z); int state2 = OnlineMapsUtils.GetIntersectionPointOfTwoLines(p1x - off1x, p1z - off1z, p22x, p22z, p32x, p32z, p2x - off2x, p2z - off2z, out is2x, out is2z); if (state1 == 1 && state2 == 1) { float o1x = is1x - px; float o1z = is1z - pz; float o2x = is2x - px; float o2z = is2z - pz; float m1 = Mathf.Sqrt(o1x * o1x + o1z * o1z); float m2 = Mathf.Sqrt(o2x * o2x + o2z * o2z); if (m1 > w2) { is1x = o1x / m1 * w2 + px; is1z = o1z / m1 * w2 + pz; } if (m2 > w2) { is2x = o2x / m2 * w2 + px; is2z = o2z / m2 * w2 + pz; } s1 = new Vector3(is1x, control.GetElevationValue(is1x, is1z, bestElevationYScale, tlx, tly, brx, bry), is1z); s2 = new Vector3(is2x, control.GetElevationValue(is2x, is2z, bestElevationYScale, tlx, tly, brx, bry), is2z); } else { float po1x = p1x + off1x; float po1z = p1z + off1z; float po2x = p2x - off1x; float po2z = p2z - off1z; s1 = new Vector3(po1x, control.GetElevationValue(po1x, po1z, bestElevationYScale, tlx, tly, brx, bry), po1z); s2 = new Vector3(po2x, control.GetElevationValue(po2x, po2z, bestElevationYScale, tlx, tly, brx, bry), po2z); } } if (i > 0) { int ti = verticles.Count; verticles.Add(prevS1); verticles.Add(s1); verticles.Add(s2); verticles.Add(prevS2); normals.Add(Vector3.up); normals.Add(Vector3.up); normals.Add(Vector3.up); normals.Add(Vector3.up); uv.Add(new Vector2(0, 0)); uv.Add(new Vector2(0, 1)); uv.Add(new Vector2(1, 1)); uv.Add(new Vector2(1, 0)); triangles.Add(ti); triangles.Add(ti + 1); triangles.Add(ti + 2); triangles.Add(ti); triangles.Add(ti + 2); triangles.Add(ti + 3); } prevS1 = s1; prevS2 = s2; } activePoints.Clear(); }