ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/Client.xs
(Generate patch)

Comparing deliantra/Deliantra-Client/Client.xs (file contents):
Revision 1.51 by root, Wed Apr 19 20:46:44 2006 UTC vs.
Revision 1.59 by root, Sun Apr 23 04:41:33 2006 UTC

9#include <string.h> 9#include <string.h>
10#include <stdio.h> 10#include <stdio.h>
11 11
12#include <SDL.h> 12#include <SDL.h>
13#include <SDL_image.h> 13#include <SDL_image.h>
14#include <SDL_mixer.h>
14#include <SDL_opengl.h> 15#include <SDL_opengl.h>
15 16
16#include <glib/gmacros.h> 17#include <glib/gmacros.h>
17 18
18#include <pango/pango.h> 19#include <pango/pango.h>
32 typedef signed char int8_t; 33 typedef signed char int8_t;
33 typedef signed short int16_t; 34 typedef signed short int16_t;
34 typedef signed int int32_t; 35 typedef signed int int32_t;
35#endif 36#endif
36 37
38#include "glext.h"
39
37#define FOW_DARKNESS 32 40#define FOW_DARKNESS 32
38 41
39#define MAP_EXTEND_X 32 42#define MAP_EXTEND_X 32
40#define MAP_EXTEND_Y 512 43#define MAP_EXTEND_Y 512
44
45#define MIN_FONT_HEIGHT 8 * PANGO_SCALE
46
47typedef Mix_Chunk *CFClient__MixChunk;
48typedef Mix_Music *CFClient__MixMusic;
41 49
42static PangoContext *context; 50static PangoContext *context;
43static PangoFontMap *fontmap; 51static PangoFontMap *fontmap;
44 52
45typedef struct cf_layout { 53typedef struct cf_layout {
58layout_update (CFClient__Layout self) 66layout_update (CFClient__Layout self)
59{ 67{
60 /* use a random scale factor to account for unknown descenders, 0.8 works 68 /* use a random scale factor to account for unknown descenders, 0.8 works
61 * reasonably well with bitstream vera 69 * reasonably well with bitstream vera
62 */ 70 */
63 PangoFontDescription *font = pango_context_get_font_description (context); 71 PangoFontDescription *font = pango_layout_get_font_description (self->pl);
64 72
65 int height = self->base_height * (PANGO_SCALE * 8 / 10); 73 int height = self->base_height * (PANGO_SCALE * 8 / 10);
74
75 if (height < MIN_FONT_HEIGHT)
76 height = MIN_FONT_HEIGHT;
66 77
67 if (pango_font_description_get_size (font) != height) 78 if (pango_font_description_get_size (font) != height)
68 { 79 {
80 font = pango_font_description_copy (font);
69 pango_font_description_set_absolute_size (font, height); 81 pango_font_description_set_absolute_size (font, height);
70 pango_layout_context_changed (self->pl); 82 pango_layout_set_font_description (self->pl, font);
71 } 83 }
72} 84}
73 85
74static void 86static void
75layout_get_pixel_size (CFClient__Layout self, int *w, int *h) 87layout_get_pixel_size (CFClient__Layout self, int *w, int *h)
233 break; 245 break;
234 246
235 row->col[x - row->c0].darkness = -1; 247 row->col[x - row->c0].darkness = -1;
236 } 248 }
237 } 249 }
250}
251
252static void
253music_finished ()
254{
255 SDL_UserEvent ev;
256
257 ev.type = SDL_USEREVENT;
258 ev.code = 0;
259 ev.data1 = 0;
260 ev.data2 = 0;
261
262 SDL_PushEvent ((SDL_Event *)&ev);
238} 263}
239 264
240MODULE = CFClient PACKAGE = CFClient 265MODULE = CFClient PACKAGE = CFClient
241 266
242PROTOTYPES: ENABLE 267PROTOTYPES: ENABLE
382 407
383 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1); 408 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1);
384 SDL_GL_SetAttribute (SDL_GL_BUFFER_SIZE, 15); 409 SDL_GL_SetAttribute (SDL_GL_BUFFER_SIZE, 15);
385 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 0); 410 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 0);
386 411
412 SDL_EnableUNICODE (1);
413 SDL_EnableKeyRepeat (SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
414
387 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL); 415 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL);
388 416
389 if (m && m != (SDL_Rect **)-1) 417 if (m && m != (SDL_Rect **)-1)
390 while (*m) 418 while (*m)
391 { 419 {
407 SDL_WM_SetCaption ("Crossfire+ Client " VERSION, "Crossfire+"); 435 SDL_WM_SetCaption ("Crossfire+ Client " VERSION, "Crossfire+");
408 OUTPUT: 436 OUTPUT:
409 RETVAL 437 RETVAL
410 438
411void 439void
440SDL_GL_SwapBuffers ()
441
442void
443SDL_PollEvent ()
444 PPCODE:
445{
446 SDL_Event ev;
447
448 while (SDL_PollEvent (&ev))
449 {
450 HV *hv = newHV ();
451 hv_store (hv, "type", 4, newSViv (ev.type), 0);
452 switch (ev.type)
453 {
454 case SDL_KEYDOWN:
455 case SDL_KEYUP:
456 hv_store (hv, "state", 5, newSViv (ev.key.state), 0);
457 hv_store (hv, "sym", 3, newSViv (ev.key.keysym.sym), 0);
458 hv_store (hv, "mod", 3, newSViv (ev.key.keysym.mod), 0);
459 hv_store (hv, "unicode", 7, newSViv (ev.key.keysym.unicode), 0);
460 break;
461
462 case SDL_ACTIVEEVENT:
463 hv_store (hv, "gain", 4, newSViv (ev.active.gain), 0);
464 hv_store (hv, "state", 5, newSViv (ev.active.state), 0);
465 break;
466
467 case SDL_MOUSEMOTION:
468 hv_store (hv, "state", 5, newSViv (ev.motion.state), 0);
469 hv_store (hv, "x", 1, newSViv (ev.motion.x), 0);
470 hv_store (hv, "y", 1, newSViv (ev.motion.y), 0);
471 hv_store (hv, "xrel", 4, newSViv (ev.motion.xrel), 0);
472 hv_store (hv, "yrel", 4, newSViv (ev.motion.yrel), 0);
473 break;
474
475 case SDL_MOUSEBUTTONDOWN:
476 case SDL_MOUSEBUTTONUP:
477 hv_store (hv, "button", 6, newSViv (ev.button.button), 0);
478 hv_store (hv, "state", 5, newSViv (ev.button.state), 0);
479 hv_store (hv, "x", 1, newSViv (ev.button.x), 0);
480 hv_store (hv, "y", 1, newSViv (ev.button.y), 0);
481 }
482
483 XPUSHs (sv_2mortal (newRV_noinc ((SV *)hv)));
484 }
485}
486
487int
488Mix_OpenAudio (int frequency = 22050, int format = MIX_DEFAULT_FORMAT, int channels = 1, int chunksize = 512)
489 POSTCALL:
490 Mix_HookMusicFinished (music_finished);
491
492void
493Mix_CloseAudio ()
494
495int
496Mix_AllocateChannels (int numchans = -1)
497
498void
412lowdelay (int fd, int val = 1) 499lowdelay (int fd, int val = 1)
413 CODE: 500 CODE:
414#ifndef _WIN32 501#ifndef _WIN32
415 setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof (val)); 502 setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof (val));
416#endif 503#endif
440{ 527{
441 int count; 528 int count;
442 FcPattern *pattern = FcFreeTypeQuery ((const FcChar8 *)file, 0, 0, &count); 529 FcPattern *pattern = FcFreeTypeQuery ((const FcChar8 *)file, 0, 0, &count);
443 PangoFontDescription *font = pango_fc_font_description_from_pattern (pattern, 0); 530 PangoFontDescription *font = pango_fc_font_description_from_pattern (pattern, 0);
444 FcPatternDestroy (pattern); 531 FcPatternDestroy (pattern);
532 pango_font_description_set_absolute_size (font, MIN_FONT_HEIGHT);
445 pango_context_set_font_description (context, font); 533 pango_context_set_font_description (context, font);
446} 534}
447 535
448void 536void
449load_image_inline (SV *image_) 537load_image_inline (SV *image_)
551 CODE: 639 CODE:
552 New (0, RETVAL, 1, struct cf_layout); 640 New (0, RETVAL, 1, struct cf_layout);
553 RETVAL->base_height = base_height; 641 RETVAL->base_height = base_height;
554 RETVAL->pl = pango_layout_new (context); 642 RETVAL->pl = pango_layout_new (context);
555 pango_layout_set_wrap (RETVAL->pl, PANGO_WRAP_WORD_CHAR); 643 pango_layout_set_wrap (RETVAL->pl, PANGO_WRAP_WORD_CHAR);
644 pango_layout_set_font_description (RETVAL->pl,
645 pango_font_description_copy (
646 pango_context_get_font_description (context)));
556 OUTPUT: 647 OUTPUT:
557 RETVAL 648 RETVAL
558 649
559void 650void
560DESTROY (CFClient::Layout self) 651DESTROY (CFClient::Layout self)
869 cell->darkness = -1; 960 cell->darkness = -1;
870 } 961 }
871} 962}
872 963
873SV * 964SV *
874mapmap (CFClient::Map self, int w, int h) 965mapmap (CFClient::Map self, int x0, int y0, int w, int h)
875 CODE: 966 CODE:
876{ 967{
877 int x0, x1, x; 968 int x1, x;
878 int y0, y1, y; 969 int y1, y;
879 int z; 970 int z;
880 SV *map_sv = newSV (w * h * sizeof (uint32_t)); 971 SV *map_sv = newSV (w * h * sizeof (uint32_t));
881 uint32_t *map = (uint32_t *)SvPVX (map_sv); 972 uint32_t *map = (uint32_t *)SvPVX (map_sv);
882 973
883 SvPOK_only (map_sv); 974 SvPOK_only (map_sv);
884 SvCUR_set (map_sv, w * h * sizeof (uint32_t)); 975 SvCUR_set (map_sv, w * h * sizeof (uint32_t));
885 976
886 x0 = self->x - w / 2; x1 = x0 + w; 977 x0 += self->x; x1 = x0 + w;
887 y0 = self->y - h / 2; y1 = y0 + h; 978 y0 += self->y; y1 = y0 + h;
888 979
889 for (y = y0; y < y1; y++) 980 for (y = y0; y < y1; y++)
890 { 981 {
891 maprow *row = 0 <= y && y < self->rows 982 maprow *row = 0 <= y && y < self->rows
892 ? self->row + y 983 ? self->row + y
1032 *data++ = 0; /* version 0 format */ 1123 *data++ = 0; /* version 0 format */
1033 *data++ = w >> 8; *data++ = w; 1124 *data++ = w >> 8; *data++ = w;
1034 *data++ = h >> 8; *data++ = h; 1125 *data++ = h >> 8; *data++ = h;
1035 1126
1036 // we need to do this 'cause we don't keep an absolute coord system for rows 1127 // we need to do this 'cause we don't keep an absolute coord system for rows
1037 // TODO: treat rows as we treat 1128 // TODO: treat rows as we treat columns
1038 map_get_row (self, y0 + self->y - self->oy);//D 1129 map_get_row (self, y0 + self->y - self->oy);//D
1039 map_get_row (self, y0 + self->y - self->oy + h - 1);//D 1130 map_get_row (self, y0 + self->y - self->oy + h - 1);//D
1040 1131
1041 x0 += self->x - self->ox; 1132 x0 += self->x - self->ox;
1042 y0 += self->y - self->oy; 1133 y0 += self->y - self->oy;
1106 1197
1107 w = *data++ << 8; w |= *data++; 1198 w = *data++ << 8; w |= *data++;
1108 h = *data++ << 8; h |= *data++; 1199 h = *data++ << 8; h |= *data++;
1109 1200
1110 // we need to do this 'cause we don't keep an absolute coord system for rows 1201 // we need to do this 'cause we don't keep an absolute coord system for rows
1111 // TODO: treat rows as we treat 1202 // TODO: treat rows as we treat columns
1112 map_get_row (self, y0 + self->y - self->oy);//D 1203 map_get_row (self, y0 + self->y - self->oy);//D
1113 map_get_row (self, y0 + self->y - self->oy + h - 1);//D 1204 map_get_row (self, y0 + self->y - self->oy + h - 1);//D
1114 1205
1115 x0 += self->x - self->ox; 1206 x0 += self->x - self->ox;
1116 y0 += self->y - self->oy; 1207 y0 += self->y - self->oy;
1151 } 1242 }
1152 } 1243 }
1153 } 1244 }
1154} 1245}
1155 1246
1247MODULE = CFClient PACKAGE = CFClient::MixChunk
1248
1249CFClient::MixChunk
1250new_from_file (SV *class, char *path)
1251 CODE:
1252 RETVAL = Mix_LoadWAV (path);
1253 OUTPUT:
1254 RETVAL
1255
1256void
1257DESTROY (CFClient::MixChunk self)
1258 CODE:
1259 Mix_FreeChunk (self);
1260
1261int
1262volume (CFClient::MixChunk self, int volume = -1)
1263 CODE:
1264 RETVAL = Mix_VolumeChunk (self, volume);
1265 OUTPUT:
1266 RETVAL
1267
1268int
1269play (CFClient::MixChunk self, int channel = -1, int loops = 0, int ticks = -1)
1270 CODE:
1271 RETVAL = Mix_PlayChannelTimed (channel, self, loops, ticks);
1272 OUTPUT:
1273 RETVAL
1274
1275MODULE = CFClient PACKAGE = CFClient::MixMusic
1276
1277int
1278volume (int volume = -1)
1279 CODE:
1280 RETVAL = Mix_VolumeMusic (volume);
1281 OUTPUT:
1282 RETVAL
1283
1284CFClient::MixMusic
1285new_from_file (SV *class, char *path)
1286 CODE:
1287 RETVAL = Mix_LoadMUS (path);
1288 OUTPUT:
1289 RETVAL
1290
1291void
1292DESTROY (CFClient::MixMusic self)
1293 CODE:
1294 Mix_FreeMusic (self);
1295
1296int
1297play (CFClient::MixMusic self, int loops = -1)
1298 CODE:
1299 RETVAL = Mix_PlayMusic (self, loops);
1300 OUTPUT:
1301 RETVAL
1302
1303MODULE = CFClient PACKAGE = CFClient::OpenGL
1304
1305BOOT:
1306{
1307 HV *stash = gv_stashpv ("CFClient::OpenGL", 1);
1308 static const struct {
1309 const char *name;
1310 IV iv;
1311 } *civ, const_iv[] = {
1312# define const_iv(name) { # name, (IV)name }
1313 const_iv (GL_COLOR_MATERIAL),
1314 const_iv (GL_SMOOTH),
1315 const_iv (GL_FLAT),
1316 const_iv (GL_BLEND),
1317 const_iv (GL_AND),
1318 const_iv (GL_SRC_ALPHA),
1319 const_iv (GL_ONE_MINUS_SRC_ALPHA),
1320 const_iv (GL_RGB),
1321 const_iv (GL_RGBA),
1322 const_iv (GL_UNSIGNED_BYTE),
1323 const_iv (GL_ALPHA4),
1324 const_iv (GL_ALPHA),
1325 const_iv (GL_FLOAT),
1326 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV),
1327 const_iv (GL_COMPILE),
1328 const_iv (GL_TEXTURE_1D),
1329 const_iv (GL_TEXTURE_2D),
1330 const_iv (GL_TEXTURE_ENV),
1331 const_iv (GL_TEXTURE_MAG_FILTER),
1332 const_iv (GL_TEXTURE_MIN_FILTER),
1333 const_iv (GL_TEXTURE_ENV_MODE),
1334 const_iv (GL_TEXTURE_WRAP_S),
1335 const_iv (GL_TEXTURE_WRAP_T),
1336 const_iv (GL_CLAMP),
1337 const_iv (GL_REPEAT),
1338 const_iv (GL_NEAREST),
1339 const_iv (GL_LINEAR),
1340 const_iv (GL_NEAREST_MIPMAP_NEAREST),
1341 const_iv (GL_LINEAR_MIPMAP_NEAREST),
1342 const_iv (GL_NEAREST_MIPMAP_LINEAR),
1343 const_iv (GL_LINEAR_MIPMAP_LINEAR),
1344 const_iv (GL_GENERATE_MIPMAP),
1345 const_iv (GL_LINEAR),
1346 const_iv (GL_MODULATE),
1347 const_iv (GL_REPLACE),
1348 const_iv (GL_COLOR_BUFFER_BIT),
1349 const_iv (GL_PROJECTION),
1350 const_iv (GL_MODELVIEW),
1351 const_iv (GL_COLOR_LOGIC_OP),
1352 const_iv (GL_CONVOLUTION_2D),
1353 const_iv (GL_CONVOLUTION_BORDER_MODE),
1354 const_iv (GL_CONSTANT_BORDER),
1355 const_iv (GL_LINES),
1356 const_iv (GL_QUADS),
1357 const_iv (GL_LINE_LOOP),
1358 const_iv (GL_PERSPECTIVE_CORRECTION_HINT),
1359 const_iv (GL_FASTEST),
1360# undef const_iv
1361 };
1362
1363 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; )
1364 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv));
1365}
1366
1367int glGetError ()
1368
1369void glClear (int mask)
1370
1371void glClearColor (float r, float g, float b, float a = 1.0)
1372 PROTOTYPE: @
1373
1374void glEnable (int cap)
1375
1376void glDisable (int cap)
1377
1378void glShadeModel (int mode)
1379
1380void glHint (int target, int mode)
1381
1382void glBlendFunc (int sfactor, int dfactor)
1383
1384void glLogicOp (int opcode)
1385
1386void glMatrixMode (int mode)
1387
1388void glPushMatrix ()
1389
1390void glPopMatrix ()
1391
1392void glLoadIdentity ()
1393
1394void glOrtho (double left, double right, double bottom, double top, double near, double far)
1395
1396void glViewport (int x, int y, int width, int height)
1397
1398void glTranslate (float x, float y, float z = 0.)
1399 CODE:
1400 glTranslatef (x, y, z);
1401
1402void glScale (float x, float y, float z)
1403 CODE:
1404 glScalef (x, y, z);
1405
1406void glRotate (float angle, float x, float y, float z)
1407 CODE:
1408 glRotatef (angle, x, y, z);
1409
1410void glBegin (int mode)
1411
1412void glEnd ()
1413
1414void glColor (float r, float g, float b, float a = 1.0)
1415 PROTOTYPE: @
1416 CODE:
1417 glColor4f (r, g, b, a);
1418
1419void glVertex (float x, float y, float z = 0.)
1420 CODE:
1421 glVertex3f (x, y, z);
1422
1423void glTexCoord (float s, float t)
1424 CODE:
1425 glTexCoord2f (s, t);
1426
1427void glTexEnv (int target, int pname, float param)
1428 CODE:
1429 glTexEnvf (target, pname, param);
1430
1431void glTexParameter (int target, int pname, float param)
1432 CODE:
1433 glTexParameterf (target, pname, param);
1434
1435void glBindTexture (int target, int name)
1436
1437void glConvolutionParameter (int target, int pname, float params)
1438 CODE:
1439 glConvolutionParameterf (target, pname, params);
1440
1441void glConvolutionFilter2D (int target, int internalformat, int width, int height, int format, int type, char *data)
1442
1443void glTexImage2D (int target, int level, int internalformat, int width, int height, int border, int format, int type, char *data)
1444
1445void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border)
1446
1447int glGenTexture ()
1448 CODE:
1449{
1450 GLuint name;
1451 glGenTextures (1, &name);
1452 RETVAL = name;
1453}
1454 OUTPUT:
1455 RETVAL
1456
1457void glDeleteTexture (int name)
1458 CODE:
1459{
1460 GLuint name_ = name;
1461 glDeleteTextures (1, &name_);
1462}
1463
1464int glGenList ()
1465 CODE:
1466 RETVAL = glGenLists (1);
1467 OUTPUT:
1468 RETVAL
1469
1470void glDeleteList (int list)
1471 CODE:
1472 glDeleteLists (list, 1);
1473
1474void glNewList (int list, int mode = GL_COMPILE)
1475
1476void glEndList ()
1477
1478void glCallList (int list)
1479

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines