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.294 by root, Sat Dec 19 05:06:56 2009 UTC

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 64 86#define FOW_DARKNESS 64
87#define DARKNESS_ADJUST(n) ((29 * (int)(n)) >> 5) /* times 0.9 */
87 88
88#define MAP_EXTEND_X 32 89#define MAP_EXTEND_X 32
89#define MAP_EXTEND_Y 512 90#define MAP_EXTEND_Y 512
90 91
91#define MIN_FONT_HEIGHT 10 92#define MIN_FONT_HEIGHT 10
1659 glDisable (GL_BLEND); 1660 glDisable (GL_BLEND);
1660 } 1661 }
1661} 1662}
1662 1663
1663void 1664void
1664draw_fow_texture (float intensity, int name1, float s1, float t1, float w1, float h1) 1665draw_fow_texture (float intensity, int name1, float s1, float t1, float w1, float h1, float blend = 0.f, float dx = 0.f, float dy = 0.f, int name2 = 0, float s2 = 0.f, float t2 = 0.f, float w2 = 0.f, float h2 = 0.f)
1665 PROTOTYPE: @ 1666 PROTOTYPE: @
1666 CODE: 1667 CODE:
1667{ 1668{
1668 glEnable (GL_TEXTURE_2D); 1669 glEnable (GL_TEXTURE_2D);
1669 glEnable (GL_BLEND); 1670 glEnable (GL_BLEND);
1670 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
1671 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 1671 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1672 glBindTexture (GL_TEXTURE_2D, name1);
1672 1673
1673 glColor4f (intensity, intensity, intensity, 0.9); 1674 glColor3f (intensity, intensity, intensity);
1674 glPushMatrix (); 1675 glPushMatrix ();
1675 glScalef (1./3, 1./3, 1.); 1676 glScalef (1./3, 1./3, 1.);
1676 1677
1678 if (blend > 0.f)
1679 {
1680 float S2, T2; /* 0. 0. for texture 2 */
1681 float w = w1 > w2 ? w1 : w2;
1682 float h = h1 > h2 ? h1 : h2;
1683 GLfloat env_color[4] = { 0., 0., 0., blend };
1684
1685 /* interpolate the two shadow textures */
1686 /* stage 0 == rgb(glcolor) + alpha(t0) */
1687 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1688
1689 /* stage 1 == rgb(glcolor) + alpha(interpolate t0, t1, texenv) */
1690 gl.ActiveTexture (GL_TEXTURE1);
1691 glEnable (GL_TEXTURE_2D);
1677 glBindTexture (GL_TEXTURE_2D, name1); 1692 glBindTexture (GL_TEXTURE_2D, name2);
1693 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
1678 1694
1695 /* rgb == rgb(glcolor) */
1696 glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
1697 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_CONSTANT);
1698 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
1699
1700 /* alpha = interpolate t0, t1 by env_alpha */
1701 glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, env_color);
1702
1703 glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_INTERPOLATE);
1704 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE);
1705 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
1706
1707 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_PREVIOUS);
1708 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
1709
1710 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE2_ALPHA, GL_CONSTANT);
1711 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, GL_SRC_ALPHA);
1712
1713 s1 *= w / w1;
1714 t1 *= h / h1;
1715
1716 dx *= -3.f / w2;
1717 dy *= -3.f / h2;
1718 dx *= w / w2;
1719 dy *= h / h2;
1720
1721 s2 *= w / w2;
1722 t2 *= h / h2;
1723
1679 glBegin (GL_QUADS); 1724 glBegin (GL_QUADS);
1725 gl.MultiTexCoord2f (GL_TEXTURE0, 0, 0); gl.MultiTexCoord2f (GL_TEXTURE1, dx , dy ); glVertex2f ( 0, 0);
1726 gl.MultiTexCoord2f (GL_TEXTURE0, 0, t1); gl.MultiTexCoord2f (GL_TEXTURE1, dx , dy + t2); glVertex2f ( 0, h1);
1727 gl.MultiTexCoord2f (GL_TEXTURE0, s1, t1); gl.MultiTexCoord2f (GL_TEXTURE1, dx + s2, dy + t2); glVertex2f (w1, h1);
1728 gl.MultiTexCoord2f (GL_TEXTURE0, s1, 0); gl.MultiTexCoord2f (GL_TEXTURE1, dx + s2, dy ); glVertex2f (w1, 0);
1729 glEnd ();
1730
1731 glDisable (GL_TEXTURE_2D);
1732 gl.ActiveTexture (GL_TEXTURE0);
1733 }
1734 else
1735 {
1736 /* simple blending of one texture, also opengl <1.3 path */
1737 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1738
1739 glBegin (GL_QUADS);
1680 glTexCoord2f ( 0, 0); glVertex2f ( 0, 0); 1740 glTexCoord2f ( 0, 0); glVertex2f ( 0, 0);
1681 glTexCoord2f ( 0, t1); glVertex2f ( 0, h1); 1741 glTexCoord2f ( 0, t1); glVertex2f ( 0, h1);
1682 glTexCoord2f (s1, t1); glVertex2f (w1, h1); 1742 glTexCoord2f (s1, t1); glVertex2f (w1, h1);
1683 glTexCoord2f (s1, 0); glVertex2f (w1, 0); 1743 glTexCoord2f (s1, 0); glVertex2f (w1, 0);
1684 glEnd (); 1744 glEnd ();
1745 }
1685 1746
1686 glPopMatrix (); 1747 glPopMatrix ();
1687 1748
1688 glDisable (GL_TEXTURE_2D); 1749 glDisable (GL_TEXTURE_2D);
1689 glDisable (GL_BLEND); 1750 glDisable (GL_BLEND);
2450 SvCUR_set (darkness3_sv, sw34 * sh3); 2511 SvCUR_set (darkness3_sv, sw34 * sh3);
2451 2512
2452 mx += self->x - 1; 2513 mx += self->x - 1;
2453 my += self->y - 1; 2514 my += self->y - 1;
2454 2515
2455 memset (darkness1, 255 - FOW_DARKNESS, sw1 * sh1); 2516 memset (darkness1, DARKNESS_ADJUST (255 - FOW_DARKNESS), sw1 * sh1);
2456 2517
2457 for (y = 0; y < sh1; y++) 2518 for (y = 0; y < sh1; y++)
2458 if (0 <= y + my && y + my < self->rows) 2519 if (0 <= y + my && y + my < self->rows)
2459 { 2520 {
2460 maprow *row = self->row + (y + my); 2521 maprow *row = self->row + (y + my);
2463 if (row->c0 <= x + mx && x + mx < row->c1) 2524 if (row->c0 <= x + mx && x + mx < row->c1)
2464 { 2525 {
2465 mapcell *cell = row->col + (x + mx - row->c0); 2526 mapcell *cell = row->col + (x + mx - row->c0);
2466 2527
2467 darkness1 [y * sw1 + x] = cell->darkness 2528 darkness1 [y * sw1 + x] = cell->darkness
2468 ? 255 - (cell->darkness - 1) 2529 ? DARKNESS_ADJUST (255 - (cell->darkness - 1))
2469 : 255 - FOW_DARKNESS; 2530 : DARKNESS_ADJUST (255 - FOW_DARKNESS);
2470 } 2531 }
2471 } 2532 }
2472 2533
2473 for (y = 0; y < sh; ++y) 2534 for (y = 0; y < sh; ++y)
2474 for (x = 0; x < sw; ++x) 2535 for (x = 0; x < sw; ++x)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines