X-Git-Url: http://deadsoftware.ru/gitweb?p=d2df-sdl.git;a=blobdiff_plain;f=src%2Fgame%2Fsdl%2Fg_system.pas;h=e5f62750ea6b0ca2c993025d4f7ab23125eb1d35;hp=3e78fadcfdc997d324162bb67f1e47560c8f4ad4;hb=676995a77ad243efc0abee75841f81e86a7262a0;hpb=ff17260e083bdf4461154b916a716cd9b61126b1 diff --git a/src/game/sdl/g_system.pas b/src/game/sdl/g_system.pas index 3e78fad..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); @@ -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)