Ejemplo n.º 1
0
    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);
    }
Ejemplo n.º 2
0
    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);
        }
    }
Ejemplo n.º 3
0
    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));
        }
    }
Ejemplo n.º 4
0
 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);
     }
 }
Ejemplo n.º 5
0
 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;
 }
Ejemplo n.º 6
0
    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();
    }