X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_window.pas;h=47963bdfbd2b2864de7d14fd08040be1d3897e1a;hb=042f4d57bf2de8205155dbee6208bf8a655a65ca;hp=f7f06d89d2aa5e3fc8712b12f30d99e5c20cdbb9;hpb=601480a60d06a26f053bee5b93650c3df73343cf;p=d2df-sdl.git diff --git a/src/game/g_window.pas b/src/game/g_window.pas index f7f06d8..47963bd 100644 --- a/src/game/g_window.pas +++ b/src/game/g_window.pas @@ -1,4 +1,4 @@ -(* Copyright (C) Doom 2D: Forever Developers + (* Copyright (C) Doom 2D: Forever Developers * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -32,6 +32,7 @@ procedure Sleep (ms: LongWord); function GetDisplayModes (dbpp: LongWord; var selres: LongWord): SSArray; function g_Window_SetDisplay (preserveGL: Boolean=false): Boolean; function g_Window_SetSize (w, h: Word; fullscreen: Boolean): Boolean; +procedure g_SetVSync (vsync: Boolean); procedure ProcessLoading (forceUpdate: Boolean=false); @@ -50,8 +51,13 @@ implementation uses {$IFDEF WINDOWS}Windows,{$ENDIF} +{$IFDEF USE_NANOGL} + nanoGL, +{$ELSE} + GL, GLExt, +{$ENDIF} SysUtils, Classes, MAPDEF, - SDL2, GL, GLExt, e_graphics, e_log, e_texture, g_main, + SDL2, e_graphics, e_log, e_texture, g_main, g_console, e_input, g_options, g_game, g_basic, g_textures, e_sound, g_sound, g_menu, ENet, g_net, g_map, g_gfx, g_monsters, g_holmes, xprofiler, @@ -69,10 +75,10 @@ var {$IF not DEFINED(HEADLESS)} wTitle: PChar = nil; wasFullscreen: Boolean = true; // so we need to recreate the window - wMaximized: Boolean = false; {$ENDIF} wNeedTimeReset: Boolean = false; wMinimized: Boolean = false; + wMaximized: Boolean = false; wLoadingProgress: Boolean = false; wLoadingQuit: Boolean = false; {$IFNDEF WINDOWS} @@ -85,7 +91,13 @@ procedure KillGLWindow (preserveGL: Boolean); begin if (h_GL <> nil) and (not preserveGL) then begin if (assigned(oglDeinitCB)) then oglDeinitCB(); end; if (h_Wnd <> nil) then SDL_DestroyWindow(h_Wnd); - if (h_GL <> nil) and (not preserveGL) then SDL_GL_DeleteContext(h_GL); + if (h_GL <> nil) and (not preserveGL) then + begin + {$IFDEF USE_NANOGL} + nanoGL_Destroy; + {$ENDIF USE_NANOGL} + SDL_GL_DeleteContext(h_GL); + end; h_Wnd := nil; if (not preserveGL) then h_GL := nil; end; @@ -105,7 +117,7 @@ begin e_WriteLog('Setting display mode...', TMsgType.Notify); wFlags := SDL_WINDOW_OPENGL {or SDL_WINDOW_RESIZABLE}; - if gFullscreen then wFlags := wFlags or SDL_WINDOW_FULLSCREEN else wFlags := wFlags or SDL_WINDOW_RESIZABLE; + if gFullscreen then wFlags := wFlags {or SDL_WINDOW_FULLSCREEN} else wFlags := wFlags or SDL_WINDOW_RESIZABLE; if (not gFullscreen) and (not preserveGL) and gWinMaximized then wFlags := wFlags or SDL_WINDOW_MAXIMIZED else gWinMaximized := false; if gFullscreen then @@ -144,12 +156,15 @@ begin begin KillGLWindow(preserveGL); h_Wnd := SDL_CreateWindow(PChar(wTitle), gWinRealPosX, gWinRealPosY, gScreenWidth, gScreenHeight, wFlags); + if gFullscreen then + SDL_SetWindowFullscreen(h_Wnd, SDL_WINDOW_FULLSCREEN); if (h_Wnd = nil) then exit; end; wasFullscreen := gFullscreen; SDL_GL_MakeCurrent(h_Wnd, h_GL); SDL_ShowCursor(SDL_DISABLE); + if (h_GL <> nil) then g_SetVSync(gVSync); if (gFullscreen) then begin nw := 0; @@ -519,7 +534,17 @@ begin if (h_GL = nil) then exit; fuiScrWdt := gScreenWidth; fuiScrHgt := gScreenHeight; + SDL_GL_MakeCurrent(h_Wnd, h_GL); +{$IFDEF USE_NANOGL} + if nanoGL_Init() = 0 then + begin + KillGLWindow(false); + e_WriteLog('nanoGL initialization error', TMsgType.Fatal); + exit; + end; +{$ENDIF USE_NANOGL} if (assigned(oglInitCB)) then oglInitCB(); + if (h_GL <> nil) then g_SetVSync(gVSync); {$ENDIF} e_ResizeWindow(gScreenWidth, gScreenHeight); @@ -747,7 +772,7 @@ begin end; -procedure InitOpenGL (vsync: Boolean); +procedure g_SetVSync (vsync: Boolean); {$IF not DEFINED(HEADLESS)} var v: Byte; @@ -755,15 +780,35 @@ var begin {$IF not DEFINED(HEADLESS)} if vsync then v := 1 else v := 0; - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); - SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); - SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); - SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); - SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); + if (SDL_GL_SetSwapInterval(v) <> 0) then + begin + e_WriteLog('oops; can''t change vsync option, restart required', TMsgType.Warning); + end + else + begin + if vsync then e_WriteLog('VSync: ON', TMsgType.Notify) else e_WriteLog('VSync: OFF', TMsgType.Notify); + end; +{$ENDIF} +end; + + +procedure InitOpenGL (); +begin +{$IF not DEFINED(HEADLESS)} + {$IFDEF USE_NANOGL} + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 1); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); + {$ELSE} + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); + SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); + SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); // lights; it is enough to have 1-bit stencil buffer for lighting, but... + {$ENDIF} SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); - SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); // lights; it is enough to have 1-bit stencil buffer for lighting, but... - SDL_GL_SetSwapInterval(v); {$ENDIF} end; @@ -911,12 +956,13 @@ begin end; e_WriteLog('Initializing OpenGL', TMsgType.Notify); - InitOpenGL(gVSync); + InitOpenGL(); e_WriteLog('Creating GL window', TMsgType.Notify); if not CreateGLWindow(PChar(Format('Doom 2D: Forever %s', [GAME_VERSION]))) then begin result := 0; + e_WriteLog('Unable to create GL window: ' + SDL_GetError(), TMsgType.Fatal); exit; end;