… | |
… | |
6 | use List::Util qw(min max); |
6 | use List::Util qw(min max); |
7 | |
7 | |
8 | use CFClient::OpenGL; |
8 | use CFClient::OpenGL; |
9 | |
9 | |
10 | our @ISA = CFClient::UI::Base::; |
10 | our @ISA = CFClient::UI::Base::; |
|
|
11 | |
|
|
12 | my $magicmap_tex = |
|
|
13 | new_from_file CFClient::Texture CFClient::find_rcfile "magicmap.png", |
|
|
14 | mipmap => 1, wrap => 0, internalformat => GL_ALPHA; |
11 | |
15 | |
12 | sub new { |
16 | sub new { |
13 | my $class = shift; |
17 | my $class = shift; |
14 | |
18 | |
15 | my $self = $class->SUPER::new ( |
19 | my $self = $class->SUPER::new ( |
… | |
… | |
244 | } |
248 | } |
245 | |
249 | |
246 | $res |
250 | $res |
247 | } |
251 | } |
248 | |
252 | |
|
|
253 | sub set_magicmap { |
|
|
254 | my ($self, $w, $h, $x, $y, $data) = @_; |
|
|
255 | |
|
|
256 | $x += - $::MAP->x - int 0.5 * $::MAP->w; |
|
|
257 | $y += - $::MAP->y - int 0.5 * $::MAP->h; |
|
|
258 | |
|
|
259 | $self->{magicmap} = [$x, $y, $w, $h, $data]; |
|
|
260 | |
|
|
261 | $self->update; |
|
|
262 | } |
|
|
263 | |
249 | sub draw { |
264 | sub draw { |
250 | my ($self) = @_; |
265 | my ($self) = @_; |
251 | |
266 | |
252 | return unless $::MAP; |
267 | return unless $::MAP; |
253 | |
268 | |
… | |
… | |
264 | my $sy = $self->{sy} = CFClient::ceil $::CFG->{map_shift_y} / $tilesize; |
279 | my $sy = $self->{sy} = CFClient::ceil $::CFG->{map_shift_y} / $tilesize; |
265 | |
280 | |
266 | my $sx0 = $self->{sx0} = $::CFG->{map_shift_x} - $sx * $tilesize; |
281 | my $sx0 = $self->{sx0} = $::CFG->{map_shift_x} - $sx * $tilesize; |
267 | my $sy0 = $self->{sy0} = $::CFG->{map_shift_y} - $sy * $tilesize; |
282 | my $sy0 = $self->{sy0} = $::CFG->{map_shift_y} - $sy * $tilesize; |
268 | |
283 | |
269 | my $sw = $self->{sw} = 1 + CFClient::ceil $::WIDTH / $tilesize; |
284 | my $sw = $self->{sw} = 1 + CFClient::ceil $self->{w} / $tilesize; |
270 | my $sh = $self->{sh} = 1 + CFClient::ceil $::HEIGHT / $tilesize; |
285 | my $sh = $self->{sh} = 1 + CFClient::ceil $self->{h} / $tilesize; |
271 | |
286 | |
272 | if ($::CFG->{fow_enable}) { |
287 | if ($::CFG->{fow_enable}) { |
273 | my ($w, $h, $data) = $::MAP->fow_texture ($sx, $sy, 0, 0, $sw, $sh); |
288 | my ($w, $h, $data) = $::MAP->fow_texture ($sx, $sy, 0, 0, $sw, $sh); |
274 | |
289 | |
275 | if ($::CFG->{fow_smooth} && $CFClient::OpenGL::GL_VERSION >= 1.2) { # smooth fog of war |
290 | if ($::CFG->{fow_smooth} && $CFClient::OpenGL::GL_VERSION >= 1.2) { # smooth fog of war |
… | |
… | |
302 | glTranslate $sx0, $sy0; |
317 | glTranslate $sx0, $sy0; |
303 | glScale $::CFG->{map_scale}, $::CFG->{map_scale}; |
318 | glScale $::CFG->{map_scale}, $::CFG->{map_scale}; |
304 | |
319 | |
305 | $::MAP->draw ($sx, $sy, 0, 0, $sw, $sh); |
320 | $::MAP->draw ($sx, $sy, 0, 0, $sw, $sh); |
306 | |
321 | |
|
|
322 | glScale 32, 32; |
|
|
323 | |
307 | if (my $tex = $self->{fow_texture}) { |
324 | if (my $tex = $self->{fow_texture}) { |
308 | glEnable GL_TEXTURE_2D; |
325 | glEnable GL_TEXTURE_2D; |
309 | glTexEnv GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE; |
326 | glTexEnv GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE; |
310 | |
327 | |
311 | glScale 32, 32; |
|
|
312 | glColor +($::CFG->{fow_intensity}) x 3, 0.9; |
328 | glColor +($::CFG->{fow_intensity}) x 3, 0.9; |
313 | $self->{fow_texture}->draw_quad_alpha (0, 0); |
329 | $self->{fow_texture}->draw_quad_alpha (0, 0); |
314 | |
330 | |
315 | glDisable GL_TEXTURE_2D; |
331 | glDisable GL_TEXTURE_2D; |
316 | } |
332 | } |
317 | |
333 | |
|
|
334 | if ($self->{magicmap}) { |
|
|
335 | my ($x, $y, $w, $h, $data) = @{ $self->{magicmap} }; |
|
|
336 | |
|
|
337 | $x += $::MAP->x - $sx + int 0.5 * ($::MAP->w - $sw + 1); |
|
|
338 | $y += $::MAP->y - $sy + int 0.5 * ($::MAP->h - $sh + 1); |
|
|
339 | |
|
|
340 | glTranslate - $x - 1, - $y - 1; |
|
|
341 | glBindTexture GL_TEXTURE_2D, $magicmap_tex->{name}; |
|
|
342 | $::MAP->draw_magicmap ($x, $y, $w, $h, $data); |
|
|
343 | } |
|
|
344 | |
318 | glPopMatrix; |
345 | glPopMatrix; |
319 | |
|
|
320 | glEndList; |
346 | glEndList; |
321 | } |
347 | } |
322 | |
348 | |
323 | glPushMatrix; |
|
|
324 | glCallList $self->{list}; |
349 | glCallList $self->{list}; |
325 | glPopMatrix; |
|
|
326 | |
350 | |
327 | # TNT2 emulates logops in software (or worse :) |
351 | # TNT2 emulates logops in software (or worse :) |
328 | unless ($focused) { |
352 | unless ($focused) { |
329 | glColor 0.4, 0.2, 0.2, 0.6; |
353 | glColor 0.4, 0.2, 0.2, 0.6; |
330 | glEnable GL_BLEND; |
354 | glEnable GL_BLEND; |