DEADSOFTWARE

5deccdbdfd29a40c7983a34bfc26226b53356dcd
[d2df-sdl.git] / src / game / opengl / r_render.pas
1 (* Copyright (C) Doom 2D: Forever Developers
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, version 3 of the License ONLY.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 *)
15 {$INCLUDE ../../shared/a_modes.inc}
16 unit r_render;
18 interface
20 procedure r_Render_Initialize;
21 procedure r_Render_Finalize;
22 procedure r_Render_Resize (w, h: Integer);
24 procedure r_Render_Load;
25 procedure r_Render_Free;
27 procedure r_Render_Apply;
29 implementation
31 uses
32 {$INCLUDE ../../nogl/noGLuses.inc}
33 SysUtils, Classes, Math,
34 e_log, g_system,
35 g_game, g_options, g_console,
36 r_window, r_graphics, r_console, r_playermodel,
37 r_weapons, r_items, r_gfx, r_monsters
38 ;
40 var
41 LoadedGL: Boolean = false;
43 procedure LoadGL;
44 begin
45 if LoadedGL = false then
46 begin
47 {$IFDEF NOGL_INIT}
48 nogl_Init;
49 if glRenderToFBO and (not nogl_ExtensionSupported('GL_OES_framebuffer_object')) then
50 begin
51 e_LogWriteln('GL: framebuffer objects not supported; disabling FBO rendering');
52 glRenderToFBO := false
53 end;
54 {$ELSE}
55 if glRenderToFBO and (not Load_GL_ARB_framebuffer_object) then
56 begin
57 e_LogWriteln('GL: framebuffer objects not supported; disabling FBO rendering');
58 glRenderToFBO := false
59 end;
60 {$ENDIF}
61 LoadedGL := true
62 end
63 end;
65 procedure FreeGL;
66 begin
67 if LoadedGL = true then
68 begin
69 {$IFDEF NOGL_INIT}
70 nogl_Quit;
71 {$ENDIF}
72 LoadedGL := false
73 end
74 end;
76 procedure r_Render_Load;
77 begin
78 r_PlayerModel_Load;
79 r_Monsters_Load;
80 r_Weapon_Load;
81 r_Items_Load;
82 r_GFX_Load;
83 end;
85 procedure r_Render_Free;
86 begin
87 r_GFX_Free;
88 r_Items_Free;
89 r_Weapon_Free;
90 r_Monsters_Free;
91 r_PlayerModel_Free;
92 end;
94 procedure r_Render_Initialize;
95 begin
96 if sys_SetDisplayMode(gRC_Width, gRC_Height, gBPP, gRC_FullScreen, gRC_Maximized) = False then
97 raise Exception.Create('Failed to set videomode on startup.');
98 LoadGL;
99 r_Window_Initialize;
100 r_Console_Init;
101 end;
103 procedure r_Render_Finalize;
104 begin
105 FreeGL;
106 e_ReleaseEngine
107 end;
109 procedure r_Render_Resize (w, h: Integer);
110 begin
111 LoadGL;
112 gWinSizeX := w;
113 gWinSizeY := h;
114 gRC_Width := w;
115 gRC_Height := h;
116 if glRenderToFBO then
117 begin
118 // store real window size in gWinSize, downscale resolution now
119 w := round(w / r_pixel_scale);
120 h := round(h / r_pixel_scale);
121 if not e_ResizeFramebuffer(w, h) then
122 begin
123 e_LogWriteln('GL: could not create framebuffer, falling back to --no-fbo');
124 glRenderToFBO := False;
125 w := gWinSizeX;
126 h := gWinSizeY;
127 end;
128 end;
129 gScreenWidth := w;
130 gScreenHeight := h;
131 e_ResizeWindow(w, h);
132 e_InitGL
133 end;
135 procedure r_Render_Apply;
136 begin
137 if sys_SetDisplayMode(Max(1, gRC_Width), Max(1, gRC_Height), Max(1, gBPP), gRC_FullScreen, gRC_Maximized) then
138 e_LogWriteln('resolution changed')
139 else
140 e_LogWriteln('resolution not changed');
141 sys_EnableVSync(gVSync)
142 end;
144 end.