1 /************************************************************************************
2
3 AstroMenace
4 Hardcore 3D space scroll-shooter with spaceship upgrade possibilities.
5 Copyright (c) 2006-2019 Mikhail Kurinnoi, Viewizard
6
7
8 AstroMenace is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
12
13 AstroMenace is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with AstroMenace. If not, see <https://www.gnu.org/licenses/>.
20
21
22 Website: https://viewizard.com/
23 Project: https://github.com/viewizard/astromenace
24 E-mail: viewizard@viewizard.com
25
26 *************************************************************************************/
27
28 #include "../core/core.h"
29 #include "../config/config.h"
30
31 // NOTE switch to nested namespace definition (namespace A::B::C { ... }) (since C++17)
32 namespace viewizard {
33 namespace astromenace {
34
35 namespace {
36
37 // empirical found "everage load value" for one texture asset
38 // small value mean that asset loads fast, big value - slow
39 constexpr unsigned TextureLoadValue{200};
40
41 struct sTextureAsset {
42 // alpha channel related
43 const bool Alpha{false};
44 const eAlphaCreateMode AlphaMode{eAlphaCreateMode::EQUAL};
45 // filtering related
46 const eTextureWrapMode TextWrap{eTextureWrapMode::CLAMP_TO_EDGE};
47 const eTextureBasicFilter TextFilter{eTextureBasicFilter::BILINEAR};
48 const bool NeedAnisotropy{false};
49 const bool MipMap{false};
50 // preload
51 GLtexture PreloadedTexture{0};
52
sTextureAssetviewizard::astromenace::__anon855c77820111::sTextureAsset53 explicit sTextureAsset(bool _Alpha = false,
54 eAlphaCreateMode _AlphaMode = eAlphaCreateMode::EQUAL,
55 eTextureWrapMode _TextWrap = eTextureWrapMode::CLAMP_TO_EDGE,
56 eTextureBasicFilter _TextFilter = eTextureBasicFilter::BILINEAR,
57 bool _NeedAnisotropy = false,
58 bool _MipMap = false) :
59 Alpha{_Alpha},
60 AlphaMode{_AlphaMode},
61 TextWrap{_TextWrap},
62 TextFilter{_TextFilter},
63 NeedAnisotropy{_NeedAnisotropy},
64 MipMap{_MipMap}
65 {}
66 };
67
68 std::unordered_map<std::string, sTextureAsset> TextureMap{
69 {"menu/astromenace.tga", sTextureAsset{true}},
70 {"menu/button384_back.tga", sTextureAsset{true}},
71 {"menu/button384_in.tga", sTextureAsset{true}},
72 {"menu/button384_out.tga", sTextureAsset{true}},
73 {"menu/button256_back.tga", sTextureAsset{true}},
74 {"menu/button256_in.tga", sTextureAsset{true}},
75 {"menu/button256_out.tga", sTextureAsset{true}},
76 {"menu/button256_off.tga", sTextureAsset{true}},
77 {"menu/blackpoint.tga", sTextureAsset{}},
78 {"menu/whitepoint.tga", sTextureAsset{}},
79 {"menu/line.tga", sTextureAsset{true, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT}},
80 {"menu/perc.tga", sTextureAsset{true}},
81 {"menu/perc_none.tga", sTextureAsset{true}},
82 {"menu/checkbox_main.tga", sTextureAsset{true}},
83 {"menu/checkbox_in.tga", sTextureAsset{true}},
84 {"menu/workshop_panel1.tga", sTextureAsset{true}},
85 {"menu/workshop_panel1+.tga", sTextureAsset{true}},
86 {"menu/workshop_panel2.tga", sTextureAsset{true}},
87 {"menu/workshop_panel2+.tga", sTextureAsset{true}},
88 {"menu/workshop_panel3.tga", sTextureAsset{true}},
89 {"menu/workshop_panel4.tga", sTextureAsset{true}},
90 {"menu/workshop_panel5.tga", sTextureAsset{true}},
91 {"menu/ammo.tga", sTextureAsset{true}},
92 {"lang/en/menu/button_weaponry_out.tga", sTextureAsset{}},
93 {"lang/en/menu/button_weaponry_in.tga", sTextureAsset{}},
94 {"lang/de/menu/button_weaponry_out.tga", sTextureAsset{}},
95 {"lang/de/menu/button_weaponry_in.tga", sTextureAsset{}},
96 {"lang/ru/menu/button_weaponry_out.tga", sTextureAsset{}},
97 {"lang/ru/menu/button_weaponry_in.tga", sTextureAsset{}},
98 {"lang/pl/menu/button_weaponry_out.tga", sTextureAsset{}},
99 {"lang/pl/menu/button_weaponry_in.tga", sTextureAsset{}},
100 {"menu/back_spot.tga", sTextureAsset{true}},
101 {"menu/back_spot2.tga", sTextureAsset{true}},
102 {"menu/dialog512_256.tga", sTextureAsset{true}},
103 {"menu/dialog512_512.tga", sTextureAsset{true}},
104 {"menu/dialog768_600.tga", sTextureAsset{true}},
105 {"menu/panel444_333_back.tga", sTextureAsset{true}},
106 {"menu/panel444_333_border.tga", sTextureAsset{true}},
107 {"menu/panel800_444_back.tga", sTextureAsset{true}},
108 {"menu/button_dialog200_out.tga", sTextureAsset{true}},
109 {"menu/button_dialog200_in.tga", sTextureAsset{true}},
110 {"menu/button_dialog200_off.tga", sTextureAsset{true}},
111 {"menu/button_dialog128_out.tga", sTextureAsset{true}},
112 {"menu/button_dialog128_in.tga", sTextureAsset{true}},
113 {"menu/button_dialog128_off.tga", sTextureAsset{true}},
114 {"menu/arrow_list_up.tga", sTextureAsset{true}},
115 {"menu/arrow_list_down.tga", sTextureAsset{true}},
116 {"script/mission1_icon.tga", sTextureAsset{}},
117 {"script/mission2_icon.tga", sTextureAsset{}},
118 {"script/mission3_icon.tga", sTextureAsset{}},
119 {"script/mission4_icon.tga", sTextureAsset{}},
120 {"script/mission5_icon.tga", sTextureAsset{}},
121 {"script/mission6_icon.tga", sTextureAsset{}},
122 {"script/mission7_icon.tga", sTextureAsset{}},
123 {"script/mission8_icon.tga", sTextureAsset{}},
124 {"script/mission9_icon.tga", sTextureAsset{}},
125 {"script/mission10_icon.tga", sTextureAsset{}},
126 {"script/mission11_icon.tga", sTextureAsset{}},
127 {"script/mission12_icon.tga", sTextureAsset{}},
128 {"script/mission13_icon.tga", sTextureAsset{}},
129 {"script/mission14_icon.tga", sTextureAsset{}},
130 {"script/mission15_icon.tga", sTextureAsset{}},
131 {"menu/system_engine1.tga", sTextureAsset{true}},
132 {"menu/system_engine2.tga", sTextureAsset{true}},
133 {"menu/system_engine3.tga", sTextureAsset{true}},
134 {"menu/system_engine4.tga", sTextureAsset{true}},
135 {"menu/system_mechan1.tga", sTextureAsset{true}},
136 {"menu/system_mechan2.tga", sTextureAsset{true}},
137 {"menu/system_mechan3.tga", sTextureAsset{true}},
138 {"menu/system_mechan4.tga", sTextureAsset{true}},
139 {"menu/system_power1.tga", sTextureAsset{true}},
140 {"menu/system_power2.tga", sTextureAsset{true}},
141 {"menu/system_power3.tga", sTextureAsset{true}},
142 {"menu/system_power4.tga", sTextureAsset{true}},
143 {"menu/system_protect1.tga", sTextureAsset{true}},
144 {"menu/system_protect2.tga", sTextureAsset{true}},
145 {"menu/system_protect3.tga", sTextureAsset{true}},
146 {"menu/system_protect4.tga", sTextureAsset{true}},
147 {"menu/system_target1.tga", sTextureAsset{true}},
148 {"menu/system_target2.tga", sTextureAsset{true}},
149 {"menu/system_target3.tga", sTextureAsset{true}},
150 {"menu/system_target4.tga", sTextureAsset{true}},
151 {"menu/system_empty.tga", sTextureAsset{true}},
152 {"menu/weapon1_icon.tga", sTextureAsset{true}},
153 {"menu/weapon2_icon.tga", sTextureAsset{true}},
154 {"menu/weapon3_icon.tga", sTextureAsset{true}},
155 {"menu/weapon4_icon.tga", sTextureAsset{true}},
156 {"menu/weapon5_icon.tga", sTextureAsset{true}},
157 {"menu/weapon6_icon.tga", sTextureAsset{true}},
158 {"menu/weapon7_icon.tga", sTextureAsset{true}},
159 {"menu/weapon8_icon.tga", sTextureAsset{true}},
160 {"menu/weapon9_icon.tga", sTextureAsset{true}},
161 {"menu/weapon10_icon.tga", sTextureAsset{true}},
162 {"menu/weapon11_icon.tga", sTextureAsset{true}},
163 {"menu/weapon12_icon.tga", sTextureAsset{true}},
164 {"menu/weapon13_icon.tga", sTextureAsset{true}},
165 {"menu/weapon14_icon.tga", sTextureAsset{true}},
166 {"menu/weapon15_icon.tga", sTextureAsset{true}},
167 {"menu/weapon16_icon.tga", sTextureAsset{true}},
168 {"menu/weapon17_icon.tga", sTextureAsset{true}},
169 {"menu/weapon18_icon.tga", sTextureAsset{true}},
170 {"menu/weapon19_icon.tga", sTextureAsset{true}},
171 {"menu/weapon_on_icon.tga", sTextureAsset{true}},
172 {"menu/weapon_empty_icon.tga", sTextureAsset{true}},
173 {"menu/cursor.tga", sTextureAsset{true}},
174 {"menu/cursor_shadow.tga", sTextureAsset{true}},
175 {"gfx/flare.tga", sTextureAsset{true, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT,
176 eTextureBasicFilter::TRILINEAR, true, true}},
177 {"gfx/flare1.tga", sTextureAsset{true, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
178 eTextureBasicFilter::TRILINEAR, true, true}},
179 {"gfx/flare2.tga", sTextureAsset{true, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
180 eTextureBasicFilter::TRILINEAR, true, true}},
181 {"gfx/flare3.tga", sTextureAsset{true, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
182 eTextureBasicFilter::TRILINEAR, true, true}},
183 {"gfx/trail1.tga", sTextureAsset{true, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
184 eTextureBasicFilter::TRILINEAR, true, true}},
185 {"gfx/trail2.tga", sTextureAsset{true, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
186 eTextureBasicFilter::TRILINEAR, true, true}},
187 {"gfx/trail3.tga", sTextureAsset{true, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
188 eTextureBasicFilter::TRILINEAR, true, true}},
189 {"gfx/trail4.tga", sTextureAsset{true, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
190 eTextureBasicFilter::TRILINEAR, true, true}},
191 {"gfx/trail5.tga", sTextureAsset{true, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
192 eTextureBasicFilter::TRILINEAR, true, true}},
193 {"game/nums.tga", sTextureAsset{true}},
194 {"game/ammo.tga", sTextureAsset{true}},
195 {"game/energy.tga", sTextureAsset{true}},
196 {"game/game_panel.tga", sTextureAsset{true}},
197 {"game/game_panel2.tga", sTextureAsset{true}},
198 {"game/game_panel_el.tga", sTextureAsset{true}},
199 {"game/game_num.tga", sTextureAsset{true}},
200 {"game/weapon_panel_left.tga", sTextureAsset{true}},
201 {"game/weapon_panel_right.tga", sTextureAsset{true}},
202 {"game/weapon_ammo.tga", sTextureAsset{true}},
203 {"game/weapon_energy.tga", sTextureAsset{true}},
204 {"lang/en/game/mission.tga", sTextureAsset{true}},
205 {"lang/en/game/missionfailed.tga", sTextureAsset{true}},
206 {"lang/en/game/pause.tga", sTextureAsset{true}},
207 {"lang/de/game/mission.tga", sTextureAsset{true}},
208 {"lang/de/game/missionfailed.tga", sTextureAsset{true}},
209 {"lang/de/game/pause.tga", sTextureAsset{true}},
210 {"lang/ru/game/mission.tga", sTextureAsset{true}},
211 {"lang/ru/game/missionfailed.tga", sTextureAsset{true}},
212 {"lang/ru/game/pause.tga", sTextureAsset{true}},
213 {"skybox/tile_back.tga", sTextureAsset{true, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT,
214 eTextureBasicFilter::TRILINEAR, true, true}},
215 {"skybox/tile_stars.tga", sTextureAsset{true, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT,
216 eTextureBasicFilter::TRILINEAR, true, true}},
217 {"models/earthfighter/sf-text00.vw2d",
218 sTextureAsset{false, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
219 eTextureBasicFilter::TRILINEAR, true, true}},
220 {"models/earthfighter/sf-text04.vw2d",
221 sTextureAsset{false, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
222 eTextureBasicFilter::TRILINEAR, true, true}},
223 {"models/earthfighter/sf-text05.vw2d",
224 sTextureAsset{false, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
225 eTextureBasicFilter::TRILINEAR, true, true}},
226 {"models/earthfighter/sf-text06.vw2d",
227 sTextureAsset{false, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
228 eTextureBasicFilter::TRILINEAR, true, true}},
229 {"models/earthfighter/sf-text07.vw2d",
230 sTextureAsset{false, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
231 eTextureBasicFilter::TRILINEAR, true, true}},
232 {"models/earthfighter/sf-text08.vw2d",
233 sTextureAsset{false, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
234 eTextureBasicFilter::TRILINEAR, true, true}},
235 {"models/earthfighter/sf-text09.vw2d",
236 sTextureAsset{false, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
237 eTextureBasicFilter::TRILINEAR, true, true}},
238 {"models/earthfighter/sf-text10.vw2d",
239 sTextureAsset{false, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
240 eTextureBasicFilter::TRILINEAR, true, true}},
241 {"models/earthfighter/sf-illum01.vw2d",
242 sTextureAsset{true, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
243 eTextureBasicFilter::TRILINEAR, true, true}},
244 {"models/earthfighter/sf-illum02.vw2d",
245 sTextureAsset{true, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
246 eTextureBasicFilter::TRILINEAR, true, true}},
247 {"models/earthfighter/sf-illum03.vw2d",
248 sTextureAsset{true, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
249 eTextureBasicFilter::TRILINEAR, true, true}},
250 {"models/earthfighter/sf-illum04.vw2d",
251 sTextureAsset{true, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
252 eTextureBasicFilter::TRILINEAR, true, true}},
253 {"models/earthfighter/lnch12.tga",
254 sTextureAsset{false, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
255 eTextureBasicFilter::TRILINEAR, true, true}},
256 {"models/earthfighter/lnch34.tga",
257 sTextureAsset{false, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
258 eTextureBasicFilter::TRILINEAR, true, true}},
259 {"models/earthfighter/rockets.tga",
260 sTextureAsset{false, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
261 eTextureBasicFilter::TRILINEAR, true, true}},
262 {"models/mine/mine1.tga", sTextureAsset{false, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
263 eTextureBasicFilter::TRILINEAR, true, true}},
264 {"models/mine/mine1i.tga", sTextureAsset{false, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
265 eTextureBasicFilter::TRILINEAR, true, true}},
266 {"models/mine/mine2.tga", sTextureAsset{false, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
267 eTextureBasicFilter::TRILINEAR, true, true}},
268 {"models/mine/mine2i.tga", sTextureAsset{false, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
269 eTextureBasicFilter::TRILINEAR, true, true}},
270 {"models/mine/mine3.tga", sTextureAsset{false, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
271 eTextureBasicFilter::TRILINEAR, true, true}},
272 {"models/mine/mine3i.tga", sTextureAsset{false, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
273 eTextureBasicFilter::TRILINEAR, true, true}},
274 {"models/mine/mine4.tga", sTextureAsset{false, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
275 eTextureBasicFilter::TRILINEAR, true, true}},
276 {"models/mine/mine4i.tga", sTextureAsset{false, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
277 eTextureBasicFilter::TRILINEAR, true, true}},
278 {"models/alienfighter/al-text04.vw2d",
279 sTextureAsset{false, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
280 eTextureBasicFilter::TRILINEAR, true, true}},
281 {"models/alienfighter/al-illum04.vw2d",
282 sTextureAsset{true, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
283 eTextureBasicFilter::TRILINEAR, true, true}},
284 {"models/gr-01.vw2d", sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT,
285 eTextureBasicFilter::TRILINEAR, true, true}},
286 {"models/gr-02.vw2d", sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT,
287 eTextureBasicFilter::TRILINEAR, true, true}},
288 {"models/gr-03.vw2d", sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT,
289 eTextureBasicFilter::TRILINEAR, true, true}},
290 {"models/gr-04.vw2d", sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT,
291 eTextureBasicFilter::TRILINEAR, true, true}},
292 {"models/normalmap/bomber_nm.tga",
293 sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT,
294 eTextureBasicFilter::TRILINEAR, true, true}},
295 {"models/gr-05.vw2d", sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT,
296 eTextureBasicFilter::TRILINEAR, true, true}},
297 {"models/gr-06.vw2d", sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT,
298 eTextureBasicFilter::TRILINEAR, true, true}},
299 {"models/gr-07.vw2d", sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT,
300 eTextureBasicFilter::TRILINEAR, true, true}},
301 {"models/track.vw2d", sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT,
302 eTextureBasicFilter::TRILINEAR, true, true}},
303 {"models/turret/turrets.tga", sTextureAsset{false, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
304 eTextureBasicFilter::TRILINEAR, true, true}},
305 {"models/spacebase/allalpha.tga",
306 sTextureAsset{true, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT,
307 eTextureBasicFilter::TRILINEAR, true, true}},
308 {"models/spacebase/metal.tga", sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT,
309 eTextureBasicFilter::TRILINEAR, true, true}},
310 {"models/space/asteroid-01.tga",
311 sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT,
312 eTextureBasicFilter::TRILINEAR, true, true}},
313 {"models/planet/asteroid.tga", sTextureAsset{true, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT,
314 eTextureBasicFilter::TRILINEAR, true, true}},
315 {"models/planet/clouds.tga", sTextureAsset{true, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT,
316 eTextureBasicFilter::TRILINEAR, true, true}},
317 {"models/planet/q_class2.tga", sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT,
318 eTextureBasicFilter::TRILINEAR, true, true}},
319 {"models/planet/a_class4.tga", sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT,
320 eTextureBasicFilter::TRILINEAR, true, true}},
321 {"models/planet/m_class7.tga", sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT,
322 eTextureBasicFilter::TRILINEAR, true, true}},
323 {"models/planet/d_class3.tga", sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT,
324 eTextureBasicFilter::TRILINEAR, true, true}},
325 {"models/normalmap/m_class7_nm.tga",
326 sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT,
327 eTextureBasicFilter::TRILINEAR, true, true}},
328 {"models/normalmap/d_class3_nm.tga",
329 sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT,
330 eTextureBasicFilter::TRILINEAR, true, true}},
331 {"models/normalmap/a_class4_nm.tga",
332 sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT,
333 eTextureBasicFilter::TRILINEAR, true, true}},
334 {"models/normalmap/planet_asteroids_nm.tga",
335 sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT,
336 eTextureBasicFilter::TRILINEAR, true, true}},
337 {"models/normalmap/q_class2_nm.tga",
338 sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT,
339 eTextureBasicFilter::TRILINEAR, true, true}},
340 {"models/alienmothership/alm-text02.vw2d",
341 sTextureAsset{false, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
342 eTextureBasicFilter::TRILINEAR, true, true}},
343 {"models/alienmothership/alm-text03.vw2d",
344 sTextureAsset{false, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
345 eTextureBasicFilter::TRILINEAR, true, true}},
346 {"models/alienmothership/alm-text04.vw2d",
347 sTextureAsset{false, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
348 eTextureBasicFilter::TRILINEAR, true, true}},
349 {"models/alienmothership/alm-text08.vw2d",
350 sTextureAsset{false, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
351 eTextureBasicFilter::TRILINEAR, true, true}},
352 {"models/alienmothership/alm-illum02.vw2d",
353 sTextureAsset{true, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
354 eTextureBasicFilter::TRILINEAR, true, true}},
355 {"models/alienmothership/alm-illum03.vw2d",
356 sTextureAsset{true, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
357 eTextureBasicFilter::TRILINEAR, true, true}},
358 {"models/alienmothership/alm-illum04.vw2d",
359 sTextureAsset{true, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
360 eTextureBasicFilter::TRILINEAR, true, true}},
361 {"models/alienmothership/alm-illum08.vw2d",
362 sTextureAsset{true, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
363 eTextureBasicFilter::TRILINEAR, true, true}},
364 {"models/normalmap/alien_mothership_nm.tga",
365 sTextureAsset{false, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
366 eTextureBasicFilter::TRILINEAR, true, true}},
367 {"models/building/bld.vw2d", sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::REPEAT,
368 eTextureBasicFilter::TRILINEAR, true, true}},
369 {"models/normalmap/buildings_nm.tga",
370 sTextureAsset{false, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
371 eTextureBasicFilter::TRILINEAR, true, true}},
372 {"models/building/bld_illum.vw2d",
373 sTextureAsset{true, eAlphaCreateMode::EQUAL, eTextureWrapMode::REPEAT,
374 eTextureBasicFilter::TRILINEAR, true, true}},
375 {"skybox/1/skybox_back6.tga", sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::CLAMP_TO_EDGE}},
376 {"skybox/1/skybox_bottom4.tga", sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::CLAMP_TO_EDGE}},
377 {"skybox/1/skybox_front5.tga", sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::CLAMP_TO_EDGE}},
378 {"skybox/1/skybox_left2.tga", sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::CLAMP_TO_EDGE}},
379 {"skybox/1/skybox_right1.tga", sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::CLAMP_TO_EDGE}},
380 {"skybox/1/skybox_top3.tga", sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::CLAMP_TO_EDGE}},
381 {"skybox/2/skybox_back6.tga", sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::CLAMP_TO_EDGE}},
382 {"skybox/2/skybox_bottom4.tga", sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::CLAMP_TO_EDGE}},
383 {"skybox/2/skybox_front5.tga", sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::CLAMP_TO_EDGE}},
384 {"skybox/2/skybox_left2.tga", sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::CLAMP_TO_EDGE}},
385 {"skybox/2/skybox_right1.tga", sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::CLAMP_TO_EDGE}},
386 {"skybox/2/skybox_top3.tga", sTextureAsset{false, eAlphaCreateMode::GREYSC, eTextureWrapMode::CLAMP_TO_EDGE}},
387 };
388
389 } // unnamed namespace
390
391
392 /*
393 * Get all texture assets load value.
394 */
GetTextureAssetsLoadValue()395 unsigned GetTextureAssetsLoadValue()
396 {
397 return TextureMap.size() * TextureLoadValue;
398 }
399
400 /*
401 * Cycle with function callback on each texture asset load.
402 */
ForEachTextureAssetLoad(std::function<void (unsigned AssetValue)> function)403 void ForEachTextureAssetLoad(std::function<void (unsigned AssetValue)> function)
404 {
405 vw_SetTextureAlpha(0, 0, 0);
406
407 for (auto &tmpAsset : TextureMap) {
408 vw_SetTextureProp(sTextureFilter{tmpAsset.second.TextFilter},
409 tmpAsset.second.NeedAnisotropy ? GameConfig().AnisotropyLevel : 1,
410 sTextureWrap{tmpAsset.second.TextWrap}, tmpAsset.second.Alpha,
411 tmpAsset.second.AlphaMode, tmpAsset.second.MipMap);
412 tmpAsset.second.PreloadedTexture = vw_LoadTexture(tmpAsset.first);
413 function(TextureLoadValue);
414 }
415 }
416
417 /*
418 * Change anisotropy level for all textures that was loaded with anisotropy.
419 */
ChangeTexturesAnisotropyLevel()420 void ChangeTexturesAnisotropyLevel()
421 {
422 for (auto &tmpAsset : TextureMap) {
423 if (tmpAsset.second.NeedAnisotropy) {
424 vw_BindTexture(0, tmpAsset.second.PreloadedTexture);
425 vw_SetTextureAnisotropy(GameConfig().AnisotropyLevel);
426 }
427 }
428 vw_BindTexture(0, 0);
429 }
430
431 /*
432 * Get preloaded texture asset (preloaded by ForEachTextureAssetLoad() call).
433 * Note, we don't validate textures, caller should care about call
434 * ForEachTextureAssetLoad() each time, when this need.
435 */
GetPreloadedTextureAsset(const std::string & FileName)436 GLtexture GetPreloadedTextureAsset(const std::string &FileName)
437 {
438 auto tmpAsset = TextureMap.find(FileName);
439 if ((tmpAsset != TextureMap.end()) &&
440 tmpAsset->second.PreloadedTexture)
441 return tmpAsset->second.PreloadedTexture;
442
443 std::cerr << __func__ << "(): " << "preloaded texture not found: " << FileName << "\n";
444 return 0;
445 }
446
447 } // astromenace namespace
448 } // viewizard namespace
449