diff --git a/include/reign.h b/include/reign.h index eaba6c2..a5cb8ed 100644 --- a/include/reign.h +++ b/include/reign.h @@ -17,7 +17,6 @@ #ifndef SYSTEM4_REIGN_H #define SYSTEM4_REIGN_H -#define RE_MAX_INSTANCES 32 #define RE_NR_BACK_CGS 16 #include @@ -66,7 +65,8 @@ struct RE_back_cg { struct RE_plugin { struct draw_plugin plugin; int sprite; - struct RE_instance *instances[RE_MAX_INSTANCES]; + int nr_instances; + struct RE_instance **instances; struct archive *aar; struct RE_renderer *renderer; struct RE_camera camera; diff --git a/src/3d/debug.c b/src/3d/debug.c index 3de2782..8cb14dc 100644 --- a/src/3d/debug.c +++ b/src/3d/debug.c @@ -120,7 +120,7 @@ void RE_debug_print(struct sact_sprite *sp, int indent) indent_printf(indent, "camera = {x=%f, y=%f, z=%f, pitch=%f, roll=%f, yaw=%f},\n", SPREAD_VEC3(p->camera.pos), p->camera.pitch, p->camera.roll, p->camera.yaw); - for (int i = 0; i < RE_MAX_INSTANCES; i++) + for (int i = 0; i < p->nr_instances; i++) print_instance(p->instances[i], i, indent); for (int i = 0; i < RE_NR_BACK_CGS; i++) diff --git a/src/3d/reign.c b/src/3d/reign.c index 7fe93ae..92fe549 100644 --- a/src/3d/reign.c +++ b/src/3d/reign.c @@ -173,6 +173,8 @@ struct RE_plugin *RE_plugin_new(void) plugin->plugin.name = "ReignEngine"; plugin->plugin.update = RE_render; plugin->plugin.debug_print = RE_debug_print; + plugin->nr_instances = 16; + plugin->instances = xcalloc(plugin->nr_instances, sizeof(struct RE_instance *)); plugin->aar = aar; for (int i = 0; i < RE_NR_BACK_CGS; i++) RE_back_cg_init(&plugin->back_cg[i]); @@ -181,10 +183,11 @@ struct RE_plugin *RE_plugin_new(void) void RE_plugin_free(struct RE_plugin *plugin) { - for (int i = 0; i < RE_MAX_INSTANCES; i++) { + for (int i = 0; i < plugin->nr_instances; i++) { if (plugin->instances[i]) free_instance(plugin->instances[i]); } + free(plugin->instances); archive_free(plugin->aar); if (plugin->renderer) RE_renderer_free(plugin->renderer); @@ -222,7 +225,7 @@ bool RE_build_model(struct RE_plugin *plugin, int elapsed_ms) if (!plugin) return false; - for (int i = 0; i < RE_MAX_INSTANCES; i++) { + for (int i = 0; i < plugin->nr_instances; i++) { if (plugin->instances[i]) animate(plugin->instances[i], elapsed_ms); } @@ -241,14 +244,17 @@ int RE_create_instance(struct RE_plugin *plugin) { if (!plugin) return -1; - for (int i = 0; i < RE_MAX_INSTANCES; i++) { + for (int i = 0; i < plugin->nr_instances; i++) { if (!plugin->instances[i]) { plugin->instances[i] = create_instance(plugin); return i; } } - WARNING("too many instances"); - return -1; + int old_size = plugin->nr_instances; + plugin->nr_instances *= 2; + plugin->instances = xrealloc_array(plugin->instances, old_size, plugin->nr_instances, sizeof(struct RE_instance *)); + plugin->instances[old_size] = create_instance(plugin); + return old_size; } bool RE_release_instance(struct RE_plugin *plugin, int instance) diff --git a/src/3d/renderer.c b/src/3d/renderer.c index 937eb1b..ae7d479 100644 --- a/src/3d/renderer.c +++ b/src/3d/renderer.c @@ -321,7 +321,7 @@ static void setup_lights(struct RE_plugin *plugin) struct RE_renderer *r = plugin->renderer; glUniform3fv(r->view_pos, 1, plugin->camera.pos); int light_index = 0; - for (int i = 0; i < RE_MAX_INSTANCES; i++) { + for (int i = 0; i < plugin->nr_instances; i++) { struct RE_instance *inst = plugin->instances[i]; if (!inst) continue; @@ -397,7 +397,7 @@ void RE_render(struct sact_sprite *sp) setup_lights(plugin); - for (int i = 0; i < RE_MAX_INSTANCES; i++) { + for (int i = 0; i < plugin->nr_instances; i++) { struct RE_instance *inst = plugin->instances[i]; if (!inst || !inst->draw) continue; diff --git a/src/hll/ReignEngine.c b/src/hll/ReignEngine.c index 1938ac8..711724e 100644 --- a/src/hll/ReignEngine.c +++ b/src/hll/ReignEngine.c @@ -40,7 +40,7 @@ static struct RE_instance *get_instance(unsigned plugin, unsigned instance) struct RE_plugin *rp = get_plugin(plugin); if (!rp) return NULL; - return instance < RE_MAX_INSTANCES ? rp->instances[instance] : NULL; + return instance < (unsigned)rp->nr_instances ? rp->instances[instance] : NULL; } static struct motion *get_motion(unsigned plugin, unsigned instance)