X-Git-Url: https://deadsoftware.ru/gitweb?p=d2df-sdl.git;a=blobdiff_plain;f=src%2Fgame%2Fsdl%2Fg_system.pas;h=e5f62750ea6b0ca2c993025d4f7ab23125eb1d35;hp=4a4a3cb34c92799203e3db627d004a33d2d7769a;hb=e452d337f0620b50d8d978b534437b2732134d8f;hpb=4171d8dd0b8d733da27c584616e431811bf0fdcf diff --git a/src/game/sdl/g_system.pas b/src/game/sdl/g_system.pas index 4a4a3cb..e5f6275 100644 --- a/src/game/sdl/g_system.pas +++ b/src/game/sdl/g_system.pas @@ -24,8 +24,8 @@ interface procedure sys_Delay (ms: Integer); (* --- Graphics --- *) - function sys_GetDispalyModes (bpp: Integer): SSArray; - function sys_SetDisplayMode (w, h, bpp: Integer; fullscreen: Boolean): Boolean; + function sys_GetDisplayModes (bpp: Integer): SSArray; + function sys_SetDisplayMode (w, h, bpp: Integer; fullscreen, maximized: Boolean): Boolean; procedure sys_EnableVSync (yes: Boolean); procedure sys_Repaint; @@ -43,10 +43,10 @@ implementation SysUtils, SDL, Math, {$INCLUDE ../nogl/noGLuses.inc} e_log, e_graphics, e_input, e_sound, - g_options, g_window, g_console, g_game, g_menu, g_gui, g_main; + g_options, g_window, g_console, g_game, g_menu, g_gui, g_main, g_basic; const - GameTitle = 'Doom 2D: Forever (SDL 1.2)'; + GameTitle = 'Doom 2D: Forever (SDL 1.2, %s)'; var userResize: Boolean; @@ -74,8 +74,15 @@ implementation begin gWinSizeX := w; gWinSizeY := h; - gWinRealPosX := 0; - gWinRealPosY := 0; + gRC_Width := w; + gRC_Height := h; + if glRenderToFBO then + begin + // store real window size in gWinSize, downscale resolution now + w := round(w / r_pixel_scale); + h := round(h / r_pixel_scale); + e_ResizeFramebuffer(w, h); + end; gScreenWidth := w; gScreenHeight := h; {$IFDEF ENABLE_HOLMES} @@ -89,11 +96,20 @@ implementation g_Game_ClearLoading; end; + function GetTitle (): PChar; + var info: AnsiString; + begin + info := g_GetBuildHash(false); + if info = 'custom build' then + info := info + ' by ' + g_GetBuilderName() + ' ' + GAME_BUILDDATE + ' ' + GAME_BUILDTIME; + result := PChar(Format(GameTitle, [info])) + end; + function InitWindow (w, h, bpp: Integer; fullScreen: Boolean): Boolean; var flags: Uint32; begin e_LogWritefln('InitWindow %s %s %s %s', [w, h, bpp, fullScreen]); - result := False; + result := false; SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); @@ -109,10 +125,21 @@ implementation screen := SDL_SetVideoMode(w, h, bpp, flags); if screen <> nil then begin - {$IFDEF USE_NOGL} + {$IFDEF NOGL_INIT} nogl_Init; + glRenderToFBO := False; // TODO: check for GL_OES_framebuffer_object + {$ELSE} + if glRenderToFBO then + if not Load_GL_ARB_framebuffer_object() then + if not Load_GL_EXT_framebuffer_object() then + begin + e_LogWriteln('SDL: no framebuffer support detected'); + glRenderToFBO := False + end; {$ENDIF} - SDL_WM_SetCaption(GameTitle, nil); + SDL_WM_SetCaption(GetTitle(), nil); + gFullScreen := fullscreen; + gRC_FullScreen := fullscreen; UpdateSize(w, h); result := True end @@ -125,6 +152,8 @@ implementation procedure sys_Repaint; begin + if glRenderToFBO then + e_BlitFramebuffer(gWinSizeX, gWinSizeY); SDL_GL_SwapBuffers end; @@ -133,7 +162,7 @@ implementation (* ??? *) end; - function sys_GetDispalyModes (bpp: Integer): SSArray; + function sys_GetDisplayModes (bpp: Integer): SSArray; var m: PPSDL_Rect; f: TSDL_PixelFormat; i, count: Integer; begin SetLength(result, 0); @@ -142,7 +171,7 @@ implementation f.BitsPerPixel := bpp; f.BytesPerPixel := (bpp + 7) div 8; m := SDL_ListModes(@f, SDL_OPENGL or SDL_FULLSCREEN); - if (m <> NIL) and (IntPtr(m) <> -1) then + if (m <> NIL) and (UIntPtr(m) <> UIntPtr(-1)) then begin count := 0; while m[count] <> nil do inc(count); @@ -152,7 +181,7 @@ implementation end end; - function sys_SetDisplayMode (w, h, bpp: Integer; fullscreen: Boolean): Boolean; + function sys_SetDisplayMode (w, h, bpp: Integer; fullscreen, maximized: Boolean): Boolean; begin result := InitWindow(w, h, bpp, fullscreen) end; @@ -470,7 +499,7 @@ implementation RemoveJoystick(i); if screen <> nil then begin - {$IFDEF USE_NOGL} + {$IFDEF NOGL_INIT} nogl_Quit; {$ENDIF} SDL_FreeSurface(screen)