--- deliantra/Deliantra-Client/bin/pclient 2006/04/09 22:24:43 1.54
+++ deliantra/Deliantra-Client/bin/pclient 2006/04/11 13:38:22 1.68
@@ -14,16 +14,17 @@
use SDL::OpenGL::Constants;
use Crossfire;
-use Crossfire::Client;
use Crossfire::Protocol;
-use Crossfire::Client::Widget;
-
-our $FACECACHE;
+use CFClient;
+use CFClient::Widget;
our $VERSION = '0.1';
-our %GL_EXT;
+my $MAX_FPS = 30;
+my $TICKS_PER_FRAME = int 1000 / $MAX_FPS - 1; # min ticks per frame
+
+our $FACECACHE;
our $CFG;
our $CONN;
@@ -33,27 +34,22 @@
our $FULLSCREEN;
our $FONTSIZE;
-our $FOCUS;
-our $HOVER;
our $SDL_TIMER;
our $SDL_APP;
-our $SDL_EV = new SDL::Event;
+our $SDL_EV;
our %SDL_CB;
-our @GL_INIT; # hooks called on every gl init
-
our $ALT_ENTER_MESSAGE;
our $STATUS_LINE;
-
-our $TOPLEVEL;
-
-our $tw; # Test widget #d#
+our $DEBUG_STATUS;
my $last_refresh;
my %ANIMATE;
my $refresh_handler;
+our ($tw, $te); # Test widget #d#
+
sub init_screen {
$SDL_APP = new SDL::App
-flags => SDL_ANYFORMAT | SDL_HWSURFACE,
@@ -69,18 +65,25 @@
-fullscreen => $FULLSCREEN,
-resizeable => 0;
- $last_refresh = SDL::GetTicks;
+ $SDL_EV = new SDL::Event;
+ $SDL_EV->set_unicode (1);
- %GL_EXT = map +($_ => 1), split /\s+/, Crossfire::Client::gl_extensions;
+ $SDL_TIMER = add Glib::Timeout 1000/50, sub {
+ ($SDL_CB{$SDL_EV->type} || sub { warn "unhandled event ", $SDL_EV->type })->()
+ while $SDL_EV->poll;
- $GL_EXT{GL_ARB_texture_non_power_of_two}
- or warn "WARNING: non-power-of-two opengl extension required";
+ 1
+ };
+
+ $last_refresh = SDL::GetTicks;
+
+ CFClient::gl_init;
$FONTSIZE = int $HEIGHT / 50;
#############################################################################
- glClearColor 0, 0, 0, 0;
+ glClearColor 0.45, 0.45, 0.45, 1;
glEnable GL_TEXTURE_2D;
glEnable GL_COLOR_MATERIAL;
@@ -88,63 +91,62 @@
glDisable GL_DEPTH_TEST;
glBlendFunc GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA;
- $_->() for @GL_INIT;
-
#############################################################################
+
+ $DEBUG_STATUS = new CFClient::Widget::Label;
+ $CFClient::Widget::TOPLEVEL->add ($DEBUG_STATUS);
- $STATUS_LINE = new Crossfire::Client::Widget::Label
- 0, $HEIGHT * 59 / 60 - $FONTSIZE, 1, $FONTSIZE,
- "";
- $TOPLEVEL->add ($STATUS_LINE);
-
- $ALT_ENTER_MESSAGE = new Crossfire::Client::Widget::Label
- 0, $HEIGHT * 59 / 60, 1, $HEIGHT / 60,
- "Use Alt-Enter to toggle fullscreen mode";
- $TOPLEVEL->add ($ALT_ENTER_MESSAGE);
+ $STATUS_LINE = new CFClient::Widget::Label
+ y => $HEIGHT * 59 / 60 - $FONTSIZE;
+ $CFClient::Widget::TOPLEVEL->add ($STATUS_LINE);
+
+ $ALT_ENTER_MESSAGE = new CFClient::Widget::Label
+ y => $HEIGHT * 59 / 60,
+ height => $HEIGHT / 60,
+ text => "Use Alt-Enter to toggle fullscreen mode";
+ $CFClient::Widget::TOPLEVEL->add ($ALT_ENTER_MESSAGE);
# Test code #d#
unless ($tw) { # haha...
- $tw = new Crossfire::Client::Widget::Animator;
- my $lbl1 = new Crossfire::Client::Widget::Label
- 0, 0, 10, $FONTSIZE, "This is a\nTEST!\nOf a themed\nFrame!";
- my $lbl2 = new Crossfire::Client::Widget::Label
- 0, 0, 10, $FONTSIZE, "LBL2";
-
- my $vb = new Crossfire::Client::Widget::VBox;
- my $f = new Crossfire::Client::Widget::FancyFrame;
- my $f2 = new Crossfire::Client::Widget::FancyFrame;
+ $te = new CFClient::Widget::FancyFrame x => 300, z => 1;
+ $te->add (new CFClient::Widget::Entry);
+ $CFClient::Widget::TOPLEVEL->add ($te);
+
+ $tw = new CFClient::Widget::Animator x => $WIDTH - 200, w => 400, h => 300;
+ my $lbl1 = new CFClient::Widget::Label text => "This is a\nTEST!\nOf a themed\nFrame!";
+ my $lbl2 = new CFClient::Widget::Label text => "LBL2";
+ my $vb = new CFClient::Widget::VBox;
+ my $f = new CFClient::Widget::FancyFrame;
+ my $f2 = new CFClient::Widget::FancyFrame;
$f->add ($lbl1);
$f2->add ($lbl2);
$vb->add ($f);
$vb->add ($f2, 1);
$tw->add ($vb);
- $tw->w (400);
- $tw->h (300);
- $tw->move ($WIDTH - 200, 0);
$tw->moveto (0, 0);
- $TOPLEVEL->add ($tw);
+ $CFClient::Widget::TOPLEVEL->add ($tw);
# $f->move ($WIDTH - 200, 0);
-# $TOPLEVEL->add ($f);
+# $CFClient::Widget::TOPLEVEL->add ($f);
}
}
-sub start_game {
- $SDL_TIMER = add Glib::Timeout 1000/50, sub {
- ($SDL_CB{$SDL_EV->type} || sub { warn "unhandled event ", $SDL_EV->type })->()
- while $SDL_EV->poll;
-
- 1
- };
+sub destroy_screen {
+ remove Glib::Source $SDL_TIMER;
+ undef $SDL_APP;
+ undef $SDL_EV;
+ SDL::Quit;
+}
+sub start_game {
$WIDTH = $CFG->{width};
$HEIGHT = $CFG->{height};
$FULLSCREEN = 0;
init_screen;
- my $mapsize = List::Util::min 64, List::Util::max 11, int $HEIGHT * $CFG->{mapsize} * 0.01 / 32;
+ my $mapsize = List::Util::min 64, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32;
$CONN = new conn
host => $CFG->{host},
@@ -155,48 +157,68 @@
maph => $mapsize,
;
- Crossfire::Client::lowdelay fileno $CONN->{fh};
+ CFClient::lowdelay fileno $CONN->{fh};
}
sub stop_game {
- remove Glib::Source $SDL_TIMER;
remove Glib::Source $refresh_handler if $refresh_handler;
undef $refresh_handler;
- undef $SDL_APP;
undef $CONN;
- SDL::Quit;
+ destroy_screen;
}
-
sub force_refresh {
glViewport 0, 0, $WIDTH, $HEIGHT;
glMatrixMode GL_PROJECTION;
glLoadIdentity;
- glOrtho 0, $WIDTH, $HEIGHT, 0, -6000 , 6000;
+ glOrtho 0, $WIDTH, $HEIGHT, 0, -10000 , 10000;
glMatrixMode GL_MODELVIEW;
glClear GL_COLOR_BUFFER_BIT;
- $TOPLEVEL->draw;
+ $CFClient::Widget::TOPLEVEL->draw;
SDL::GLSwapBuffers;
}
+sub debug {
+ $DEBUG_STATUS->set_text ($_[0]);
+ $DEBUG_STATUS->size_allocate ($DEBUG_STATUS->size_request);
+ $DEBUG_STATUS->move ($WIDTH - $DEBUG_STATUS->{w}, 0);
+}
+
+my $FPS;
+
sub refresh {
$refresh_handler ||= add Glib::Idle sub {
- return unless $SDL_APP;
+ if ($SDL_APP) {
+ my $next_refresh = SDL::GetTicks;
- my $next_refresh = SDL::GetTicks;
- my $interval = ($next_refresh - $last_refresh) * 0.001;
- $last_refresh = $next_refresh;
+ if ($next_refresh - $last_refresh < $TICKS_PER_FRAME) {
+ SDL::Delay $TICKS_PER_FRAME - ($next_refresh - $last_refresh);
+ $next_refresh = SDL::GetTicks;
+ }
+
+ my $interval = ($next_refresh - $last_refresh) * 0.001;
+ $last_refresh = $next_refresh;
+
+ if ($interval) {
+ $FPS ||= 1 / $interval;
+ $FPS = $FPS * 0.96 + (1 / $interval) * 0.04;
+ debug sprintf "%5.02f", $FPS;
+ }
- force_refresh;
- $_->animate ($interval) for grep $_, values %ANIMATE;
+ force_refresh;
+ $_->animate ($interval) for grep $_, values %ANIMATE;
- if (%ANIMATE) {
- 1
+ if (%ANIMATE) {
+ 1
+ } else {
+ undef $refresh_handler;
+ 0
+ }
} else {
undef $refresh_handler;
0
@@ -232,26 +254,23 @@
$FULLSCREEN = !$FULLSCREEN;
init_screen;
} else {
- Crossfire::Client::Widget::feed_sdl_key_down_event ($SDL_EV);
+ CFClient::Widget::feed_sdl_key_down_event ($SDL_EV);
}
},
SDL_KEYUP() => sub {
- Crossfire::Client::Widget::feed_sdl_key_up_event ($SDL_EV);
+ CFClient::Widget::feed_sdl_key_up_event ($SDL_EV);
},
SDL_MOUSEMOTION() => sub {
- my ($x, $y) = ($SDL_EV->motion_x, $SDL_EV->motion_y);
- $HOVER = $TOPLEVEL->find_widget ($x, $y);
-
- warn "mouse $x, $y = $HOVER\n";
+ CFClient::Widget::feed_sdl_motion_event ($SDL_EV);
},
SDL_MOUSEBUTTONDOWN() => sub {
- Crossfire::Client::Widget::feed_sdl_button_down_event ($SDL_EV);
+ CFClient::Widget::feed_sdl_button_down_event ($SDL_EV);
},
SDL_MOUSEBUTTONUP() => sub {
- Crossfire::Client::Widget::feed_sdl_button_up_event ($SDL_EV);
+ CFClient::Widget::feed_sdl_button_up_event ($SDL_EV);
},
SDL_ACTIVEEVENT() => sub {
- warn "active\n";#d#
+ printf "active %x %x\n", $SDL_EV->active_gain, $SDL_EV->active_state;#d#
},
);
@@ -286,7 +305,7 @@
$FACECACHE->{"$face->{chksum},$face->{name}"} = $face->{image};
- $face->{texture} = new_from_image Crossfire::Client::Texture delete $face->{image};
+ $face->{texture} = new_from_image CFClient::Texture delete $face->{image};
}
sub conn::query {
@@ -369,7 +388,7 @@
$::CFG->{$_} = $cfg->{$_}
if $_ ne '_i';
}
- Crossfire::Client::write_cfg "$Crossfire::VARDIR/pclientrc";
+ CFClient::write_cfg "$CFrossfire::VARDIR/pclientrc";
});
$hb->pack_start (my $cb = Gtk2::Button->new ("login"), 1, 1, 5);
$cb->signal_connect (clicked => sub {
@@ -398,14 +417,12 @@
SDL::Init SDL_INIT_EVERYTHING;
-$TOPLEVEL = Crossfire::Client::Widget::Toplevel->new;
-
-my $mapwidget = Crossfire::Client::Widget::MapWidget->new;
+my $mapwidget = CFClient::Widget::MapWidget->new;
-$TOPLEVEL->add ($mapwidget);
+$CFClient::Widget::TOPLEVEL->add ($mapwidget);
$mapwidget->focus_in;
-Crossfire::Client::read_cfg "$Crossfire::VARDIR/pclientrc";
+CFClient::read_cfg "$Crossfire::VARDIR/pclientrc";
$CFG ||= {
width => 640,
@@ -416,7 +433,12 @@
port => 13327,
};
-Crossfire::Client::set_font Crossfire::Client::find_rcfile "uifont.ttf";
+{
+ my @fonts = map CFClient::find_rcfile $_, qw(uifont.ttf uifontb.ttf uifonti.ttf uifontbi.ttf);
+
+ CFClient::add_font $_ for @fonts;
+ CFClient::set_font $fonts[0];
+}
$FACECACHE = eval { Crossfire::load_ref "$Crossfire::VARDIR/pclient.faces" } || {};