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.56 by root, Thu Apr 20 09:13:31 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>
37#define FOW_DARKNESS 32 38#define FOW_DARKNESS 32
38 39
39#define MAP_EXTEND_X 32 40#define MAP_EXTEND_X 32
40#define MAP_EXTEND_Y 512 41#define MAP_EXTEND_Y 512
41 42
43typedef Mix_Chunk *CFClient__MixChunk;
44typedef Mix_Music *CFClient__MixMusic;
45
42static PangoContext *context; 46static PangoContext *context;
43static PangoFontMap *fontmap; 47static PangoFontMap *fontmap;
44 48
45typedef struct cf_layout { 49typedef struct cf_layout {
46 PangoLayout *pl; 50 PangoLayout *pl;
233 break; 237 break;
234 238
235 row->col[x - row->c0].darkness = -1; 239 row->col[x - row->c0].darkness = -1;
236 } 240 }
237 } 241 }
242}
243
244static void
245music_finished ()
246{
247 SDL_UserEvent ev;
248
249 ev.type = SDL_USEREVENT;
250 ev.code = 0;
251 ev.data1 = 0;
252 ev.data2 = 0;
253
254 SDL_PushEvent (&ev);
238} 255}
239 256
240MODULE = CFClient PACKAGE = CFClient 257MODULE = CFClient PACKAGE = CFClient
241 258
242PROTOTYPES: ENABLE 259PROTOTYPES: ENABLE
382 399
383 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1); 400 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1);
384 SDL_GL_SetAttribute (SDL_GL_BUFFER_SIZE, 15); 401 SDL_GL_SetAttribute (SDL_GL_BUFFER_SIZE, 15);
385 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 0); 402 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 0);
386 403
404 SDL_EnableUNICODE (1);
405 SDL_EnableKeyRepeat (SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
406
387 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL); 407 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL);
388 408
389 if (m && m != (SDL_Rect **)-1) 409 if (m && m != (SDL_Rect **)-1)
390 while (*m) 410 while (*m)
391 { 411 {
405 w, h, 0, SDL_OPENGL | (fullscreen ? SDL_FULLSCREEN : 0) 425 w, h, 0, SDL_OPENGL | (fullscreen ? SDL_FULLSCREEN : 0)
406 ); 426 );
407 SDL_WM_SetCaption ("Crossfire+ Client " VERSION, "Crossfire+"); 427 SDL_WM_SetCaption ("Crossfire+ Client " VERSION, "Crossfire+");
408 OUTPUT: 428 OUTPUT:
409 RETVAL 429 RETVAL
430
431void
432SDL_GL_SwapBuffers ()
433
434void
435SDL_PollEvent ()
436 PPCODE:
437{
438 SDL_Event ev;
439
440 while (SDL_PollEvent (&ev))
441 {
442 HV *hv = newHV ();
443 hv_store (hv, "type", 4, newSViv (ev.type), 0);
444 switch (ev.type)
445 {
446 case SDL_KEYDOWN:
447 case SDL_KEYUP:
448 hv_store (hv, "state", 5, newSViv (ev.key.state), 0);
449 hv_store (hv, "sym", 3, newSViv (ev.key.keysym.sym), 0);
450 hv_store (hv, "mod", 3, newSViv (ev.key.keysym.mod), 0);
451 hv_store (hv, "unicode", 7, newSViv (ev.key.keysym.unicode), 0);
452 break;
453
454 case SDL_ACTIVEEVENT:
455 hv_store (hv, "gain", 4, newSViv (ev.active.gain), 0);
456 hv_store (hv, "state", 5, newSViv (ev.active.state), 0);
457 break;
458
459 case SDL_MOUSEMOTION:
460 hv_store (hv, "state", 5, newSViv (ev.motion.state), 0);
461 hv_store (hv, "x", 1, newSViv (ev.motion.x), 0);
462 hv_store (hv, "y", 1, newSViv (ev.motion.y), 0);
463 hv_store (hv, "xrel", 4, newSViv (ev.motion.xrel), 0);
464 hv_store (hv, "yrel", 4, newSViv (ev.motion.yrel), 0);
465 break;
466
467 case SDL_MOUSEBUTTONDOWN:
468 case SDL_MOUSEBUTTONUP:
469 hv_store (hv, "button", 6, newSViv (ev.button.button), 0);
470 hv_store (hv, "state", 5, newSViv (ev.button.state), 0);
471 hv_store (hv, "x", 1, newSViv (ev.button.x), 0);
472 hv_store (hv, "y", 1, newSViv (ev.button.y), 0);
473 }
474
475 XPUSHs (sv_2mortal (newRV_noinc ((SV *)hv)));
476 }
477}
478
479int
480Mix_OpenAudio (int frequency = 22050, int format = MIX_DEFAULT_FORMAT, int channels = 1, int chunksize = 512)
481 POSTCALL:
482 Mix_HookMusicFinished (music_finished);
483
484void
485Mix_CloseAudio ()
486
487int
488Mix_AllocateChannels (int numchans = -1)
410 489
411void 490void
412lowdelay (int fd, int val = 1) 491lowdelay (int fd, int val = 1)
413 CODE: 492 CODE:
414#ifndef _WIN32 493#ifndef _WIN32
869 cell->darkness = -1; 948 cell->darkness = -1;
870 } 949 }
871} 950}
872 951
873SV * 952SV *
874mapmap (CFClient::Map self, int w, int h) 953mapmap (CFClient::Map self, int x0, int y0, int w, int h)
875 CODE: 954 CODE:
876{ 955{
877 int x0, x1, x; 956 int x1, x;
878 int y0, y1, y; 957 int y1, y;
879 int z; 958 int z;
880 SV *map_sv = newSV (w * h * sizeof (uint32_t)); 959 SV *map_sv = newSV (w * h * sizeof (uint32_t));
881 uint32_t *map = (uint32_t *)SvPVX (map_sv); 960 uint32_t *map = (uint32_t *)SvPVX (map_sv);
882 961
883 SvPOK_only (map_sv); 962 SvPOK_only (map_sv);
884 SvCUR_set (map_sv, w * h * sizeof (uint32_t)); 963 SvCUR_set (map_sv, w * h * sizeof (uint32_t));
885 964
886 x0 = self->x - w / 2; x1 = x0 + w; 965 x0 += self->x; x1 = x0 + w;
887 y0 = self->y - h / 2; y1 = y0 + h; 966 y0 += self->y; y1 = y0 + h;
888 967
889 for (y = y0; y < y1; y++) 968 for (y = y0; y < y1; y++)
890 { 969 {
891 maprow *row = 0 <= y && y < self->rows 970 maprow *row = 0 <= y && y < self->rows
892 ? self->row + y 971 ? self->row + y
1032 *data++ = 0; /* version 0 format */ 1111 *data++ = 0; /* version 0 format */
1033 *data++ = w >> 8; *data++ = w; 1112 *data++ = w >> 8; *data++ = w;
1034 *data++ = h >> 8; *data++ = h; 1113 *data++ = h >> 8; *data++ = h;
1035 1114
1036 // we need to do this 'cause we don't keep an absolute coord system for rows 1115 // we need to do this 'cause we don't keep an absolute coord system for rows
1037 // TODO: treat rows as we treat 1116 // TODO: treat rows as we treat columns
1038 map_get_row (self, y0 + self->y - self->oy);//D 1117 map_get_row (self, y0 + self->y - self->oy);//D
1039 map_get_row (self, y0 + self->y - self->oy + h - 1);//D 1118 map_get_row (self, y0 + self->y - self->oy + h - 1);//D
1040 1119
1041 x0 += self->x - self->ox; 1120 x0 += self->x - self->ox;
1042 y0 += self->y - self->oy; 1121 y0 += self->y - self->oy;
1106 1185
1107 w = *data++ << 8; w |= *data++; 1186 w = *data++ << 8; w |= *data++;
1108 h = *data++ << 8; h |= *data++; 1187 h = *data++ << 8; h |= *data++;
1109 1188
1110 // we need to do this 'cause we don't keep an absolute coord system for rows 1189 // we need to do this 'cause we don't keep an absolute coord system for rows
1111 // TODO: treat rows as we treat 1190 // TODO: treat rows as we treat columns
1112 map_get_row (self, y0 + self->y - self->oy);//D 1191 map_get_row (self, y0 + self->y - self->oy);//D
1113 map_get_row (self, y0 + self->y - self->oy + h - 1);//D 1192 map_get_row (self, y0 + self->y - self->oy + h - 1);//D
1114 1193
1115 x0 += self->x - self->ox; 1194 x0 += self->x - self->ox;
1116 y0 += self->y - self->oy; 1195 y0 += self->y - self->oy;
1151 } 1230 }
1152 } 1231 }
1153 } 1232 }
1154} 1233}
1155 1234
1235MODULE = CFClient PACKAGE = CFClient::MixChunk
1236
1237CFClient::MixChunk
1238new_from_file (SV *class, char *path)
1239 CODE:
1240 RETVAL = Mix_LoadWAV (path);
1241 OUTPUT:
1242 RETVAL
1243
1244void
1245DESTROY (CFClient::MixChunk self)
1246 CODE:
1247 Mix_FreeChunk (self);
1248
1249int
1250volume (CFClient::MixChunk self, int volume = -1)
1251 CODE:
1252 RETVAL = Mix_VolumeChunk (self, volume);
1253 OUTPUT:
1254 RETVAL
1255
1256int
1257play (CFClient::MixChunk self, int channel = -1, int loops = 0, int ticks = -1)
1258 CODE:
1259 RETVAL = Mix_PlayChannelTimed (channel, self, loops, ticks);
1260 OUTPUT:
1261 RETVAL
1262
1263MODULE = CFClient PACKAGE = CFClient::MixMusic
1264
1265int
1266volume (int volume = -1)
1267 CODE:
1268 RETVAL = Mix_VolumeMusic (volume);
1269 OUTPUT:
1270 RETVAL
1271
1272CFClient::MixMusic
1273new_from_file (SV *class, char *path)
1274 CODE:
1275 RETVAL = Mix_LoadMUS (path);
1276 OUTPUT:
1277 RETVAL
1278
1279void
1280DESTROY (CFClient::MixMusic self)
1281 CODE:
1282 Mix_FreeMusic (self);
1283
1284int
1285play (CFClient::MixMusic self, int loops = -1)
1286 CODE:
1287 RETVAL = Mix_PlayMusic (self, loops);
1288 OUTPUT:
1289 RETVAL
1290
1291MODULE = CFClient PACKAGE = CFClient::OpenGL
1292
1293BOOT:
1294{
1295 HV *stash = gv_stashpv ("CFClient::OpenGL", 1);
1296 static const struct {
1297 const char *name;
1298 IV iv;
1299 } *civ, const_iv[] = {
1300# define const_iv(name) { # name, (IV)name }
1301 const_iv (GL_COLOR_MATERIAL),
1302 const_iv (GL_SMOOTH),
1303 const_iv (GL_FLAT),
1304 const_iv (GL_BLEND),
1305 const_iv (GL_AND),
1306 const_iv (GL_SRC_ALPHA),
1307 const_iv (GL_ONE_MINUS_SRC_ALPHA),
1308 const_iv (GL_RGB),
1309 const_iv (GL_RGBA),
1310 const_iv (GL_UNSIGNED_BYTE),
1311 const_iv (GL_ALPHA4),
1312 const_iv (GL_ALPHA),
1313 const_iv (GL_FLOAT),
1314 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV),
1315 const_iv (GL_COMPILE),
1316 const_iv (GL_TEXTURE_1D),
1317 const_iv (GL_TEXTURE_2D),
1318 const_iv (GL_TEXTURE_ENV),
1319 const_iv (GL_TEXTURE_MAG_FILTER),
1320 const_iv (GL_TEXTURE_MIN_FILTER),
1321 const_iv (GL_TEXTURE_ENV_MODE),
1322 const_iv (GL_TEXTURE_WRAP_S),
1323 const_iv (GL_TEXTURE_WRAP_T),
1324 const_iv (GL_CLAMP),
1325 const_iv (GL_REPEAT),
1326 const_iv (GL_NEAREST),
1327 const_iv (GL_LINEAR),
1328 const_iv (GL_MODULATE),
1329 const_iv (GL_REPLACE),
1330 const_iv (GL_COLOR_BUFFER_BIT),
1331 const_iv (GL_PROJECTION),
1332 const_iv (GL_MODELVIEW),
1333 const_iv (GL_COLOR_LOGIC_OP),
1334 const_iv (GL_CONVOLUTION_2D),
1335 const_iv (GL_CONVOLUTION_BORDER_MODE),
1336 const_iv (GL_CONSTANT_BORDER),
1337 const_iv (GL_LINES),
1338 const_iv (GL_QUADS),
1339 const_iv (GL_LINE_LOOP),
1340 const_iv (GL_PERSPECTIVE_CORRECTION_HINT),
1341 const_iv (GL_FASTEST),
1342# undef const_iv
1343 };
1344
1345 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; )
1346 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv));
1347}
1348
1349int glGetError ()
1350
1351void glClear (int mask)
1352
1353void glClearColor (float r, float g, float b, float a = 1.0)
1354 PROTOTYPE: @
1355
1356void glEnable (int cap)
1357
1358void glDisable (int cap)
1359
1360void glShadeModel (int mode)
1361
1362void glHint (int target, int mode)
1363
1364void glBlendFunc (int sfactor, int dfactor)
1365
1366void glLogicOp (int opcode)
1367
1368void glMatrixMode (int mode)
1369
1370void glPushMatrix ()
1371
1372void glPopMatrix ()
1373
1374void glLoadIdentity ()
1375
1376void glOrtho (double left, double right, double bottom, double top, double near, double far)
1377
1378void glViewport (int x, int y, int width, int height)
1379
1380void glTranslate (float x, float y, float z = 0.)
1381 CODE:
1382 glTranslatef (x, y, z);
1383
1384void glScale (float x, float y, float z)
1385 CODE:
1386 glScalef (x, y, z);
1387
1388void glRotate (float angle, float x, float y, float z)
1389 CODE:
1390 glRotatef (angle, x, y, z);
1391
1392void glBegin (int mode)
1393
1394void glEnd ()
1395
1396void glColor (float r, float g, float b, float a = 1.0)
1397 PROTOTYPE: @
1398 CODE:
1399 glColor4f (r, g, b, a);
1400
1401void glVertex (float x, float y, float z = 0.)
1402 CODE:
1403 glVertex3f (x, y, z);
1404
1405void glTexCoord (float s, float t)
1406 CODE:
1407 glTexCoord2f (s, t);
1408
1409void glTexEnv (int target, int pname, float param)
1410 CODE:
1411 glTexEnvf (target, pname, param);
1412
1413void glTexParameter (int target, int pname, float param)
1414 CODE:
1415 glTexParameterf (target, pname, param);
1416
1417void glBindTexture (int target, int name)
1418
1419void glConvolutionParameter (int target, int pname, float params)
1420 CODE:
1421 glConvolutionParameterf (target, pname, params);
1422
1423void glConvolutionFilter2D (int target, int internalformat, int width, int height, int format, int type, char *data)
1424
1425void glTexImage2D (int target, int level, int internalformat, int width, int height, int border, int format, int type, char *data)
1426
1427void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border)
1428
1429int glGenTexture ()
1430 CODE:
1431{
1432 GLuint name;
1433 glGenTextures (1, &name);
1434 RETVAL = name;
1435}
1436 OUTPUT:
1437 RETVAL
1438
1439void glDeleteTexture (int name)
1440 CODE:
1441{
1442 GLuint name_ = name;
1443 glDeleteTextures (1, &name_);
1444}
1445
1446int glGenList ()
1447 CODE:
1448 RETVAL = glGenLists (1);
1449 OUTPUT:
1450 RETVAL
1451
1452void glDeleteList (int list)
1453 CODE:
1454 glDeleteLists (list, 1);
1455
1456void glNewList (int list, int mode = GL_COMPILE)
1457
1458void glEndList ()
1459
1460void glCallList (int list)
1461

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines