ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/bin/pclient
Revision: 1.11
Committed: Fri Apr 7 16:08:01 2006 UTC (18 years, 1 month ago) by elmex
Branch: MAIN
Changes since 1.10: +2 -1 lines
Log Message:
load Crossfire

File Contents

# Content
1 #!/opt/bin/perl
2
3 use strict;
4
5 use Crossfire;
6 use Crossfire::Client;
7 use Crossfire::Protocol;
8
9 use Client::Util;
10
11 package Crossfire::Client; # uh, yeah
12
13 use strict;
14
15 our $CFG;
16 our $VERSION = '0.1';
17
18 use SDL;
19 use SDL::App;
20 use SDL::Event;
21 use SDL::Surface;
22 use SDL::OpenGL;
23 use SDL::OpenGL::Constants;
24
25 my $conn;
26 my $app;
27
28 my $WIDTH = 640;
29 my $HEIGHT = 480;
30
31 sub glinit {
32 # nuke all gl context data
33
34 $app = new SDL::App
35 -flags => SDL_ANYFORMAT | SDL_HWSURFACE,
36 -title => "Crossfire+ Client",
37 -width => $WIDTH,
38 -height => $HEIGHT,
39 -opengl => 1,
40 -red_size => 8,
41 -green_size => 8,
42 -blue_size => 8,
43 -double_buffer => 1,
44 -resizeable => 0;
45
46 glEnable GL_TEXTURE_2D;
47 glTexEnv GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE;
48 glShadeModel GL_FLAT;
49 glDisable GL_DEPTH_TEST;
50 glBlendFunc GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA;
51 glEnable GL_BLEND;
52
53 glMatrixMode GL_PROJECTION;
54 glLoadIdentity;
55 glOrtho 0, $WIDTH / 32, $HEIGHT / 32, 0, -1 , 1;
56
57 # re-bind all textures
58 }
59
60 sub refresh {
61 glClearColor 0, 0, 0, 0;
62 glClear GL_COLOR_BUFFER_BIT;
63
64 my $map = $conn->{map};
65
66 for my $x (0 .. $conn->{mapw} - 1) {
67 for my $y (0 .. $conn->{maph} - 1) {
68
69 my $cell = $map->[$x][$y]
70 or next;
71
72 my $darkness = $cell->[3] * (1 / 255);
73 my $darkness = 0.8 + 0.2*rand;
74 glColor $darkness, $darkness, $darkness;
75
76 for my $num (grep $_, $cell->[0], $cell->[1], $cell->[2]) {
77 my $tex = $conn->{face}[$num]{texture} || 0;
78
79 glBindTexture GL_TEXTURE_2D, $tex;
80
81 glBegin GL_QUADS;
82 glTexCoord 0, 0; glVertex $x, $y;
83 glTexCoord 0, 1; glVertex $x, $y + 1;
84 glTexCoord 1, 1; glVertex $x + 1, $y + 1;
85 glTexCoord 1, 0; glVertex $x + 1, $y;
86 glEnd;
87 }
88 }
89 }
90
91 SDL::GLSwapBuffers;
92 }
93
94 my $ev = new SDL::Event;
95 my %ev_cb;
96
97 sub event(&$) {
98 $ev_cb{$_[0]->()} = $_[1];
99 }
100
101 sub does(&) { shift }
102
103 event {SDL_QUIT} does {
104 exit;
105 };
106
107 event {SDL_VIDEORESIZE} does {
108 print "resize\n";
109 };
110
111 event {SDL_VIDEOEXPOSE} does {
112 refresh;
113 };
114
115 event {SDL_KEYDOWN} does {
116 print "keypress\n";
117 };
118
119 event {SDL_KEYUP} does {
120 print "keyup\n";#d#
121 };
122
123 event {SDL_MOUSEMOTION} does {
124 print "motion\n";
125 };
126
127 event {SDL_MOUSEBUTTONDOWN} does {
128 print "button\n";
129 };
130
131 event {SDL_MOUSEBUTTONUP} does {
132 print "buttup\n";
133 };
134
135 event {SDL_ACTIVEEVENT} does {
136 print "active\n";
137 };
138
139 package Crossfire::Client;
140
141 @conn::ISA = Crossfire::Protocol::;
142
143 sub conn::map_update {
144 my ($self, $dirty) = @_;
145
146 refresh;
147 }
148
149 sub conn::map_scroll {
150 my ($self, $dx, $dy) = @_;
151
152 refresh;
153 }
154
155 sub conn::map_clear {
156 my ($self) = @_;
157
158 refresh;
159 }
160
161 sub conn::face_update {
162 my ($self, $num, $face) = @_;
163
164 warn "up face $self,$num,$face\n";#d#
165 use Gtk2;
166
167 my $pb = new Gtk2::Gdk::PixbufLoader;
168 $pb->write ($face->{image});
169 $pb->close;
170
171 $pb = $pb->get_pixbuf;
172 $pb = $pb->add_alpha (0, 0, 0, 0);
173
174 glGetError();
175 my ($tex) = @{glGenTextures 1};
176
177 $face->{texture} = $tex;
178
179 glBindTexture GL_TEXTURE_2D, $tex;
180 my $glerr=glGetError(); die "a: ".gluErrorString($glerr)."\n" if $glerr;
181
182 glTexParameter GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR;
183 glTexParameter GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR;#_MIPMAP_LINEAR;
184 glTexParameter GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP;
185 glTexParameter GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP;
186
187 glTexImage2D GL_TEXTURE_2D, 0,
188 GL_RGBA8,
189 $pb->get_width, $pb->get_height,
190 0,
191 GL_RGBA,
192 GL_UNSIGNED_BYTE,
193 $pb->get_pixels;
194 my $glerr=glGetError(); die "Problem setting up 2d Texture (dimensions not a power of 2?)):".gluErrorString($glerr)."\n" if $glerr;
195 }
196
197 #############################################################################
198
199 use Event;
200
201 Client::Util::read_cfg "$Crossfire::VARDIR/pclientrc";
202
203 glinit;
204
205 $conn = new conn
206 host => "cf.schmorp.de",
207 port => 13327;
208
209 Event->timer (after => 0, interval => 1/20, hard => 1, cb => sub {
210 while ($ev->poll) {
211 ($ev_cb{$ev->type} || sub { warn "unhandled event ", $ev->type })->();
212 }
213 });
214
215 Event::loop;
216