--- deliantra/Deliantra-Client/Client.xs 2018/11/18 12:01:50 1.327 +++ deliantra/Deliantra-Client/Client.xs 2018/11/18 12:47:55 1.328 @@ -289,18 +289,11 @@ struct mapgrid { int x, y, w, h; int ox, oy; /* offset to virtual global coordinate system */ - std::vector tile; - std::vector tex; + int faces; tileid *face2tile; // [faceid] + int texs; maptex *tex; // [tileid] int32_t rows; maprow *row; - - ~mapgrid () - { - clear_cells (); - } - - void clear_cells (); }; typedef mapgrid *DC__Map; @@ -330,6 +323,26 @@ #define Append(type,ptr,sze,inc) (ptr) = (type *)append ((char *)ptr, (sze) * sizeof (type), (inc) * sizeof (type)) #define Prepend(type,ptr,sze,inc) (ptr) = (type *)prepend ((char *)ptr, (sze) * sizeof (type), (inc) * sizeof (type)) +static void +need_facenum (struct mapgrid *self, faceid face) +{ + while (self->faces <= face) + { + Append (tileid, self->face2tile, self->faces, self->faces); + self->faces *= 2; + } +} + +static void +need_texid (struct mapgrid *self, int texid) +{ + while (self->texs <= texid) + { + Append (maptex, self->tex, self->texs, self->texs); + self->texs *= 2; + } +} + static maprow * map_get_row (mapgrid *self, int y) { @@ -384,21 +397,22 @@ return row_get_cell (map_get_row (self, y), x); } -void mapgrid::clear_cells () +static void +map_clear (mapgrid *self) { int r; - for (r = 0; r < rows; r++) - Safefree (row[r].col); + for (r = 0; r < self->rows; r++) + Safefree (self->row[r].col); - Safefree (row); + Safefree (self->row); - x = 0; - y = 0; - ox = 0; - oy = 0; - row = 0; - rows = 0; + self->x = 0; + self->y = 0; + self->ox = 0; + self->oy = 0; + self->row = 0; + self->rows = 0; } #define CELL_CLEAR(cell) \ @@ -1888,13 +1902,15 @@ DC::Map new (SV *klass) CODE: - RETVAL = new mapgrid; + New (0, RETVAL, 1, mapgrid); RETVAL->x = 0; RETVAL->y = 0; RETVAL->w = 0; RETVAL->h = 0; RETVAL->ox = 0; RETVAL->oy = 0; + RETVAL->faces = 8192; Newz (0, RETVAL->face2tile, RETVAL->faces, tileid); + RETVAL->texs = 8192; Newz (0, RETVAL->tex , RETVAL->texs , maptex); RETVAL->rows = 0; RETVAL->row = 0; OUTPUT: @@ -1904,7 +1920,10 @@ DESTROY (DC::Map self) CODE: { - delete self; + map_clear (self); + Safefree (self->face2tile); + Safefree (self->tex); + Safefree (self); } void @@ -1916,55 +1935,57 @@ void clear (DC::Map self) CODE: - self->clear_cells (); + map_clear (self); void set_tileid (DC::Map self, int face, int tile) CODE: { - if (self->tile.size () <= face) self->tile.resize (face + 1); - self->tile[face] = tile; - if (self->tex.size () <= tile) self->tex .resize (tile + 1); + need_facenum (self, face); self->face2tile [face] = tile; + need_texid (self, tile); } void set_smooth (DC::Map self, int face, int smooth, int level) CODE: { - if (face < 0 || face >= self->tile.size ()) + tileid texid; + maptex *tex; + + if (face < 0 || face >= self->faces) return; - if (smooth < 0 || smooth >= self->tile.size ()) + if (smooth < 0 || smooth >= self->faces) return; - tileid texid = self->tile[face]; + texid = self->face2tile [face]; if (!texid) return; - maptex &tex = self->tex[texid]; - tex.smoothtile = self->tile[smooth]; - tex.smoothlevel = level; + tex = self->tex + texid; + tex->smoothtile = self->face2tile [smooth]; + tex->smoothlevel = level; } void set_texture (DC::Map self, int texid, int name, int w, int h, float s, float t, int r, int g, int b, int a) CODE: { - if (self->tex.size () < texid) self->tex.resize (texid + 1); + need_texid (self, texid); { - maptex &tex = self->tex[texid]; + maptex *tex = self->tex + texid; - tex.name = name; - tex.w = w; - tex.h = h; - tex.s = s; - tex.t = t; - tex.r = r; - tex.g = g; - tex.b = b; - tex.a = a; + tex->name = name; + tex->w = w; + tex->h = h; + tex->s = s; + tex->t = t; + tex->r = r; + tex->g = g; + tex->b = b; + tex->a = a; } // somewhat hackish, but for textures that require it, it really @@ -1980,20 +2001,20 @@ void expire_textures (DC::Map self, int texid, int count) PPCODE: - for (; texid < self->tex.size () && count; ++texid, --count) + for (; texid < self->texs && count; ++texid, --count) { - maptex &tex = self->tex[texid]; + maptex *tex = self->tex + texid; - if (tex.name) + if (tex->name) { - if (tex.unused) + if (tex->unused) { - tex.name = 0; - tex.unused = 0; + tex->name = 0; + tex->unused = 0; XPUSHs (sv_2mortal (newSViv (texid))); } else - tex.unused = 1; + tex->unused = 1; } } @@ -2114,23 +2135,23 @@ for (z = 0; z <= 2; ++z) if (flags & (4 >> z)) { - faceid face = (data[0] << 8) + data[1]; data += 2; - if (self->tile.size () <= face) self->tile.resize (face + 1); - cell->tile[z] = self->tile[face]; + faceid face = (data [0] << 8) + data [1]; data += 2; + need_facenum (self, face); + cell->tile [z] = self->face2tile [face]; - if (cell->tile[z]) + if (cell->tile [z]) { - maptex &tex = self->tex[cell->tile[z]]; - tex.unused = 0; - if (!tex.name) + maptex *tex = self->tex + cell->tile [z]; + tex->unused = 0; + if (!tex->name) av_push (missing, newSViv (cell->tile [z])); - if (tex.smoothtile) + if (tex->smoothtile) { - maptex &smooth = self->tex[tex.smoothtile]; - smooth.unused = 0; - if (!smooth.name) - av_push (missing, newSViv (tex.smoothtile)); + maptex *smooth = self->tex + tex->smoothtile; + smooth->unused = 0; + if (!smooth->name) + av_push (missing, newSViv (tex->smoothtile)); } } } @@ -2789,13 +2810,13 @@ { tileid t = tile [z]; - if (t >= self->tex.size () || (t && !self->tex[t].name)) + if (t >= self->texs || (t && !self->tex [t].name)) { PUSHs (sv_2mortal (newSViv (t))); - if (self->tex.size () <= t) self->tex.resize (t + 1); + need_texid (self, t); } - cell->tile[z] = t; + cell->tile [z] = t; } } }