From f00696711a1a72fedf2df030fa9782d9cc79ab8e Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Sat, 6 Mar 2021 14:53:25 +0100 Subject: [PATCH] HyperRogue ported to SDL2 (in mymake do -sdl2) --- basegraph.cpp | 108 +++++++++++++++++++++++++++++++++++++++++++------- control.cpp | 106 ++++++++++++++++++++++++++++++++++++++++++------- drawing.cpp | 36 ++++++++++++----- graph.cpp | 13 ++---- history.cpp | 18 +++++++-- multi.cpp | 46 ++++++++++++++++++++- mymake.cpp | 62 +++++++++++++++++++++++------ netgen.cpp | 30 ++++++++++---- rug.cpp | 20 +++++----- shmup.cpp | 6 ++- sysconfig.h | 36 +++++++++++++++++ textures.cpp | 2 +- 12 files changed, 396 insertions(+), 87 deletions(-) diff --git a/basegraph.cpp b/basegraph.cpp index 06f68ba6..5e023f23 100644 --- a/basegraph.cpp +++ b/basegraph.cpp @@ -130,8 +130,21 @@ void fix_font_size(int& size) { #endif #if CAP_SDL + +#if !CAP_SDL2 +#if HDR +typedef SDL_Surface SDL_Renderer +#define srend s +#endif +#endif + EX SDL_Surface *s; EX SDL_Surface *s_screen; +#if CAP_SDL2 +EX SDL_Renderer *srend; +EX SDL_Texture *s_texture; +EX SDL_Window *s_window; +#endif EX color_t qpixel_pixel_outside; @@ -143,6 +156,31 @@ EX color_t& qpixel(SDL_Surface *surf, int x, int y) { return pi[x]; } +EX void present_surface() { + #if CAP_SDL2 + SDL_UpdateTexture(s_texture, NULL, s, s->w * sizeof (Uint32)); + SDL_RenderClear(srend); + SDL_RenderCopy(srend, s_texture, NULL, NULL); + SDL_RenderPresent(srend); + #else + SDL_UpdateRect(s, 0, 0, 0, 0); + #endif + } + +EX void present_screen() { +#if CAP_GL + if(vid.usingGL) { + #if CAP_SDL2 + SDL_GL_SwapWindow(s_window); + #else + SDL_GL_SwapBuffers(); + #endif + return; + } +#endif + present_surface(); + } + #endif #if CAP_SDLTTF @@ -733,7 +771,11 @@ EX bool displaystr(int x, int y, int shift, int size, const char *str, color_t c bool clicked = (mousex >= rect.x && mousey >= rect.y && mousex <= rect.x+rect.w && mousey <= rect.y+rect.h); if(shift) { + #if CAP_SDL2 + SDL_Surface* txt2 = SDL_ConvertSurfaceFormat(txt, SDL_PIXELFORMAT_RGBA8888, 0); + #else SDL_Surface* txt2 = SDL_DisplayFormat(txt); + #endif SDL_LockSurface(txt2); SDL_LockSurface(s); color_t c0 = qpixel(txt2, 0, 0); @@ -993,12 +1035,12 @@ EX void drawCircle(int x, int y, int size, color_t color, color_t fillcolor IS(0 gdpush(4); gdpush(color); gdpush(x); gdpush(y); gdpush(size); #elif CAP_SDLGFX if(pconf.stretch == 1) { - if(fillcolor) filledCircleColor(s, x, y, size, fillcolor); - if(color) ((vid.antialias && AA_NOGL)?aacircleColor:circleColor) (s, x, y, size, color); + if(fillcolor) filledCircleColor(srend, x, y, size, fillcolor); + if(color) ((vid.antialias && AA_NOGL)?aacircleColor:circleColor) (srend, x, y, size, color); } else { - if(fillcolor) filledEllipseColor(s, x, y, size, size * pconf.stretch, fillcolor); - if(color) ((vid.antialias && AA_NOGL)?aaellipseColor:ellipseColor) (s, x, y, size, size * pconf.stretch, color); + if(fillcolor) filledEllipseColor(srend, x, y, size, size * pconf.stretch, fillcolor); + if(color) ((vid.antialias && AA_NOGL)?aaellipseColor:ellipseColor) (srend, x, y, size, size * pconf.stretch, color); } #elif CAP_SDL int pts = size * 4; @@ -1109,6 +1151,10 @@ EX pair get_requested_resolution() { return { vid.window_x, vid.window_y }; } +#ifndef CUSTOM_CAPTION +#define CUSTOM_CAPTION ("HyperRogue " VER) +#endif + #if CAP_SDL EX void setvideomode() { @@ -1127,11 +1173,12 @@ EX void setvideomode() { #if CAP_GL vid.usingGL = vid.wantGL; if(vid.usingGL) { - flags = SDL_OPENGL | SDL_HWSURFACE; + flags = SDL12(SDL_OPENGL | SDL_HWSURFACE, SDL_WINDOW_OPENGL); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 1); + vid.current_vsync = want_vsync(); - #if !ISMOBWEB + #if !ISMOBWEB && !CAP_SDL2 if(vid.current_vsync) SDL_GL_SetAttribute( SDL_GL_SWAP_CONTROL, 1 ); else @@ -1146,7 +1193,7 @@ EX void setvideomode() { vid.usingGL = false; #endif - int sizeflag = (vid.full ? SDL_FULLSCREEN : SDL_RESIZABLE); + int sizeflag = SDL12(vid.full ? SDL_FULLSCREEN : SDL_RESIZABLE, vid.full ? SDL_WINDOW_FULLSCREEN : SDL_WINDOW_RESIZABLE); #ifdef WINDOWS #ifndef OLD_MINGW @@ -1167,23 +1214,49 @@ EX void setvideomode() { #endif #endif - s = s_screen = SDL_SetVideoMode(vid.xres, vid.yres, 32, flags | sizeflag); + auto create_win = [&] { + #if CAP_SDL2 + if(s_window) SDL_DestroyWindow(s_window); + s_window = SDL_CreateWindow(CUSTOM_CAPTION, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, + vid.xres, vid.yres, + flags | sizeflag + ); + #else + s = SDL_SetVideoMode(vid.xres, vid.yres, 32, flags | sizeflag); + #endif + }; + + create_win(); if(vid.full && !s) { vid.xres = vid.xscr; vid.yres = vid.yscr; vid.fsize = 10; - s = s_screen = SDL_SetVideoMode(vid.xres, vid.yres, 32, flags | SDL_FULLSCREEN); + sizeflag = SDL12(SDL_FULLSCREEN, SDL_WINDOW_FULLSCREEN); + create_win(); } if(!s) { addMessage("Failed to set the graphical mode: "+its(vid.xres)+"x"+its(vid.yres)+(vid.full ? " fullscreen" : " windowed")); vid.xres = 640; vid.yres = 480; - SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0); + SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0); vid.antialias &= ~AA_MULTI; - s = s_screen = SDL_SetVideoMode(vid.xres, vid.yres, 32, flags | SDL_RESIZABLE); + sizeflag = SDL12(SDL_RESIZABLE, SDL_WINDOW_RESIZABLE); + create_win(); } + + #if CAP_SDL2 + if(srend) SDL_DestroyRenderer(srend); + srend = SDL_CreateRenderer(s_window, -1, vid.current_vsync ? SDL_RENDERER_PRESENTVSYNC : 0); + + if(s_texture) SDL_DestroyTexture(s_texture); + s_texture = SDL_CreateTexture(srend, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, vid.xres, vid.yres); + + if(s) SDL_FreeSurface(s); + s = shot::empty_surface(vid.xres, vid.yres, false); + #endif + s_screen = s; #if CAP_GL if(vid.usingGL) { @@ -1251,16 +1324,21 @@ EX void init_graph() { get_canvas_size(); #else if(!vid.xscr) { + #if CAP_SDL2 + SDL_DisplayMode dm; + SDL_GetCurrentDisplayMode(0, &dm); + vid.xscr = vid.xres = dm.w; + vid.yscr = vid.yres = dm.h; + #else const SDL_VideoInfo *inf = SDL_GetVideoInfo(); vid.xscr = vid.xres = inf->current_w; vid.yscr = vid.yres = inf->current_h; + #endif } #endif -#ifdef CUSTOM_CAPTION +#if !CAP_SDL2 SDL_WM_SetCaption(CUSTOM_CAPTION, CUSTOM_CAPTION); -#else - SDL_WM_SetCaption("HyperRogue " VER, "HyperRogue " VER); #endif #endif @@ -1271,8 +1349,10 @@ EX void init_graph() { exit(2); } + #if !CAP_SDL2 SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); SDL_EnableUNICODE(1); + #endif #endif #if ISANDROID diff --git a/control.cpp b/control.cpp index 3a801a75..38ded6ef 100644 --- a/control.cpp +++ b/control.cpp @@ -728,14 +728,22 @@ EX void mainloopiter() { oldmousepan = mousepan; #if CAP_MOUSEGRAB if(mousepan) { + #if CAP_SDL2 + SDL_SetRelativeMouseMode(SDL_TRUE); + #else SDL_WM_GrabInput(SDL_GRAB_ON); SDL_ShowCursor(SDL_DISABLE); + #endif mouseaim_x = mouseaim_y = 0; } else { + #if CAP_SDL2 + SDL_SetRelativeMouseMode(SDL_FALSE); + #else SDL_WM_GrabInput( SDL_GRAB_OFF ); SDL_ShowCursor(SDL_ENABLE); SDL_WarpMouse(vid.xres/2, vid.yres/2); + #endif mouseaim_x = mouseaim_y = 0; } #endif @@ -769,6 +777,30 @@ EX void mainloopiter() { lastframe = ticks; } + wheelclick = false; + + getcshift = 1; + + #if CAP_SDL2 + + const Uint8 *keystate = SDL_GetKeyboardState(NULL); + + pandora_rightclick = keystate[SDL_SCANCODE_RCTRL]; + pandora_leftclick = keystate[SDL_SCANCODE_RSHIFT]; + + lshiftclick = keystate[SDL_SCANCODE_LSHIFT]; + rshiftclick = keystate[SDL_SCANCODE_RSHIFT]; + + lctrlclick = keystate[SDL_SCANCODE_LCTRL]; + rctrlclick = keystate[SDL_SCANCODE_RCTRL]; + + hiliteclick = keystate[SDL_SCANCODE_LALT] | keystate[SDL_SCANCODE_RALT]; + if(keystate[SDL_SCANCODE_LSHIFT] || keystate[SDL_SCANCODE_RSHIFT]) getcshift = -1; + if(keystate[SDL_SCANCODE_LCTRL] || keystate[SDL_SCANCODE_RCTRL]) getcshift /= 10; + if(keystate[SDL_SCANCODE_LALT] || keystate[SDL_SCANCODE_RALT]) getcshift *= 10; + + #else + Uint8 *keystate = SDL_GetKeyState(NULL); pandora_rightclick = keystate[SDLK_RCTRL]; @@ -776,21 +808,22 @@ EX void mainloopiter() { lshiftclick = keystate[SDLK_LSHIFT]; rshiftclick = keystate[SDLK_RSHIFT]; - anyshiftclick = lshiftclick | rshiftclick; lctrlclick = keystate[SDLK_LCTRL]; rctrlclick = keystate[SDLK_RCTRL]; - anyctrlclick = lctrlclick | rctrlclick; - - forcetarget = anyshiftclick; - hiliteclick = keystate[SDLK_LALT] | keystate[SDLK_RALT]; - wheelclick = false; - getcshift = 1; + hiliteclick = keystate[SDLK_LALT] | keystate[SDLK_RALT]; if(keystate[SDLK_LSHIFT] || keystate[SDLK_RSHIFT]) getcshift = -1; if(keystate[SDLK_LCTRL] || keystate[SDLK_RCTRL]) getcshift /= 10; if(keystate[SDLK_LALT] || keystate[SDLK_RALT]) getcshift *= 10; + #endif + + anyshiftclick = lshiftclick | rshiftclick; + anyctrlclick = lctrlclick | rctrlclick; + + forcetarget = anyshiftclick; + didsomething = false; if(vid.shifttarget&1) { @@ -858,6 +891,20 @@ EX void mainloopiter() { auto& lastticks = sc_ticks; ld t = (ticks - lastticks) * shiftmul / 1000.; lastticks = ticks; + + #if CAP_SDL2 + const Uint8 *keystate = SDL_GetKeyboardState(NULL); + + if(keystate[SDL_SCANCODE_END] && GDIM == 3 && DEFAULTNOR(SDL_SCANCODE_END)) full_forward_camera(-t); + if(keystate[SDL_SCANCODE_HOME] && GDIM == 3 && DEFAULTNOR(SDL_SCANCODE_HOME)) full_forward_camera(t); + if(keystate[SDL_SCANCODE_RIGHT] && DEFAULTNOR(SDL_SCANCODE_RIGHT)) full_rotate_camera(0, -t); + if(keystate[SDL_SCANCODE_LEFT] && DEFAULTNOR(SDL_SCANCODE_LEFT)) full_rotate_camera(0, t); + if(keystate[SDL_SCANCODE_UP] && DEFAULTNOR(SDL_SCANCODE_UP)) full_rotate_camera(1, t); + if(keystate[SDL_SCANCODE_DOWN] && DEFAULTNOR(SDL_SCANCODE_DOWN)) full_rotate_camera(1, -t); + if(keystate[SDL_SCANCODE_PAGEUP] && DEFAULTNOR(SDL_SCANCODE_PAGEUP)) full_rotate_view(t * 180 / M_PI, t); + if(keystate[SDL_SCANCODE_PAGEDOWN] && DEFAULTNOR(SDL_SCANCODE_PAGEDOWN)) full_rotate_view(-t * 180 / M_PI, t); + + #else Uint8 *keystate = SDL_GetKeyState(NULL); if(keystate[SDLK_END] && GDIM == 3 && DEFAULTNOR(SDLK_END)) full_forward_camera(-t); @@ -868,6 +915,7 @@ EX void mainloopiter() { if(keystate[SDLK_DOWN] && DEFAULTNOR(SDLK_DOWN)) full_rotate_camera(1, -t); if(keystate[SDLK_PAGEUP] && DEFAULTNOR(SDLK_PAGEUP)) full_rotate_view(t * 180 / M_PI, t); if(keystate[SDLK_PAGEDOWN] && DEFAULTNOR(SDLK_PAGEDOWN)) full_rotate_view(-t * 180 / M_PI, t); + #endif } else sc_ticks = ticks; @@ -905,6 +953,20 @@ EX void handle_event(SDL_Event& ev) { initJoysticks(); } */ + #if CAP_SDL2 + if(ev.type == SDL_WINDOWEVENT) { + auto w = ev.window.event; + if(w == SDL_WINDOWEVENT_ENTER) + outoffocus = false; + if(w == SDL_WINDOWEVENT_LEAVE) + outoffocus = true; + if(w == SDL_WINDOWEVENT_EXPOSED) + drawscreen(); + if(w == SDL_WINDOWEVENT_RESIZED) + resize_screen_to(ev.window.data1, ev.window.data2); + } + + #else if(ev.type == SDL_ACTIVEEVENT) { if(ev.active.state & SDL_APPINPUTFOCUS) { if(ev.active.gain) { @@ -917,11 +979,12 @@ EX void handle_event(SDL_Event& ev) { } if(ev.type == SDL_VIDEORESIZE) - resize_screen_to(ev.resize.w, ev.resize.h); + resize_screen_to(ev.resize.w, ev.resize.h); if(ev.type == SDL_VIDEOEXPOSE) { drawscreen(); } + #endif #if CAP_SDLJOY if(ev.type == SDL_JOYAXISMOTION && normal && DEFAULTCONTROL) { @@ -970,9 +1033,17 @@ EX void handle_event(SDL_Event& ev) { flashMessages(); mousing = false; sym = ev.key.keysym.sym; + #if CAP_SDL2 + uni = ev.key.keysym.sym; + if(uni >= 'a' && uni <= 'z') { + if(ev.key.keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT)) uni -= 32; + else if(ev.key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) uni -= 96; + } + #else uni = ev.key.keysym.unicode; if(ev.key.keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT)) shiftmul = -1; if(ev.key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) shiftmul /= 10; + #endif numlock_on = ev.key.keysym.mod & KMOD_NUM; if(sym == SDLK_RETURN && (ev.key.keysym.mod & (KMOD_LALT | KMOD_RALT))) { sym = 0; uni = 0; @@ -988,7 +1059,7 @@ EX void handle_event(SDL_Event& ev) { bool rollchange = (cmode & sm::OVERVIEW) && getcstat >= 2000 && cheater; - if(ev.type == SDL_MOUSEBUTTONDOWN || ev.type == SDL_MOUSEBUTTONUP) { + if(ev.type == SDL_MOUSEBUTTONDOWN || ev.type == SDL_MOUSEBUTTONUP SDL12(, || ev.type == SDL_MOUSEWHEEL)) { mousepressed = ev.type == SDL_MOUSEBUTTONDOWN; if(mousepressed) flashMessages(); mousing = true; @@ -996,19 +1067,22 @@ EX void handle_event(SDL_Event& ev) { bool was_holdmouse = holdmouse; holdmouse = false; + bool down = ev.type == SDL_MOUSEBUTTONDOWN SDL12(, || ev.type == SDL_MOUSEWHEEL); + bool up = ev.type == SDL_MOUSEBUTTONUP; + bool act = false; if(vid.quickmouse) { - act = ev.type == SDL_MOUSEBUTTONDOWN; + act = down; } else { - act = actonrelease && ev.type == SDL_MOUSEBUTTONUP; - actonrelease = ev.type == SDL_MOUSEBUTTONDOWN; + act = actonrelease && up; + actonrelease = down; } fix_mouseh(); - if(was_holdmouse && ev.type == SDL_MOUSEBUTTONUP) + if(was_holdmouse && up) sym = uni = PSEUDOKEY_RELEASE; /* simulate RMB and MMB for Mac users etc. */ @@ -1029,8 +1103,12 @@ EX void handle_event(SDL_Event& ev) { sym = getcstat, uni = getcstat, shiftmul = getcshift; } - else if(ev.button.button==SDL_BUTTON_WHEELDOWN || ev.button.button == SDL_BUTTON_WHEELUP) { + else if(SDL12(ev.button.button==SDL_BUTTON_WHEELDOWN || ev.button.button == SDL_BUTTON_WHEELUP, ev.type == SDL_MOUSEWHEEL)) { + #if CAP_SDL2 + ld dir = ev.wheel.y * 0.25; + #else ld dir = ev.button.button == SDL_BUTTON_WHEELUP ? 0.25 : -0.25; + #endif if(lshiftclick && rshiftclick && !rug::rugged && GDIM == 2) { mapeditor::scaleall(pow(2, dir), lctrlclick); pconf.alpha *= pow(2, dir); diff --git a/drawing.cpp b/drawing.cpp index 4368d9c5..705d44a4 100644 --- a/drawing.cpp +++ b/drawing.cpp @@ -251,7 +251,14 @@ EX void glflush() { #endif #if CAP_SDL && !ISMOBILE + SDL_Surface *aux; +#if CAP_SDL2 +SDL_Renderer *auxrend; +#else +#define auxrend aux +#endif + #endif #if CAP_POLY @@ -552,17 +559,17 @@ void addpoly(const shiftmatrix& V, const vector &tab, int ofs, int cnt } #if CAP_SDLGFX -void aapolylineColor(SDL_Surface *s, int*x, int *y, int polyi, color_t col) { +void aapolylineColor(SDL_Renderer *s, int*x, int *y, int polyi, color_t col) { for(int i=1; i spx(px, px + polyi); std::vector spy(py, py + polyi); filledPolygonColor(s, spx.data(), spy.data(), polyi, col); @@ -1977,19 +1984,19 @@ void dqi_poly::draw() { polyx[i] = 0; polyy[i] = vid.yres; i++; polyx[i] = 0; polyy[i] = 0; i++; } - filledPolygonColorI(s, polyx, polyy, polyi+5, color); + filledPolygonColorI(srend, polyx, polyy, polyi+5, color); } else if(poly_flags & POLY_TRIANGLES) { for(int i=0; istereo_active()) filledPolygonColorI(aux, polyxr, polyy, polyi, color); + if(current_display->stereo_active()) filledPolygonColorI(auxrend, polyxr, polyy, polyi, color); - ((vid.antialias & AA_NOGL) ?aapolylineColor:polylineColor)(s, polyx, polyy, polyi, outline); - if(current_display->stereo_active()) aapolylineColor(aux, polyxr, polyy, polyi, outline); + ((vid.antialias & AA_NOGL) ?aapolylineColor:polylineColor)(srend, polyx, polyy, polyi, outline); + if(current_display->stereo_active()) aapolylineColor(auxrend, polyxr, polyy, polyi, outline); if(vid.xres >= 2000 || fatborder) { int xmi = 3000, xma = -3000; @@ -1997,7 +2004,7 @@ void dqi_poly::draw() { if(xma > xmi + 20) for(int x=-1; x<2; x++) for(int y=-1; y<=2; y++) if(x*x+y*y == 1) { for(int t=0; tstereo_active() && !vid.usingGL) { - if(aux && (aux->w != s->w || aux->h != s->h)) + if(aux && (aux->w != s->w || aux->h != s->h)) { SDL_FreeSurface(aux); + #if CAP_SDL2 + SDL_DestroyRenderer(auxrend); + #endif + } if(!aux) { aux = SDL_CreateRGBSurface(SDL_SWSURFACE,s->w,s->h,32,0,0,0,0); + #if CAP_SDL2 + auxrend = SDL_CreateSoftwareRenderer(aux); + #endif } // SDL_LockSurface(aux); diff --git a/graph.cpp b/graph.cpp index 4cbfab2f..435defb3 100644 --- a/graph.cpp +++ b/graph.cpp @@ -4798,9 +4798,9 @@ EX void drawthemap() { } #if CAP_SDL - Uint8 *keystate = SDL_GetKeyState(NULL); + const Uint8 *keystate = SDL12_GetKeyState(NULL); lmouseover = mouseover; - bool useRangedOrb = (!(vid.shifttarget & 1) && haveRangedOrb() && lmouseover && lmouseover->cpdist > 1) || (keystate[SDLK_RSHIFT] | keystate[SDLK_LSHIFT]); + bool useRangedOrb = (!(vid.shifttarget & 1) && haveRangedOrb() && lmouseover && lmouseover->cpdist > 1) || (keystate[SDL12(SDLK_RSHIFT, SDL_SCANCODE_RSHIFT)] | keystate[SDL12(SDLK_LSHIFT, SDL_SCANCODE_LSHIFT)]); if(!useRangedOrb && !(cmode & sm::MAP) && !(cmode & sm::DRAW) && DEFAULTCONTROL && !mouseout() && !dual::state) { dynamicval gs(gravity_state, gravity_state); void calcMousedest(); @@ -5291,13 +5291,8 @@ EX void drawscreen() { #if CAP_VR vrhr::submit(); #endif - -#if CAP_SDL -#if CAP_GL - if(vid.usingGL) SDL_GL_SwapBuffers(); else -#endif - SDL_UpdateRect(s, 0, 0, vid.xres, vid.yres); -#endif + + present_screen(); #if CAP_VR vrhr::handoff(); diff --git a/history.cpp b/history.cpp index eda40bf3..c4a3be5a 100644 --- a/history.cpp +++ b/history.cpp @@ -108,31 +108,41 @@ namespace spiral { displaystr(SX/2, vid.fsize*2, 0, vid.fsize, "arrows = navigate, ESC = return, h = hide help", forecolor, 8); displaystr(SX/2, SY - vid.fsize*2, 0, vid.fsize, XLAT("s = save to " IMAGEEXT, buf), forecolor, 8); } - SDL_UpdateRect(s, 0, 0, 0, 0); + present_surface(); shiftx += velx; shifty += vely; SDL_Event event; while(SDL_PollEvent(&event)) switch (event.type) { + #if !CAP_SDL2 case SDL_VIDEORESIZE: { resize_screen_to(event.resize.w, event.resize.h); precompute(); break; } + #endif + #if CAP_SDL2 + case SDL_WINDOWEVENT: { + if(event.window.event == SDL_WINDOWEVENT_RESIZED) + resize_screen_to(event.window.data1, event.window.data2); + precompute(); + break; + } + #endif case SDL_QUIT: case SDL_MOUSEBUTTONDOWN: goto breakloop; case SDL_KEYDOWN: { int sym = event.key.keysym.sym; - int uni = event.key.keysym.unicode; + int uni = 0; numlock_on = event.key.keysym.mod & KMOD_NUM; if(DKEY == SDLK_RIGHT) velx++; if(DKEY == SDLK_LEFT) velx--; if(DKEY == SDLK_UP) vely++; if(DKEY == SDLK_DOWN) vely--; if(sym == SDLK_ESCAPE) goto breakloop; - if(uni == 'h') displayhelp = !displayhelp; - if(uni == 's') dosave = true; + if(sym == 'h') displayhelp = !displayhelp; + if(sym == 's') dosave = true; } } } diff --git a/multi.cpp b/multi.cpp index e55afd23..52a8fd41 100644 --- a/multi.cpp +++ b/multi.cpp @@ -167,7 +167,11 @@ string listkeys(int id) { string lk = ""; for(int i=0; i<512; i++) if(scfg.keyaction[i] == id) + #if CAP_SDL2 + lk = lk + " " + SDL_GetScancodeName(SDL_Scancode(i)); + #else lk = lk + " " + SDL_GetKeyName(SDLKey(i)); + #endif #if CAP_SDLJOY for(int i=0; i modules; time_t get_file_time(const string s) { @@ -97,13 +125,7 @@ bool file_exists(string fname) { } int main(int argc, char **argv) { -#if defined(MAC) - set_mac(); -#elif defined(WINDOWS) - set_mingw64(); -#else - set_linux(); -#endif + set_os(os); int retval = 0; // for storing return values of some function calls for(string fname: {"Makefile.loc", "Makefile.simple", "Makefile"}) if(file_exists(fname)) { @@ -122,26 +144,40 @@ int main(int argc, char **argv) { else obj_dir += c; } else if(s == "-mingw64") { - set_mingw64(); + set_os("mingw64"); obj_dir += "/mingw64"; setdir += "../"; } else if(s == "-mac") { - set_mac(); + set_os("mac"); obj_dir += "/mac"; setdir += "../"; } else if(s == "-linux") { - set_linux(); + set_os("linux"); obj_dir += "/linux"; setdir += "../"; } else if(s == "-web") { - set_web(); + set_os("web"); modules.push_back("hyperweb"); obj_dir += "/web"; setdir += "../"; } + else if(s == "-sdl1") { + sdlver = 1; + set_os(os); + obj_dir += "/sdl1"; + setdir += "../"; + opts += " -DCAP_SDL2=0"; + } + else if(s == "-sdl2") { + sdlver = 2; + set_os(os); + obj_dir += "/sdl2"; + setdir += "../"; + opts += " -DCAP_SDL2=1"; + } else if(s.substr(0, 2) == "-f") { opts += " " + s; obj_dir += "/"; diff --git a/netgen.cpp b/netgen.cpp index 6f0bd0e6..84f65984 100644 --- a/netgen.cpp +++ b/netgen.cpp @@ -208,7 +208,7 @@ EX namespace netgen { void blackline(vec v1, vec v2, color_t col = 0x000000FF) { #if CAP_SDLGFX - aalineColor(s, int(v1.x), int(v1.y), int(v2.x), int(v2.y), col); + aalineColor(srend, int(v1.x), int(v1.y), int(v2.x), int(v2.y), col); #elif CAP_SDL SDL_LockSurface(s); int len = abs(v1.x-v2.x) + abs(v1.y-v2.y); @@ -226,7 +226,7 @@ EX namespace netgen { polyy[0] = int(v1.y); polyy[1] = int(v2.y); polyy[2] = int(v3.y); - filledPolygonColorI(s, polyx, polyy, 3, col); + filledPolygonColorI(srend, polyx, polyy, 3, col); #elif CAP_SDL SDL_LockSurface(s); int len = abs(v1.x-v2.x) + abs(v1.y-v2.y); @@ -238,7 +238,7 @@ EX namespace netgen { void blackcircle(vec v, int r, color_t col = 0x000000FF) { #if CAP_SDLGFX - aacircleColor(s, int(v.x), int(v.y), r, col); + aacircleColor(srend, int(v.x), int(v.y), r, col); #endif } @@ -338,9 +338,14 @@ EX namespace netgen { drawline(hvec(i,e), hvec(i,7), 0x80808080); } */ - SDL_Surface *sav = s; + dynamicval ds(s); s = net = SDL_CreateRGBSurface(SDL_SWSURFACE,SX*nscale,SY*nscale,32,0,0,0,0); + #if CAP_SDL2 + dynamicval dr(srend); + srend = SDL_CreateSoftwareRenderer(s); + #endif + SDL_FillRect(net, NULL, 0xFFFFFF); int pateks = 0; @@ -440,8 +445,9 @@ EX namespace netgen { SDL_FreeSurface(net); SDL_FreeSurface(quarter); - - s = sav; + #if CAP_SDL2 + SDL_DestroyRenderer(srend); + #endif } vec mousepos, rel; @@ -554,7 +560,8 @@ EX namespace netgen { } SDL_UnlockSurface(s); - SDL_UpdateRect(s, 0, 0, 0, 0); + + present_surface(); } double rs, rz; @@ -609,9 +616,13 @@ EX namespace netgen { break; } - case SDL_KEYDOWN: { + case SDL_KEYDOWN: { int key = event.key.keysym.sym; + #if CAP_SDL2 + int uni = key; + #else int uni = event.key.keysym.unicode; + #endif if(uni == 'q' || key == SDLK_ESCAPE || key == SDLK_F10) return; @@ -636,7 +647,10 @@ EX namespace netgen { } void designNet() { + #if !CAP_SDL2 + // fstx s = SDL_SetVideoMode(SX, SY, 32, 0); + #endif netgen_loop(); saveData(); setvideomode(); diff --git a/rug.cpp b/rug.cpp index 39145985..5ee25645 100644 --- a/rug.cpp +++ b/rug.cpp @@ -1333,20 +1333,20 @@ EX void actDraw() { lastticks = ticks; #if CAP_HOLDKEYS - Uint8 *keystate = SDL_GetKeyState(NULL); - if(keystate[SDLK_LALT]) alpha /= 10; + const Uint8 *keystate = SDL12_GetKeyState(NULL); + if(keystate[SDL12(SDLK_LALT, SDL_SCANCODE_LALT)]) alpha /= 10; #endif #if CAP_HOLDKEYS auto perform_finger = [=] () { - if(keystate[SDLK_HOME]) finger_range /= exp(alpha); - if(keystate[SDLK_END]) finger_range *= exp(alpha); - if(keystate[SDLK_LEFT]) finger_on(0, -alpha); - if(keystate[SDLK_RIGHT]) finger_on(0, alpha); - if(keystate[SDLK_UP]) finger_on(1, alpha); - if(keystate[SDLK_DOWN]) finger_on(1, -alpha); - if(keystate[SDLK_PAGEDOWN]) finger_on(2, -alpha); - if(keystate[SDLK_PAGEUP]) finger_on(2, +alpha); + if(keystate[SDL12(SDLK_HOME, SDL_SCANCODE_HOME)]) finger_range /= exp(alpha); + if(keystate[SDL12(SDLK_END, SDL_SCANCODE_END)]) finger_range *= exp(alpha); + if(keystate[SDL12(SDLK_LEFT, SDL_SCANCODE_LEFT)]) finger_on(0, -alpha); + if(keystate[SDL12(SDLK_RIGHT, SDL_SCANCODE_RIGHT)]) finger_on(0, alpha); + if(keystate[SDL12(SDLK_UP, SDL_SCANCODE_UP)]) finger_on(1, alpha); + if(keystate[SDL12(SDLK_DOWN, SDL_SCANCODE_DOWN)]) finger_on(1, -alpha); + if(keystate[SDL12(SDLK_PAGEDOWN, SDL_SCANCODE_PAGEDOWN)]) finger_on(2, -alpha); + if(keystate[SDL12(SDLK_PAGEUP, SDL_SCANCODE_PAGEUP)]) finger_on(2, +alpha); }; if(finger_center) diff --git a/shmup.cpp b/shmup.cpp index f8062c9a..89fa7514 100644 --- a/shmup.cpp +++ b/shmup.cpp @@ -876,8 +876,12 @@ void movePlayer(monster *m, int delta) { } #if CAP_SDL - Uint8 *keystate = SDL_GetKeyState(NULL); + const Uint8 *keystate = SDL12_GetKeyState(NULL); + #if CAP_SDL2 + bool forcetarget = (keystate[SDL_SCANCODE_RSHIFT] | keystate[SDL_SCANCODE_LSHIFT]); + #else bool forcetarget = (keystate[SDLK_RSHIFT] | keystate[SDLK_LSHIFT]); + #endif if(((mousepressed && !forcetarget) || facemouse) && delta > 0 && !mouseout() && !stdracing && GDIM == 2) { // playermoved = true; hyperpoint h = inverse_shift(m->pat, mouseh); diff --git a/sysconfig.h b/sysconfig.h index 2516cc78..0ada509b 100644 --- a/sysconfig.h +++ b/sysconfig.h @@ -121,6 +121,10 @@ #define CAP_SDL (!ISMOBILE) #endif +#ifndef CAP_SDL2 +#define CAP_SDL2 1 +#endif + #ifndef CAP_COMPASS #define CAP_COMPASS ISMOBILE #endif @@ -340,23 +344,55 @@ #include #if CAP_SDL +#if CAP_SDL2 +#include +#define SDL12(x,y) y +#define SDLK_KP1 SDLK_KP_1 +#define SDLK_KP2 SDLK_KP_2 +#define SDLK_KP3 SDLK_KP_3 +#define SDLK_KP4 SDLK_KP_4 +#define SDLK_KP5 SDLK_KP_5 +#define SDLK_KP6 SDLK_KP_6 +#define SDLK_KP7 SDLK_KP_7 +#define SDLK_KP8 SDLK_KP_8 +#define SDLK_KP9 SDLK_KP_9 +#define SDLK_KP0 SDLK_KP_0 +#define SDL12_GetKeyState SDL_GetKeyboardState +#define KEYSTATES SDL_NUM_SCANCODES +#else #include +#define SDL12(x,y) x +#define SDL12_GetKeyState SDL_GetKeyState +#define KEYSTATES SDLK_LAST +#endif #if !ISMAC #undef main #endif #if CAP_SDLAUDIO +#if CAP_SDL2 +#include +#else #include #endif +#endif #if CAP_SDLTTF +#if CAP_SDL2 +#include +#else #include #endif +#endif #if CAP_SDLGFX +#if CAP_SDL2 +#include +#else #include #endif +#endif #elif !ISFAKEMOBILE #define SDLK_F1 (123001) diff --git a/textures.cpp b/textures.cpp index 08272652..c9bc6f00 100644 --- a/textures.cpp +++ b/textures.cpp @@ -155,7 +155,7 @@ SDL_Surface *convertSurface(SDL_Surface* s) { fmt.Aloss = fmt.Rloss = fmt.Gloss = fmt.Bloss = 0; fmt.palette = NULL; -#ifndef SDL2 +#if !CAP_SDL2 fmt.alpha = 0; fmt.colorkey = 0x1ffffff; #endif