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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines