ReignEngine: Remove hard limit on number of instances

Some maps in Toushin Toshi 3 have more than 32 instances.
This commit is contained in:
kichikuou
2022-07-23 21:41:41 +09:00
parent fc81d0ec4e
commit 2918a6310c
5 changed files with 17 additions and 11 deletions
+2 -2
View File
@@ -17,7 +17,6 @@
#ifndef SYSTEM4_REIGN_H
#define SYSTEM4_REIGN_H
#define RE_MAX_INSTANCES 32
#define RE_NR_BACK_CGS 16
#include <cglm/types.h>
@@ -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;
+1 -1
View File
@@ -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++)
+11 -5
View File
@@ -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)
+2 -2
View File
@@ -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;
+1 -1
View File
@@ -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)