--- deliantra/Deliantra-Client/DC.pm 2006/04/15 21:16:49 1.34 +++ deliantra/Deliantra-Client/DC.pm 2006/04/15 22:55:59 1.35 @@ -141,7 +141,8 @@ use SDL::OpenGL; -my @textures; +my %TEXTURES; +my @NAMES; sub new { my ($class, %data) = @_; @@ -153,8 +154,7 @@ %data, }, $class; - push @textures, $self; - Scalar::Util::weaken $textures[-1]; + Scalar::Util::weaken ($TEXTURES{$self+0} = $self); $self->upload; @@ -264,7 +264,7 @@ $self->{s} = $self->{w} / $tw; $self->{t} = $self->{h} / $th; - $self->{name} ||= (glGenTextures 1)->[0]; + $self->{name} ||= (pop @NAMES) || (glGenTextures 1)->[0]; glBindTexture GL_TEXTURE_2D, $self->{name}; @@ -295,14 +295,18 @@ sub DESTROY { my ($self) = @_; - return unless exists $self->{name}; + delete $TEXTURES{$self+0}; + + if (my $name = delete $self->{name}) { + glDeleteTextures $name; + push @NAMES, $name; + } - glDeleteTextures delete $self->{name}; } sub restore_state{ $_->upload - for grep $_, @textures; + for grep $_, values %TEXTURES; }; 1;