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