--- deliantra/Deliantra-Client/Client.xs 2018/11/18 03:06:13 1.326 +++ deliantra/Deliantra-Client/Client.xs 2018/11/18 12:01:50 1.327 @@ -289,11 +289,18 @@ struct mapgrid { int x, y, w, h; int ox, oy; /* offset to virtual global coordinate system */ - int faces; tileid *face2tile; // [faceid] - int texs; maptex *tex; // [tileid] + std::vector tile; + std::vector tex; int32_t rows; maprow *row; + + ~mapgrid () + { + clear_cells (); + } + + void clear_cells (); }; typedef mapgrid *DC__Map; @@ -323,26 +330,6 @@ #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) { @@ -397,22 +384,21 @@ return row_get_cell (map_get_row (self, y), x); } -static void -map_clear (mapgrid *self) +void mapgrid::clear_cells () { int r; - for (r = 0; r < self->rows; r++) - Safefree (self->row[r].col); + for (r = 0; r < rows; r++) + Safefree (row[r].col); - Safefree (self->row); + Safefree (row); - self->x = 0; - self->y = 0; - self->ox = 0; - self->oy = 0; - self->row = 0; - self->rows = 0; + x = 0; + y = 0; + ox = 0; + oy = 0; + row = 0; + rows = 0; } #define CELL_CLEAR(cell) \ @@ -1902,15 +1888,13 @@ DC::Map new (SV *klass) CODE: - New (0, RETVAL, 1, mapgrid); + RETVAL = new 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: @@ -1920,10 +1904,7 @@ DESTROY (DC::Map self) CODE: { - map_clear (self); - Safefree (self->face2tile); - Safefree (self->tex); - Safefree (self); + delete self; } void @@ -1935,57 +1916,55 @@ void clear (DC::Map self) CODE: - map_clear (self); + self->clear_cells (); void set_tileid (DC::Map self, int face, int tile) CODE: { - need_facenum (self, face); self->face2tile [face] = tile; - need_texid (self, tile); + if (self->tile.size () <= face) self->tile.resize (face + 1); + self->tile[face] = tile; + if (self->tex.size () <= tile) self->tex .resize (tile + 1); } void set_smooth (DC::Map self, int face, int smooth, int level) CODE: { - tileid texid; - maptex *tex; - - if (face < 0 || face >= self->faces) + if (face < 0 || face >= self->tile.size ()) return; - if (smooth < 0 || smooth >= self->faces) + if (smooth < 0 || smooth >= self->tile.size ()) return; - texid = self->face2tile [face]; + tileid texid = self->tile[face]; if (!texid) return; - tex = self->tex + texid; - tex->smoothtile = self->face2tile [smooth]; - tex->smoothlevel = level; + maptex &tex = self->tex[texid]; + tex.smoothtile = self->tile[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: { - need_texid (self, texid); + if (self->tex.size () < texid) self->tex.resize (texid + 1); { - 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 @@ -2001,20 +1980,20 @@ void expire_textures (DC::Map self, int texid, int count) PPCODE: - for (; texid < self->texs && count; ++texid, --count) + for (; texid < self->tex.size () && 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; } } @@ -2135,23 +2114,23 @@ for (z = 0; z <= 2; ++z) if (flags & (4 >> z)) { - faceid face = (data [0] << 8) + data [1]; data += 2; - need_facenum (self, face); - cell->tile [z] = self->face2tile [face]; + 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]; - 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)); } } } @@ -2810,13 +2789,13 @@ { tileid t = tile [z]; - if (t >= self->texs || (t && !self->tex [t].name)) + if (t >= self->tex.size () || (t && !self->tex[t].name)) { PUSHs (sv_2mortal (newSViv (t))); - need_texid (self, t); + if (self->tex.size () <= t) self->tex.resize (t + 1); } - cell->tile [z] = t; + cell->tile[z] = t; } } }