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.293 by root, Thu Dec 17 02:49:38 2009 UTC vs.
Revision 1.296 by root, Mon Dec 21 23:52:34 2009 UTC

19 19
20#ifdef _WIN32 20#ifdef _WIN32
21# undef pipe 21# undef pipe
22// microsoft vs. C 22// microsoft vs. C
23# define sqrtf(x) sqrt(x) 23# define sqrtf(x) sqrt(x)
24# define roundf(x) (int)(x)
25# define atan2f(x,y) atan2(x,y) 24# define atan2f(x,y) atan2(x,y)
26# define M_PI 3.14159265f 25# define M_PI 3.14159265f
27#endif 26#endif
28 27
29#include <assert.h> 28#include <assert.h>
81#define expect_false(expr) expect ((expr) != 0, 0) 80#define expect_false(expr) expect ((expr) != 0, 0)
82#define expect_true(expr) expect ((expr) != 0, 1) 81#define expect_true(expr) expect ((expr) != 0, 1)
83 82
84#define OBJ_STR "\xef\xbf\xbc" /* U+FFFC, object replacement character */ 83#define OBJ_STR "\xef\xbf\xbc" /* U+FFFC, object replacement character */
85 84
85/* this is used as fow flag as well, so has to have a different value */
86/* then anything that is computed by incoming darkness */
86#define FOW_DARKNESS 64 87#define FOW_DARKNESS 50
88#define DARKNESS_ADJUST(n) (n)
87 89
88#define MAP_EXTEND_X 32 90#define MAP_EXTEND_X 32
89#define MAP_EXTEND_Y 512 91#define MAP_EXTEND_Y 512
90 92
91#define MIN_FONT_HEIGHT 10 93#define MIN_FONT_HEIGHT 10
821 823
822IV minpot (UV n) 824IV minpot (UV n)
823 825
824IV popcount (UV n) 826IV popcount (UV n)
825 827
828NV distance (NV dx, NV dy)
829 CODE:
830 RETVAL = pow (dx * dx + dy * dy, 0.5);
831 OUTPUT:
832 RETVAL
833
826void 834void
827pango_init () 835pango_init ()
828 CODE: 836 CODE:
829{ 837{
830 opengl_fontmap = pango_opengl_font_map_new (); 838 opengl_fontmap = pango_opengl_font_map_new ();
1659 glDisable (GL_BLEND); 1667 glDisable (GL_BLEND);
1660 } 1668 }
1661} 1669}
1662 1670
1663void 1671void
1664draw_fow_texture (float intensity, int name1, float s1, float t1, float w1, float h1) 1672draw_fow_texture (float intensity, int hidden_tex, int name1, uint8_t *data1, float s, float t, int w, int h, float blend = 0.f, int dx = 0, int dy = 0, int name2 = 0, uint8_t *data2 = data1)
1665 PROTOTYPE: @ 1673 PROTOTYPE: @
1666 CODE: 1674 CODE:
1667{ 1675{
1668 glEnable (GL_TEXTURE_2D); 1676 glEnable (GL_TEXTURE_2D);
1669 glEnable (GL_BLEND); 1677 glEnable (GL_BLEND);
1670 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
1671 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 1678 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1679 glBindTexture (GL_TEXTURE_2D, name1);
1672 1680
1673 glColor4f (intensity, intensity, intensity, 0.9); 1681 glColor3f (intensity, intensity, intensity);
1674 glPushMatrix (); 1682 glPushMatrix ();
1675 glScalef (1./3, 1./3, 1.); 1683 glScalef (1./3, 1./3, 1.);
1676 1684
1685 if (blend > 0.f)
1686 {
1687 float dx3 = dx * -3.f / w;
1688 float dy3 = dy * -3.f / h;
1689 GLfloat env_color[4] = { 0., 0., 0., blend };
1690
1691 /* interpolate the two shadow textures */
1692 /* stage 0 == rgb(glcolor) + alpha(t0) */
1693 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1694
1695 /* stage 1 == rgb(glcolor) + alpha(interpolate t0, t1, texenv) */
1696 gl.ActiveTexture (GL_TEXTURE1);
1697 glEnable (GL_TEXTURE_2D);
1677 glBindTexture (GL_TEXTURE_2D, name1); 1698 glBindTexture (GL_TEXTURE_2D, name2);
1699 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
1678 1700
1701 /* rgb == rgb(glcolor) */
1702 glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
1703 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_CONSTANT);
1704 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
1705
1706 /* alpha = interpolate t0, t1 by env_alpha */
1707 glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, env_color);
1708
1709 glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_INTERPOLATE);
1710 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE);
1711 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
1712
1713 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_PREVIOUS);
1714 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
1715
1716 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE2_ALPHA, GL_CONSTANT);
1717 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, GL_SRC_ALPHA);
1718
1719 glBegin (GL_QUADS);
1720 gl.MultiTexCoord2f (GL_TEXTURE0, 0, 0); gl.MultiTexCoord2f (GL_TEXTURE1, dx3 , dy3 ); glVertex2i (0, 0);
1721 gl.MultiTexCoord2f (GL_TEXTURE0, 0, t); gl.MultiTexCoord2f (GL_TEXTURE1, dx3 , dy3 + t); glVertex2i (0, h);
1722 gl.MultiTexCoord2f (GL_TEXTURE0, s, t); gl.MultiTexCoord2f (GL_TEXTURE1, dx3 + s, dy3 + t); glVertex2i (w, h);
1723 gl.MultiTexCoord2f (GL_TEXTURE0, s, 0); gl.MultiTexCoord2f (GL_TEXTURE1, dx3 + s, dy3 ); glVertex2i (w, 0);
1724 glEnd ();
1725
1726 glDisable (GL_TEXTURE_2D);
1727 gl.ActiveTexture (GL_TEXTURE0);
1728 }
1729 else
1730 {
1731 /* simple blending of one texture, also opengl <1.3 path */
1732 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1733
1734 glBegin (GL_QUADS);
1735 glTexCoord2f (0, 0); glVertex2f (0, 0);
1736 glTexCoord2f (0, t); glVertex2f (0, h);
1737 glTexCoord2f (s, t); glVertex2f (w, h);
1738 glTexCoord2f (s, 0); glVertex2f (w, 0);
1739 glEnd ();
1740 }
1741
1742 /* draw ?-marks or equivalent, this is very clumsy code :/ */
1743 {
1744 int x, y;
1745 int dx3 = dx * 3;
1746 int dy3 = dy * 3;
1747
1748 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
1749 glBindTexture (GL_TEXTURE_2D, hidden_tex);
1750 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1751 glTranslatef (-1., -1., 0);
1679 glBegin (GL_QUADS); 1752 glBegin (GL_QUADS);
1680 glTexCoord2f ( 0, 0); glVertex2f ( 0, 0); 1753
1681 glTexCoord2f ( 0, t1); glVertex2f ( 0, h1); 1754 for (y = 1; y < h; y += 3)
1682 glTexCoord2f (s1, t1); glVertex2f (w1, h1); 1755 {
1683 glTexCoord2f (s1, 0); glVertex2f (w1, 0); 1756 int y1 = y - dy3;
1757 int y1valid = y1 >= 0 && y1 < h;
1758
1759 for (x = 1; x < w; x += 3)
1760 {
1761 int x1 = x - dx3;
1762 uint8_t h1 = data1 [x + y * w] == DARKNESS_ADJUST (255 - FOW_DARKNESS);
1763 uint8_t h2;
1764
1765 if (y1valid && x1 >= 0 && x1 < w)
1766 h2 = data2 [x1 + y1 * w] == DARKNESS_ADJUST (255 - FOW_DARKNESS);
1767 else
1768 h2 = 1; /* out of range == invisible */
1769
1770 if (h1 || h2)
1771 {
1772 float alpha = h1 == h2 ? 1.f : h1 ? 1.f - blend : blend;
1773 glColor4f (1., 1., 1., alpha);
1774
1775 glTexCoord2f (0, 0.); glVertex2i (x , y );
1776 glTexCoord2f (0, 1.); glVertex2i (x , y + 3);
1777 glTexCoord2f (1, 1.); glVertex2i (x + 3, y + 3);
1778 glTexCoord2f (1, 0.); glVertex2i (x + 3, y );
1779 }
1780 }
1781 }
1782 }
1783
1684 glEnd (); 1784 glEnd ();
1685 1785
1686 glPopMatrix (); 1786 glPopMatrix ();
1687 1787
1688 glDisable (GL_TEXTURE_2D); 1788 glDisable (GL_TEXTURE_2D);
1910 { 2010 {
1911 ext = *data++; 2011 ext = *data++;
1912 cmd = ext & 0x7f; 2012 cmd = ext & 0x7f;
1913 2013
1914 if (cmd < 4) 2014 if (cmd < 4)
1915 cell->darkness = 255 - ext * 64 + 1; 2015 cell->darkness = 255 - ext * 64 + 1; /* make sure this doesn't collide with FOW_DARKNESS */
1916 else if (cmd == 5) // health 2016 else if (cmd == 5) // health
1917 { 2017 {
1918 cell->stat_width = 1; 2018 cell->stat_width = 1;
1919 cell->stat_hp = *data++; 2019 cell->stat_hp = *data++;
1920 } 2020 }
2180 skey.x = x ; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0400); 2280 skey.x = x ; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0400);
2181 skey.x = x + 2; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0800); 2281 skey.x = x + 2; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0800);
2182 } 2282 }
2183 } 2283 }
2184 2284
2185 if (expect_false (z == 2)) 2285 if (expect_false (z == 2) && expect_false (cell->flags))
2186 { 2286 {
2187 /* draw question marks on top of hidden spaces */ 2287 // overlays such as the speech bubble, probably more to come
2188 if (!cell->darkness) 2288 if (cell->flags & 1)
2189 { 2289 {
2190 maptex tex = self->tex [TEXID_HIDDEN];
2191 int px = (x + 1) * T - tex.w;
2192 int py = (y + 1) * T - tex.h;
2193
2194 rc_t2f_v3f (arr_hidden, 0 , 0 , px , py , 0);
2195 rc_t2f_v3f (arr_hidden, 0 , tex.t, px , py + tex.h, 0);
2196 rc_t2f_v3f (arr_hidden, tex.s, tex.t, px + tex.w, py + tex.h, 0);
2197 rc_t2f_v3f (arr_hidden, tex.s, 0 , px + tex.w, py , 0);
2198 }
2199
2200 if (expect_false (cell->flags))
2201 {
2202 // overlays such as the speech bubble, probably more to come
2203 if (cell->flags & 1)
2204 {
2205 rc_key_t key_ov = key; 2290 rc_key_t key_ov = key;
2206 maptex tex = self->tex [TEXID_SPEECH]; 2291 maptex tex = self->tex [TEXID_SPEECH];
2207 rc_array_t *arr; 2292 rc_array_t *arr;
2208 int px = x * T + T * 2 / 32; 2293 int px = x * T + T * 2 / 32;
2209 int py = y * T - T * 6 / 32; 2294 int py = y * T - T * 6 / 32;
2210 2295
2211 key_ov.texname = tex.name; 2296 key_ov.texname = tex.name;
2212 arr = rc_array (rc_ov, &key_ov); 2297 arr = rc_array (rc_ov, &key_ov);
2213 2298
2214 rc_t2f_v3f (arr, 0 , 0 , px , py , 0); 2299 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
2215 rc_t2f_v3f (arr, 0 , tex.t, px , py + T, 0); 2300 rc_t2f_v3f (arr, 0 , tex.t, px , py + T, 0);
2216 rc_t2f_v3f (arr, tex.s, tex.t, px + T, py + T, 0); 2301 rc_t2f_v3f (arr, tex.s, tex.t, px + T, py + T, 0);
2217 rc_t2f_v3f (arr, tex.s, 0 , px + T, py , 0); 2302 rc_t2f_v3f (arr, tex.s, 0 , px + T, py , 0);
2218 }
2219 } 2303 }
2220 } 2304 }
2221 } 2305 }
2222 } 2306 }
2223 2307
2366 } 2450 }
2367 } 2451 }
2368} 2452}
2369 2453
2370void 2454void
2371draw_magicmap (DC::Map self, int dx, int dy, int w, int h, unsigned char *data) 2455draw_magicmap (DC::Map self, int w, int h, unsigned char *data)
2372 CODE: 2456 CODE:
2373{ 2457{
2374 static float color[16][3] = { 2458 static float color[16][3] = {
2375 { 0.00F, 0.00F, 0.00F }, 2459 { 0.00f, 0.00f, 0.00f },
2376 { 1.00F, 1.00F, 1.00F }, 2460 { 1.00f, 1.00f, 1.00f },
2377 { 0.00F, 0.00F, 0.55F }, 2461 { 0.00f, 0.00f, 0.55f },
2378 { 1.00F, 0.00F, 0.00F }, 2462 { 1.00f, 0.00f, 0.00f },
2379 2463
2380 { 1.00F, 0.54F, 0.00F }, 2464 { 1.00f, 0.54f, 0.00f },
2381 { 0.11F, 0.56F, 1.00F }, 2465 { 0.11f, 0.56f, 1.00f },
2382 { 0.93F, 0.46F, 0.00F }, 2466 { 0.93f, 0.46f, 0.00f },
2383 { 0.18F, 0.54F, 0.34F }, 2467 { 0.18f, 0.54f, 0.34f },
2384 2468
2385 { 0.56F, 0.73F, 0.56F }, 2469 { 0.56f, 0.73f, 0.56f },
2386 { 0.80F, 0.80F, 0.80F }, 2470 { 0.80f, 0.80f, 0.80f },
2387 { 0.55F, 0.41F, 0.13F }, 2471 { 0.55f, 0.41f, 0.13f },
2388 { 0.99F, 0.77F, 0.26F }, 2472 { 0.99f, 0.77f, 0.26f },
2389 2473
2390 { 0.74F, 0.65F, 0.41F }, 2474 { 0.74f, 0.65f, 0.41f },
2391 2475
2392 { 0.00F, 1.00F, 1.00F }, 2476 { 0.00f, 1.00f, 1.00f },
2393 { 1.00F, 0.00F, 1.00F }, 2477 { 1.00f, 0.00f, 1.00f },
2394 { 1.00F, 1.00F, 0.00F }, 2478 { 1.00f, 1.00f, 0.00f },
2395 }; 2479 };
2396 2480
2397 int x, y; 2481 int x, y;
2398 2482
2399 glEnable (GL_TEXTURE_2D); 2483 glEnable (GL_TEXTURE_2D);
2400 /* GL_REPLACE would be correct, as we don't need to modulate alpha, 2484 /* GL_REPLACE would be correct, as we don't need to modulate alpha,
2401 * but the nvidia driver (185.18.14) mishandles alpha textures 2485 * but the nvidia driver (185.18.14) mishandles alpha textures
2402 * ansd takes the colour from god knows where instead of using 2486 * and takes the colour from god knows where instead of using
2403 * Cp. MODULATE results in the same colour, but slightly different 2487 * Cp. MODULATE results in the same colour, but slightly different
2404 * alpha, but atcually gives us the correct colour with nvidia. 2488 * alpha, but atcually gives us the correct colour with nvidia.
2405 */ 2489 */
2406 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 2490 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
2407 glEnable (GL_BLEND); 2491 glEnable (GL_BLEND);
2415 2499
2416 if (m) 2500 if (m)
2417 { 2501 {
2418 float *c = color [m & 15]; 2502 float *c = color [m & 15];
2419 2503
2420 float tx1 = m & 0x40 ? 0.5 : 0.; 2504 float tx1 = m & 0x40 ? 0.5f : 0.f;
2421 float tx2 = tx1 + 0.5; 2505 float tx2 = tx1 + 0.5f;
2422 2506
2423 glColor4f (c[0], c[1], c[2], 1); 2507 glColor4f (c[0], c[1], c[2], 1);
2424 glTexCoord2f (tx1, 0.); glVertex2i (x , y ); 2508 glTexCoord2f (tx1, 0.); glVertex2i (x , y );
2425 glTexCoord2f (tx1, 1.); glVertex2i (x , y + 1); 2509 glTexCoord2f (tx1, 1.); glVertex2i (x , y + 1);
2426 glTexCoord2f (tx2, 1.); glVertex2i (x + 1, y + 1); 2510 glTexCoord2f (tx2, 1.); glVertex2i (x + 1, y + 1);
2436void 2520void
2437fow_texture (DC::Map self, int mx, int my, int sw, int sh) 2521fow_texture (DC::Map self, int mx, int my, int sw, int sh)
2438 PPCODE: 2522 PPCODE:
2439{ 2523{
2440 int x, y; 2524 int x, y;
2441 int sw1 = sw + 2; 2525 int sw1 = sw + 2;
2442 int sh1 = sh + 2; 2526 int sh1 = sh + 2;
2443 int sh3 = sh * 3; 2527 int sh3 = sh * 3;
2444 int sw34 = (sw * 3 + 3) & ~3; 2528 int sw3 = sw * 3;
2445 uint8_t *darkness1 = (uint8_t *)malloc (sw1 * sh1); 2529 uint8_t *darkness1 = (uint8_t *)malloc (sw1 * sh1);
2446 SV *darkness3_sv = sv_2mortal (newSV (sw34 * sh3)); 2530 SV *darkness3_sv = sv_2mortal (newSV (sw3 * sh3));
2447 uint8_t *darkness3 = (uint8_t *)SvPVX (darkness3_sv); 2531 uint8_t *darkness3 = (uint8_t *)SvPVX (darkness3_sv);
2448 2532
2449 SvPOK_only (darkness3_sv); 2533 SvPOK_only (darkness3_sv);
2450 SvCUR_set (darkness3_sv, sw34 * sh3); 2534 SvCUR_set (darkness3_sv, sw3 * sh3);
2451 2535
2452 mx += self->x - 1; 2536 mx += self->x - 1;
2453 my += self->y - 1; 2537 my += self->y - 1;
2454
2455 memset (darkness1, 255 - FOW_DARKNESS, sw1 * sh1);
2456 2538
2457 for (y = 0; y < sh1; y++) 2539 for (y = 0; y < sh1; y++)
2458 if (0 <= y + my && y + my < self->rows) 2540 if (0 <= y + my && y + my < self->rows)
2459 { 2541 {
2460 maprow *row = self->row + (y + my); 2542 maprow *row = self->row + (y + my);
2463 if (row->c0 <= x + mx && x + mx < row->c1) 2545 if (row->c0 <= x + mx && x + mx < row->c1)
2464 { 2546 {
2465 mapcell *cell = row->col + (x + mx - row->c0); 2547 mapcell *cell = row->col + (x + mx - row->c0);
2466 2548
2467 darkness1 [y * sw1 + x] = cell->darkness 2549 darkness1 [y * sw1 + x] = cell->darkness
2468 ? 255 - (cell->darkness - 1) 2550 ? DARKNESS_ADJUST (255 - (cell->darkness - 1))
2469 : 255 - FOW_DARKNESS; 2551 : DARKNESS_ADJUST (255 - FOW_DARKNESS);
2470 } 2552 }
2471 } 2553 }
2472 2554
2473 for (y = 0; y < sh; ++y) 2555 for (y = 0; y < sh; ++y)
2474 for (x = 0; x < sw; ++x) 2556 for (x = 0; x < sw; ++x)
2493 2575
2494 uint8_t r13 = (d13 + d23 + d12) / 3; 2576 uint8_t r13 = (d13 + d23 + d12) / 3;
2495 uint8_t r23 = d23; 2577 uint8_t r23 = d23;
2496 uint8_t r33 = (d23 + d33 + d32) / 3; 2578 uint8_t r33 = (d23 + d33 + d32) / 3;
2497 2579
2498 darkness3 [(y * 3 ) * sw34 + (x * 3 )] = MAX (d22, r11); 2580 darkness3 [(y * 3 ) * sw3 + (x * 3 )] = MAX (d22, r11);
2499 darkness3 [(y * 3 ) * sw34 + (x * 3 + 1)] = MAX (d22, r21); 2581 darkness3 [(y * 3 ) * sw3 + (x * 3 + 1)] = MAX (d22, r21);
2500 darkness3 [(y * 3 ) * sw34 + (x * 3 + 2)] = MAX (d22, r31); 2582 darkness3 [(y * 3 ) * sw3 + (x * 3 + 2)] = MAX (d22, r31);
2501 darkness3 [(y * 3 + 1) * sw34 + (x * 3 )] = MAX (d22, r12); 2583 darkness3 [(y * 3 + 1) * sw3 + (x * 3 )] = MAX (d22, r12);
2502 darkness3 [(y * 3 + 1) * sw34 + (x * 3 + 1)] = MAX (d22, r22); 2584 darkness3 [(y * 3 + 1) * sw3 + (x * 3 + 1)] = MAX (d22, r22); /* this MUST be == d22 */
2503 darkness3 [(y * 3 + 1) * sw34 + (x * 3 + 2)] = MAX (d22, r32); 2585 darkness3 [(y * 3 + 1) * sw3 + (x * 3 + 2)] = MAX (d22, r32);
2504 darkness3 [(y * 3 + 2) * sw34 + (x * 3 )] = MAX (d22, r13); 2586 darkness3 [(y * 3 + 2) * sw3 + (x * 3 )] = MAX (d22, r13);
2505 darkness3 [(y * 3 + 2) * sw34 + (x * 3 + 1)] = MAX (d22, r23); 2587 darkness3 [(y * 3 + 2) * sw3 + (x * 3 + 1)] = MAX (d22, r23);
2506 darkness3 [(y * 3 + 2) * sw34 + (x * 3 + 2)] = MAX (d22, r33); 2588 darkness3 [(y * 3 + 2) * sw3 + (x * 3 + 2)] = MAX (d22, r33);
2507 } 2589 }
2508 2590
2509 free (darkness1); 2591 free (darkness1);
2510 2592
2511 EXTEND (SP, 3); 2593 EXTEND (SP, 3);
2512 PUSHs (sv_2mortal (newSViv (sw34))); 2594 PUSHs (sv_2mortal (newSViv (sw3)));
2513 PUSHs (sv_2mortal (newSViv (sh3))); 2595 PUSHs (sv_2mortal (newSViv (sh3)));
2514 PUSHs (darkness3_sv); 2596 PUSHs (darkness3_sv);
2515} 2597}
2516 2598
2517SV * 2599SV *
2774void 2856void
2775set_position_r (DC::Channel self, int dx, int dy, int maxdistance) 2857set_position_r (DC::Channel self, int dx, int dy, int maxdistance)
2776 CODE: 2858 CODE:
2777{ 2859{
2778 int distance = sqrtf (dx * dx + dy * dy) * (255.f / sqrtf (maxdistance * maxdistance)); 2860 int distance = sqrtf (dx * dx + dy * dy) * (255.f / sqrtf (maxdistance * maxdistance));
2779 int angle = 360 + (int)roundf (atan2f (dx, -dy) * 180.f / (float)M_PI); 2861 int angle = atan2f (dx, -dy) * 180.f / (float)M_PI + 360.f;
2780 Mix_SetPosition (self, angle, CLAMP (distance, 0, 255)); 2862 Mix_SetPosition (self, angle, CLAMP (distance, 0, 255));
2781} 2863}
2782 2864
2783void 2865void
2784set_reverse_stereo (DC::Channel self, int flip) 2866set_reverse_stereo (DC::Channel self, int flip)
3231 3313
3232void glEndList () 3314void glEndList ()
3233 3315
3234void glCallList (int list) 3316void glCallList (int list)
3235 3317
3318void c_init ()
3319 CODE:
3320 glPixelStorei (GL_PACK_ALIGNMENT , 1);
3321 glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
3322
3236MODULE = Deliantra::Client PACKAGE = DC::UI::Base 3323MODULE = Deliantra::Client PACKAGE = DC::UI::Base
3237 3324
3238PROTOTYPES: DISABLE 3325PROTOTYPES: DISABLE
3239 3326
3240void 3327void

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines