--- deliantra/Deliantra-Client/Client.xs 2006/04/19 21:17:15 1.52 +++ deliantra/Deliantra-Client/Client.xs 2006/04/23 04:41:33 1.59 @@ -35,11 +35,15 @@ typedef signed int int32_t; #endif +#include "glext.h" + #define FOW_DARKNESS 32 #define MAP_EXTEND_X 32 #define MAP_EXTEND_Y 512 +#define MIN_FONT_HEIGHT 8 * PANGO_SCALE + typedef Mix_Chunk *CFClient__MixChunk; typedef Mix_Music *CFClient__MixMusic; @@ -64,14 +68,18 @@ /* use a random scale factor to account for unknown descenders, 0.8 works * reasonably well with bitstream vera */ - PangoFontDescription *font = pango_context_get_font_description (context); + PangoFontDescription *font = pango_layout_get_font_description (self->pl); int height = self->base_height * (PANGO_SCALE * 8 / 10); + if (height < MIN_FONT_HEIGHT) + height = MIN_FONT_HEIGHT; + if (pango_font_description_get_size (font) != height) { + font = pango_font_description_copy (font); pango_font_description_set_absolute_size (font, height); - pango_layout_context_changed (self->pl); + pango_layout_set_font_description (self->pl, font); } } @@ -241,6 +249,19 @@ } } +static void +music_finished () +{ + SDL_UserEvent ev; + + ev.type = SDL_USEREVENT; + ev.code = 0; + ev.data1 = 0; + ev.data2 = 0; + + SDL_PushEvent ((SDL_Event *)&ev); +} + MODULE = CFClient PACKAGE = CFClient PROTOTYPES: ENABLE @@ -388,6 +409,9 @@ SDL_GL_SetAttribute (SDL_GL_BUFFER_SIZE, 15); SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 0); + SDL_EnableUNICODE (1); + SDL_EnableKeyRepeat (SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); + m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL); if (m && m != (SDL_Rect **)-1) @@ -412,11 +436,58 @@ OUTPUT: RETVAL -int -Mix_VolumeMusic (int newvol = -1) +void +SDL_GL_SwapBuffers () + +void +SDL_PollEvent () + PPCODE: +{ + SDL_Event ev; + + while (SDL_PollEvent (&ev)) + { + HV *hv = newHV (); + hv_store (hv, "type", 4, newSViv (ev.type), 0); + switch (ev.type) + { + case SDL_KEYDOWN: + case SDL_KEYUP: + hv_store (hv, "state", 5, newSViv (ev.key.state), 0); + hv_store (hv, "sym", 3, newSViv (ev.key.keysym.sym), 0); + hv_store (hv, "mod", 3, newSViv (ev.key.keysym.mod), 0); + hv_store (hv, "unicode", 7, newSViv (ev.key.keysym.unicode), 0); + break; + + case SDL_ACTIVEEVENT: + hv_store (hv, "gain", 4, newSViv (ev.active.gain), 0); + hv_store (hv, "state", 5, newSViv (ev.active.state), 0); + break; + + case SDL_MOUSEMOTION: + hv_store (hv, "state", 5, newSViv (ev.motion.state), 0); + hv_store (hv, "x", 1, newSViv (ev.motion.x), 0); + hv_store (hv, "y", 1, newSViv (ev.motion.y), 0); + hv_store (hv, "xrel", 4, newSViv (ev.motion.xrel), 0); + hv_store (hv, "yrel", 4, newSViv (ev.motion.yrel), 0); + break; + + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + hv_store (hv, "button", 6, newSViv (ev.button.button), 0); + hv_store (hv, "state", 5, newSViv (ev.button.state), 0); + hv_store (hv, "x", 1, newSViv (ev.button.x), 0); + hv_store (hv, "y", 1, newSViv (ev.button.y), 0); + } + + XPUSHs (sv_2mortal (newRV_noinc ((SV *)hv))); + } +} int Mix_OpenAudio (int frequency = 22050, int format = MIX_DEFAULT_FORMAT, int channels = 1, int chunksize = 512) + POSTCALL: + Mix_HookMusicFinished (music_finished); void Mix_CloseAudio () @@ -458,6 +529,7 @@ FcPattern *pattern = FcFreeTypeQuery ((const FcChar8 *)file, 0, 0, &count); PangoFontDescription *font = pango_fc_font_description_from_pattern (pattern, 0); FcPatternDestroy (pattern); + pango_font_description_set_absolute_size (font, MIN_FONT_HEIGHT); pango_context_set_font_description (context, font); } @@ -569,6 +641,9 @@ RETVAL->base_height = base_height; RETVAL->pl = pango_layout_new (context); pango_layout_set_wrap (RETVAL->pl, PANGO_WRAP_WORD_CHAR); + pango_layout_set_font_description (RETVAL->pl, + pango_font_description_copy ( + pango_context_get_font_description (context))); OUTPUT: RETVAL @@ -887,11 +962,11 @@ } SV * -mapmap (CFClient::Map self, int w, int h) +mapmap (CFClient::Map self, int x0, int y0, int w, int h) CODE: { - int x0, x1, x; - int y0, y1, y; + int x1, x; + int y1, y; int z; SV *map_sv = newSV (w * h * sizeof (uint32_t)); uint32_t *map = (uint32_t *)SvPVX (map_sv); @@ -899,8 +974,8 @@ SvPOK_only (map_sv); SvCUR_set (map_sv, w * h * sizeof (uint32_t)); - x0 = self->x - w / 2; x1 = x0 + w; - y0 = self->y - h / 2; y1 = y0 + h; + x0 += self->x; x1 = x0 + w; + y0 += self->y; y1 = y0 + h; for (y = y0; y < y1; y++) { @@ -1050,7 +1125,7 @@ *data++ = h >> 8; *data++ = h; // we need to do this 'cause we don't keep an absolute coord system for rows - // TODO: treat rows as we treat + // TODO: treat rows as we treat columns map_get_row (self, y0 + self->y - self->oy);//D map_get_row (self, y0 + self->y - self->oy + h - 1);//D @@ -1124,7 +1199,7 @@ h = *data++ << 8; h |= *data++; // we need to do this 'cause we don't keep an absolute coord system for rows - // TODO: treat rows as we treat + // TODO: treat rows as we treat columns map_get_row (self, y0 + self->y - self->oy);//D map_get_row (self, y0 + self->y - self->oy + h - 1);//D @@ -1225,3 +1300,180 @@ OUTPUT: RETVAL +MODULE = CFClient PACKAGE = CFClient::OpenGL + +BOOT: +{ + HV *stash = gv_stashpv ("CFClient::OpenGL", 1); + static const struct { + const char *name; + IV iv; + } *civ, const_iv[] = { +# define const_iv(name) { # name, (IV)name } + const_iv (GL_COLOR_MATERIAL), + const_iv (GL_SMOOTH), + const_iv (GL_FLAT), + const_iv (GL_BLEND), + const_iv (GL_AND), + const_iv (GL_SRC_ALPHA), + const_iv (GL_ONE_MINUS_SRC_ALPHA), + const_iv (GL_RGB), + const_iv (GL_RGBA), + const_iv (GL_UNSIGNED_BYTE), + const_iv (GL_ALPHA4), + const_iv (GL_ALPHA), + const_iv (GL_FLOAT), + const_iv (GL_UNSIGNED_INT_8_8_8_8_REV), + const_iv (GL_COMPILE), + const_iv (GL_TEXTURE_1D), + const_iv (GL_TEXTURE_2D), + const_iv (GL_TEXTURE_ENV), + const_iv (GL_TEXTURE_MAG_FILTER), + const_iv (GL_TEXTURE_MIN_FILTER), + const_iv (GL_TEXTURE_ENV_MODE), + const_iv (GL_TEXTURE_WRAP_S), + const_iv (GL_TEXTURE_WRAP_T), + const_iv (GL_CLAMP), + const_iv (GL_REPEAT), + const_iv (GL_NEAREST), + const_iv (GL_LINEAR), + const_iv (GL_NEAREST_MIPMAP_NEAREST), + const_iv (GL_LINEAR_MIPMAP_NEAREST), + const_iv (GL_NEAREST_MIPMAP_LINEAR), + const_iv (GL_LINEAR_MIPMAP_LINEAR), + const_iv (GL_GENERATE_MIPMAP), + const_iv (GL_LINEAR), + const_iv (GL_MODULATE), + const_iv (GL_REPLACE), + const_iv (GL_COLOR_BUFFER_BIT), + const_iv (GL_PROJECTION), + const_iv (GL_MODELVIEW), + const_iv (GL_COLOR_LOGIC_OP), + const_iv (GL_CONVOLUTION_2D), + const_iv (GL_CONVOLUTION_BORDER_MODE), + const_iv (GL_CONSTANT_BORDER), + const_iv (GL_LINES), + const_iv (GL_QUADS), + const_iv (GL_LINE_LOOP), + const_iv (GL_PERSPECTIVE_CORRECTION_HINT), + const_iv (GL_FASTEST), +# undef const_iv + }; + + for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) + newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); +} + +int glGetError () + +void glClear (int mask) + +void glClearColor (float r, float g, float b, float a = 1.0) + PROTOTYPE: @ + +void glEnable (int cap) + +void glDisable (int cap) + +void glShadeModel (int mode) + +void glHint (int target, int mode) + +void glBlendFunc (int sfactor, int dfactor) + +void glLogicOp (int opcode) + +void glMatrixMode (int mode) + +void glPushMatrix () + +void glPopMatrix () + +void glLoadIdentity () + +void glOrtho (double left, double right, double bottom, double top, double near, double far) + +void glViewport (int x, int y, int width, int height) + +void glTranslate (float x, float y, float z = 0.) + CODE: + glTranslatef (x, y, z); + +void glScale (float x, float y, float z) + CODE: + glScalef (x, y, z); + +void glRotate (float angle, float x, float y, float z) + CODE: + glRotatef (angle, x, y, z); + +void glBegin (int mode) + +void glEnd () + +void glColor (float r, float g, float b, float a = 1.0) + PROTOTYPE: @ + CODE: + glColor4f (r, g, b, a); + +void glVertex (float x, float y, float z = 0.) + CODE: + glVertex3f (x, y, z); + +void glTexCoord (float s, float t) + CODE: + glTexCoord2f (s, t); + +void glTexEnv (int target, int pname, float param) + CODE: + glTexEnvf (target, pname, param); + +void glTexParameter (int target, int pname, float param) + CODE: + glTexParameterf (target, pname, param); + +void glBindTexture (int target, int name) + +void glConvolutionParameter (int target, int pname, float params) + CODE: + glConvolutionParameterf (target, pname, params); + +void glConvolutionFilter2D (int target, int internalformat, int width, int height, int format, int type, char *data) + +void glTexImage2D (int target, int level, int internalformat, int width, int height, int border, int format, int type, char *data) + +void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border) + +int glGenTexture () + CODE: +{ + GLuint name; + glGenTextures (1, &name); + RETVAL = name; +} + OUTPUT: + RETVAL + +void glDeleteTexture (int name) + CODE: +{ + GLuint name_ = name; + glDeleteTextures (1, &name_); +} + +int glGenList () + CODE: + RETVAL = glGenLists (1); + OUTPUT: + RETVAL + +void glDeleteList (int list) + CODE: + glDeleteLists (list, 1); + +void glNewList (int list, int mode = GL_COMPILE) + +void glEndList () + +void glCallList (int list) +