diff --git a/src/game/g_window.pas b/src/game/g_window.pas
index c159ddd236d40221480036aa03394f51e41b51f9..7d9ec78b5baffe5a78bb694e1c15008af40eeb53 100644 (file)
--- a/src/game/g_window.pas
+++ b/src/game/g_window.pas
+(* 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 <http://www.gnu.org/licenses/>.
+ *)
+{$INCLUDE ../shared/a_modes.inc}
unit g_window;
interface
uses
- WADEDITOR;
+ wadreader;
function SDLMain(): Integer;
function GetTimer(): Int64;
function g_Window_SetDisplay(PreserveGL: Boolean = False): Boolean;
function g_Window_SetSize(W, H: Word; FScreen: Boolean): Boolean;
+var
+ gwin_dump_extensions: Boolean = false;
+ gwin_has_stencil: Boolean = false;
+ gwin_k8_enable_light_experiments: Boolean = false;
+
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;
+ g_basic, g_textures, e_sound, g_sound, g_menu, ENet, g_net,
+ g_map;
var
h_Wnd: PSDL_Window;
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
Result := True;
Exit;
{$ENDIF}
-
+
Result := False;
e_WriteLog('Setting display mode...', MSG_NOTIFY);
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;
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);
Result := False;
wActivate := False;
wDeactivate := False;
-
+
case ev.event of
SDL_WINDOWEVENT_MOVED:
begin
gWinRealPosY := ev.data2;
end;
end;
-
+
SDL_WINDOWEVENT_MINIMIZED:
begin
if not wMinimized then
wDeactivate := True;
end;
end;
-
+
SDL_WINDOWEVENT_RESIZED:
begin
gScreenWidth := ev.data1;
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
end;
end;
end;
-
+
SDL_WINDOWEVENT_RESTORED:
begin
if wMinimized then
key := ev.key.keysym.scancode;
KeyPress(key);
end;
-
+
SDL_TEXTINPUT:
begin
Utf8ToUnicode(@uc, PChar(ev.text.text), 1);
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;
lastTicks := t;
result := ticksOverflow+Int64(t);
end;
+{$ENDIF}
procedure ResetTimer();
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);
+ g_Map_ProfilersBegin();
+
+ t := Time_Delta div 28{(27777 div 1000)};
if t > 0 then
begin
flag := True;
else if NetMode = NET_CLIENT then g_Net_Client_Update();
end;
+ g_Map_ProfilersEnd();
+
if wLoadingQuit then
begin
g_Game_Free();
// Âðåìÿ ïðåäûäóùåãî îáíîâëåíèÿ:
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();
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
+ if gwin_k8_enable_light_experiments then
+ begin
+ SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 1); // lights; it is enough to have 1-bit stencil buffer for lighting
+ end;
SDL_GL_SetSwapInterval(v);
end;
+function glHasExtension (name: AnsiString): Boolean;
+var
+ exts: PChar;
+ i: Integer;
+ found: Boolean;
+ extName: ShortString;
+begin
+ result := false;
+ if length(name) = 0 then exit;
+ exts := glGetString(GL_EXTENSIONS);
+ if exts = nil then exit;
+ while (exts[0] <> #0) and (exts[0] = ' ') do Inc(exts);
+ while exts[0] <> #0 do
+ begin
+ if gwin_dump_extensions then
+ begin
+ i := 0;
+ while (exts[i] <> #0) and (exts[i] <> ' ') do Inc(i);
+ if i > 255 then
+ begin
+ e_WriteLog('FUUUUUUUUUUUUU', MSG_WARNING);
+ end
+ else
+ begin
+ Move(exts^, extName[1], i);
+ extName[0] := Char(i);
+ e_WriteLog(Format('EXT: %s', [extName]), MSG_NOTIFY);
+ end;
+ end;
+ found := true;
+ for i := 0 to length(name)-1 do
+ begin
+ if exts[i] = #0 then begin found := false; break; end;
+ if exts[i] <> name[i+1] then begin found := false; break; end;
+ end;
+ if found and ((exts[length(name)] = #0) or (exts[length(name)] = ' ')) then begin result := true; exit; end;
+ while (exts[0] <> #0) and (exts[0] <> ' ') do Inc(exts);
+ while (exts[0] <> #0) and (exts[0] = ' ') do Inc(exts);
+ end;
+end;
+
function SDLMain(): Integer;
+var
+ idx: Integer;
+ ltmp: Integer;
begin
{$IFDEF HEADLESS}
e_NoGraphics := True;
{$ENDIF}
+ for idx := 1 to ParamCount do
+ begin
+ if ParamStr(idx) = '--opengl-dump-exts' then gwin_dump_extensions := true;
+ if ParamStr(idx) = '--twinkletwinkle' then gwin_k8_enable_light_experiments := true;
+ if ParamStr(idx) = '--jah' then g_profile_history_size := 100;
+ if ParamStr(idx) = '--tree-draw' then gdbg_map_use_tree_draw := true;
+ if ParamStr(idx) = '--grid-draw' then gdbg_map_use_tree_draw := false;
+ if ParamStr(idx) = '--tree-coldet' then gdbg_map_use_tree_coldet := true;
+ if ParamStr(idx) = '--grid-coldet' then gdbg_map_use_tree_coldet := false;
+ end;
+
+ if gdbg_map_use_tree_draw then e_WriteLog('using TREE renderer', MSG_NOTIFY);
+ if not gdbg_map_use_tree_draw then e_WriteLog('using GRID renderer', MSG_NOTIFY);
+
+ if gdbg_map_use_tree_coldet then e_WriteLog('using TREE coldet', MSG_NOTIFY);
+ if not gdbg_map_use_tree_coldet then e_WriteLog('using GRID coldet', MSG_NOTIFY);
+
+ 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
exit;
end;
- e_WriteLog('Initializing OpenGL', MSG_NOTIFY);
- InitOpenGL(gVSync);
-
{EnumDisplayModes();}
+ if gwin_k8_enable_light_experiments then
+ begin
+ SDL_GL_GetAttribute(SDL_GL_STENCIL_SIZE, @ltmp);
+ e_WriteLog(Format('stencil buffer size: %d', [ltmp]), MSG_WARNING);
+ gwin_has_stencil := (ltmp > 0);
+ end
+ else
+ begin
+ gwin_has_stencil := false;
+ end;
+
+ if not glHasExtension('GL_ARB_texture_non_power_of_two') then
+ begin
+ e_WriteLog('Driver DID''T advertised NPOT textures support', MSG_WARNING);
+ glLegacyNPOT := true;
+ end
+ else
+ begin
+ e_WriteLog('Driver advertised NPOT textures support', MSG_NOTIFY);
+ glLegacyNPOT := false;
+ end;
+ gwin_dump_extensions := false;
+
Init();
Time_Old := GetTimer();