--- deliantra/Deliantra-Client/DC/Protocol.pm 2007/04/06 07:45:35 1.96 +++ deliantra/Deliantra-Client/DC/Protocol.pm 2007/04/10 09:39:48 1.99 @@ -19,7 +19,12 @@ sub new { my $class = shift; - my $self = $class->SUPER::new (@_, setup_req => { extmap => 1 }); + my $self = $class->SUPER::new (@_, + setup_req => { + extmap => 1, + smoothing => 1, + }, + ); $self->{map_widget}->clr_commands; @@ -404,6 +409,27 @@ delete $self->{map_widget}{magicmap}; } +sub bg_fetch { + my ($self) = @_; + + my $id; + + do { + $id = pop @{$self->{bg_fetch}} + or return; + } while $self->{texture}[$id]; + + CFPlus::DB::get tilecache => $id, sub { + my ($data) = @_; + + return unless $self->{map}; # stop when destroyed + + $self->set_texture ($id => $data) + if defined $data; + + $self->bg_fetch; + }; +} sub load_map($$$) { my ($self, $hash, $x, $y) = @_; @@ -414,14 +440,10 @@ if (defined $data) { $data = Compress::LZF::decompress $data; #warn sprintf "LOADmap[%s,%d,%d] length %d\n", $hash, $x, $y, length $data;#d# - for my $id ($self->{map}->set_rect ($x, $y, $data)) { - CFPlus::DB::get tilecache => $id, sub { - my ($data) = @_; - - $self->set_texture ($id => $data) - if defined $data; - }; - } + + my $inprogress = @{ $self->{bg_fetch} || [] }; + unshift @{ $self->{bg_fetch} }, $self->{map}->set_rect ($x, $y, $data); + $self->bg_fetch unless $inprogress; } }; } @@ -570,19 +592,21 @@ $self->set_texture ($face->{id} => delete $face->{image}); } +sub smooth_update { + my ($self, $facenum, $face) = @_; + + $self->{map}->set_smooth ($facenum, $face->{smoothface}, $face->{smoothlevel}); +} + sub set_texture { my ($self, $id, $data) = @_; - $self->{texture}[$id] ||= do { - my $tex = - new_from_image CFPlus::Texture - $data, minify => 1, mipmap => 1; - - $self->{map}->set_texture ($id, @$tex{qw(name w h s t)}, @{$tex->{minified}}); - $self->{map_widget}->update; + $self->{texture}[$id] = my $tex = + new_from_image CFPlus::Texture + $data, minify => 1, mipmap => 1; - $tex - }; + $self->{map}->set_texture ($id, @$tex{qw(name w h s t)}, @{$tex->{minified}}); + $self->{map_widget}->update; } sub sound_play {