--- deliantra/Deliantra-Client/DC/MapWidget.pm 2006/04/24 13:12:32 1.17 +++ deliantra/Deliantra-Client/DC/MapWidget.pm 2006/04/25 12:56:34 1.18 @@ -86,12 +86,12 @@ my $sw = int $::WIDTH / (32 * $::CFG->{map_scale}) + 0.99; my $sh = int $::HEIGHT / (32 * $::CFG->{map_scale}) + 0.99; - glPushMatrix; - glScale $::CFG->{map_scale}, $::CFG->{map_scale}; - my $sx = $::CFG->{map_shift_x} / $::CFG->{map_scale}; my $sx0 = $sx & 31; $sx = ($sx - $sx0) / 32; my $sy = $::CFG->{map_shift_y} / $::CFG->{map_scale}; my $sy0 = $sy & 31; $sy = ($sy - $sy0) / 32; + glPushMatrix; + glScale $::CFG->{map_scale}, $::CFG->{map_scale}; + glTranslate $sx0 - 32, $sy0 - 32, 0; my ($w, $h, $data) = $::MAP->draw ($sx, $sy, 0, 0, $sw + 1, $sh + 1); @@ -133,46 +133,7 @@ glDisable GL_BLEND; } - # HACK BEGIN - { - glTranslate -($sx0 - 32), -($sy0 - 32), 0;#remove - - glTranslate 0, 30; - my ($w, $h) = (250, 250); - - my ($ox, $oy) = ($::MAP->ox, $::MAP->oy); - - glEnable GL_BLEND; - glBlendFunc GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA; - glEnable GL_TEXTURE_2D; - glTexEnv GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE; - - glPopMatrix; - - $self->{mapmap_texture} = - new CFClient::Texture - w => $w, - h => $h, - data => $::MAP->mapmap (- $w * 0.5, - $h * 0.5, $w, $h), - type => $CFClient::GL_VERSION >= 1.2 ? GL_UNSIGNED_INT_8_8_8_8_REV : GL_UNSIGNED_BYTE; - - $self->{mapmap_texture}->draw_quad (0, 0); - - glDisable GL_TEXTURE_2D; - - glTranslate 0.375, 0.375; - - glColor 1, 1, 0, 1; - glBegin GL_LINE_LOOP; - glVertex $w * 0.5 - $sx , $h * 0.5 - $sy ; - glVertex $w * 0.5 - $sx , $h * 0.5 - $sy + $sh; - glVertex $w * 0.5 - $sx + $sw, $h * 0.5 - $sy + $sh; - glVertex $w * 0.5 - $sx + $sw, $h * 0.5 - $sy ; - glEnd; - - glDisable GL_BLEND; - } - # HACK END + glPopMatrix; } glEndList; @@ -281,6 +242,85 @@ push @{$self->{command}}, [$abbrev, $command, $tooltip, $widget, $cb]; } +package CFClient::MapWidget::MapMap; + +use base CFClient::UI::Base::; + +use Time::HiRes qw(time); +use CFClient::OpenGL; + +sub size_request { + ($::HEIGHT * 0.25, $::HEIGHT * 0.25) +} + +sub size_allocate { + my ($self, $w, $h) = @_; + + $self->SUPER::size_allocate ($w, $h); + $self->update; +} + +sub update { + my ($self) = @_; + + delete $self->{texture_atime}; + $self->SUPER::update; +} + +sub _draw { + my ($self) = @_; + + $::MAP or return; + + my ($w, $h) = @$self{qw(w h)}; + + my $sw = int $::WIDTH / (32 * $::CFG->{map_scale}) + 0.99; + my $sh = int $::HEIGHT / (32 * $::CFG->{map_scale}) + 0.99; + + my $sx = int $::CFG->{map_shift_x} / 32; + my $sy = int $::CFG->{map_shift_y} / 32; + + my $ox = 0.5 * ($w - $sw); + my $oy = 0.5 * ($h - $sh); + + glEnable GL_BLEND; + glBlendFunc GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA; + glEnable GL_TEXTURE_2D; + glTexEnv GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE; + + if ($self->{texture_atime} < time) { + $self->{texture_atime} = time + 1/3; + + $self->{texture} = + new CFClient::Texture + w => $w, + h => $h, + data => $::MAP->mapmap (-$ox, -$oy, $w, $h), + type => $CFClient::GL_VERSION >= 1.2 ? GL_UNSIGNED_INT_8_8_8_8_REV : GL_UNSIGNED_BYTE; + } + + $self->{texture}->draw_quad (0, 0); + + glDisable GL_TEXTURE_2D; + + glTranslate 0.375, 0.375; + + #TODO: map scale is completely borked + + my $x0 = int $ox - $sx + 0.5; + my $y0 = int $oy - $sy + 0.5; + + glColor 1, 1, 0, 1; + glBegin GL_LINE_LOOP; + glVertex $x0 , $y0 ; + glVertex $x0 , $y0 + $sh; + glVertex $x0 + $sw, $y0 + $sh; + glVertex $x0 + $sw, $y0 ; + glEnd; + + glDisable GL_BLEND; +} + package CFClient::MapWidget::Command; use strict;