X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsdl.c;h=eee5d59ac56cee2d054f4ecbd79fa788982569c5;hb=39fb4fecfb8d4647d3563bdb18ce0065f6129522;hp=9d2dc17c656f06b6ded090cc5da70f22bdd7b84e;hpb=88a1829af8ca41b6e581f209002022b2483b86df;p=rocksndiamonds.git diff --git a/src/libgame/sdl.c b/src/libgame/sdl.c index 9d2dc17c..eee5d59a 100644 --- a/src/libgame/sdl.c +++ b/src/libgame/sdl.c @@ -62,6 +62,10 @@ static void FinalizeScreen(int draw_target) // copy global animations to render target buffer, if defined (above border) if (gfx.draw_global_anim_function != NULL) gfx.draw_global_anim_function(draw_target, DRAW_GLOBAL_ANIM_STAGE_2); + + // copy tile selection cursor to render target buffer, if defined (above all) + if (gfx.draw_tile_cursor_function != NULL) + gfx.draw_tile_cursor_function(draw_target); } static void UpdateScreenExt(SDL_Rect *rect, boolean with_frame_delay) @@ -241,6 +245,20 @@ static void UpdateScreen_WithoutFrameDelay(SDL_Rect *rect) UpdateScreenExt(rect, FALSE); } +void Delay_WithScreenUpdates(unsigned int delay) +{ + unsigned int time_current = SDL_GetTicks(); + unsigned int time_delayed = time_current + delay; + + while (time_current < time_delayed) + { + // updating the screen contains waiting for frame delay (non-busy) + UpdateScreen_WithFrameDelay(NULL); + + time_current = SDL_GetTicks(); + } +} + static void SDLSetWindowIcon(char *basename) { /* (setting the window icon on Mac OS X would replace the high-quality @@ -1385,20 +1403,7 @@ void SDLFadeRectangle(int x, int y, int width, int height, } if (post_delay > 0) - { - unsigned int time_post_delay; - - time_current = SDL_GetTicks(); - time_post_delay = time_current + post_delay; - - while (time_current < time_post_delay) - { - // updating the screen contains waiting for frame delay (non-busy) - UpdateScreen_WithFrameDelay(NULL); - - time_current = SDL_GetTicks(); - } - } + Delay_WithScreenUpdates(post_delay); // restore function for drawing global masked border gfx.draw_global_border_function = draw_global_border_function; @@ -2980,16 +2985,183 @@ boolean SDLReadJoystick(int nr, int *x, int *y, boolean *b1, boolean *b2) /* ========================================================================= */ #if defined(USE_TOUCH_INPUT_OVERLAY) +static void DrawTouchInputOverlay_ShowGrid(int alpha) +{ + SDL_Rect rect; + int grid_xsize = overlay.grid_xsize; + int grid_ysize = overlay.grid_ysize; + int x, y; + + SDL_SetRenderDrawColor(sdl_renderer, 255, 255, 255, alpha); + SDL_SetRenderDrawBlendMode(sdl_renderer, SDL_BLENDMODE_BLEND); + + for (x = 0; x < grid_xsize; x++) + { + rect.x = (x + 0) * video.screen_width / grid_xsize; + rect.w = (x + 1) * video.screen_width / grid_xsize - rect.x; + + for (y = 0; y < grid_ysize; y++) + { + rect.y = (y + 0) * video.screen_height / grid_ysize; + rect.h = (y + 1) * video.screen_height / grid_ysize - rect.y; + + if (overlay.grid_button[x][y] == CHAR_GRID_BUTTON_NONE) + SDL_RenderDrawRect(sdl_renderer, &rect); + } + } + + SDL_SetRenderDrawColor(sdl_renderer, 0, 0, 0, 255); +} + +static void RenderFillRectangle(int x, int y, int width, int height) +{ + SDL_Rect rect = { x, y, width, height }; + + SDL_RenderFillRect(sdl_renderer, &rect); +} + +static void DrawTouchInputOverlay_ShowGridButtons(int alpha) +{ + static int alpha_direction = 0; + static int alpha_highlight = 0; + int alpha_max = ALPHA_FROM_TRANSPARENCY(setup.touch.transparency); + int alpha_step = ALPHA_FADING_STEPSIZE(alpha_max); + SDL_Rect rect; + int grid_xsize = overlay.grid_xsize; + int grid_ysize = overlay.grid_ysize; + int x, y; + + if (alpha == alpha_max) + { + if (alpha_direction < 0) + { + alpha_highlight = MAX(0, alpha_highlight - alpha_step); + + if (alpha_highlight == 0) + alpha_direction = 1; + } + else + { + alpha_highlight = MIN(alpha_highlight + alpha_step, alpha_max); + + if (alpha_highlight == alpha_max) + alpha_direction = -1; + } + } + else + { + alpha_direction = 1; + alpha_highlight = alpha; + } + + SDL_SetRenderDrawBlendMode(sdl_renderer, SDL_BLENDMODE_BLEND); + + for (x = 0; x < grid_xsize; x++) + { + for (y = 0; y < grid_ysize; y++) + { + int grid_button = overlay.grid_button[x][y]; + int grid_button_action = GET_ACTION_FROM_GRID_BUTTON(grid_button); + int alpha_draw = alpha; + int outline_border = MV_NONE; + int border_size = 2; + boolean draw_outlined = setup.touch.draw_outlined; + boolean draw_pressed = setup.touch.draw_pressed; + + if (grid_button == CHAR_GRID_BUTTON_NONE) + continue; + + if (grid_button == overlay.grid_button_highlight) + alpha_draw = alpha_highlight; + + if (draw_pressed && overlay.grid_button_action & grid_button_action) + { + if (draw_outlined) + draw_outlined = FALSE; + else + alpha_draw = MIN((float)alpha_draw * 1.5, SDL_ALPHA_OPAQUE); + } + + SDL_SetRenderDrawColor(sdl_renderer, 255, 255, 255, alpha_draw); + + rect.x = (x + 0) * video.screen_width / grid_xsize; + rect.y = (y + 0) * video.screen_height / grid_ysize; + rect.w = (x + 1) * video.screen_width / grid_xsize - rect.x; + rect.h = (y + 1) * video.screen_height / grid_ysize - rect.y; + + if (x == 0 || overlay.grid_button[x - 1][y] != grid_button) + { + rect.x += border_size; + rect.w -= border_size; + + outline_border |= MV_LEFT; + } + + if (x == grid_xsize - 1 || overlay.grid_button[x + 1][y] != grid_button) + { + rect.w -= border_size; + + outline_border |= MV_RIGHT; + } + + if (y == 0 || overlay.grid_button[x][y - 1] != grid_button) + { + rect.y += border_size; + rect.h -= border_size; + + outline_border |= MV_UP; + } + + if (y == grid_ysize - 1 || overlay.grid_button[x][y + 1] != grid_button) + { + rect.h -= border_size; + + outline_border |= MV_DOWN; + } + + if (draw_outlined) + { + int rect_x = rect.x + + (outline_border & MV_LEFT ? border_size : 0); + int rect_w = rect.w - + (outline_border & MV_LEFT ? border_size : 0) - + (outline_border & MV_RIGHT ? border_size : 0); + + if (outline_border & MV_LEFT) + RenderFillRectangle(rect.x, rect.y, border_size, rect.h); + + if (outline_border & MV_RIGHT) + RenderFillRectangle(rect.x + rect.w - border_size, rect.y, + border_size, rect.h); + + if (outline_border & MV_UP) + RenderFillRectangle(rect_x, rect.y, rect_w, border_size); + + if (outline_border & MV_DOWN) + RenderFillRectangle(rect_x, rect.y + rect.h - border_size, + rect_w, border_size); + } + else + { + SDL_RenderFillRect(sdl_renderer, &rect); + } + } + } + + SDL_SetRenderDrawColor(sdl_renderer, 0, 0, 0, 255); +} + static void DrawTouchInputOverlay() { static SDL_Texture *texture = NULL; static boolean initialized = FALSE; static boolean deactivated = TRUE; + static boolean show_grid = FALSE; static int width = 0, height = 0; - static int alpha_max = SDL_ALPHA_OPAQUE / 2; - static int alpha_step = 5; - static int alpha_last = 0; + static int alpha_last = -1; static int alpha = 0; + int alpha_max = ALPHA_FROM_TRANSPARENCY(setup.touch.transparency); + int alpha_step = ALPHA_FADING_STEPSIZE(alpha_max); boolean active = (overlay.enabled && overlay.active); if (!active && deactivated) @@ -3010,6 +3182,21 @@ static void DrawTouchInputOverlay() deactivated = TRUE; } + if (overlay.show_grid) + show_grid = TRUE; + else if (deactivated) + show_grid = FALSE; + + if (show_grid) + DrawTouchInputOverlay_ShowGrid(alpha); + + DrawTouchInputOverlay_ShowGridButtons(alpha); + + return; + + + // !!! VIRTUAL BUTTONS FROM IMAGE FILE NOT USED ANYMORE !!! + if (!initialized) { char *basename = "overlay/VirtualButtons.png"; @@ -3038,7 +3225,6 @@ static void DrawTouchInputOverlay() SDL_FreeSurface(surface); SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); - SDL_SetTextureAlphaMod(texture, alpha_max); initialized = TRUE; }