DEADSOFTWARE

cfc2a0d61464b50af5e7b0e67e07986cce8a9539
[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;
40 procedure r_Render_QueueEffect (AnimType, X, Y: Integer);
42 {$IFDEF ENABLE_TOUCH}
43 // touch screen button location and size
44 procedure r_Render_GetKeyRect (key: Integer; out x, y, w, h: Integer; out founded: Boolean);
45 {$ENDIF}
47 procedure r_Render_DrawLoading (force: Boolean); // !!! remove it
49 implementation
51 uses
52 {$INCLUDE ../../nogl/noGLuses.inc}
53 {$IFDEF ENABLE_TOUCH}
54 r_touch,
55 {$ENDIF}
56 SysUtils, Classes, Math,
57 e_log, g_system, utils,
58 g_game, g_options, g_console,
59 r_window, r_graphics, r_console, r_playermodel, r_textures, r_animations,
60 r_weapons, r_items, r_gfx, r_monsters, r_map, r_player, r_game
61 ;
63 var
64 LoadedGL: Boolean = false;
66 procedure LoadGL;
67 begin
68 if LoadedGL = false then
69 begin
70 {$IFDEF NOGL_INIT}
71 nogl_Init;
72 if glRenderToFBO and (not nogl_ExtensionSupported('GL_OES_framebuffer_object')) then
73 begin
74 e_LogWriteln('GL: framebuffer objects not supported; disabling FBO rendering');
75 glRenderToFBO := false
76 end;
77 {$ELSE}
78 if glRenderToFBO and (not Load_GL_ARB_framebuffer_object) then
79 begin
80 e_LogWriteln('GL: framebuffer objects not supported; disabling FBO rendering');
81 glRenderToFBO := false
82 end;
83 {$ENDIF}
84 LoadedGL := true
85 end
86 end;
88 procedure FreeGL;
89 begin
90 if LoadedGL = true then
91 begin
92 {$IFDEF NOGL_INIT}
93 nogl_Quit;
94 {$ENDIF}
95 LoadedGL := false
96 end
97 end;
99 procedure r_Render_LoadTextures;
100 begin
101 r_Game_LoadTextures;
102 r_Map_LoadTextures;
103 end;
105 procedure r_Render_FreeTextures;
106 begin
107 r_Map_FreeTextures;
108 r_Game_FreeTextures;
109 end;
111 procedure r_Render_Load;
112 begin
113 r_Game_Load; // load first!
114 r_Player_Load;
115 r_Map_Load;
116 r_PlayerModel_Load;
117 r_Monsters_Load;
118 r_Weapon_Load;
119 r_Items_Load;
120 r_GFX_Load;
121 end;
123 procedure r_Render_Free;
124 begin
125 r_GFX_Free;
126 r_Items_Free;
127 r_Weapon_Free;
128 r_Monsters_Free;
129 r_PlayerModel_Free;
130 r_Map_Free;
131 r_Player_Free;
132 r_Game_Free;
133 g_Texture_DeleteAll;
134 g_Frames_DeleteAll;
135 end;
137 procedure r_Render_Initialize;
138 begin
139 if sys_SetDisplayMode(gRC_Width, gRC_Height, gBPP, gRC_FullScreen, gRC_Maximized) = False then
140 raise Exception.Create('Failed to set videomode on startup.');
141 LoadGL;
142 r_Window_Initialize;
143 r_Console_Init;
144 r_PlayerModel_Initialize;
145 r_Map_Initialize;
146 end;
148 procedure r_Render_Finalize;
149 begin
150 r_Map_Finalize;
151 r_PlayerModel_Finalize;
152 FreeGL;
153 e_ReleaseEngine
154 end;
156 procedure r_Render_Update;
157 begin
158 r_GFX_Update;
159 r_Map_Update;
160 r_PlayerModel_Update;
161 r_Console_Update;
162 end;
164 procedure r_Render_Draw;
165 begin
166 r_Game_Draw;
167 {$IFDEF ENABLE_TOUCH}
168 r_Touch_Draw;
169 {$ENDIF}
170 end;
172 procedure r_Render_Resize (w, h: Integer);
173 begin
174 LoadGL;
175 gWinSizeX := w;
176 gWinSizeY := h;
177 gRC_Width := w;
178 gRC_Height := h;
179 if glRenderToFBO then
180 begin
181 // store real window size in gWinSize, downscale resolution now
182 w := round(w / r_pixel_scale);
183 h := round(h / r_pixel_scale);
184 if not e_ResizeFramebuffer(w, h) then
185 begin
186 e_LogWriteln('GL: could not create framebuffer, falling back to --no-fbo');
187 glRenderToFBO := False;
188 w := gWinSizeX;
189 h := gWinSizeY;
190 end;
191 end;
192 gScreenWidth := w;
193 gScreenHeight := h;
194 e_ResizeWindow(w, h);
195 e_InitGL;
196 r_Game_SetupScreenSize;
197 end;
199 procedure r_Render_Apply;
200 begin
201 if sys_SetDisplayMode(Max(1, gRC_Width), Max(1, gRC_Height), Max(1, gBPP), gRC_FullScreen, gRC_Maximized) then
202 e_LogWriteln('resolution changed')
203 else
204 e_LogWriteln('resolution not changed');
205 sys_EnableVSync(gVSync)
206 end;
208 function r_Render_WriteScreenShot (filename: String): Boolean;
209 var s: TStream;
210 begin
211 Result := False;
212 try
213 s := CreateDiskFile(filename);
214 try
215 e_MakeScreenshot(s, gScreenWidth, gScreenHeight);
216 Result := True;
217 except
218 DeleteFile(filename)
219 end;
220 s.Free;
221 finally
222 end
223 end;
225 function r_Render_GetGibRect (m, id: Integer): TRectWH;
226 begin
227 Result := r_PlayerModel_GetGibRect(m, id)
228 end;
230 procedure r_Render_QueueEffect (AnimType, X, Y: Integer);
231 begin
232 r_GFX_OnceAnim(AnimType, X, Y)
233 end;
235 {$IFDEF ENABLE_TOUCH}
236 procedure r_Render_GetKeyRect (key: Integer; out x, y, w, h: Integer; out founded: Boolean);
237 begin
238 r_Touch_GetKeyRect (key, x, y, w, h, founded)
239 end;
240 {$ENDIF}
242 procedure r_Render_DrawLoading (force: Boolean);
243 begin
244 r_Window_DrawLoading(force)
245 end;
247 end.