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.221 by root, Fri Aug 10 04:02:13 2007 UTC vs.
Revision 1.235 by root, Tue Aug 28 01:23:47 2007 UTC

17#include "perl.h" 17#include "perl.h"
18#include "XSUB.h" 18#include "XSUB.h"
19 19
20#ifdef _WIN32 20#ifdef _WIN32
21# undef pipe 21# undef pipe
22// microsoft vs. C
23# define sqrtf(x) sqrt(x)
24# define roundf(x) (int)(x)
25# define atan2f(x,y) atan2(x,y)
26# define M_PI 3.14159265f
22#endif 27#endif
23 28
24#include <assert.h> 29#include <assert.h>
25#include <math.h> 30#include <math.h>
26#include <string.h> 31#include <string.h>
109 av_push (texture_av, (SV *)(size_t)name); 114 av_push (texture_av, (SV *)(size_t)name);
110 glDeleteTextures (1, &name); 115 glDeleteTextures (1, &name);
111} 116}
112 117
113#include "texcache.c" 118#include "texcache.c"
119#include "rendercache.c"
114 120
115#include "pango-font.c" 121#include "pango-font.c"
116#include "pango-fontmap.c" 122#include "pango-fontmap.c"
117#include "pango-render.c" 123#include "pango-render.c"
118 124
144typedef struct cf_layout { 150typedef struct cf_layout {
145 PangoLayout *pl; 151 PangoLayout *pl;
146 float r, g, b, a; // default color for rgba mode 152 float r, g, b, a; // default color for rgba mode
147 int base_height; 153 int base_height;
148 CFPlus__Font font; 154 CFPlus__Font font;
155 rc_t *rc;
149} *CFPlus__Layout; 156} *CFPlus__Layout;
150 157
151static CFPlus__Font default_font; 158static CFPlus__Font default_font;
152static PangoContext *opengl_context; 159static PangoContext *opengl_context;
153static PangoFontMap *opengl_fontmap; 160static PangoFontMap *opengl_fontmap;
196 203
197typedef uint16_t tileid; 204typedef uint16_t tileid;
198typedef uint16_t faceid; 205typedef uint16_t faceid;
199 206
200typedef struct { 207typedef struct {
201 int name; 208 GLuint name;
202 int w, h; 209 int w, h;
203 float s, t; 210 float s, t;
204 uint8_t r, g, b, a; 211 uint8_t r, g, b, a;
205 tileid smoothtile; 212 tileid smoothtile;
206 uint8_t smoothlevel; 213 uint8_t smoothlevel;
431 n |= n >> 4; 438 n |= n >> 4;
432 n |= n >> 8; 439 n |= n >> 8;
433 n |= n >> 16; 440 n |= n >> 16;
434 441
435 return n + 1; 442 return n + 1;
443}
444
445static unsigned int
446popcount (unsigned int n)
447{
448 n -= (n >> 1) & 0x55555555U;
449 n = ((n >> 2) & 0x33333333U) + (n & 0x33333333U);
450 n = ((n >> 4) + n) & 0x0f0f0f0fU;
451 n *= 0x01010101U;
452
453 return n >> 24;
436} 454}
437 455
438/* SDL should provide this, really. */ 456/* SDL should provide this, really. */
439#define SDLK_MODIFIER_MIN 300 457#define SDLK_MODIFIER_MIN 300
440#define SDLK_MODIFIER_MAX 314 458#define SDLK_MODIFIER_MAX 314
518 536
519 const_iv (SDL_APPINPUTFOCUS), 537 const_iv (SDL_APPINPUTFOCUS),
520 const_iv (SDL_APPMOUSEFOCUS), 538 const_iv (SDL_APPMOUSEFOCUS),
521 const_iv (SDL_APPACTIVE), 539 const_iv (SDL_APPACTIVE),
522 540
541 const_iv (SDLK_FIRST),
542 const_iv (SDLK_LAST),
523 const_iv (SDLK_KP0), 543 const_iv (SDLK_KP0),
524 const_iv (SDLK_KP1), 544 const_iv (SDLK_KP1),
525 const_iv (SDLK_KP2), 545 const_iv (SDLK_KP2),
526 const_iv (SDLK_KP3), 546 const_iv (SDLK_KP3),
527 const_iv (SDLK_KP4), 547 const_iv (SDLK_KP4),
626 646
627NV floor (NV x) 647NV floor (NV x)
628 648
629NV ceil (NV x) 649NV ceil (NV x)
630 650
651IV minpot (UV n)
652
653IV popcount (UV n)
654
631void 655void
632pango_init () 656pango_init ()
633 CODE: 657 CODE:
634{ 658{
635 opengl_fontmap = pango_opengl_font_map_new (); 659 opengl_fontmap = pango_opengl_font_map_new ();
708 732
709 if (RETVAL) 733 if (RETVAL)
710 { 734 {
711 av_clear (texture_av); 735 av_clear (texture_av);
712 736
713 SDL_WM_SetCaption ("Crossfire+ Client " VERSION, "Crossfire+"); 737 SDL_WM_SetCaption ("Crossfire TRT Client " VERSION, "Crossfire TRT");
714#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name); 738#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name);
715#include "glfunc.h" 739#include "glfunc.h"
716#undef GL_FUNC 740#undef GL_FUNC
717 } 741 }
718} 742}
1030 RETVAL->g = 1.; 1054 RETVAL->g = 1.;
1031 RETVAL->b = 1.; 1055 RETVAL->b = 1.;
1032 RETVAL->a = 1.; 1056 RETVAL->a = 1.;
1033 RETVAL->base_height = MIN_FONT_HEIGHT; 1057 RETVAL->base_height = MIN_FONT_HEIGHT;
1034 RETVAL->font = 0; 1058 RETVAL->font = 0;
1059 RETVAL->rc = rc_alloc ();
1035 1060
1036 pango_layout_set_wrap (RETVAL->pl, PANGO_WRAP_WORD_CHAR); 1061 pango_layout_set_wrap (RETVAL->pl, PANGO_WRAP_WORD_CHAR);
1037 layout_update_font (RETVAL); 1062 layout_update_font (RETVAL);
1038 OUTPUT: 1063 OUTPUT:
1039 RETVAL 1064 RETVAL
1040 1065
1041void 1066void
1042DESTROY (CFPlus::Layout self) 1067DESTROY (CFPlus::Layout self)
1043 CODE: 1068 CODE:
1044 g_object_unref (self->pl); 1069 g_object_unref (self->pl);
1070 rc_free (self->rc);
1045 Safefree (self); 1071 Safefree (self);
1046 1072
1047void 1073void
1048set_text (CFPlus::Layout self, SV *text_) 1074set_text (CFPlus::Layout self, SV *text_)
1049 CODE: 1075 CODE:
1301 } 1327 }
1302} 1328}
1303 1329
1304void 1330void
1305render (CFPlus::Layout self, float x, float y, int flags = 0) 1331render (CFPlus::Layout self, float x, float y, int flags = 0)
1306 PPCODE: 1332 CODE:
1333 rc_clear (self->rc);
1307 pango_opengl_render_layout_subpixel ( 1334 pango_opengl_render_layout_subpixel (
1308 self->pl, 1335 self->pl,
1336 self->rc,
1309 x * PANGO_SCALE, y * PANGO_SCALE, 1337 x * PANGO_SCALE, y * PANGO_SCALE,
1310 self->r, self->g, self->b, self->a, 1338 self->r, self->g, self->b, self->a,
1311 flags 1339 flags
1312 ); 1340 );
1341 // we assume that context_change actually clears/frees stuff
1342 // and does not do any recomputation...
1343 pango_layout_context_changed (self->pl);
1344
1345void
1346draw (CFPlus::Layout self)
1347 CODE:
1348{
1349 glEnable (GL_TEXTURE_2D);
1350 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
1351 glEnable (GL_BLEND);
1352 gl_BlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA,
1353 GL_ONE , GL_ONE_MINUS_SRC_ALPHA);
1354 glEnable (GL_ALPHA_TEST);
1355 glAlphaFunc (GL_GREATER, 7.f / 255.f);
1356
1357 rc_draw (self->rc);
1358
1359 glDisable (GL_ALPHA_TEST);
1360 glDisable (GL_BLEND);
1361 glDisable (GL_TEXTURE_2D);
1362}
1313 1363
1314MODULE = CFPlus PACKAGE = CFPlus::Texture 1364MODULE = CFPlus PACKAGE = CFPlus::Texture
1315 1365
1316PROTOTYPES: ENABLE 1366PROTOTYPES: ENABLE
1317
1318int minpot (int n)
1319 1367
1320void 1368void
1321pad (SV *data_, int ow, int oh, int nw, int nh) 1369pad (SV *data_, int ow, int oh, int nw, int nh)
1322 CODE: 1370 CODE:
1323{ 1371{
1708 1756
1709void 1757void
1710draw (CFPlus::Map self, int mx, int my, int sw, int sh, int T) 1758draw (CFPlus::Map self, int mx, int my, int sw, int sh, int T)
1711 CODE: 1759 CODE:
1712{ 1760{
1761 int x, y, z;
1762
1713 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ()); 1763 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ());
1714 uint32_t smooth_level[256 / 32]; // one bit for every possible smooth level 1764 uint32_t smooth_level[256 / 32]; // one bit for every possible smooth level
1715 static uint8_t smooth_max[256][256]; // egad, fats and wasteful on memory (64k) 1765 static uint8_t smooth_max[256][256]; // egad, fast and wasteful on memory (64k)
1716 smooth_key skey; 1766 smooth_key skey;
1717 int x, y, z; 1767
1718 int last_name; 1768 rc_t *rc = rc_alloc ();
1769 rc_key_t key;
1770 rc_array_t *arr;
1719 1771
1720 // thats current max. sorry. 1772 // thats current max. sorry.
1721 if (sw > 255) sw = 255; 1773 if (sw > 255) sw = 255;
1722 if (sh > 255) sh = 255; 1774 if (sh > 255) sh = 255;
1723 1775
1724 // clear key, in case of extra padding 1776 // clear key, in case of extra padding
1725 memset (&skey, 0, sizeof (skey)); 1777 memset (&skey, 0, sizeof (skey));
1726 1778
1727 glColor4ub (255, 255, 255, 255); 1779 memset (&key, 0, sizeof (key));
1728 1780 key.r = 255;
1729 glEnable (GL_BLEND); 1781 key.g = 255;
1730 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 1782 key.b = 255;
1731 glEnable (GL_TEXTURE_2D); 1783 key.a = 255;
1732 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 1784 key.mode = GL_QUADS;
1733 1785 key.format = GL_T2F_V3F;
1734 glBegin (GL_QUADS);
1735
1736 last_name = -1; 1786 key.texname = -1;
1737 1787
1738 mx += self->x; 1788 mx += self->x;
1739 my += self->y; 1789 my += self->y;
1740 1790
1741 // first pass: determine smooth_max 1791 // first pass: determine smooth_max
1757 MAX (self->tex [cell->tile [0]].smoothlevel, 1807 MAX (self->tex [cell->tile [0]].smoothlevel,
1758 MAX (self->tex [cell->tile [1]].smoothlevel, 1808 MAX (self->tex [cell->tile [1]].smoothlevel,
1759 self->tex [cell->tile [2]].smoothlevel)); 1809 self->tex [cell->tile [2]].smoothlevel));
1760 } 1810 }
1761 } 1811 }
1812
1813 glEnable (GL_BLEND);
1814 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1815 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1762 1816
1763 for (z = 0; z <= 2; z++) 1817 for (z = 0; z <= 2; z++)
1764 { 1818 {
1765 memset (smooth_level, 0, sizeof (smooth_level)); 1819 memset (smooth_level, 0, sizeof (smooth_level));
1766 1820
1778 if (tile) 1832 if (tile)
1779 { 1833 {
1780 maptex tex = self->tex [tile]; 1834 maptex tex = self->tex [tile];
1781 int px, py; 1835 int px, py;
1782 1836
1783 // suppressing texture state switches here
1784 // is only moderately effective, but worth the extra effort
1785 if (last_name != tex.name) 1837 if (key.texname != tex.name)
1786 { 1838 {
1787 if (!tex.name) 1839 if (!tex.name)
1788 tex = self->tex [2]; /* missing, replace by noface */ 1840 tex = self->tex [2]; /* missing, replace by noface */
1789 1841
1790 glEnd (); 1842 key.texname = tex.name;
1791 glBindTexture (GL_TEXTURE_2D, last_name = tex.name); 1843 arr = rc_array (rc, &key);
1792 glBegin (GL_QUADS);
1793 } 1844 }
1794 1845
1795 px = (x + 1) * T - tex.w; 1846 px = (x + 1) * T - tex.w;
1796 py = (y + 1) * T - tex.h; 1847 py = (y + 1) * T - tex.h;
1797 1848
1798 glTexCoord2f (0 , 0 ); glVertex2f (px , py ); 1849 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
1799 glTexCoord2f (0 , tex.t); glVertex2f (px , py + tex.h); 1850 rc_t2f_v3f (arr, 0 , tex.t, px , py + tex.h, 0);
1800 glTexCoord2f (tex.s, tex.t); glVertex2f (px + tex.w, py + tex.h); 1851 rc_t2f_v3f (arr, tex.s, tex.t, px + tex.w, py + tex.h, 0);
1801 glTexCoord2f (tex.s, 0 ); glVertex2f (px + tex.w, py ); 1852 rc_t2f_v3f (arr, tex.s, 0 , px + tex.w, py , 0);
1802 1853
1803 if (cell->flags && z == 2) 1854 if (cell->flags && z == 2)
1804 { 1855 {
1856 // overlays such as the speech bubble, probably more to come
1805 if (cell->flags & 1) 1857 if (cell->flags & 1)
1806 { 1858 {
1807 maptex tex = self->tex [1]; 1859 maptex tex = self->tex [1];
1808 int px = x * T + T * 2 / 32; 1860 int px = x * T + T * 2 / 32;
1809 int py = y * T - T * 6 / 32; 1861 int py = y * T - T * 6 / 32;
1810 1862
1863 if (tex.name)
1811 glEnd (); 1864 {
1812 glBindTexture (GL_TEXTURE_2D, last_name = tex.name); 1865 if (key.texname != tex.name)
1866 {
1867 key.texname = tex.name;
1868 arr = rc_array (rc, &key);
1869 }
1870
1871 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
1872 rc_t2f_v3f (arr, 0 , tex.t, px , py + T, 0);
1873 rc_t2f_v3f (arr, tex.s, tex.t, px + T, py + T, 0);
1874 rc_t2f_v3f (arr, tex.s, 0 , px + T, py , 0);
1813 glBegin (GL_QUADS); 1875 }
1814
1815 glTexCoord2f (0 , 0 ); glVertex2f (px , py );
1816 glTexCoord2f (0 , tex.t); glVertex2f (px , py + T);
1817 glTexCoord2f (tex.s, tex.t); glVertex2f (px + T, py + T);
1818 glTexCoord2f (tex.s, 0 ); glVertex2f (px + T, py );
1819 } 1876 }
1820 } 1877 }
1821 1878
1822 // update smooth hash 1879 // update smooth hash
1823 if (tex.smoothtile) 1880 if (tex.smoothtile)
1859 } 1916 }
1860 } 1917 }
1861 } 1918 }
1862 } 1919 }
1863 1920
1921 rc_draw (rc);
1922 rc_clear (rc);
1923
1864 // go through all smoothlevels, lowest to highest, then draw. 1924 // go through all smoothlevels, lowest to highest, then draw.
1865 // this is basically counting sort 1925 // this is basically counting sort
1866 { 1926 {
1867 int w, b; 1927 int w, b;
1868 1928
1929 glEnable (GL_TEXTURE_2D);
1930 glBegin (GL_QUADS);
1869 for (w = 0; w < 256 / 32; ++w) 1931 for (w = 0; w < 256 / 32; ++w)
1870 { 1932 {
1871 uint32_t smask = smooth_level [w]; 1933 uint32_t smask = smooth_level [w];
1872 if (smask) 1934 if (smask)
1873 for (b = 0; b < 32; ++b) 1935 for (b = 0; b < 32; ++b)
1892 int border = bits & 15; 1954 int border = bits & 15;
1893 int corner = (bits >> 8) & ~(bits >> 4) & 15; 1955 int corner = (bits >> 8) & ~(bits >> 4) & 15;
1894 float dx = tex.s * .0625f; // 16 images/row 1956 float dx = tex.s * .0625f; // 16 images/row
1895 float dy = tex.t * .5f ; // 2 images/column 1957 float dy = tex.t * .5f ; // 2 images/column
1896 1958
1897 // this time naively avoiding texture state changes
1898 // save gobs of state changes.
1899 if (last_name != tex.name) 1959 if (tex.name)
1900 { 1960 {
1961 // this time avoiding texture state changes
1962 // save gobs of state changes.
1901 if (!tex.name) 1963 if (key.texname != tex.name)
1902 continue; // smoothing not yet available 1964 {
1903
1904 glEnd (); 1965 glEnd ();
1905 glBindTexture (GL_TEXTURE_2D, last_name = tex.name); 1966 glBindTexture (GL_TEXTURE_2D, key.texname = tex.name);
1906 glBegin (GL_QUADS); 1967 glBegin (GL_QUADS);
1907 } 1968 }
1908 1969
1909 if (border) 1970 if (border)
1910 { 1971 {
1911 float ox = border * dx; 1972 float ox = border * dx;
1912 1973
1913 glTexCoord2f (ox , 0.f ); glVertex2f (px , py ); 1974 glTexCoord2f (ox , 0.f ); glVertex2i (px , py );
1914 glTexCoord2f (ox , dy ); glVertex2f (px , py + T); 1975 glTexCoord2f (ox , dy ); glVertex2i (px , py + T);
1915 glTexCoord2f (ox + dx, dy ); glVertex2f (px + T, py + T); 1976 glTexCoord2f (ox + dx, dy ); glVertex2i (px + T, py + T);
1916 glTexCoord2f (ox + dx, 0.f ); glVertex2f (px + T, py ); 1977 glTexCoord2f (ox + dx, 0.f ); glVertex2i (px + T, py );
1917 } 1978 }
1918 1979
1919 if (corner) 1980 if (corner)
1920 { 1981 {
1921 float ox = corner * dx; 1982 float ox = corner * dx;
1922 1983
1923 glTexCoord2f (ox , dy ); glVertex2f (px , py ); 1984 glTexCoord2f (ox , dy ); glVertex2i (px , py );
1924 glTexCoord2f (ox , dy * 2.f); glVertex2f (px , py + T); 1985 glTexCoord2f (ox , dy * 2.f); glVertex2i (px , py + T);
1925 glTexCoord2f (ox + dx, dy * 2.f); glVertex2f (px + T, py + T); 1986 glTexCoord2f (ox + dx, dy * 2.f); glVertex2i (px + T, py + T);
1926 glTexCoord2f (ox + dx, dy ); glVertex2f (px + T, py ); 1987 glTexCoord2f (ox + dx, dy ); glVertex2i (px + T, py );
1988 }
1927 } 1989 }
1928 } 1990 }
1929 } 1991 }
1930 } 1992 }
1931 } 1993 }
1994
1995 glEnd ();
1996 glDisable (GL_TEXTURE_2D);
1997 key.texname = -1;
1932 } 1998 }
1933 1999
1934 hv_clear (smooth); 2000 hv_clear (smooth);
1935 } 2001 }
1936 2002
1937 glEnd ();
1938
1939 glDisable (GL_TEXTURE_2D);
1940 glDisable (GL_BLEND); 2003 glDisable (GL_BLEND);
2004 rc_free (rc);
1941 2005
1942 // top layer: overlays such as the health bar 2006 // top layer: overlays such as the health bar
1943 for (y = 0; y < sh; y++) 2007 for (y = 0; y < sh; y++)
1944 if (0 <= y + my && y + my < self->rows) 2008 if (0 <= y + my && y + my < self->rows)
1945 { 2009 {
2194 int x, y, z; 2258 int x, y, z;
2195 int w, h; 2259 int w, h;
2196 int x1, y1; 2260 int x1, y1;
2197 2261
2198 if (*data++ != 0) 2262 if (*data++ != 0)
2199 return; /* version mismatch */ 2263 XSRETURN_EMPTY; /* version mismatch */
2200 2264
2201 w = *data++ << 8; w |= *data++; 2265 w = *data++ << 8; w |= *data++;
2202 h = *data++ << 8; h |= *data++; 2266 h = *data++ << 8; h |= *data++;
2203 2267
2204 // we need to do this 'cause we don't keep an absolute coord system for rows 2268 // we need to do this 'cause we don't keep an absolute coord system for rows
2500 const_iv (GL_INTENSITY), 2564 const_iv (GL_INTENSITY),
2501 const_iv (GL_LUMINANCE), 2565 const_iv (GL_LUMINANCE),
2502 const_iv (GL_LUMINANCE_ALPHA), 2566 const_iv (GL_LUMINANCE_ALPHA),
2503 const_iv (GL_FLOAT), 2567 const_iv (GL_FLOAT),
2504 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV), 2568 const_iv (GL_UNSIGNED_INT_8_8_8_8_REV),
2569 const_iv (GL_COMPRESSED_ALPHA_ARB),
2570 const_iv (GL_COMPRESSED_LUMINANCE_ARB),
2571 const_iv (GL_COMPRESSED_LUMINANCE_ALPHA_ARB),
2572 const_iv (GL_COMPRESSED_INTENSITY_ARB),
2573 const_iv (GL_COMPRESSED_RGB_ARB),
2574 const_iv (GL_COMPRESSED_RGBA_ARB),
2505 const_iv (GL_COMPILE), 2575 const_iv (GL_COMPILE),
2506 const_iv (GL_PROXY_TEXTURE_1D), 2576 const_iv (GL_PROXY_TEXTURE_1D),
2507 const_iv (GL_PROXY_TEXTURE_2D), 2577 const_iv (GL_PROXY_TEXTURE_2D),
2508 const_iv (GL_TEXTURE_1D), 2578 const_iv (GL_TEXTURE_1D),
2509 const_iv (GL_TEXTURE_2D), 2579 const_iv (GL_TEXTURE_2D),
2548 const_iv (GL_PERSPECTIVE_CORRECTION_HINT), 2618 const_iv (GL_PERSPECTIVE_CORRECTION_HINT),
2549 const_iv (GL_POINT_SMOOTH_HINT), 2619 const_iv (GL_POINT_SMOOTH_HINT),
2550 const_iv (GL_LINE_SMOOTH_HINT), 2620 const_iv (GL_LINE_SMOOTH_HINT),
2551 const_iv (GL_POLYGON_SMOOTH_HINT), 2621 const_iv (GL_POLYGON_SMOOTH_HINT),
2552 const_iv (GL_GENERATE_MIPMAP_HINT), 2622 const_iv (GL_GENERATE_MIPMAP_HINT),
2623 const_iv (GL_TEXTURE_COMPRESSION_HINT),
2553 const_iv (GL_FASTEST), 2624 const_iv (GL_FASTEST),
2554 const_iv (GL_DONT_CARE), 2625 const_iv (GL_DONT_CARE),
2555 const_iv (GL_NICEST), 2626 const_iv (GL_NICEST),
2556 const_iv (GL_V2F), 2627 const_iv (GL_V2F),
2557 const_iv (GL_V3F), 2628 const_iv (GL_V3F),
2565 2636
2566 texture_av = newAV (); 2637 texture_av = newAV ();
2567 AvREAL_off (texture_av); 2638 AvREAL_off (texture_av);
2568} 2639}
2569 2640
2641void
2642disable_GL_EXT_blend_func_separate ()
2643 CODE:
2644 gl.BlendFuncSeparate = 0;
2645 gl.BlendFuncSeparateEXT = 0;
2646
2570char * 2647char *
2571gl_vendor () 2648gl_vendor ()
2572 CODE: 2649 CODE:
2573 RETVAL = (char *)glGetString (GL_VENDOR); 2650 RETVAL = (char *)glGetString (GL_VENDOR);
2574 OUTPUT: 2651 OUTPUT:
2695 2772
2696void glRect (float x1, float y1, float x2, float y2) 2773void glRect (float x1, float y1, float x2, float y2)
2697 CODE: 2774 CODE:
2698 glRectf (x1, y1, x2, y2); 2775 glRectf (x1, y1, x2, y2);
2699 2776
2777void glRect_lineloop (float x1, float y1, float x2, float y2)
2778 CODE:
2779 glBegin (GL_LINE_LOOP);
2780 glVertex2f (x1, y1);
2781 glVertex2f (x2, y1);
2782 glVertex2f (x2, y2);
2783 glVertex2f (x1, y2);
2784 glEnd ();
2785
2700PROTOTYPES: ENABLE 2786PROTOTYPES: ENABLE
2701 2787
2702void glBegin (int mode) 2788void glBegin (int mode)
2703 2789
2704void glEnd () 2790void glEnd ()
2805 NV x, y, w, h; 2891 NV x, y, w, h;
2806 SV *draw_x_sv = GvSV (draw_x_gv); 2892 SV *draw_x_sv = GvSV (draw_x_gv);
2807 SV *draw_y_sv = GvSV (draw_y_gv); 2893 SV *draw_y_sv = GvSV (draw_y_gv);
2808 SV *draw_w_sv = GvSV (draw_w_gv); 2894 SV *draw_w_sv = GvSV (draw_w_gv);
2809 SV *draw_h_sv = GvSV (draw_h_gv); 2895 SV *draw_h_sv = GvSV (draw_h_gv);
2810 SV *hover;
2811 double draw_x, draw_y, draw_w, draw_h; 2896 double draw_x, draw_y;
2812 2897
2813 if (!SvROK (self)) 2898 if (!SvROK (self))
2814 croak ("CFPlus::Base::draw: %s not a reference", SvPV_nolen (self)); 2899 croak ("CFPlus::Base::draw: %s not a reference", SvPV_nolen (self));
2815 2900
2816 hv = (HV *)SvRV (self); 2901 hv = (HV *)SvRV (self);
2844 { 2929 {
2845 svp = hv_fetch (hv, "can_hover", sizeof ("can_hover") - 1, 0); 2930 svp = hv_fetch (hv, "can_hover", sizeof ("can_hover") - 1, 0);
2846 2931
2847 if (svp && SvTRUE (*svp)) 2932 if (svp && SvTRUE (*svp))
2848 { 2933 {
2849 glColor4f (1*0.2f, 0.8*0.2f, 0.5*0.2f, 0.2f); 2934 glColor4f (1.0f * 0.2f, 0.8f * 0.2f, 0.5f * 0.2f, 0.2f);
2850 glEnable (GL_BLEND); 2935 glEnable (GL_BLEND);
2851 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 2936 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
2852 glBegin (GL_QUADS); 2937 glBegin (GL_QUADS);
2853 glVertex2f (0, 0); 2938 glVertex2f (0, 0);
2854 glVertex2f (w, 0); 2939 glVertex2f (w, 0);
2857 glEnd (); 2942 glEnd ();
2858 glDisable (GL_BLEND); 2943 glDisable (GL_BLEND);
2859 } 2944 }
2860 } 2945 }
2861#if 0 2946#if 0
2862 if ($ENV{CFPLUS_DEBUG} & 1) { 2947 // draw borders, for debugging
2863 glPushMatrix; 2948 glPushMatrix ();
2864 glColor 1, 1, 0, 1; 2949 glColor4f (1., 1., 0., 1.);
2865 glTranslate 0.375, 0.375; 2950 glTranslatef (.5, .5, 0.);
2866 glBegin GL_LINE_LOOP; 2951 glBegin (GL_LINE_LOOP);
2867 glVertex 0 , 0; 2952 glVertex2f (0 , 0);
2868 glVertex $self->{w} - 1, 0; 2953 glVertex2f (w - 1, 0);
2869 glVertex $self->{w} - 1, $self->{h} - 1; 2954 glVertex2f (w - 1, h - 1);
2870 glVertex 0 , $self->{h} - 1; 2955 glVertex2f (0 , h - 1);
2871 glEnd; 2956 glEnd ();
2872 glPopMatrix; 2957 glPopMatrix ();
2873 #CFPlus::UI::Label->new (w => $self->{w}, h => $self->{h}, text => $self, fontsize => 0)->_draw;
2874 }
2875#endif 2958#endif
2876 PUSHMARK (SP); 2959 PUSHMARK (SP);
2877 XPUSHs (self); 2960 XPUSHs (self);
2878 PUTBACK; 2961 PUTBACK;
2879 call_method ("_draw", G_VOID | G_DISCARD); 2962 call_method ("_draw", G_VOID | G_DISCARD);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines