index 511e06200dd020c08d950a998c3025cc97c08b05..eec03232f7d26e99fd2619d39994ff5291b26257 100644 (file)
implementation
uses
implementation
uses
- SysUtils, SDL2, Math,
+ SysUtils, SDL2, Math, ctypes,
e_log, e_graphics, e_input, e_sound,
{$INCLUDE ../nogl/noGLuses.inc}
{$IFDEF ENABLE_HOLMES}
e_log, e_graphics, e_input, e_sound,
{$INCLUDE ../nogl/noGLuses.inc}
{$IFDEF ENABLE_HOLMES}
var
window: PSDL_Window;
context: TSDL_GLContext;
var
window: PSDL_Window;
context: TSDL_GLContext;
- display: Integer;
+ display, wx, wy: Integer;
+ wc: Boolean;
JoystickHandle: array [0..e_MaxJoys - 1] of PSDL_Joystick;
JoystickHatState: array [0..e_MaxJoys - 1, 0..e_MaxJoyHats - 1, HAT_LEFT..HAT_DOWN] of Boolean;
JoystickZeroAxes: array [0..e_MaxJoys - 1, 0..e_MaxJoyAxes - 1] of Integer;
JoystickHandle: array [0..e_MaxJoys - 1] of PSDL_Joystick;
JoystickHatState: array [0..e_MaxJoys - 1, 0..e_MaxJoyHats - 1, HAT_LEFT..HAT_DOWN] of Boolean;
JoystickZeroAxes: array [0..e_MaxJoys - 1, 0..e_MaxJoyAxes - 1] of Integer;
(* --------- Graphics --------- *)
(* --------- Graphics --------- *)
+ function LoadGL: Boolean;
+ begin
+ result := true;
+ {$IFDEF NOGL_INIT}
+ nogl_Init;
+ if glRenderToFBO and (not nogl_ExtensionSupported('GL_OES_framebuffer_object')) then
+ {$ELSE}
+ if glRenderToFBO and (not Load_GL_ARB_framebuffer_object) then
+ {$ENDIF}
+ begin
+ e_LogWriteln('GL: framebuffer objects not supported; disabling FBO rendering');
+ glRenderToFBO := false;
+ end;
+ end;
+
+ procedure FreeGL;
+ begin
+ {$IFDEF NOGL_INIT}
+ nogl_Quit();
+ {$ENDIF}
+ end;
+
procedure UpdateSize (w, h: Integer);
begin
gWinSizeX := w;
gWinSizeY := h;
procedure UpdateSize (w, h: Integer);
begin
gWinSizeX := w;
gWinSizeY := h;
- gScreenWidth := w;
- gScreenHeight := h;
gRC_Width := w;
gRC_Height := h;
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);
+ if not e_ResizeFramebuffer(w, h) then
+ begin
+ e_LogWriteln('GL: could not create framebuffer, falling back to --no-fbo');
+ glRenderToFBO := False;
+ w := gWinSizeX;
+ h := gWinSizeY;
+ end;
+ end;
+ gScreenWidth := w;
+ gScreenHeight := h;
{$IFDEF ENABLE_HOLMES}
fuiScrWdt := w;
fuiScrHgt := h;
{$IFDEF ENABLE_HOLMES}
fuiScrWdt := w;
fuiScrHgt := h;
e_ResizeWindow(w, h);
e_InitGL;
g_Game_SetupScreenSize;
e_ResizeWindow(w, h);
e_InitGL;
g_Game_SetupScreenSize;
- {$IFNDEF ANDOIRD}
+ {$IFNDEF ANDROID}
(* This will fix menu reset on keyboard showing *)
g_Menu_Reset;
{$ENDIF}
(* This will fix menu reset on keyboard showing *)
g_Menu_Reset;
{$ENDIF}
end;
function InitWindow (w, h, bpp: Integer; fullScreen, maximized: Boolean): Boolean;
end;
function InitWindow (w, h, bpp: Integer; fullScreen, maximized: Boolean): Boolean;
- var flags: UInt32; x, y: Integer;
+ var flags: UInt32; x, y: cint;
begin
// note: on window close make: if assigned(oglDeinitCB) then oglDeinitCB;
e_LogWritefln('InitWindow %s %s %s %s', [w, h, bpp, fullScreen]);
begin
// note: on window close make: if assigned(oglDeinitCB) then oglDeinitCB;
e_LogWritefln('InitWindow %s %s %s %s', [w, h, bpp, fullScreen]);
flags := SDL_WINDOW_OPENGL or SDL_WINDOW_RESIZABLE;
if fullScreen then flags := flags or SDL_WINDOW_FULLSCREEN;
if maximized then flags := flags or SDL_WINDOW_MAXIMIZED;
flags := SDL_WINDOW_OPENGL or SDL_WINDOW_RESIZABLE;
if fullScreen then flags := flags or SDL_WINDOW_FULLSCREEN;
if maximized then flags := flags or SDL_WINDOW_MAXIMIZED;
- x := SDL_WINDOWPOS_CENTERED;
- y := SDL_WINDOWPOS_CENTERED;
+ if wc then
+ begin
+ x := SDL_WINDOWPOS_CENTERED;
+ y := SDL_WINDOWPOS_CENTERED
+ end
+ else
+ begin
+ x := wx;
+ y := wy
+ end;
window := SDL_CreateWindow(GetTitle(), x, y, w, h, flags);
if window <> nil then
begin
context := SDL_GL_CreateContext(window);
if context <> nil then
begin
window := SDL_CreateWindow(GetTitle(), x, y, w, h, flags);
if window <> nil then
begin
context := SDL_GL_CreateContext(window);
if context <> nil then
begin
- {$IFDEF NOGL_INIT}
- nogl_Init;
- {$ENDIF}
+ if not LoadGL then
+ begin
+ e_LogWriteln('GL: unable to load OpenGL functions', TMsgType.Fatal);
+ SDL_GL_DeleteContext(context); context := nil;
+ exit;
+ end;
+ if (fullscreen = false) and (maximized = false) and (wc = false) then
+ begin
+ SDL_GetWindowPosition(window, @x, @y);
+ wx := x; wy := y
+ end;
gFullScreen := fullscreen;
gWinMaximized := maximized;
gRC_FullScreen := fullscreen;
gFullScreen := fullscreen;
gWinMaximized := maximized;
gRC_FullScreen := fullscreen;
end
else
begin
end
else
begin
+ // SDL_DestroyWindow(window);
e_LogWritefln('SDL: unable to create OpenGL context: %s', [SDL_GetError])
end
end
e_LogWritefln('SDL: unable to create OpenGL context: %s', [SDL_GetError])
end
end
end
else
begin
end
else
begin
- SDL_SetWindowSize(window, w, h);
- if maximized then
- SDL_MaximizeWindow(window);
if fullScreen then flags := SDL_WINDOW_FULLSCREEN else flags := 0;
SDL_SetWindowFullscreen(window, flags);
if fullScreen then flags := SDL_WINDOW_FULLSCREEN else flags := 0;
SDL_SetWindowFullscreen(window, flags);
+ SDL_SetWindowSize(window, w, h);
+ if maximized then SDL_MaximizeWindow(window);
+ // always reset to center when changing fullscreen->windowed for safety purposes
+ if wc or (gFullscreen and not fullscreen) or (gWinMaximized and not maximized) then
+ begin
+ x := SDL_WINDOWPOS_CENTERED;
+ y := SDL_WINDOWPOS_CENTERED
+ end
+ else
+ begin
+ x := wx;
+ y := wy
+ end;
+ SDL_SetWindowPosition(window, x, y);
+ if (fullscreen = false) and (maximized = false) and (wc = false) then
+ begin
+ SDL_GetWindowPosition(window, @x, @y);
+ wx := x; wy := y
+ end;
gFullScreen := fullscreen;
gWinMaximized := maximized;
gRC_FullScreen := fullscreen;
gFullScreen := fullscreen;
gWinMaximized := maximized;
gRC_FullScreen := fullscreen;
SDL_WINDOWEVENT_RESIZED: UpdateSize(ev.data1, ev.data2);
SDL_WINDOWEVENT_EXPOSED: sys_Repaint;
SDL_WINDOWEVENT_CLOSE: result := true;
SDL_WINDOWEVENT_RESIZED: UpdateSize(ev.data1, ev.data2);
SDL_WINDOWEVENT_EXPOSED: sys_Repaint;
SDL_WINDOWEVENT_CLOSE: result := true;
+ SDL_WINDOWEVENT_MOVED:
+ begin
+ wx := ev.data1;
+ wy := ev.data2
+ end;
SDL_WINDOWEVENT_FOCUS_LOST, SDL_WINDOWEVENT_MINIMIZED:
begin
e_UnpressAllKeys;
SDL_WINDOWEVENT_FOCUS_LOST, SDL_WINDOWEVENT_MINIMIZED:
begin
e_UnpressAllKeys;
SDL_WINDOWEVENT_FOCUS_GAINED, SDL_WINDOWEVENT_MAXIMIZED, SDL_WINDOWEVENT_RESTORED:
begin
if ev.event = SDL_WINDOWEVENT_MAXIMIZED then
SDL_WINDOWEVENT_FOCUS_GAINED, SDL_WINDOWEVENT_MAXIMIZED, SDL_WINDOWEVENT_RESTORED:
begin
if ev.event = SDL_WINDOWEVENT_MAXIMIZED then
+ begin
+ gWinMaximized := true;
gRC_Maximized := true
gRC_Maximized := true
+ end
else if ev.event = SDL_WINDOWEVENT_RESTORED then
else if ev.event = SDL_WINDOWEVENT_RESTORED then
- gRC_Maximized := false;
+ begin
+ gWinMaximized := false;
+ gRC_Maximized := false
+ end;
e_MuteChannels(false);
{$IFDEF ENABLE_HOLMES}
if assigned(winFocusCB) then winFocusCB;
e_MuteChannels(false);
{$IFDEF ENABLE_HOLMES}
if assigned(winFocusCB) then winFocusCB;
e_KeyUpDown(key, down);
g_Console_ProcessBind(key, down);
end
e_KeyUpDown(key, down);
g_Console_ProcessBind(key, down);
end
- else if gConsoleShow or gChatShow or (g_ActiveWindow <> nil) then
+ else
begin
begin
- KeyPress(key) // key repeat in menus and shit
+ if g_dbg_input then
+ e_LogWritefln('Input Debug: keyrep, scancode=%s', [key]);
+ g_Console_ProcessBindRepeat(key);
end
end;
end
end;
flags := SDL_INIT_TIMER or $00004000;
{$ENDIF}
{$ELSE}
flags := SDL_INIT_TIMER or $00004000;
{$ENDIF}
{$ELSE}
- flags := SDL_INIT_JOYSTICK or SDL_INIT_TIMER or SDL_INIT_VIDEO;
+ flags := SDL_INIT_TIMER or SDL_INIT_VIDEO;
{$ENDIF}
SDL_SetHint(SDL_HINT_ACCELEROMETER_AS_JOYSTICK, '0');
if SDL_Init(flags) <> 0 then
raise Exception.Create('SDL: Init failed: ' + SDL_GetError);
{$ENDIF}
SDL_SetHint(SDL_HINT_ACCELEROMETER_AS_JOYSTICK, '0');
if SDL_Init(flags) <> 0 then
raise Exception.Create('SDL: Init failed: ' + SDL_GetError);
+ {$IFNDEF HEADLESS}
+ if SDL_InitSubSystem(SDL_INIT_JOYSTICK) <> 0 then
+ e_LogWritefln('SDL: Init subsystem failed: %s', [SDL_GetError()]);
+ {$ENDIF}
SDL_ShowCursor(SDL_DISABLE);
end;
SDL_ShowCursor(SDL_DISABLE);
end;
e_WriteLog('Releasing SDL2', TMsgType.Notify);
if context <> nil then
begin
e_WriteLog('Releasing SDL2', TMsgType.Notify);
if context <> nil then
begin
- {$IFDEF NOGL_INIT}
- nogl_Quit;
- {$ENDIF}
+ FreeGL;
SDL_GL_DeleteContext(context);
context := nil;
end;
SDL_GL_DeleteContext(context);
context := nil;
end;
initialization
conRegVar('sdl2_display_index', @display, 'use display index as base', '');
initialization
conRegVar('sdl2_display_index', @display, 'use display index as base', '');
+ conRegVar('sdl2_window_x', @wx, 'window position x', '');
+ conRegVar('sdl2_window_y', @wy, 'window position y', '');
+ conRegVar('sdl2_window_center', @wc, 'force window creation at center', '');
+ display := 0;
+ wx := SDL_WINDOWPOS_CENTERED;
+ wy := SDL_WINDOWPOS_CENTERED;
+ wc := false
end.
end.