--- deliantra/Deliantra-Client/DC/UI.pm 2006/04/17 19:50:22 1.123 +++ deliantra/Deliantra-Client/DC/UI.pm 2006/04/17 20:29:37 1.124 @@ -1387,6 +1387,110 @@ ############################################################################# +package CFClient::UI::VGauge; + +our @ISA = CFClient::UI::Base::; + +use SDL::OpenGL; + +my %tex = ( + food => [ + map { new_from_file CFClient::Texture CFClient::find_rcfile $_ } + qw/g1_food_gauge_empty.png g1_food_gauge_full.png/ + ], + grace => [ + map { new_from_file CFClient::Texture CFClient::find_rcfile $_ } + qw/g1_grace_gauge_empty.png g1_grace_gauge_full.png/ + ], + hp => [ + map { new_from_file CFClient::Texture CFClient::find_rcfile $_ } + qw/g1_hp_gauge_empty.png g1_hp_gauge_full.png/ + ], + mana => [ + map { new_from_file CFClient::Texture CFClient::find_rcfile $_ } + qw/g1_mana_gauge_empty.png g1_mana_gauge_full.png/ + ], +); + +# eg. VGauge->new (gauge => 'food'), default gauge: food +sub new { + my $class = shift; + + my $self = $class->SUPER::new (gauge => 'food', @_); + + $self +} + +sub size_request { + my ($self) = @_; + + ($self->{w}, $self->{h}) +} + +sub set_max { + my ($self, $max) = @_; + $self->{max_val} = $max; +} + +sub set_value { + my ($self, $val, $max) = @_; + + $self->set_max ($max) + if defined $max; + + $max = $self->{max_val}; + $self->{val} = $val; + + $self->update; +} + +sub _draw { + my ($self) = @_; + + my $tex = $tex{$self->{gauge}}; + + my ($w, $h) = ($self->{w}, $self->{h}); + + my $ycut = $self->{val} / ($self->{max_val} || 1); + $ycut = 1 if $self->{val} > $self->{max_val}; + + my $t1 = $tex->[0]; + my $t2 = $tex->[1]; + + 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; + + my $h1 = $self->{h} - $ycut * $self->{h}; + my $h2 = $ycut * $self->{h}; + + my $yp = 0; + + glBindTexture (GL_TEXTURE_2D, $t1->{name}); + glBegin (GL_QUADS); + glTexCoord (0, 0); glVertex (0 , $yp); + glTexCoord (0, (1 - $ycut)); glVertex (0 , $yp + $h1); + glTexCoord (1, (1 - $ycut)); glVertex (0 + $w, $yp + $h1); + glTexCoord (1, 0); glVertex (0 + $w, $yp); + glEnd (); + + $yp += $h1; + + glBindTexture (GL_TEXTURE_2D, $t2->{name}); + glBegin (GL_QUADS); + glTexCoord (0, (1 - $ycut)); glVertex (0 , $yp); + glTexCoord (0, 1); glVertex (0 , $yp + $h2); + glTexCoord (1, 1); glVertex (0 + $w, $yp + $h2); + glTexCoord (1, (1 - $ycut)); glVertex (0 + $w, $yp); + glEnd (); + + glDisable GL_BLEND; + glDisable GL_TEXTURE_2D; +} + +############################################################################# + package CFClient::UI::Slider; use strict;