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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines