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.52 by root, Wed Apr 19 21:17:15 2006 UTC vs.
Revision 1.60 by root, Sun Apr 23 04:47:02 2006 UTC

33 typedef signed char int8_t; 33 typedef signed char int8_t;
34 typedef signed short int16_t; 34 typedef signed short int16_t;
35 typedef signed int int32_t; 35 typedef signed int int32_t;
36#endif 36#endif
37 37
38#include "glext.h"
39
38#define FOW_DARKNESS 32 40#define FOW_DARKNESS 32
39 41
40#define MAP_EXTEND_X 32 42#define MAP_EXTEND_X 32
41#define MAP_EXTEND_Y 512 43#define MAP_EXTEND_Y 512
44
45#define MIN_FONT_HEIGHT 8 * PANGO_SCALE
42 46
43typedef Mix_Chunk *CFClient__MixChunk; 47typedef Mix_Chunk *CFClient__MixChunk;
44typedef Mix_Music *CFClient__MixMusic; 48typedef Mix_Music *CFClient__MixMusic;
45 49
46static PangoContext *context; 50static PangoContext *context;
62layout_update (CFClient__Layout self) 66layout_update (CFClient__Layout self)
63{ 67{
64 /* 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
65 * reasonably well with bitstream vera 69 * reasonably well with bitstream vera
66 */ 70 */
67 PangoFontDescription *font = pango_context_get_font_description (context); 71 PangoFontDescription *font = (PangoFontDescription *)
72 pango_layout_get_font_description (self->pl);
68 73
69 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;
70 78
71 if (pango_font_description_get_size (font) != height) 79 if (pango_font_description_get_size (font) != height)
72 { 80 {
81 font = pango_font_description_copy (font);
73 pango_font_description_set_absolute_size (font, height); 82 pango_font_description_set_absolute_size (font, height);
74 pango_layout_context_changed (self->pl); 83 pango_layout_set_font_description (self->pl, font);
75 } 84 }
76} 85}
77 86
78static void 87static void
79layout_get_pixel_size (CFClient__Layout self, int *w, int *h) 88layout_get_pixel_size (CFClient__Layout self, int *w, int *h)
237 break; 246 break;
238 247
239 row->col[x - row->c0].darkness = -1; 248 row->col[x - row->c0].darkness = -1;
240 } 249 }
241 } 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);
242} 264}
243 265
244MODULE = CFClient PACKAGE = CFClient 266MODULE = CFClient PACKAGE = CFClient
245 267
246PROTOTYPES: ENABLE 268PROTOTYPES: ENABLE
386 408
387 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1); 409 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1);
388 SDL_GL_SetAttribute (SDL_GL_BUFFER_SIZE, 15); 410 SDL_GL_SetAttribute (SDL_GL_BUFFER_SIZE, 15);
389 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 0); 411 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 0);
390 412
413 SDL_EnableUNICODE (1);
414 SDL_EnableKeyRepeat (SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
415
391 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL); 416 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL);
392 417
393 if (m && m != (SDL_Rect **)-1) 418 if (m && m != (SDL_Rect **)-1)
394 while (*m) 419 while (*m)
395 { 420 {
410 ); 435 );
411 SDL_WM_SetCaption ("Crossfire+ Client " VERSION, "Crossfire+"); 436 SDL_WM_SetCaption ("Crossfire+ Client " VERSION, "Crossfire+");
412 OUTPUT: 437 OUTPUT:
413 RETVAL 438 RETVAL
414 439
415int 440void
416Mix_VolumeMusic (int newvol = -1) 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}
417 487
418int 488int
419Mix_OpenAudio (int frequency = 22050, int format = MIX_DEFAULT_FORMAT, int channels = 1, int chunksize = 512) 489Mix_OpenAudio (int frequency = 22050, int format = MIX_DEFAULT_FORMAT, int channels = 1, int chunksize = 512)
490 POSTCALL:
491 Mix_HookMusicFinished (music_finished);
420 492
421void 493void
422Mix_CloseAudio () 494Mix_CloseAudio ()
423 495
424int 496int
456{ 528{
457 int count; 529 int count;
458 FcPattern *pattern = FcFreeTypeQuery ((const FcChar8 *)file, 0, 0, &count); 530 FcPattern *pattern = FcFreeTypeQuery ((const FcChar8 *)file, 0, 0, &count);
459 PangoFontDescription *font = pango_fc_font_description_from_pattern (pattern, 0); 531 PangoFontDescription *font = pango_fc_font_description_from_pattern (pattern, 0);
460 FcPatternDestroy (pattern); 532 FcPatternDestroy (pattern);
533 pango_font_description_set_absolute_size (font, MIN_FONT_HEIGHT);
461 pango_context_set_font_description (context, font); 534 pango_context_set_font_description (context, font);
462} 535}
463 536
464void 537void
465load_image_inline (SV *image_) 538load_image_inline (SV *image_)
567 CODE: 640 CODE:
568 New (0, RETVAL, 1, struct cf_layout); 641 New (0, RETVAL, 1, struct cf_layout);
569 RETVAL->base_height = base_height; 642 RETVAL->base_height = base_height;
570 RETVAL->pl = pango_layout_new (context); 643 RETVAL->pl = pango_layout_new (context);
571 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)));
572 OUTPUT: 648 OUTPUT:
573 RETVAL 649 RETVAL
574 650
575void 651void
576DESTROY (CFClient::Layout self) 652DESTROY (CFClient::Layout self)
885 cell->darkness = -1; 961 cell->darkness = -1;
886 } 962 }
887} 963}
888 964
889SV * 965SV *
890mapmap (CFClient::Map self, int w, int h) 966mapmap (CFClient::Map self, int x0, int y0, int w, int h)
891 CODE: 967 CODE:
892{ 968{
893 int x0, x1, x; 969 int x1, x;
894 int y0, y1, y; 970 int y1, y;
895 int z; 971 int z;
896 SV *map_sv = newSV (w * h * sizeof (uint32_t)); 972 SV *map_sv = newSV (w * h * sizeof (uint32_t));
897 uint32_t *map = (uint32_t *)SvPVX (map_sv); 973 uint32_t *map = (uint32_t *)SvPVX (map_sv);
898 974
899 SvPOK_only (map_sv); 975 SvPOK_only (map_sv);
900 SvCUR_set (map_sv, w * h * sizeof (uint32_t)); 976 SvCUR_set (map_sv, w * h * sizeof (uint32_t));
901 977
902 x0 = self->x - w / 2; x1 = x0 + w; 978 x0 += self->x; x1 = x0 + w;
903 y0 = self->y - h / 2; y1 = y0 + h; 979 y0 += self->y; y1 = y0 + h;
904 980
905 for (y = y0; y < y1; y++) 981 for (y = y0; y < y1; y++)
906 { 982 {
907 maprow *row = 0 <= y && y < self->rows 983 maprow *row = 0 <= y && y < self->rows
908 ? self->row + y 984 ? self->row + y
1048 *data++ = 0; /* version 0 format */ 1124 *data++ = 0; /* version 0 format */
1049 *data++ = w >> 8; *data++ = w; 1125 *data++ = w >> 8; *data++ = w;
1050 *data++ = h >> 8; *data++ = h; 1126 *data++ = h >> 8; *data++ = h;
1051 1127
1052 // 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
1053 // TODO: treat rows as we treat 1129 // TODO: treat rows as we treat columns
1054 map_get_row (self, y0 + self->y - self->oy);//D 1130 map_get_row (self, y0 + self->y - self->oy);//D
1055 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
1056 1132
1057 x0 += self->x - self->ox; 1133 x0 += self->x - self->ox;
1058 y0 += self->y - self->oy; 1134 y0 += self->y - self->oy;
1122 1198
1123 w = *data++ << 8; w |= *data++; 1199 w = *data++ << 8; w |= *data++;
1124 h = *data++ << 8; h |= *data++; 1200 h = *data++ << 8; h |= *data++;
1125 1201
1126 // 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
1127 // TODO: treat rows as we treat 1203 // TODO: treat rows as we treat columns
1128 map_get_row (self, y0 + self->y - self->oy);//D 1204 map_get_row (self, y0 + self->y - self->oy);//D
1129 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
1130 1206
1131 x0 += self->x - self->ox; 1207 x0 += self->x - self->ox;
1132 y0 += self->y - self->oy; 1208 y0 += self->y - self->oy;
1223 CODE: 1299 CODE:
1224 RETVAL = Mix_PlayMusic (self, loops); 1300 RETVAL = Mix_PlayMusic (self, loops);
1225 OUTPUT: 1301 OUTPUT:
1226 RETVAL 1302 RETVAL
1227 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