X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_window.pas;h=651675a2572865cb3fc2feeaeb657f963a9efbb5;hb=8d318aca88d4253961e698b0cd05399989efe252;hp=33fc80c2969914e7f43c22d84edbc8c8d9ba55fb;hpb=cd0c726308c335c662384b41d9e23af0457290f7;p=d2df-sdl.git diff --git a/src/game/g_window.pas b/src/game/g_window.pas index 33fc80c..651675a 100644 --- a/src/game/g_window.pas +++ b/src/game/g_window.pas @@ -1,9 +1,25 @@ +(* 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *) +{$MODE DELPHI} unit g_window; interface uses - WADEDITOR; + wadreader; function SDLMain(): Integer; function GetTimer(): Int64; @@ -23,6 +39,7 @@ function g_Window_SetSize(W, H: Word; FScreen: Boolean): Boolean; implementation uses +{$IFDEF WINDOWS}Windows,{$ENDIF} SDL2, GL, GLExt, e_graphics, e_log, g_main, g_console, SysUtils, e_input, g_options, g_game, g_basic, g_textures, e_sound, g_sound, g_menu, ENet, g_net; @@ -42,8 +59,10 @@ var wLoadingProgress: Boolean = False; wLoadingQuit: Boolean = False; {wWinPause: Byte = 0;} +{$IFNDEF WINDOWS} ticksOverflow: Int64 = -1; lastTicks: Uint32 = 0; // to detect overflow +{$ENDIF} const // TODO: move this to a separate file @@ -73,6 +92,11 @@ function g_Window_SetDisplay(PreserveGL: Boolean = False): Boolean; var mode, cmode: TSDL_DisplayMode; begin +{$IFDEF HEADLESS} + Result := True; + Exit; +{$ENDIF} + Result := False; e_WriteLog('Setting display mode...', MSG_NOTIFY); @@ -80,13 +104,13 @@ begin wFlags := SDL_WINDOW_OPENGL or SDL_WINDOW_RESIZABLE; if gFullscreen then wFlags := wFlags or SDL_WINDOW_FULLSCREEN; if gWinMaximized then wFlags := wFlags or SDL_WINDOW_MAXIMIZED; - + if h_Wnd <> nil then begin SDL_DestroyWindow(h_Wnd); h_Wnd := nil; end; - + if gFullscreen then begin mode.w := gScreenWidth; @@ -108,7 +132,7 @@ begin h_Wnd := SDL_CreateWindow(PChar(wTitle), gWinRealPosX, gWinRealPosY, gScreenWidth, gScreenHeight, wFlags); if h_Wnd = nil then Exit; - + SDL_GL_MakeCurrent(h_Wnd, h_GL); SDL_ShowCursor(SDL_DISABLE); @@ -126,7 +150,7 @@ var res, i, k, n, pw, ph: Integer; begin SetLength(Result, 0); - + {$IFDEF HEADLESS}Exit;{$ENDIF} k := 0; SelRes := 0; n := SDL_GetNumDisplayModes(0); pw := 0; ph := 0; @@ -156,6 +180,7 @@ procedure ChangeWindowSize(); begin gWinSizeX := gScreenWidth; gWinSizeY := gScreenHeight; + {$IFDEF HEADLESS}Exit;{$ENDIF} e_ResizeWindow(gScreenWidth, gScreenHeight); g_Game_SetupScreenSize(); g_Menu_Reset(); @@ -167,6 +192,7 @@ var Preserve: Boolean; begin Result := False; + {$IFDEF HEADLESS}Exit;{$ENDIF} Preserve := False; if (gScreenWidth <> W) or (gScreenHeight <> H) then @@ -197,7 +223,7 @@ begin Result := False; wActivate := False; wDeactivate := False; - + case ev.event of SDL_WINDOWEVENT_MOVED: begin @@ -207,7 +233,7 @@ begin gWinRealPosY := ev.data2; end; end; - + SDL_WINDOWEVENT_MINIMIZED: begin if not wMinimized then @@ -223,7 +249,7 @@ begin wDeactivate := True; end; end; - + SDL_WINDOWEVENT_RESIZED: begin gScreenWidth := ev.data1; @@ -236,10 +262,10 @@ begin e_WriteLog('[DEBUG] WinMsgs: Resized to ' + IntToStr(ev.data1) + 'x' + IntToStr(ev.data2), MSG_NOTIFY); end; end; - + SDL_WINDOWEVENT_EXPOSED: SwapBuffers(); - + SDL_WINDOWEVENT_MAXIMIZED: begin if wMinimized then @@ -258,7 +284,7 @@ begin end; end; end; - + SDL_WINDOWEVENT_RESTORED: begin if wMinimized then @@ -367,7 +393,7 @@ begin key := ev.key.keysym.scancode; KeyPress(key); end; - + SDL_TEXTINPUT: begin Utf8ToUnicode(@uc, PChar(ev.text.text), 1); @@ -383,6 +409,7 @@ end; procedure SwapBuffers(); begin + {$IFDEF HEADLESS}Exit;{$ENDIF} SDL_GL_SwapWindow(h_Wnd); end; @@ -414,9 +441,10 @@ begin exit; end; +{$IFNDEF HEADLESS} h_Gl := SDL_GL_CreateContext(h_Wnd); if h_Gl = nil then Exit; - +{$ENDIF} //wWindowCreated := True; e_ResizeWindow(gScreenWidth, gScreenHeight); @@ -425,6 +453,17 @@ begin Result := True; end; +{$IFDEF WINDOWS} +// windoze sux; in headless mode `GetTickCount()` (and SDL) returns shit +function GetTimer(): Int64; +var + F, C: Int64; +begin + QueryPerformanceFrequency(F); + QueryPerformanceCounter(C); + Result := Round(C/F*1000{000}); +end; +{$ELSE} function GetTimer(): Int64; var t: Uint32; @@ -449,6 +488,7 @@ begin lastTicks := t; result := ticksOverflow+Int64(t); end; +{$ENDIF} procedure ResetTimer(); begin @@ -528,11 +568,11 @@ begin if wNeedTimeReset then begin - Time_Delta := (27777 div 1000); + Time_Delta := 28{(27777 div 1000)}; wNeedTimeReset := False; end; - t := Time_Delta div (27777 div 1000); + t := Time_Delta div 28{(27777 div 1000)}; if t > 0 then begin flag := True; @@ -564,7 +604,7 @@ begin // Âðåìÿ ïðåäûäóùåãî îáíîâëåíèÿ: if flag then begin - Time_Old := Time - (Time_Delta mod (27777 div 1000)); + Time_Old := Time - (Time_Delta mod 28{(27777 div 1000)}); if (not wMinimized) then begin Draw(); @@ -588,6 +628,7 @@ procedure InitOpenGL(VSync: Boolean); var v: Byte; begin + {$IFDEF HEADLESS}Exit;{$ENDIF} 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); @@ -601,6 +642,13 @@ end; function SDLMain(): Integer; begin +{$IFDEF HEADLESS} + e_NoGraphics := True; +{$ENDIF} + + e_WriteLog('Initializing OpenGL', MSG_NOTIFY); + InitOpenGL(gVSync); + e_WriteLog('Creating GL window', MSG_NOTIFY); if not CreateGLWindow(PChar(Format('Doom 2D: Forever %s', [GAME_VERSION]))) then begin @@ -608,9 +656,6 @@ begin exit; end; - e_WriteLog('Initializing OpenGL', MSG_NOTIFY); - InitOpenGL(gVSync); - {EnumDisplayModes();} Init();