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.284 by elmex, Thu Dec 11 00:17:47 2008 UTC vs.
Revision 1.293 by root, Thu Dec 17 02:49:38 2009 UTC

81#define expect_false(expr) expect ((expr) != 0, 0) 81#define expect_false(expr) expect ((expr) != 0, 0)
82#define expect_true(expr) expect ((expr) != 0, 1) 82#define expect_true(expr) expect ((expr) != 0, 1)
83 83
84#define OBJ_STR "\xef\xbf\xbc" /* U+FFFC, object replacement character */ 84#define OBJ_STR "\xef\xbf\xbc" /* U+FFFC, object replacement character */
85 85
86#define FOW_DARKNESS 16 86#define FOW_DARKNESS 64
87 87
88#define MAP_EXTEND_X 32 88#define MAP_EXTEND_X 32
89#define MAP_EXTEND_Y 512 89#define MAP_EXTEND_Y 512
90 90
91#define MIN_FONT_HEIGHT 10 91#define MIN_FONT_HEIGHT 10
92 92
93/* mask out modifiers we are not interested in */ 93/* mask out modifiers we are not interested in */
94#define MOD_MASK (KMOD_CTRL | KMOD_SHIFT | KMOD_ALT | KMOD_META) 94#define MOD_MASK (KMOD_CTRL | KMOD_SHIFT | KMOD_ALT | KMOD_META)
95 95
96#define KMOD_LRAM 0x10000 // our extension 96#define KMOD_LRAM 0x10000 // our extension
97
98#define TEXID_SPEECH 1
99#define TEXID_NOFACE 2
100#define TEXID_HIDDEN 3
97 101
98static AV *texture_av; 102static AV *texture_av;
99 103
100static struct 104static struct
101{ 105{
1654 glDisable (GL_ALPHA_TEST); 1658 glDisable (GL_ALPHA_TEST);
1655 glDisable (GL_BLEND); 1659 glDisable (GL_BLEND);
1656 } 1660 }
1657} 1661}
1658 1662
1663void
1664draw_fow_texture (float intensity, int name1, float s1, float t1, float w1, float h1)
1665 PROTOTYPE: @
1666 CODE:
1667{
1668 glEnable (GL_TEXTURE_2D);
1669 glEnable (GL_BLEND);
1670 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
1671 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1672
1673 glColor4f (intensity, intensity, intensity, 0.9);
1674 glPushMatrix ();
1675 glScalef (1./3, 1./3, 1.);
1676
1677 glBindTexture (GL_TEXTURE_2D, name1);
1678
1679 glBegin (GL_QUADS);
1680 glTexCoord2f ( 0, 0); glVertex2f ( 0, 0);
1681 glTexCoord2f ( 0, t1); glVertex2f ( 0, h1);
1682 glTexCoord2f (s1, t1); glVertex2f (w1, h1);
1683 glTexCoord2f (s1, 0); glVertex2f (w1, 0);
1684 glEnd ();
1685
1686 glPopMatrix ();
1687
1688 glDisable (GL_TEXTURE_2D);
1689 glDisable (GL_BLEND);
1690}
1691
1659IV texture_valid_2d (GLint internalformat, GLsizei w, GLsizei h, GLenum format, GLenum type) 1692IV texture_valid_2d (GLint internalformat, GLsizei w, GLsizei h, GLenum format, GLenum type)
1660 CODE: 1693 CODE:
1661{ 1694{
1662 GLint width; 1695 GLint width;
1663 glTexImage2D (GL_PROXY_TEXTURE_2D, 0, internalformat, w, h, 0, format, type, 0); 1696 glTexImage2D (GL_PROXY_TEXTURE_2D, 0, internalformat, w, h, 0, format, type, 0);
2005 uint32_t smooth_level[256 / 32]; // one bit for every possible smooth level 2038 uint32_t smooth_level[256 / 32]; // one bit for every possible smooth level
2006 static uint8_t smooth_max[256][256]; // egad, fast and wasteful on memory (64k) 2039 static uint8_t smooth_max[256][256]; // egad, fast and wasteful on memory (64k)
2007 smooth_key skey; 2040 smooth_key skey;
2008 int pl_x, pl_y; 2041 int pl_x, pl_y;
2009 maptex pl_tex; 2042 maptex pl_tex;
2010 rc_t *rc = rc_alloc (); 2043 rc_t *rc = rc_alloc ();
2044 rc_t *rc_ov = rc_alloc ();
2011 rc_key_t key; 2045 rc_key_t key;
2012 rc_array_t *arr; 2046 rc_array_t *arr, *arr_hidden;
2013 2047
2014 pl_tex.name = 0; 2048 pl_tex.name = 0;
2015 2049
2016 // thats current max. sorry. 2050 // that's current max. sorry.
2017 if (sw > 255) sw = 255; 2051 if (sw > 255) sw = 255;
2018 if (sh > 255) sh = 255; 2052 if (sh > 255) sh = 255;
2019 2053
2020 // clear key, in case of extra padding 2054 // clear key, in case of extra padding
2021 memset (&skey, 0, sizeof (skey)); 2055 memset (&skey, 0, sizeof (skey));
2054 } 2088 }
2055 2089
2056 glEnable (GL_BLEND); 2090 glEnable (GL_BLEND);
2057 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 2091 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
2058 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 2092 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);
2059 2096
2060 for (z = 0; z <= 2; z++) 2097 for (z = 0; z <= 2; z++)
2061 { 2098 {
2062 memset (smooth_level, 0, sizeof (smooth_level)); 2099 memset (smooth_level, 0, sizeof (smooth_level));
2063 key.texname = -1; 2100 key.texname = -1;
2074 tileid tile = cell->tile [z]; 2111 tileid tile = cell->tile [z];
2075 2112
2076 if (tile) 2113 if (tile)
2077 { 2114 {
2078 maptex tex = self->tex [tile]; 2115 maptex tex = self->tex [tile];
2079 int px = (x + 1) * T - tex.w; 2116 int px, py;
2080 int py = (y + 1) * T - tex.h;
2081 2117
2082 if (key.texname != tex.name) 2118 if (key.texname != tex.name)
2083 { 2119 {
2084 self->tex [tile].unused = 0; 2120 self->tex [tile].unused = 0;
2085 2121
2086 if (!tex.name) 2122 if (!tex.name)
2087 tex = self->tex [2]; /* missing, replace by noface */ 2123 tex = self->tex [TEXID_NOFACE]; /* missing, replace by noface */
2088 2124
2089 key.texname = tex.name; 2125 key.texname = tex.name;
2090 arr = rc_array (rc, &key); 2126 arr = rc_array (rc, &key);
2091 } 2127 }
2128
2129 px = (x + 1) * T - tex.w;
2130 py = (y + 1) * T - tex.h;
2092 2131
2093 if (expect_false (cell->player == player) && expect_false (z == 2)) 2132 if (expect_false (cell->player == player) && expect_false (z == 2))
2094 { 2133 {
2095 pl_x = px; 2134 pl_x = px;
2096 pl_y = py; 2135 pl_y = py;
2101 rc_t2f_v3f (arr, 0 , 0 , px , py , 0); 2140 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
2102 rc_t2f_v3f (arr, 0 , tex.t, px , py + tex.h, 0); 2141 rc_t2f_v3f (arr, 0 , tex.t, px , py + tex.h, 0);
2103 rc_t2f_v3f (arr, tex.s, tex.t, px + tex.w, py + tex.h, 0); 2142 rc_t2f_v3f (arr, tex.s, tex.t, px + tex.w, py + tex.h, 0);
2104 rc_t2f_v3f (arr, tex.s, 0 , px + tex.w, py , 0); 2143 rc_t2f_v3f (arr, tex.s, 0 , px + tex.w, py , 0);
2105 2144
2106 if (expect_false (cell->flags) && expect_false (z == 2))
2107 {
2108 /* this is a workaround to make speech bubbles drawn
2109 * for example above walls, work. */
2110 rc_draw (rc);
2111 rc_clear (rc);
2112 key.texname = -1;
2113
2114 // overlays such as the speech bubble, probably more to come
2115 if (cell->flags & 1)
2116 {
2117 maptex tex = self->tex [1];
2118 int px = x * T + T * 2 / 32;
2119 int py = y * T - T * 6 / 32;
2120
2121 if (tex.name)
2122 {
2123 if (key.texname != tex.name)
2124 {
2125 key.texname = tex.name;
2126 arr = rc_array (rc, &key);
2127 }
2128
2129 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
2130 rc_t2f_v3f (arr, 0 , tex.t, px , py + T, 0);
2131 rc_t2f_v3f (arr, tex.s, tex.t, px + T, py + T, 0);
2132 rc_t2f_v3f (arr, tex.s, 0 , px + T, py , 0);
2133 }
2134 }
2135 }
2136
2137 // update smooth hash 2145 // update smooth hash
2138 if (tex.smoothtile) 2146 if (tex.smoothtile)
2139 { 2147 {
2140 skey.tile = tex.smoothtile; 2148 skey.tile = tex.smoothtile;
2141 skey.level = tex.smoothlevel; 2149 skey.level = tex.smoothlevel;
2169 // corners 2177 // corners
2170 skey.x = x + 2; skey.y = y + 2; smooth_or_bits (smooth, &skey, 0x0100); 2178 skey.x = x + 2; skey.y = y + 2; smooth_or_bits (smooth, &skey, 0x0100);
2171 skey.x = x ; skey.y = y + 2; smooth_or_bits (smooth, &skey, 0x0200); 2179 skey.x = x ; skey.y = y + 2; smooth_or_bits (smooth, &skey, 0x0200);
2172 skey.x = x ; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0400); 2180 skey.x = x ; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0400);
2173 skey.x = x + 2; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0800); 2181 skey.x = x + 2; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0800);
2182 }
2183 }
2184
2185 if (expect_false (z == 2))
2186 {
2187 /* draw question marks on top of hidden spaces */
2188 if (!cell->darkness)
2189 {
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;
2206 maptex tex = self->tex [TEXID_SPEECH];
2207 rc_array_t *arr;
2208 int px = x * T + T * 2 / 32;
2209 int py = y * T - T * 6 / 32;
2210
2211 key_ov.texname = tex.name;
2212 arr = rc_array (rc_ov, &key_ov);
2213
2214 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
2215 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);
2217 rc_t2f_v3f (arr, tex.s, 0 , px + T, py , 0);
2218 }
2174 } 2219 }
2175 } 2220 }
2176 } 2221 }
2177 } 2222 }
2178 2223
2275 rc_t2f_v3f (arr, tex.s, 0 , px + tex.w, py , 0); 2320 rc_t2f_v3f (arr, tex.s, 0 , px + tex.w, py , 0);
2276 2321
2277 rc_draw (rc); 2322 rc_draw (rc);
2278 } 2323 }
2279 2324
2325 rc_draw (rc_ov);
2326 rc_clear (rc_ov);
2327
2280 glDisable (GL_BLEND); 2328 glDisable (GL_BLEND);
2281 rc_free (rc); 2329 rc_free (rc);
2330 rc_free (rc_ov);
2282 2331
2283 // top layer: overlays such as the health bar 2332 // top layer: overlays such as the health bar
2284 for (y = 0; y < sh; y++) 2333 for (y = 0; y < sh; y++)
2285 if (0 <= y + my && y + my < self->rows) 2334 if (0 <= y + my && y + my < self->rows)
2286 { 2335 {
2346 }; 2395 };
2347 2396
2348 int x, y; 2397 int x, y;
2349 2398
2350 glEnable (GL_TEXTURE_2D); 2399 glEnable (GL_TEXTURE_2D);
2400 /* GL_REPLACE would be correct, as we don't need to modulate alpha,
2401 * but the nvidia driver (185.18.14) mishandles alpha textures
2402 * ansd takes the colour from god knows where instead of using
2403 * Cp. MODULATE results in the same colour, but slightly different
2404 * alpha, but atcually gives us the correct colour with nvidia.
2405 */
2351 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 2406 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
2352 glEnable (GL_BLEND); 2407 glEnable (GL_BLEND);
2353 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 2408 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
2354 glBegin (GL_QUADS); 2409 glBegin (GL_QUADS);
2355 2410
2356 for (y = 0; y < h; y++) 2411 for (y = 0; y < h; y++)
2363 float *c = color [m & 15]; 2418 float *c = color [m & 15];
2364 2419
2365 float tx1 = m & 0x40 ? 0.5 : 0.; 2420 float tx1 = m & 0x40 ? 0.5 : 0.;
2366 float tx2 = tx1 + 0.5; 2421 float tx2 = tx1 + 0.5;
2367 2422
2368 glColor4f (c[0], c[1], c[2], 0.75); 2423 glColor4f (c[0], c[1], c[2], 1);
2369 glTexCoord2f (tx1, 0.); glVertex2i (x , y ); 2424 glTexCoord2f (tx1, 0.); glVertex2i (x , y );
2370 glTexCoord2f (tx1, 1.); glVertex2i (x , y + 1); 2425 glTexCoord2f (tx1, 1.); glVertex2i (x , y + 1);
2371 glTexCoord2f (tx2, 1.); glVertex2i (x + 1, y + 1); 2426 glTexCoord2f (tx2, 1.); glVertex2i (x + 1, y + 1);
2372 glTexCoord2f (tx2, 0.); glVertex2i (x + 1, y ); 2427 glTexCoord2f (tx2, 0.); glVertex2i (x + 1, y );
2373 } 2428 }
2832 } *civ, const_iv[] = { 2887 } *civ, const_iv[] = {
2833# define const_iv(name) { # name, (IV)name } 2888# define const_iv(name) { # name, (IV)name }
2834 const_iv (GL_VENDOR), 2889 const_iv (GL_VENDOR),
2835 const_iv (GL_VERSION), 2890 const_iv (GL_VERSION),
2836 const_iv (GL_EXTENSIONS), 2891 const_iv (GL_EXTENSIONS),
2892 const_iv (GL_MAX_TEXTURE_UNITS),
2837 const_iv (GL_COLOR_MATERIAL), 2893 const_iv (GL_COLOR_MATERIAL),
2838 const_iv (GL_SMOOTH), 2894 const_iv (GL_SMOOTH),
2839 const_iv (GL_FLAT), 2895 const_iv (GL_FLAT),
2840 const_iv (GL_DITHER), 2896 const_iv (GL_DITHER),
2841 const_iv (GL_BLEND), 2897 const_iv (GL_BLEND),
2853 const_iv (GL_ZERO), 2909 const_iv (GL_ZERO),
2854 const_iv (GL_SRC_ALPHA), 2910 const_iv (GL_SRC_ALPHA),
2855 const_iv (GL_DST_ALPHA), 2911 const_iv (GL_DST_ALPHA),
2856 const_iv (GL_ONE_MINUS_SRC_ALPHA), 2912 const_iv (GL_ONE_MINUS_SRC_ALPHA),
2857 const_iv (GL_ONE_MINUS_DST_ALPHA), 2913 const_iv (GL_ONE_MINUS_DST_ALPHA),
2914 const_iv (GL_SRC_COLOR),
2915 const_iv (GL_DST_COLOR),
2916 const_iv (GL_ONE_MINUS_SRC_COLOR),
2917 const_iv (GL_ONE_MINUS_DST_COLOR),
2858 const_iv (GL_SRC_ALPHA_SATURATE), 2918 const_iv (GL_SRC_ALPHA_SATURATE),
2859 const_iv (GL_RGB), 2919 const_iv (GL_RGB),
2860 const_iv (GL_RGBA), 2920 const_iv (GL_RGBA),
2861 const_iv (GL_RGBA4), 2921 const_iv (GL_RGBA4),
2862 const_iv (GL_RGBA8), 2922 const_iv (GL_RGBA8),
2930 const_iv (GL_NICEST), 2990 const_iv (GL_NICEST),
2931 const_iv (GL_V2F), 2991 const_iv (GL_V2F),
2932 const_iv (GL_V3F), 2992 const_iv (GL_V3F),
2933 const_iv (GL_T2F_V3F), 2993 const_iv (GL_T2F_V3F),
2934 const_iv (GL_T2F_N3F_V3F), 2994 const_iv (GL_T2F_N3F_V3F),
2995 const_iv (GL_FUNC_ADD),
2996 const_iv (GL_FUNC_SUBTRACT),
2997 const_iv (GL_FUNC_REVERSE_SUBTRACT),
2935# undef const_iv 2998# undef const_iv
2936 }; 2999 };
2937 3000
2938 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) 3001 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; )
2939 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 3002 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv));
2946disable_GL_EXT_blend_func_separate () 3009disable_GL_EXT_blend_func_separate ()
2947 CODE: 3010 CODE:
2948 gl.BlendFuncSeparate = 0; 3011 gl.BlendFuncSeparate = 0;
2949 gl.BlendFuncSeparateEXT = 0; 3012 gl.BlendFuncSeparateEXT = 0;
2950 3013
3014void
3015apple_nvidia_bug (int enable)
3016
2951char * 3017char *
2952gl_vendor () 3018gl_vendor ()
2953 CODE: 3019 CODE:
2954 RETVAL = (char *)glGetString (GL_VENDOR); 3020 RETVAL = (char *)glGetString (GL_VENDOR);
2955 OUTPUT: 3021 OUTPUT:
3003void glBlendFunc (int sfactor, int dfactor) 3069void glBlendFunc (int sfactor, int dfactor)
3004 3070
3005void glBlendFuncSeparate (int sa, int da, int saa, int daa) 3071void glBlendFuncSeparate (int sa, int da, int saa, int daa)
3006 CODE: 3072 CODE:
3007 gl_BlendFuncSeparate (sa, da, saa, daa); 3073 gl_BlendFuncSeparate (sa, da, saa, daa);
3074
3075# void glBlendEquation (int se)
3008 3076
3009void glDepthMask (int flag) 3077void glDepthMask (int flag)
3010 3078
3011void glLogicOp (int opcode) 3079void glLogicOp (int opcode)
3012 3080

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines