DEADSOFTWARE

game: disable gfx for server
[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 uses g_base; // TRectWH
22 procedure r_Render_Initialize;
23 procedure r_Render_Finalize;
25 procedure r_Render_Load;
26 procedure r_Render_Free;
28 procedure r_Render_LoadTextures;
29 procedure r_Render_FreeTextures;
31 procedure r_Render_Update;
32 procedure r_Render_Draw;
34 procedure r_Render_Resize (w, h: Integer);
35 procedure r_Render_Apply;
37 function r_Render_WriteScreenShot (filename: String): Boolean;
39 function r_Render_GetGibRect (m, id: Integer): TRectWH;
41 {$IFDEF ENABLE_GFX}
42 procedure r_Render_QueueEffect (AnimType, X, Y: Integer);
43 {$ENDIF}
45 {$IFDEF ENABLE_TOUCH}
46 // touch screen button location and size
47 procedure r_Render_GetKeyRect (key: Integer; out x, y, w, h: Integer; out founded: Boolean);
48 {$ENDIF}
50 procedure r_Render_DrawLoading (force: Boolean); // !!! remove it
52 implementation
54 uses
55 {$INCLUDE ../../nogl/noGLuses.inc}
56 {$IFDEF ENABLE_TOUCH}
57 r_touch,
58 {$ENDIF}
59 {$IFDEF ENABLE_GFX}
60 r_gfx,
61 {$ENDIF}
62 SysUtils, Classes, Math,
63 e_log, g_system, utils,
64 g_game, g_options, g_console,
65 r_window, r_graphics, r_console, r_playermodel, r_textures, r_animations,
66 r_weapons, r_items, r_monsters, r_map, r_player, r_game
67 ;
69 var
70 LoadedGL: Boolean = false;
72 function GLExtensionList (): SSArray;
73 var s: PChar; i, j, num: GLint;
74 begin
75 result := nil;
76 s := glGetString(GL_EXTENSIONS);
77 if s <> nil then
78 begin
79 num := 0;
80 i := 0;
81 j := 0;
82 while (s[i] <> #0) and (s[i] = ' ') do Inc(i);
83 while (s[i] <> #0) do
84 begin
85 while (s[i] <> #0) and (s[i] <> ' ') do Inc(i);
86 SetLength(result, num+1);
87 result[num] := Copy(s, j+1, i-j);
88 while (s[i] <> #0) and (s[i] = ' ') do Inc(i);
89 j := i;
90 Inc(num)
91 end
92 end
93 end;
95 function GLExtensionSupported (ext: AnsiString): Boolean;
96 var e: AnsiString;
97 begin
98 {$IFDEF NOGL_INIT}
99 Result := nogl_ExtensionSupported(ext);
100 {$ELSE}
101 result := false;
102 for e in GLExtensionList() do
103 begin
104 if strEquCI1251(e, ext) then
105 begin
106 result := true;
107 exit
108 end
109 end
110 {$ENDIF}
111 end;
113 function HaveNPOTSupport (): Boolean;
114 begin
115 Result := GLExtensionSupported('GL_ARB_texture_non_power_of_two') or
116 GLExtensionSupported('GL_OES_texture_npot')
117 end;
119 function HaveFBOSupport (): Boolean;
120 begin
121 Result := GLExtensionSupported('GL_ARB_framebuffer_object') or
122 GLExtensionSupported('GL_OES_framebuffer_object')
123 end;
125 procedure PrintGLSupportedExtensions;
126 begin
127 e_LogWritefln('GL Vendor: %s', [glGetString(GL_VENDOR)]);
128 e_LogWritefln('GL Renderer: %s', [glGetString(GL_RENDERER)]);
129 e_LogWritefln('GL Version: %s', [glGetString(GL_VERSION)]);
130 e_LogWritefln('GL Shaders: %s', [glGetString(GL_SHADING_LANGUAGE_VERSION)]);
131 e_LogWritefln('GL Extensions: %s', [glGetString(GL_EXTENSIONS)]);
132 end;
134 procedure r_Window_Initialize;
135 begin
136 {$IFNDEF USE_SYSSTUB}
137 PrintGLSupportedExtensions;
138 glLegacyNPOT := not HaveNPOTSupport();
139 {$ELSE}
140 glLegacyNPOT := False;
141 glRenderToFBO := False;
142 {$ENDIF}
143 if glNPOTOverride and glLegacyNPOT then
144 begin
145 glLegacyNPOT := true;
146 e_logWriteln('NPOT texture emulation: FORCED')
147 end
148 else
149 begin
150 if glLegacyNPOT then
151 e_logWriteln('NPOT texture emulation: enabled')
152 else
153 e_logWriteln('NPOT texture emulation: disabled')
154 end
155 end;
157 procedure LoadGL;
158 var fboload: Boolean;
159 begin
160 if LoadedGL = false then
161 begin
162 {$IFDEF NOGL_INIT}
163 nogl_Init;
164 {$ENDIF}
165 if glRenderToFBO then
166 begin
167 fboload := True;
168 {$IFDEF NOGL_INIT}
169 fboload := True; // !!! but if not?
170 {$ELSE}
171 fboload := Load_GL_ARB_framebuffer_object();
172 {$ENDIF}
173 if (fboload = False) or (HaveFBOSupport() = False) or (HaveNPOTSupport() = False) then
174 begin
175 e_LogWriteln('GL: framebuffer objects not supported; disabling FBO rendering');
176 glRenderToFBO := false
177 end;
178 end;
179 LoadedGL := true
180 end
181 end;
183 procedure FreeGL;
184 begin
185 if LoadedGL = true then
186 begin
187 {$IFDEF NOGL_INIT}
188 nogl_Quit;
189 {$ENDIF}
190 LoadedGL := false
191 end
192 end;
194 procedure r_Render_LoadTextures;
195 begin
196 r_Game_LoadTextures;
197 r_Map_LoadTextures;
198 end;
200 procedure r_Render_FreeTextures;
201 begin
202 r_Map_FreeTextures;
203 r_Game_FreeTextures;
204 end;
206 procedure r_Render_Load;
207 begin
208 r_Game_Load; // load first!
209 r_Player_Load;
210 r_Map_Load;
211 r_PlayerModel_Load;
212 r_Monsters_Load;
213 r_Weapon_Load;
214 r_Items_Load;
215 {$IFDEF ENABLE_GFX}
216 r_GFX_Load;
217 {$ENDIF}
218 end;
220 procedure r_Render_Free;
221 begin
222 {$IFDEF ENABLE_GFX}
223 r_GFX_Free;
224 {$ENDIF}
225 r_Items_Free;
226 r_Weapon_Free;
227 r_Monsters_Free;
228 r_PlayerModel_Free;
229 r_Map_Free;
230 r_Player_Free;
231 r_Game_Free;
232 g_Texture_DeleteAll;
233 g_Frames_DeleteAll;
234 end;
236 procedure r_Render_Initialize;
237 begin
238 if sys_SetDisplayMode(gRC_Width, gRC_Height, gBPP, gRC_FullScreen, gRC_Maximized) = False then
239 raise Exception.Create('Failed to set videomode on startup.');
240 LoadGL;
241 r_Window_Initialize;
242 r_Console_Init;
243 r_PlayerModel_Initialize;
244 r_Map_Initialize;
245 end;
247 procedure r_Render_Finalize;
248 begin
249 r_Map_Finalize;
250 r_PlayerModel_Finalize;
251 FreeGL;
252 e_ReleaseEngine
253 end;
255 procedure r_Render_Update;
256 begin
257 {$IFDEF ENABLE_GFX}
258 r_GFX_Update;
259 {$ENDIF}
260 r_Map_Update;
261 r_PlayerModel_Update;
262 r_Console_Update;
263 end;
265 procedure r_Render_Draw;
266 begin
267 r_Game_Draw;
268 {$IFDEF ENABLE_TOUCH}
269 r_Touch_Draw;
270 {$ENDIF}
271 end;
273 procedure r_Render_Resize (w, h: Integer);
274 begin
275 LoadGL;
276 gWinSizeX := w;
277 gWinSizeY := h;
278 gRC_Width := w;
279 gRC_Height := h;
280 if glRenderToFBO then
281 begin
282 // store real window size in gWinSize, downscale resolution now
283 w := round(w / r_pixel_scale);
284 h := round(h / r_pixel_scale);
285 if not e_ResizeFramebuffer(w, h) then
286 begin
287 e_LogWriteln('GL: could not create framebuffer, falling back to --no-fbo');
288 glRenderToFBO := False;
289 w := gWinSizeX;
290 h := gWinSizeY;
291 end;
292 end;
293 gScreenWidth := w;
294 gScreenHeight := h;
295 e_ResizeWindow(w, h);
296 e_InitGL;
297 r_Game_SetupScreenSize;
298 end;
300 procedure r_Render_Apply;
301 begin
302 if sys_SetDisplayMode(Max(1, gRC_Width), Max(1, gRC_Height), Max(1, gBPP), gRC_FullScreen, gRC_Maximized) then
303 e_LogWriteln('resolution changed')
304 else
305 e_LogWriteln('resolution not changed');
306 sys_EnableVSync(gVSync)
307 end;
309 function r_Render_WriteScreenShot (filename: String): Boolean;
310 var s: TStream;
311 begin
312 Result := False;
313 try
314 s := CreateDiskFile(filename);
315 try
316 e_MakeScreenshot(s, gScreenWidth, gScreenHeight);
317 Result := True;
318 except
319 DeleteFile(filename)
320 end;
321 s.Free;
322 finally
323 end
324 end;
326 function r_Render_GetGibRect (m, id: Integer): TRectWH;
327 begin
328 Result := r_PlayerModel_GetGibRect(m, id)
329 end;
331 {$IFDEF ENABLE_GFX}
332 procedure r_Render_QueueEffect (AnimType, X, Y: Integer);
333 begin
334 r_GFX_OnceAnim(AnimType, X, Y)
335 end;
336 {$ENDIF}
338 {$IFDEF ENABLE_TOUCH}
339 procedure r_Render_GetKeyRect (key: Integer; out x, y, w, h: Integer; out founded: Boolean);
340 begin
341 r_Touch_GetKeyRect (key, x, y, w, h, founded)
342 end;
343 {$ENDIF}
345 procedure r_Render_DrawLoading (force: Boolean);
346 begin
347 r_Window_DrawLoading(force)
348 end;
350 end.