DEADSOFTWARE

render: move more texture load code into render
[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;
23 procedure r_Render_Load;
24 procedure r_Render_Free;
26 procedure r_Render_LoadTextures;
27 procedure r_Render_FreeTextures;
29 procedure r_Render_Resize (w, h: Integer);
31 procedure r_Render_Update;
33 procedure r_Render_Apply;
35 implementation
37 uses
38 {$INCLUDE ../../nogl/noGLuses.inc}
39 SysUtils, Classes, Math,
40 e_log, g_system,
41 g_game, g_options, g_console,
42 r_window, r_graphics, r_console, r_playermodel, r_textures, r_animations,
43 r_weapons, r_items, r_gfx, r_monsters, r_map, r_player, r_game
44 ;
46 var
47 LoadedGL: Boolean = false;
49 procedure LoadGL;
50 begin
51 if LoadedGL = false then
52 begin
53 {$IFDEF NOGL_INIT}
54 nogl_Init;
55 if glRenderToFBO and (not nogl_ExtensionSupported('GL_OES_framebuffer_object')) then
56 begin
57 e_LogWriteln('GL: framebuffer objects not supported; disabling FBO rendering');
58 glRenderToFBO := false
59 end;
60 {$ELSE}
61 if glRenderToFBO and (not Load_GL_ARB_framebuffer_object) then
62 begin
63 e_LogWriteln('GL: framebuffer objects not supported; disabling FBO rendering');
64 glRenderToFBO := false
65 end;
66 {$ENDIF}
67 LoadedGL := true
68 end
69 end;
71 procedure FreeGL;
72 begin
73 if LoadedGL = true then
74 begin
75 {$IFDEF NOGL_INIT}
76 nogl_Quit;
77 {$ENDIF}
78 LoadedGL := false
79 end
80 end;
82 procedure r_Render_LoadTextures;
83 begin
84 r_Game_LoadTextures;
85 r_Map_LoadTextures;
86 end;
88 procedure r_Render_FreeTextures;
89 begin
90 r_Map_FreeTextures;
91 r_Game_FreeTextures;
92 end;
94 procedure r_Render_Load;
95 begin
96 r_Game_Load; // load first!
97 r_Player_Load;
98 r_Map_Load;
99 r_PlayerModel_Load;
100 r_Monsters_Load;
101 r_Weapon_Load;
102 r_Items_Load;
103 r_GFX_Load;
104 end;
106 procedure r_Render_Free;
107 begin
108 r_GFX_Free;
109 r_Items_Free;
110 r_Weapon_Free;
111 r_Monsters_Free;
112 r_PlayerModel_Free;
113 r_Map_Free;
114 r_Player_Free;
115 r_Game_Free;
116 g_Texture_DeleteAll;
117 g_Frames_DeleteAll;
118 end;
120 procedure r_Render_Initialize;
121 begin
122 if sys_SetDisplayMode(gRC_Width, gRC_Height, gBPP, gRC_FullScreen, gRC_Maximized) = False then
123 raise Exception.Create('Failed to set videomode on startup.');
124 LoadGL;
125 r_Window_Initialize;
126 r_Console_Init;
127 r_PlayerModel_Initialize;
128 r_Map_Initialize;
129 end;
131 procedure r_Render_Finalize;
132 begin
133 r_Map_Finalize;
134 r_PlayerModel_Finalize;
135 FreeGL;
136 e_ReleaseEngine
137 end;
139 procedure r_Render_Update;
140 begin
141 r_Map_Update;
142 r_PlayerModel_Update;
143 end;
145 procedure r_Render_Resize (w, h: Integer);
146 begin
147 LoadGL;
148 gWinSizeX := w;
149 gWinSizeY := h;
150 gRC_Width := w;
151 gRC_Height := h;
152 if glRenderToFBO then
153 begin
154 // store real window size in gWinSize, downscale resolution now
155 w := round(w / r_pixel_scale);
156 h := round(h / r_pixel_scale);
157 if not e_ResizeFramebuffer(w, h) then
158 begin
159 e_LogWriteln('GL: could not create framebuffer, falling back to --no-fbo');
160 glRenderToFBO := False;
161 w := gWinSizeX;
162 h := gWinSizeY;
163 end;
164 end;
165 gScreenWidth := w;
166 gScreenHeight := h;
167 e_ResizeWindow(w, h);
168 e_InitGL
169 end;
171 procedure r_Render_Apply;
172 begin
173 if sys_SetDisplayMode(Max(1, gRC_Width), Max(1, gRC_Height), Max(1, gBPP), gRC_FullScreen, gRC_Maximized) then
174 e_LogWriteln('resolution changed')
175 else
176 e_LogWriteln('resolution not changed');
177 sys_EnableVSync(gVSync)
178 end;
180 end.