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.322 by root, Sun Nov 18 01:43:12 2018 UTC vs.
Revision 1.324 by root, Sun Nov 18 01:58:53 2018 UTC

32#include <cstring> 32#include <cstring>
33#include <cstdio> 33#include <cstdio>
34#include <cstdlib> 34#include <cstdlib>
35 35
36#include <utility> 36#include <utility>
37#include <bitset>
37 38
38#define USE_RWOPS 1 // for SDL_mixer:LoadMUS_RW 39#define USE_RWOPS 1 // for SDL_mixer:LoadMUS_RW
39 40
40#include <SDL.h> 41#include <SDL.h>
41#include <SDL_thread.h> 42#include <SDL_thread.h>
199 } 200 }
200 201
201 return 0; 202 return 0;
202} 203}
203 204
204typedef struct cf_layout { 205struct cf_layout {
205 PangoLayout *pl; 206 PangoLayout *pl;
206 float r, g, b, a; // default color for rgba mode 207 float r, g, b, a; // default color for rgba mode
207 int base_height; 208 int base_height;
208 DC__Font font; 209 DC__Font font;
209 rc_t *rc; 210 rc_t *rc;
210} *DC__Layout; 211};
212
213typedef cf_layout *DC__Layout;
211 214
212static DC__Font default_font; 215static DC__Font default_font;
213static PangoContext *opengl_context; 216static PangoContext *opengl_context;
214static PangoFontMap *opengl_fontmap; 217static PangoFontMap *opengl_fontmap;
215 218
256} 259}
257 260
258typedef uint16_t tileid; 261typedef uint16_t tileid;
259typedef uint16_t faceid; 262typedef uint16_t faceid;
260 263
261typedef struct { 264struct maptex
265{
262 GLuint name; 266 GLuint name;
263 int w, h; 267 int w, h;
264 float s, t; 268 float s, t;
265 uint8_t r, g, b, a; 269 uint8_t r, g, b, a;
266 tileid smoothtile; 270 tileid smoothtile;
267 uint8_t smoothlevel; 271 uint8_t smoothlevel;
268 uint8_t unused; /* set to zero on use */ 272 uint8_t unused; /* set to zero on use */
269} maptex; 273};
270 274
271typedef struct { 275struct mapcell
276{
272 uint32_t player; 277 uint32_t player;
273 tileid tile[3]; 278 tileid tile[3];
274 uint16_t darkness; 279 uint16_t darkness;
275 uint8_t stat_width, stat_hp, flags, smoothmax; 280 uint8_t stat_width, stat_hp, flags, smoothmax;
276} mapcell; 281};
277 282
278typedef struct { 283struct maprow
284{
279 int32_t c0, c1; 285 int32_t c0, c1;
280 mapcell *col; 286 mapcell *col;
281} maprow; 287};
282 288
283typedef struct map { 289struct mapgrid {
284 int x, y, w, h; 290 int x, y, w, h;
285 int ox, oy; /* offset to virtual global coordinate system */ 291 int ox, oy; /* offset to virtual global coordinate system */
286 int faces; tileid *face2tile; // [faceid] 292 int faces; tileid *face2tile; // [faceid]
287 int texs; maptex *tex; // [tileid] 293 int texs; maptex *tex; // [tileid]
288 294
289 int32_t rows; 295 int32_t rows;
290 maprow *row; 296 maprow *row;
291} *DC__Map; 297};
298
299typedef mapgrid *DC__Map;
292 300
293static char * 301static char *
294prepend (char *ptr, int sze, int inc) 302prepend (char *ptr, int sze, int inc)
295{ 303{
296 char *p; 304 char *p;
314 322
315#define Append(type,ptr,sze,inc) (ptr) = (type *)append ((char *)ptr, (sze) * sizeof (type), (inc) * sizeof (type)) 323#define Append(type,ptr,sze,inc) (ptr) = (type *)append ((char *)ptr, (sze) * sizeof (type), (inc) * sizeof (type))
316#define Prepend(type,ptr,sze,inc) (ptr) = (type *)prepend ((char *)ptr, (sze) * sizeof (type), (inc) * sizeof (type)) 324#define Prepend(type,ptr,sze,inc) (ptr) = (type *)prepend ((char *)ptr, (sze) * sizeof (type), (inc) * sizeof (type))
317 325
318static void 326static void
319need_facenum (struct map *self, faceid face) 327need_facenum (struct mapgrid *self, faceid face)
320{ 328{
321 while (self->faces <= face) 329 while (self->faces <= face)
322 { 330 {
323 Append (tileid, self->face2tile, self->faces, self->faces); 331 Append (tileid, self->face2tile, self->faces, self->faces);
324 self->faces *= 2; 332 self->faces *= 2;
325 } 333 }
326} 334}
327 335
328static void 336static void
329need_texid (struct map *self, int texid) 337need_texid (struct mapgrid *self, int texid)
330{ 338{
331 while (self->texs <= texid) 339 while (self->texs <= texid)
332 { 340 {
333 Append (maptex, self->tex, self->texs, self->texs); 341 Append (maptex, self->tex, self->texs, self->texs);
334 self->texs *= 2; 342 self->texs *= 2;
335 } 343 }
336} 344}
337 345
338static maprow * 346static maprow *
339map_get_row (DC__Map self, int y) 347map_get_row (mapgrid *self, int y)
340{ 348{
341 if (0 > y) 349 if (0 > y)
342 { 350 {
343 int extend = - y + MAP_EXTEND_Y; 351 int extend = - y + MAP_EXTEND_Y;
344 Prepend (maprow, self->row, self->rows, extend); 352 Prepend (maprow, self->row, self->rows, extend);
382 390
383 return row->col + (x - row->c0); 391 return row->col + (x - row->c0);
384} 392}
385 393
386static mapcell * 394static mapcell *
387map_get_cell (DC__Map self, int x, int y) 395map_get_cell (mapgrid *self, int x, int y)
388{ 396{
389 return row_get_cell (map_get_row (self, y), x); 397 return row_get_cell (map_get_row (self, y), x);
390} 398}
391 399
392static void 400static void
393map_clear (DC__Map self) 401map_clear (mapgrid *self)
394{ 402{
395 int r; 403 int r;
396 404
397 for (r = 0; r < self->rows; r++) 405 for (r = 0; r < self->rows; r++)
398 Safefree (self->row[r].col); 406 Safefree (self->row[r].col);
416 (cell)->flags = 0; \ 424 (cell)->flags = 0; \
417 (cell)->player = 0; \ 425 (cell)->player = 0; \
418 } while (0) 426 } while (0)
419 427
420static void 428static void
421map_blank (DC__Map self, int x0, int y0, int w, int h) 429map_blank (mapgrid *self, int x0, int y0, int w, int h)
422{ 430{
423 int x, y; 431 int x, y;
424 maprow *row; 432 maprow *row;
425 mapcell *cell; 433 mapcell *cell;
426 434
1894PROTOTYPES: DISABLE 1902PROTOTYPES: DISABLE
1895 1903
1896DC::Map 1904DC::Map
1897new (SV *klass) 1905new (SV *klass)
1898 CODE: 1906 CODE:
1899 New (0, RETVAL, 1, struct map); 1907 New (0, RETVAL, 1, mapgrid);
1900 RETVAL->x = 0; 1908 RETVAL->x = 0;
1901 RETVAL->y = 0; 1909 RETVAL->y = 0;
1902 RETVAL->w = 0; 1910 RETVAL->w = 0;
1903 RETVAL->h = 0; 1911 RETVAL->h = 0;
1904 RETVAL->ox = 0; 1912 RETVAL->ox = 0;
2216draw (DC::Map self, int mx, int my, int sw, int sh, int Tw, int Th, U32 player = 0xffffffff, int sdx = 0, int sdy = 0) 2224draw (DC::Map self, int mx, int my, int sw, int sh, int Tw, int Th, U32 player = 0xffffffff, int sdx = 0, int sdy = 0)
2217 CODE: 2225 CODE:
2218{ 2226{
2219 int x, y, z; 2227 int x, y, z;
2220 2228
2221 uint32_t smooth_level[256 / 32]; // one bit for every possible smooth level
2222 static uint8_t smooth_max[256][256]; // egad, fast and wasteful on memory (64k) 2229 static uint8_t smooth_max[256][256]; // egad, fast and wasteful on memory (64k), also, static!
2223 smooth_key skey;
2224 int pl_x, pl_y; 2230 int pl_x, pl_y;
2225 maptex pl_tex; 2231 maptex pl_tex;
2226 rc_t *rc = rc_alloc (); 2232 rc_t *rc = rc_alloc ();
2227 rc_t *rc_ov = rc_alloc (); 2233 rc_t *rc_ov = rc_alloc ();
2228 rc_key_t key; 2234 rc_key_t key;
2231 pl_tex.name = 0; 2237 pl_tex.name = 0;
2232 2238
2233 // that's current max. sorry. 2239 // that's current max. sorry.
2234 if (sw > 255) sw = 255; 2240 if (sw > 255) sw = 255;
2235 if (sh > 255) sh = 255; 2241 if (sh > 255) sh = 255;
2236
2237 // clear key, in case of extra padding
2238 memset (&skey, 0, sizeof (skey));
2239 2242
2240 memset (&key, 0, sizeof (key)); 2243 memset (&key, 0, sizeof (key));
2241 key.r = 255; 2244 key.r = 255;
2242 key.g = 255; 2245 key.g = 255;
2243 key.b = 255; 2246 key.b = 255;
2249 my += self->y; 2252 my += self->y;
2250 2253
2251 // first pass: determine smooth_max 2254 // first pass: determine smooth_max
2252 // rather ugly, if you ask me 2255 // rather ugly, if you ask me
2253 // could also be stored inside mapcell and updated on change 2256 // could also be stored inside mapcell and updated on change
2254 memset (smooth_max, 0, sizeof (smooth_max)); 2257 memset (smooth_max, 0, sizeof (smooth_max[0]) * (sh + 1));
2255 2258
2256 for (y = 0; y < sh; y++) 2259 for (y = 0; y < sh; y++)
2257 if (0 <= y + my && y + my < self->rows) 2260 if (0 <= y + my && y + my < self->rows)
2258 { 2261 {
2259 maprow *row = self->row + (y + my); 2262 maprow *row = self->row + (y + my);
2274 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 2277 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
2275 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 2278 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
2276 2279
2277 for (z = 0; z <= 2; z++) 2280 for (z = 0; z <= 2; z++)
2278 { 2281 {
2282 uint32_t smooth_level[256 / 32]; // one bit for every possible smooth level
2283 smooth_key skey;
2279 smooth_hash smooth; 2284 smooth_hash smooth;
2280 memset (smooth_level, 0, sizeof (smooth_level)); 2285 memset (smooth_level, 0, sizeof (smooth_level));
2281 key.texname = -1; 2286 key.texname = -1;
2282 2287
2283 for (y = 0; y < sh; y++) 2288 for (y = 0; y < sh; y++)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines