Neighbors CollidedFaceAt(Vector3 cp, TileBounds b) { Vector3 collisionPoint = cp - b.center; Vector3 sz = b.size; Neighbors collidedFace = Neighbors.None; if (Roughly(collisionPoint.x, sz.x / 2)) { collidedFace = Neighbors.BackRight; } else if (Roughly(collisionPoint.x, -sz.x / 2)) { collidedFace = Neighbors.FrontLeft; } else if (Roughly(collisionPoint.z, sz.z / 2)) { collidedFace = Neighbors.BackLeft; } else if (Roughly(collisionPoint.z, -sz.z / 2)) { collidedFace = Neighbors.FrontRight; } else if (collisionPoint.y < 0) { collidedFace = Neighbors.Bottom; } else { collidedFace = Neighbors.Top; } return(collidedFace); }
void SetupAddRemoveTileBounds(TileBounds b, int idx) { Map m = (Map)target; float s = m.sideLength; float h = m.tileHeight; int y = idx / (int)m.size.x; int x = idx - (y * (int)m.size.x); int z = editZ; int zMaxHeight = 1; MapTile t = m.TileAt(x, y, z); if (t != null) { z = t.z; zMaxHeight = t.maxHeight; } Vector3 hereTop = m.transform.position + new Vector3(x * s, (z + zMaxHeight - 1) * h, y * s); b.center = hereTop + new Vector3(0, -(zMaxHeight * h) / 2, 0); b.size = new Vector3(s, h * zMaxHeight, s); if (idx < tiles.Count) { tiles[idx] = b; } else { tiles.Add(b); } }
public void DownloadTiles() { TileBounds bounds = new TileBounds(Area); tasks.Clear(); nTasksForArea = 0; regionMap = new SceneGroup(SceneGroup.Type.None, RegionName); foreach (var tileAddress in bounds.TileAddressRange) { nTasksForArea++; } foreach (var tileAddress in bounds.TileAddressRange) { var wrappedTileAddress = tileAddress.Wrapped(); var uri = new Uri(string.Format("https://tile.mapzen.com/mapzen/vector/v1/all/{0}/{1}/{2}.mvt?api_key={3}", wrappedTileAddress.z, wrappedTileAddress.x, wrappedTileAddress.y, ApiKey)); Debug.Log("URL request " + uri.AbsoluteUri); IO.IORequestCallback onTileFetched = (response) => { if (response.hasError()) { Debug.Log("TileIO Error: " + response.error); return; } if (response.data.Length == 0) { Debug.Log("Empty Response"); return; } float offsetX = (tileAddress.x - bounds.min.x); float offsetY = (-tileAddress.y + bounds.min.y); TileTask task = new TileTask(tileAddress, groupOptions, response.data, offsetX, offsetY, regionScaleRatio); task.Start(featureStyling, regionMap); OnTaskReady(task); }; // Starts the HTTP request StartCoroutine(tileIO.FetchNetworkData(uri, onTileFetched)); } }
void SetupPaintTileBounds(TileBounds b, int idx) { Map m = (Map)target; float s = m.sideLength; float h = m.tileHeight; int y = idx/(int)m.size.x; int x = idx-(y*(int)m.size.x); int z = editZ; if(!m.HasTileAt(x,y,z)) { //just go ahead and give up b.center = Vector3.zero; b.size = Vector3.zero; } else { int zMaxHeight = 1; MapTile t = m.TileAt(x,y,z); if(t != null) { z = t.z; zMaxHeight = t.maxHeight; } Vector3 hereTop = m.transform.position + new Vector3(x*s, (z+zMaxHeight-1)*h, y*s); b.center = hereTop + new Vector3(0, -(zMaxHeight*h)/2, 0); b.size = new Vector3(s, h*zMaxHeight, s); } if(idx < tiles.Count) { tiles[idx] = b; } else { tiles.Add(b); } }
Neighbors CollidedFaceAt(Vector3 cp, TileBounds b) { Vector3 collisionPoint = cp - b.center; Vector3 sz = b.size; Neighbors collidedFace = Neighbors.None; if(Roughly(collisionPoint.x, sz.x/2)) { collidedFace = Neighbors.BackRight; } else if(Roughly(collisionPoint.x, -sz.x/2)) { collidedFace = Neighbors.FrontLeft; } else if(Roughly(collisionPoint.z, sz.z/2)) { collidedFace = Neighbors.BackLeft; } else if(Roughly(collisionPoint.z, -sz.z/2)) { collidedFace = Neighbors.FrontRight; } else if(collisionPoint.y < 0) { collidedFace = Neighbors.Bottom; } else { collidedFace = Neighbors.Top; } return collidedFace; }
public void OnSceneGUI() { Event e = Event.current; //draw a grid at the lowest available levels for the map Map m = (Map)target; EditorUtility.SetSelectedWireframeHidden(m.GetComponent <MeshRenderer>(), true); Vector2 sz = m.size; float s = m.sideLength; Vector3 pos = m.transform.position; float h = m.tileHeight; if (tiles == null) { tiles = new List <TileBounds>(); } Vector3 here = pos + new Vector3(-s / 2, -h, -s / 2); Vector3[] basePlane = new Vector3[] { here + new Vector3(-0.1f, -0.1f, -0.1f), here + new Vector3(-0.1f, -0.1f, s * sz.y + 0.2f), here + new Vector3(s * sz.x + 0.2f, -0.1f, s * sz.y + 0.2f), here + new Vector3(s * sz.x + 0.2f, -0.1f, -0.1f) }; Handles.DrawSolidRectangleWithOutline(basePlane, Color.clear, Color.black); Vector2 mpos = e.mousePosition; Ray ray = HandleUtility.GUIPointToWorldRay(mpos); int closestIdx = -1; float closestDistance = Mathf.Infinity; Vector3 collisionPoint = Vector3.zero; Neighbors collidedFace = Neighbors.None; bool dimsChanged = sz != lastSize || s != lastSideLength || pos != lastPos || h != lastH; if (editMode == EditMode.AddRemove) { int neededBoxes = (int)(sz.x * sz.y); if (dimsChanged || editModeChanged || tiles.Count <= neededBoxes) { for (int i = 0; i < neededBoxes; i++) { SetupAddRemoveTileBounds(new TileBounds(), i); } } for (int i = 0; i < neededBoxes; i++) { TileBounds b = tiles[i]; if (b.center == Vector3.zero && b.size == Vector3.zero) { continue; } float distance; if (b.IntersectRay(ray, out distance) && distance < closestDistance) { closestDistance = distance; closestIdx = i; //find the ray's collision point (ray.origin+ray.direction*closestDistance), collisionPoint = ray.origin + ray.direction * closestDistance; //now translate it to the box position by subtracting the box's center (may need to subtract `new Vector3(0, -h/2, 0)`) as well collidedFace = CollidedFaceAt(collisionPoint, b); } int y = i / (int)m.size.x; int x = i - (y * (int)m.size.x); int z = editZ; if (m.HasTileAt(x, y, z)) { //skip drawing, but you can still opt-click to delete } else { DrawWireBounds(b.center, b.size, Color.magenta); } } if (closestIdx != -1) { TileBounds closest = tiles[closestIdx]; DrawWireBounds(closest.center, closest.size, Color.green); } } else if (editMode == EditMode.Reshape || editMode == EditMode.Paint) { int neededBoxes = (int)(sz.x * sz.y); if (dimsChanged || editModeChanged || tiles.Count <= neededBoxes) { for (int i = 0; i < neededBoxes; i++) { SetupPaintTileBounds(new TileBounds(), i); } } for (int i = 0; i < neededBoxes; i++) { TileBounds b = tiles[i]; if (b.center == Vector3.zero && b.size == Vector3.zero) { continue; } float distance; if (b.IntersectRay(ray, out distance) && distance < closestDistance) { closestDistance = distance; closestIdx = i; //find the ray's collision point (ray.origin+ray.direction*closestDistance), collisionPoint = ray.origin + ray.direction * closestDistance; } DrawWireBounds(b.center, b.size, Color.white); } if (closestIdx != -1) { TileBounds closest = tiles[closestIdx]; //decide what face it's on by comparing its x,y,z against the bounding box's minima and maxima collidedFace = CollidedFaceAt(collisionPoint, closest); DrawWireBounds(closest.center, closest.size, Color.green, collidedFace); } } int controlID = GUIUtility.GetControlID(FocusType.Passive); if (e.type == EventType.mouseUp) { draggingInMap = false; } if (e.type == EventType.mouseDown || (e.type == EventType.mouseDrag && draggingInMap)) { if (editMode == EditMode.AddRemove || editMode == EditMode.Reshape) { if (closestIdx != -1) { if (e.alt && e.shift) { AdjustIsoHeightAt(closestIdx, collidedFace, collisionPoint, -1); draggingInMap = false; } else if (e.shift) { AdjustIsoHeightAt(closestIdx, collidedFace, collisionPoint, 1); draggingInMap = false; } else if (editMode == EditMode.AddRemove) { if (e.alt) { RemoveIsoTileAt(closestIdx); draggingInMap = true; } else { AddOrStampIsoTileAt(closestIdx); draggingInMap = true; } } else if (editMode == EditMode.Reshape) { if (e.alt) { RemoveOffsetsAt(closestIdx); draggingInMap = true; } else { StampOffsetsAt(closestIdx); draggingInMap = true; } } e.Use(); } } else if (editMode == EditMode.Paint) { if (collidedFace != Neighbors.None) { SetTileSpecAt(closestIdx, collidedFace); draggingInMap = true; e.Use(); } } } else if (e.type == EventType.layout) { HandleUtility.AddDefaultControl(controlID); } else if (e.type == EventType.mouseMove) { e.Use(); } else if (e.type == EventType.KeyDown) { int nextZ = editZ; if (e.keyCode == KeyCode.UpArrow) { if (editZ < 20 - 1) { nextZ++; } e.Use(); } else if (e.keyCode == KeyCode.DownArrow) { if (editZ > 0) { nextZ--; } e.Use(); } if (nextZ != editZ) { //RegisterUndo(target, "Map Height Selection"); editZ = nextZ; } } lastSize = sz; lastSideLength = s; lastPos = pos; lastH = h; editModeChanged = false; this.Repaint(); }