mirror of
https://github.com/JGRennison/OpenTTD-patches.git
synced 2024-11-19 15:25:39 +00:00
(svn r4483) - NewGRF: Dynamically allocate memory for 'real' spritegroups. This removes the limit of 16 loading/unloading states, although will result in less memory usage as most of the time the full fixed allocation wasn't used.
This commit is contained in:
parent
09aef493a6
commit
3d137e9c0f
12
newgrf.c
12
newgrf.c
@ -1480,15 +1480,6 @@ static void NewSpriteGroup(byte *buf, int len)
|
|||||||
if (_cur_grffile->first_spriteset == 0)
|
if (_cur_grffile->first_spriteset == 0)
|
||||||
_cur_grffile->first_spriteset = _cur_grffile->spriteset_start;
|
_cur_grffile->first_spriteset = _cur_grffile->spriteset_start;
|
||||||
|
|
||||||
if (numloaded > 16) {
|
|
||||||
grfmsg(GMS_WARN, "NewSpriteGroup: More than 16 sprites in group %x, skipping the rest.", setid);
|
|
||||||
numloaded = 16;
|
|
||||||
}
|
|
||||||
if (numloading > 16) {
|
|
||||||
grfmsg(GMS_WARN, "NewSpriteGroup: More than 16 sprites in group %x, skipping the rest.", setid);
|
|
||||||
numloading = 16;
|
|
||||||
}
|
|
||||||
|
|
||||||
group = calloc(1, sizeof(*group));
|
group = calloc(1, sizeof(*group));
|
||||||
group->type = SGT_REAL;
|
group->type = SGT_REAL;
|
||||||
rg = &group->g.real;
|
rg = &group->g.real;
|
||||||
@ -1497,6 +1488,9 @@ static void NewSpriteGroup(byte *buf, int len)
|
|||||||
rg->loaded_count = numloaded;
|
rg->loaded_count = numloaded;
|
||||||
rg->loading_count = numloading;
|
rg->loading_count = numloading;
|
||||||
|
|
||||||
|
rg->loaded = calloc(rg->loaded_count, sizeof(*rg->loaded));
|
||||||
|
rg->loading = calloc(rg->loading_count, sizeof(*rg->loading));
|
||||||
|
|
||||||
DEBUG(grf, 6) ("NewSpriteGroup: New SpriteGroup 0x%02hhx, %u views, %u loaded, %u loading, sprites %u - %u",
|
DEBUG(grf, 6) ("NewSpriteGroup: New SpriteGroup 0x%02hhx, %u views, %u loaded, %u loading, sprites %u - %u",
|
||||||
setid, rg->sprites_per_set, rg->loaded_count, rg->loading_count,
|
setid, rg->sprites_per_set, rg->loaded_count, rg->loading_count,
|
||||||
_cur_grffile->spriteset_start - _cur_grffile->sprite_offset,
|
_cur_grffile->spriteset_start - _cur_grffile->sprite_offset,
|
||||||
|
2
sprite.c
2
sprite.c
@ -132,6 +132,8 @@ void UnloadSpriteGroup(SpriteGroup **group_ptr)
|
|||||||
for (i = 0; i < rsg->loaded_count; i++) {
|
for (i = 0; i < rsg->loaded_count; i++) {
|
||||||
if (rsg->loaded[i] != NULL) UnloadSpriteGroup(&rsg->loaded[i]);
|
if (rsg->loaded[i] != NULL) UnloadSpriteGroup(&rsg->loaded[i]);
|
||||||
}
|
}
|
||||||
|
free(group->g.real.loaded);
|
||||||
|
free(group->g.real.loading);
|
||||||
free(group);
|
free(group);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
10
sprite.h
10
sprite.h
@ -32,8 +32,6 @@ typedef struct DrawTileSprites {
|
|||||||
typedef struct SpriteGroup SpriteGroup;
|
typedef struct SpriteGroup SpriteGroup;
|
||||||
|
|
||||||
typedef struct RealSpriteGroup {
|
typedef struct RealSpriteGroup {
|
||||||
// XXX: Would anyone ever need more than 16 spritesets? Maybe we should
|
|
||||||
// use even less, now we take whole 8kb for custom sprites table, oh my!
|
|
||||||
byte sprites_per_set; // means number of directions - 4 or 8
|
byte sprites_per_set; // means number of directions - 4 or 8
|
||||||
|
|
||||||
// Loaded = in motion, loading = not moving
|
// Loaded = in motion, loading = not moving
|
||||||
@ -43,10 +41,10 @@ typedef struct RealSpriteGroup {
|
|||||||
// with small amount of cargo whilst loading is for stations with a lot
|
// with small amount of cargo whilst loading is for stations with a lot
|
||||||
// of da stuff.
|
// of da stuff.
|
||||||
|
|
||||||
byte loaded_count;
|
byte loaded_count; ///< Number of loaded groups
|
||||||
SpriteGroup *loaded[16]; // sprite ids
|
SpriteGroup **loaded; ///< List of loaded groups (can be SpriteIDs or Callback results)
|
||||||
byte loading_count;
|
byte loading_count; ///< Number of loading groups
|
||||||
SpriteGroup *loading[16]; // sprite ids
|
SpriteGroup **loading; ///< List of loading groups (can be SpriteIDs or Callback results)
|
||||||
} RealSpriteGroup;
|
} RealSpriteGroup;
|
||||||
|
|
||||||
/* Shared by deterministic and random groups. */
|
/* Shared by deterministic and random groups. */
|
||||||
|
Loading…
Reference in New Issue
Block a user