mirror of
https://github.com/nunuhara/xsystem4.git
synced 2026-09-22 23:18:01 +03:00
ReignEngine: Remove hard limit on number of instances
Some maps in Toushin Toshi 3 have more than 32 instances.
This commit is contained in:
+2
-2
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user