From 3a1bbe31104894222930f6e8768a688888531559 Mon Sep 17 00:00:00 2001 From: Jonathan Schleifer Date: Tue, 4 Mar 2025 23:51:09 +0000 Subject: [PATCH] Port to SDL2 FossilOrigin-Name: 42d4b57828b48b9e38d8be3edcebca4c7cbca9948d8792a320df1f92c13465be --- meson.build | 9 +++----- src/Cube.mm | 32 +++++++++++++-------------- src/console.mm | 52 +++++++------------------------------------- src/editing.mm | 4 ++-- src/protos.h | 3 ++- src/rendergl.mm | 22 +++++++++++-------- src/serverbrowser.mm | 14 +++++++----- 7 files changed, 52 insertions(+), 84 deletions(-) diff --git a/meson.build b/meson.build index f463127..e66803d 100644 --- a/meson.build +++ b/meson.build @@ -9,12 +9,9 @@ add_global_arguments( language: 'objcpp') objfw_dep = dependency('objfw') -sdl_dep = dependency('sdl12_compat', required: false) -if not sdl_dep.found() - sdl_dep = dependency('SDL') -endif -sdlimage_dep = dependency('SDL_image') -sdlmixer_dep = dependency('SDL_mixer') +sdl_dep = dependency('SDL2') +sdlimage_dep = dependency('SDL2_image') +sdlmixer_dep = dependency('SDL2_mixer') zlib_dep = dependency('zlib') client_link_args = [] diff --git a/src/Cube.mm b/src/Cube.mm index 574cb77..318eb1a 100644 --- a/src/Cube.mm +++ b/src/Cube.mm @@ -54,6 +54,7 @@ alloc(int s) // for some big chunks... most other allocs use the memory pool return b; } +SDL_Window *window; int scr_w = 640; int scr_h = 480; @@ -90,12 +91,7 @@ screenshot() COMMAND(screenshot, ARG_NONE) COMMAND(quit, ARG_NONE) -void -keyrepeat(bool on) -{ - SDL_EnableKeyRepeat( - on ? SDL_DEFAULT_REPEAT_DELAY : 0, SDL_DEFAULT_REPEAT_INTERVAL); -} +bool keyrepeat = false; VARF(gamespeed, 10, 100, 1000, if (multiplayer()) gamespeed = 100); VARP(minmillis, 0, 5, 1000); @@ -176,14 +172,17 @@ int framesinmap = 0; log("video: mode"); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); - if (SDL_SetVideoMode(scr_w, scr_h, 0, - SDL_OPENGL | (!windowed ? SDL_FULLSCREEN : 0)) == NULL) + if ((window = SDL_CreateWindow("cube engine", SDL_WINDOWPOS_UNDEFINED, + SDL_WINDOWPOS_UNDEFINED, scr_w, scr_h, + SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL | + (!windowed ? SDL_WINDOW_FULLSCREEN : 0))) == NULL || + SDL_GL_CreateContext(window) == NULL) fatal(@"Unable to create OpenGL screen"); log("video: misc"); - SDL_WM_SetCaption("cube engine", NULL); - SDL_WM_GrabInput(SDL_GRAB_ON); - keyrepeat(false); + SDL_SetWindowGrab(window, SDL_TRUE); + SDL_SetRelativeMouseMode(SDL_TRUE); + keyrepeat = false; SDL_ShowCursor(0); log("gl"); @@ -241,7 +240,7 @@ int framesinmap = 0; fps = (1000.0f / curtime + fps * 50) / 51; computeraytable(player1->o.x, player1->o.y); readdepth(scr_w, scr_h); - SDL_GL_SwapBuffers(); + SDL_GL_SwapWindow(window); extern void updatevol(); updatevol(); if (framesinmap++ < @@ -263,16 +262,17 @@ int framesinmap = 0; case SDL_KEYDOWN: case SDL_KEYUP: - keypress(event.key.keysym.sym, - event.key.state == SDL_PRESSED, - event.key.keysym.unicode); + if (keyrepeat || event.key.repeat == 0) + keypress(event.key.keysym.sym, + event.key.state == SDL_PRESSED, + event.key.keysym.sym); break; case SDL_MOUSEMOTION: if (ignore) { ignore--; break; - }; + } mousemove(event.motion.xrel, event.motion.yrel); break; diff --git a/src/console.mm b/src/console.mm index 67a4210..f584359 100644 --- a/src/console.mm +++ b/src/console.mm @@ -126,9 +126,13 @@ COMMANDN(bind, bindkey, ARG_2STR) void saycommand(char *init) // turns input to the command line on or off { - SDL_EnableUNICODE(saycommandon = (init != NULL)); + saycommandon = (init != NULL); + if (saycommandon) + SDL_StartTextInput(); + else + SDL_StopTextInput(); if (!editmode) - keyrepeat(saycommandon); + keyrepeat = saycommandon; if (!init) init = ""; strcpy_s(commandbuf, init); @@ -144,52 +148,12 @@ mapmsg(OFString *s) } COMMAND(mapmsg, ARG_1STR) -#if !defined(OF_WINDOWS) && !defined(OF_MACOS) -# include -# include -#endif - void pasteconsole() { -#if defined(OF_WINDOWS) - if (!IsClipboardFormatAvailable(CF_TEXT)) - return; - if (!OpenClipboard(NULL)) - return; - char *cb = (char *)GlobalLock(GetClipboardData(CF_TEXT)); + char *cb = SDL_GetClipboardText(); strcat_s(commandbuf, cb); - GlobalUnlock(cb); - CloseClipboard(); -#elif !defined(OF_MACOS) - SDL_SysWMinfo wminfo; - SDL_VERSION(&wminfo.version); - wminfo.subsystem = SDL_SYSWM_X11; - if (!SDL_GetWMInfo(&wminfo)) - return; - int cbsize; - char *cb = XFetchBytes(wminfo.info.x11.display, &cbsize); - if (!cb || !cbsize) - return; - int commandlen = strlen(commandbuf); - for (char *cbline = cb, *cbend; - commandlen + 1 < _MAXDEFSTR && cbline < &cb[cbsize]; - cbline = cbend + 1) { - cbend = (char *)memchr(cbline, '\0', &cb[cbsize] - cbline); - if (!cbend) - cbend = &cb[cbsize]; - if (commandlen + cbend - cbline + 1 > _MAXDEFSTR) - cbend = cbline + _MAXDEFSTR - commandlen - 1; - memcpy(&commandbuf[commandlen], cbline, cbend - cbline); - commandlen += cbend - cbline; - commandbuf[commandlen] = '\n'; - if (commandlen + 1 < _MAXDEFSTR && cbend < &cb[cbsize]) - ++commandlen; - commandbuf[commandlen] = '\0'; - }; - XFree(cb); -#endif -}; +} cvector vhistory; int histpos = 0; diff --git a/src/editing.mm b/src/editing.mm index 0834575..60772d5 100644 --- a/src/editing.mm +++ b/src/editing.mm @@ -68,8 +68,8 @@ toggleedit() monsterclear(); // all monsters back at their spawns for // editing projreset(); - }; - keyrepeat(editmode); + } + keyrepeat = editmode; selset = false; editing = editmode; } diff --git a/src/protos.h b/src/protos.h index 91eaf80..a971787 100644 --- a/src/protos.h +++ b/src/protos.h @@ -142,7 +142,8 @@ extern int isoccluded(float vx, float vy, float cx, float cy, float csize); // main extern void fatal(OFString *s, OFString *o = @""); extern void *alloc(int s); -extern void keyrepeat(bool on); +extern SDL_Window *window; +extern bool keyrepeat; // rendertext extern void draw_text(char *str, int left, int top, int gl_num); diff --git a/src/rendergl.mm b/src/rendergl.mm index 186972e..a0c8c15 100644 --- a/src/rendergl.mm +++ b/src/rendergl.mm @@ -239,7 +239,7 @@ renderstripssky() glBindTexture(GL_TEXTURE_2D, skyoglid); loopv(strips) if (strips[i].tex == skyoglid) glDrawArrays(GL_TRIANGLE_STRIP, strips[i].start, strips[i].num); -}; +} void renderstrips() @@ -250,17 +250,17 @@ renderstrips() if (strips[i].tex != lasttex) { glBindTexture(GL_TEXTURE_2D, strips[i].tex); lasttex = strips[i].tex; - }; + } glDrawArrays(GL_TRIANGLE_STRIP, strips[i].start, strips[i].num); - }; -}; + } +} void overbright(float amount) { if (hasoverbright) glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, amount); -}; +} void addstrip(int tex, int start, int n) @@ -269,16 +269,20 @@ addstrip(int tex, int start, int n) s.tex = tex; s.start = start; s.num = n; -}; +} VARFP(gamma, 30, 100, 300, { float f = gamma / 100.0f; - if (SDL_SetGamma(f, f, f) == -1) { + Uint16 ramp[256]; + + SDL_CalculateGammaRamp(f, ramp); + + if (SDL_SetWindowGammaRamp(window, ramp, ramp, ramp) == -1) { conoutf( @"Could not set gamma (card/driver doesn't support it?)"); conoutf(@"sdl: %s", SDL_GetError()); - }; -}); + } +}) void transplayer() diff --git a/src/serverbrowser.mm b/src/serverbrowser.mm index 7af99c3..b6fd8a2 100644 --- a/src/serverbrowser.mm +++ b/src/serverbrowser.mm @@ -60,23 +60,25 @@ resolverinit(int threads, int limit) resolverthread &rt = resolverthreads.add(); rt.query = NULL; rt.starttime = 0; - rt.thread = SDL_CreateThread(resolverloop, &rt); + rt.thread = + SDL_CreateThread(resolverloop, "resolverthread", &rt); --threads; - }; -}; + } +} void resolverstop(resolverthread &rt, bool restart) { SDL_LockMutex(resolvermutex); - SDL_KillThread(rt.thread); + // SDL_KillThread(rt.thread); rt.query = NULL; rt.starttime = 0; rt.thread = NULL; if (restart) - rt.thread = SDL_CreateThread(resolverloop, &rt); + rt.thread = + SDL_CreateThread(resolverloop, "resolverthread", &rt); SDL_UnlockMutex(resolvermutex); -}; +} void resolverclear()