diff options
author | rubidium <rubidium@openttd.org> | 2013-05-19 14:49:25 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2013-05-19 14:49:25 +0000 |
commit | ef7befdbd8b0d30e6ce121f4348799692b66d0ba (patch) | |
tree | 28be79f13ddeae1d11020509170c094fdf416746 /src/viewport.cpp | |
parent | 50ae992b47f581d8a50892942438bfe7e3f62141 (diff) | |
download | openttd-ef7befdbd8b0d30e6ce121f4348799692b66d0ba.tar.xz |
(svn r25264) -Feature: linkgraph overlay over main viewport (fonsinchen)
Diffstat (limited to 'src/viewport.cpp')
-rw-r--r-- | src/viewport.cpp | 64 |
1 files changed, 48 insertions, 16 deletions
diff --git a/src/viewport.cpp b/src/viewport.cpp index bfcc8d9d1..d96d283db 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -45,6 +45,7 @@ #include "window_func.h" #include "tilehighlight_func.h" #include "window_gui.h" +#include "linkgraph/linkgraph_gui.h" #include "table/strings.h" #include "table/palettes.h" @@ -218,6 +219,8 @@ void InitializeWindowViewport(Window *w, int x, int y, vp->dest_scrollpos_x = pt.x; vp->dest_scrollpos_y = pt.y; + vp->overlay = NULL; + w->viewport = vp; vp->virtual_left = 0;//pt.x; vp->virtual_top = 0;//pt.y; @@ -1399,22 +1402,8 @@ static void ViewportDrawDirtyBlocks() } while (--bottom > 0); } -static void ViewportDrawStrings(DrawPixelInfo *dpi, const StringSpriteToDrawVector *sstdv) +static void ViewportDrawStrings(ZoomLevel zoom, const StringSpriteToDrawVector *sstdv) { - DrawPixelInfo dp; - ZoomLevel zoom; - - _cur_dpi = &dp; - dp = *dpi; - - zoom = dp.zoom; - dp.zoom = ZOOM_LVL_NORMAL; - - dp.left = UnScaleByZoom(dp.left, zoom); - dp.top = UnScaleByZoom(dp.top, zoom); - dp.width = UnScaleByZoom(dp.width, zoom); - dp.height = UnScaleByZoom(dp.height, zoom); - const StringSpriteToDraw *ssend = sstdv->End(); for (const StringSpriteToDraw *ss = sstdv->Begin(); ss != ssend; ++ss) { TextColour colour = TC_BLACK; @@ -1497,7 +1486,24 @@ void ViewportDoDraw(const ViewPort *vp, int left, int top, int right, int bottom if (_draw_bounding_boxes) ViewportDrawBoundingBoxes(&_vd.parent_sprites_to_sort); if (_draw_dirty_blocks) ViewportDrawDirtyBlocks(); - if (_vd.string_sprites_to_draw.Length() != 0) ViewportDrawStrings(&_vd.dpi, &_vd.string_sprites_to_draw); + DrawPixelInfo dp = _vd.dpi; + ZoomLevel zoom = _vd.dpi.zoom; + dp.zoom = ZOOM_LVL_NORMAL; + dp.width = UnScaleByZoom(dp.width, zoom); + dp.height = UnScaleByZoom(dp.height, zoom); + _cur_dpi = &dp; + + /* translate to window coordinates */ + dp.left = x; + dp.top = y; + + if (vp->overlay != NULL) vp->overlay->Draw(&dp); + + /* translate back to world coordinates */ + dp.left = UnScaleByZoom(_vd.dpi.left, zoom); + dp.top = UnScaleByZoom(_vd.dpi.top, zoom); + + if (_vd.string_sprites_to_draw.Length() != 0) ViewportDrawStrings(zoom, &_vd.string_sprites_to_draw); _cur_dpi = old_dpi; @@ -1613,6 +1619,7 @@ void UpdateViewportPosition(Window *w) int delta_x = w->viewport->dest_scrollpos_x - w->viewport->scrollpos_x; int delta_y = w->viewport->dest_scrollpos_y - w->viewport->scrollpos_y; + bool update_overlay = false; if (delta_x != 0 || delta_y != 0) { if (_settings_client.gui.smooth_scroll) { int max_scroll = ScaleByMapSize1D(512 * ZOOM_LVL_BASE); @@ -1623,11 +1630,14 @@ void UpdateViewportPosition(Window *w) w->viewport->scrollpos_x = w->viewport->dest_scrollpos_x; w->viewport->scrollpos_y = w->viewport->dest_scrollpos_y; } + update_overlay = (w->viewport->scrollpos_x == w->viewport->dest_scrollpos_x && + w->viewport->scrollpos_y == w->viewport->dest_scrollpos_y); } ClampViewportToMap(vp, w->viewport->scrollpos_x, w->viewport->scrollpos_y); SetViewportPosition(w, w->viewport->scrollpos_x, w->viewport->scrollpos_y); + if (update_overlay) RebuildViewportOverlay(w); } } @@ -1987,6 +1997,15 @@ bool HandleViewportClicked(const ViewPort *vp, int x, int y) return result; } +void RebuildViewportOverlay(Window *w) +{ + if (w->viewport->overlay != NULL && + w->viewport->overlay->GetCompanyMask() != 0 && + w->viewport->overlay->GetCargoMask() != 0) { + w->viewport->overlay->RebuildCache(); + w->SetDirty(); + } +} /** * Scrolls the viewport in a window to a given location. @@ -2010,6 +2029,7 @@ bool ScrollWindowTo(int x, int y, int z, Window *w, bool instant) if (instant) { w->viewport->scrollpos_x = pt.x; w->viewport->scrollpos_y = pt.y; + RebuildViewportOverlay(w); } w->viewport->dest_scrollpos_x = pt.x; @@ -2966,3 +2986,15 @@ void ResetObjectToPlace() { SetObjectToPlace(SPR_CURSOR_MOUSE, PAL_NONE, HT_NONE, WC_MAIN_WINDOW, 0); } + +Point GetViewportStationMiddle(const ViewPort *vp, const Station *st) +{ + int x = TileX(st->xy) * TILE_SIZE; + int y = TileY(st->xy) * TILE_SIZE; + int z = GetSlopePixelZ(Clamp(x, 0, MapSizeX() * TILE_SIZE - 1), Clamp(y, 0, MapSizeY() * TILE_SIZE - 1)); + + Point p = RemapCoords(x, y, z); + p.x = UnScaleByZoom(p.x - vp->virtual_left, vp->zoom) + vp->left; + p.y = UnScaleByZoom(p.y - vp->virtual_top, vp->zoom) + vp->top; + return p; +} |