DEADSOFTWARE

gl: add new opengl render (initial implementation)
[d2df-sdl.git] / src / game / renders / 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
21 {$IFDEF ENABLE_MENU}
22 g_gui,
23 {$ENDIF}
24 g_base // TRectWH
25 ;
27 (* render startup *)
28 procedure r_Render_Initialize;
29 procedure r_Render_Finalize;
31 (* load globally used textures *)
32 procedure r_Render_Load;
33 procedure r_Render_Free;
35 (* load map specific textures *)
36 procedure r_Render_LoadTextures;
37 procedure r_Render_FreeTextures;
39 procedure r_Render_Update;
40 procedure r_Render_Draw;
42 procedure r_Render_Resize (w, h: Integer);
43 procedure r_Render_Apply;
45 function r_Render_WriteScreenShot (filename: String): Boolean;
47 {$IFDEF ENABLE_GIBS}
48 function r_Render_GetGibRect (m, id: Integer): TRectWH;
49 {$ENDIF}
51 {$IFDEF ENABLE_GFX}
52 procedure r_Render_QueueEffect (AnimType, X, Y: Integer);
53 {$ENDIF}
55 {$IFDEF ENABLE_TOUCH}
56 // touch screen button location and size
57 procedure r_Render_GetKeyRect (key: Integer; out x, y, w, h: Integer; out founded: Boolean);
58 {$ENDIF}
60 {$IFDEF ENABLE_MENU}
61 procedure r_Render_GetControlSize (ctrl: TGUIControl; out w, h: Integer);
62 procedure r_Render_GetLogoSize (out w, h: Integer);
63 procedure r_Render_GetMaxFontSize (BigFont: Boolean; out w, h: Integer);
64 procedure r_Render_GetStringSize (BigFont: Boolean; str: String; out w, h: Integer);
65 {$ENDIF}
67 procedure r_Render_DrawLoading (force: Boolean); // !!! remove it
69 implementation
71 uses
72 {$IFDEF USE_GLES1}
73 GLES11,
74 {$ELSE}
75 GL, GLEXT,
76 {$ENDIF}
77 {$IFDEF ENABLE_SYSTEM}
78 g_system,
79 {$ENDIF}
80 SysUtils, Classes, Math,
81 e_log, utils,
82 g_game, g_options, g_console,
83 r_textures, r_map
84 ;
86 var
87 menuBG: TGLTexture;
89 procedure r_Render_LoadTextures;
90 begin
91 r_Map_LoadTextures;
92 end;
94 procedure r_Render_FreeTextures;
95 begin
96 r_Map_FreeTextures;
97 end;
99 procedure r_Render_Load;
100 begin
101 menuBG := r_Textures_LoadFromFile(GameWAD + ':' + 'TEXTURES/TITLE');
102 r_Map_Load;
103 end;
105 procedure r_Render_Free;
106 begin
107 r_Map_Free;
108 menuBG.Free;
109 end;
111 {$IFDEF ENABLE_SYSTEM}
112 function GetInfo (): TGLDisplayInfo;
113 var info: TGLDisplayInfo;
114 begin
115 info := Default(TGLDisplayInfo);
116 info.w := Max(1, gRC_Width);
117 info.h := Max(1, gRC_Height);
118 info.bpp := Max(1, gBPP);
119 info.fullscreen := gRC_FullScreen;
120 info.maximized := gRC_Maximized;
121 info.major := 1;
122 info.minor := 1;
123 info.profile := TGLProfile.Compat;
124 result := info;
125 end;
126 {$ENDIF}
128 procedure r_Render_Initialize;
129 begin
130 {$IFDEF ENABLE_SYSTEM}
131 if sys_SetDisplayModeGL(GetInfo()) = False then
132 raise Exception.Create('Failed to set videomode on startup.');
133 sys_EnableVSync(gVSync);
134 {$ENDIF}
135 r_Textures_Initialize;
136 r_Map_Initialize;
137 end;
139 procedure r_Render_Finalize;
140 begin
141 r_Map_Finalize;
142 r_Textures_Finalize;
143 end;
145 procedure r_Render_Update;
146 begin
147 r_Map_Update;
148 end;
150 procedure SetupMatrix;
151 begin
152 glViewport(0, 0, gScreenWidth, gScreenHeight);
153 glScissor(0, 0, gScreenWidth, gScreenHeight);
154 glMatrixMode(GL_PROJECTION);
155 glLoadIdentity;
156 glOrtho(0, gScreenWidth, gScreenHeight, 0, 0, 1);
157 glMatrixMode(GL_MODELVIEW);
158 glLoadIdentity;
159 end;
161 procedure r_Render_Draw;
162 begin
163 if gExit = EXIT_QUIT then
164 exit;
166 SetupMatrix;
168 glClearColor(0.0, 0.0, 0.0, 0.0);
169 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
171 glColor4ub(255, 255, 255, 255);
173 e_LogWritefln('r_render_draw: %sx%s', [gScreenWidth, gScreenHeight]);
175 if gGameOn or (gState = STATE_FOLD) then
176 begin
177 // TODO setup player view
178 // TODO setup sectator mode
179 // TODO setup player hear point
180 // TODO setup player view siz
182 // TODO draw player view + setup screen coords
183 r_Map_Draw(0, 0, gScreenWidth, gScreenHeight, gPlayer1.obj.x + 32, gPlayer1.obj.y + 32); // !!! remove unnamed consts
185 // TODO draw holmes inspector
187 // TODO draw messages
188 // TODO draw stats (?)
189 // TODO draw spectator hud
190 end;
192 if gPauseMain and gGameOn {$IFDEF ENABLE_MENU}and (g_ActiveWindow = nil){$ENDIF} then
193 begin
194 // TODO draw pause screen
195 end;
197 if not gGameOn then
198 begin
199 case gState of
200 STATE_MENU: ; // TODO draw menu bg
201 STATE_FOLD: ;
202 STATE_INTERCUSTOM: ;
203 STATE_INTERSINGLE: ;
204 STATE_ENDPIC: ;
205 STATE_SLIST: ;
206 end;
207 end;
209 {$IFDEF ENABLE_MENU}
210 if g_ActiveWindow <> nil then
211 begin
212 // TODO draw menu widgets
213 end;
214 {$ENDIF}
216 // TODO draw console
218 // TODO draw holmes interface
220 glFinish();
221 glFlush();
222 sys_Repaint;
223 end;
225 procedure r_Render_Resize (w, h: Integer);
226 begin
227 gWinSizeX := w;
228 gWinSizeY := h;
229 gRC_Width := w;
230 gRC_Height := h;
231 gScreenWidth := w;
232 gScreenHeight := h;
233 end;
235 procedure r_Render_Apply;
236 begin
237 {$IFDEF ENABLE_SYSTEM}
238 if sys_SetDisplayModeGL(GetInfo()) then
239 e_LogWriteln('resolution changed')
240 else
241 e_LogWriteln('resolution not changed');
242 sys_EnableVSync(gVSync)
243 {$ENDIF}
244 end;
246 function r_Render_WriteScreenShot (filename: String): Boolean;
247 begin
248 Result := False;
249 end;
251 {$IFDEF ENABLE_GIBS}
252 function r_Render_GetGibRect (m, id: Integer): TRectWH;
253 begin
254 Result.X := 16;
255 Result.Y := 16;
256 Result.Width := 16;
257 Result.Height := 16;
258 end;
259 {$ENDIF}
261 {$IFDEF ENABLE_GFX}
262 procedure r_Render_QueueEffect (AnimType, X, Y: Integer);
263 begin
264 end;
265 {$ENDIF}
267 {$IFDEF ENABLE_TOUCH}
268 procedure r_Render_GetKeyRect (key: Integer; out x, y, w, h: Integer; out founded: Boolean);
269 begin
270 founded := False;
271 end;
272 {$ENDIF}
274 {$IFDEF ENABLE_MENU}
275 procedure r_Render_GetControlSize (ctrl: TGUIControl; out w, h: Integer);
276 begin
277 w := 0; h := 0;
278 end;
280 procedure r_Render_GetLogoSize (out w, h: Integer);
281 begin
282 w := 0; h := 0;
283 end;
285 procedure r_Render_GetMaxFontSize (BigFont: Boolean; out w, h: Integer);
286 begin
287 w := 0; h := 0;
288 end;
290 procedure r_Render_GetStringSize (BigFont: Boolean; str: String; out w, h: Integer);
291 begin
292 w := 0; h := 0;
293 end;
294 {$ENDIF}
296 procedure r_Render_DrawLoading (force: Boolean);
297 begin
298 end;
300 end.