From dac9bc367e1be04be313883b58bd5aa7933dae1a Mon Sep 17 00:00:00 2001 From: Allanis Date: Sun, 10 Mar 2013 18:53:15 +0000 Subject: [PATCH] [Add] Allow for star map zooming. --- src/map.c | 49 +++++++++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/src/map.c b/src/map.c index 58a0ebc..5fd6885 100644 --- a/src/map.c +++ b/src/map.c @@ -6,16 +6,17 @@ #include "map.h" #define WINDOW_WIDTH 550 -#define WINDOW_HEIGHT 400 +#define WINDOW_HEIGHT 440 #define MAP_WIDTH (WINDOW_WIDTH-150) -#define MAP_HEIGHT (WINDOW_HEIGHT-60) +#define MAP_HEIGHT (WINDOW_HEIGHT-100) #define BUTTON_WIDTH 60 #define BUTTON_HEIGHT 40 static int map_wid = 0; -static double map_xpos = 0.; +static double map_zoom = 1.; // Zoom of the map. +static double map_xpos = 0.; // Map position. static double map_ypos = 0.; static int map_selected = 0; @@ -33,6 +34,7 @@ static void map_close(char* str); static void map_update(void); static void map_render(double bx, double by, double w, double h); static void map_mouse(SDL_Event* event, double mx, double my); +static void map_buttonZoom(char* str); // Open the map window. void map_open(void) { @@ -62,12 +64,15 @@ void map_open(void) { window_addText(map_wid, -20, -110-gl_smallFont.h-5, 80, 100, 0, "txtPlanets", &gl_smallFont, &cBlack, NULL); - window_addCust(map_wid, 20, 20, MAP_WIDTH, MAP_HEIGHT, + window_addCust(map_wid, 20, -40, MAP_WIDTH, MAP_HEIGHT, "cstMap", 1, map_render, map_mouse); window_addButton(map_wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnClose", "Close", map_close); + window_addButton(map_wid, 40, 20, 30, 30, "btnZoomIn", "+", map_buttonZoom); + window_addButton(map_wid, 80, 20, 30, 30, "btnZoomOut", "-", map_buttonZoom); + map_update(); } @@ -130,8 +135,8 @@ static void map_render(double bx, double by, double w, double h) { glColour* col; r = 5.; - x = bx - map_xpos + w/2; - y = by - map_ypos + h/2; + x = (bx - map_xpos + w/2) * 1.; // Map zoom. + y = (by - map_ypos + h/2) * 1.; // Map zoom. // Background COLOUR(cBlack); glBegin(GL_QUADS); @@ -149,8 +154,8 @@ static void map_render(double bx, double by, double w, double h) { if(sys == cur_system) COLOUR(cRadar_targ); else if(sys->nplanets == 0) COLOUR(cInert); else COLOUR(cYellow); - gl_drawCircleInRect(x + sys->pos.x, - y + sys->pos.y, + gl_drawCircleInRect(x + sys->pos.x*map_zoom, + y + sys->pos.y*map_zoom, r, bx, by, w, h); // Draw the hyperspace paths. @@ -166,18 +171,18 @@ static void map_render(double bx, double by, double w, double h) { else col = &cInert; glBegin(GL_LINE_STRIP); ACOLOUR(*col, 0.); - tx = x + sys->pos.x; - ty = y + sys->pos.y; + tx = x + sys->pos.x * map_zoom; + ty = y + sys->pos.y * map_zoom; if(!((tx < bx) || (tx > bx + w) || (ty < by) || (ty > by+h))) glVertex2d(tx, ty); COLOUR(*col); - tx += (systems_stack[sys->jumps[j]].pos.x - sys->pos.x)/2.; - ty += (systems_stack[sys->jumps[j]].pos.y - sys->pos.y)/2.; + tx += (systems_stack[sys->jumps[j]].pos.x - sys->pos.x)/2. * map_zoom; + ty += (systems_stack[sys->jumps[j]].pos.y - sys->pos.y)/2. * map_zoom; if(!((tx < bx) || (tx > bx+w) || (ty < by) || (ty > by+h))) glVertex2d(tx, ty); ACOLOUR(*col, 0.); - tx += (systems_stack[sys->jumps[j]].pos.x - sys->pos.x)/2.; - ty += (systems_stack[sys->jumps[j]].pos.y - sys->pos.y)/2.; + tx = x + systems_stack[sys->jumps[j]].pos.x * map_zoom; + ty = y + systems_stack[sys->jumps[j]].pos.y * map_zoom; if(!((tx < bx) || (tx > bx+w) || (ty < by) || (ty > by+h))) glVertex2d(tx, ty); glEnd(); @@ -187,7 +192,8 @@ static void map_render(double bx, double by, double w, double h) { // Selected planet. sys = &systems_stack[map_selected]; COLOUR(cRed); - gl_drawCircleInRect(x + sys->pos.x, y + sys->pos.y, r+3., bx, by, w, h); + gl_drawCircleInRect(x + sys->pos.x*map_zoom, y + sys->pos.y*map_zoom, + r+3., bx, by, w, h); } // Map event handling. @@ -195,7 +201,7 @@ static void map_mouse(SDL_Event* event, double mx, double my) { int i, j; double x, y, t; - t = 13.*13.; // Threshold. + t = 13.*15.; // Threshold. mx -= MAP_WIDTH/2 - map_xpos; my -= MAP_HEIGHT/2 - map_ypos; @@ -205,8 +211,8 @@ static void map_mouse(SDL_Event* event, double mx, double my) { // Selecting star system. if(event->button.button == SDL_BUTTON_LEFT) { for(i = 0; i < systems_nstack; i++) { - x = systems_stack[i].pos.x; - y = systems_stack[i].pos.y; + x = systems_stack[i].pos.x * map_zoom; + y = systems_stack[i].pos.y * map_zoom; if((pow2(mx-x)+pow2(my-y)) < t) { map_selected = i; @@ -241,3 +247,10 @@ static void map_mouse(SDL_Event* event, double mx, double my) { } } +static void map_buttonZoom(char* str) { + if(strcmp(str, "btnZoomIn")==0) + map_zoom = MIN(2., map_zoom+0.5); + else if(strcmp(str, "btnZoomOut")==0) + map_zoom = MAX(0.5, map_zoom-0.5); +} +