3d: Store 3D engine version in a global variable

So that we don't have to pass it around everywhere.
This commit is contained in:
kichikuou
2024-10-22 10:16:51 +09:00
parent d7b7879747
commit ecd71896b3
4 changed files with 20 additions and 16 deletions
-1
View File
@@ -98,7 +98,6 @@ struct RE_back_cg {
struct RE_plugin {
struct draw_plugin plugin;
enum RE_plugin_version version;
int sprite;
int nr_instances;
struct RE_instance **instances;
+3 -1
View File
@@ -193,6 +193,8 @@ struct billboard_texture {
// reign.c
extern enum RE_plugin_version re_plugin_version;
void RE_instance_update_local_transform(struct RE_instance *inst);
// model.c
@@ -208,7 +210,7 @@ struct archive_data *RE_get_aar_entry(struct archive *aar, const char *dir, cons
// renderer.c
struct RE_renderer *RE_renderer_new(enum RE_plugin_version version);
struct RE_renderer *RE_renderer_new(void);
void RE_renderer_free(struct RE_renderer *r);
void RE_renderer_set_viewport_size(struct RE_renderer *r, int width, int height);
bool RE_renderer_load_billboard_texture(struct RE_renderer *r, int cg_no);
+5 -2
View File
@@ -34,6 +34,8 @@
#include "vm.h"
#include "xsystem4.h"
enum RE_plugin_version re_plugin_version;
static struct RE_instance *create_instance(struct RE_plugin *plugin)
{
struct RE_instance *instance = xcalloc(1, sizeof(struct RE_instance));
@@ -207,6 +209,8 @@ static void update_bones(struct RE_instance *inst)
struct RE_plugin *RE_plugin_new(enum RE_plugin_version version)
{
re_plugin_version = version;
char *aar_path = gamedir_path("Data/ReignData.red");
int error = ARCHIVE_SUCCESS;
struct archive *aar = (struct archive *)aar_open(aar_path, MMAP_IF_64BIT, &error);
@@ -220,7 +224,6 @@ struct RE_plugin *RE_plugin_new(enum RE_plugin_version version)
return NULL;
struct RE_plugin *plugin = xcalloc(1, sizeof(struct RE_plugin));
plugin->version = version;
plugin->plugin.name = "ReignEngine";
plugin->plugin.update = RE_render;
plugin->plugin.to_json = RE_to_json;
@@ -262,7 +265,7 @@ bool RE_plugin_bind(struct RE_plugin *plugin, int sprite)
struct sact_sprite *sp = sact_try_get_sprite(sprite);
if (!sp)
return false;
plugin->renderer = RE_renderer_new(plugin->version);
plugin->renderer = RE_renderer_new();
plugin->sprite = sprite;
sprite_bind_plugin(sp, &plugin->plugin);
struct texture *texture = sprite_get_texture(sp);
+12 -12
View File
@@ -59,7 +59,7 @@ enum draw_phase {
DRAW_TRANSPARENT,
};
static GLuint load_shader(const char *vertex_shader_path, const char *fragment_shader_path, enum RE_plugin_version version)
static GLuint load_shader(const char *vertex_shader_path, const char *fragment_shader_path)
{
char defines[256];
snprintf(defines, sizeof(defines),
@@ -68,7 +68,7 @@ static GLuint load_shader(const char *vertex_shader_path, const char *fragment_s
"#define ENGINE %d",
RE_REIGN_PLUGIN,
RE_TAPIR_PLUGIN,
version);
re_plugin_version);
GLuint program = glCreateProgram();
GLuint vertex_shader = gfx_load_shader_file(vertex_shader_path, GL_VERTEX_SHADER, defines);
GLuint fragment_shader = gfx_load_shader_file(fragment_shader_path, GL_FRAGMENT_SHADER, defines);
@@ -101,12 +101,12 @@ static GLuint load_shader(const char *vertex_shader_path, const char *fragment_s
return program;
}
static void init_shadow_renderer(struct shadow_renderer *sr, enum RE_plugin_version version)
static void init_shadow_renderer(struct shadow_renderer *sr)
{
GLint orig_fbo;
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &orig_fbo);
sr->program = load_shader("shaders/reign_shadow.v.glsl", "shaders/reign_shadow.f.glsl", version);
sr->program = load_shader("shaders/reign_shadow.v.glsl", "shaders/reign_shadow.f.glsl");
sr->local_transform = glGetUniformLocation(sr->program, "local_transform");
sr->view_transform = glGetUniformLocation(sr->program, "view_transform");
sr->has_bones = glGetUniformLocation(sr->program, "has_bones");
@@ -136,13 +136,13 @@ static void destroy_shadow_renderer(struct shadow_renderer *sr)
glDeleteProgram(sr->program);
}
static void init_outline_renderer(struct outline_renderer *or, enum RE_plugin_version version)
static void init_outline_renderer(struct outline_renderer *or)
{
if (version < RE_TAPIR_PLUGIN) {
if (re_plugin_version < RE_TAPIR_PLUGIN) {
or->program = 0;
return;
}
or->program = load_shader("shaders/reign_outline.v.glsl", "shaders/reign_outline.f.glsl", version);
or->program = load_shader("shaders/reign_outline.v.glsl", "shaders/reign_outline.f.glsl");
or->local_transform = glGetUniformLocation(or->program, "local_transform");
or->view_transform = glGetUniformLocation(or->program, "view_transform");
or->proj_transform = glGetUniformLocation(or->program, "proj_transform");
@@ -203,11 +203,11 @@ static void destroy_billboard_mesh(struct RE_renderer *r)
glDeleteBuffers(1, &r->billboard_attr_buffer);
}
struct RE_renderer *RE_renderer_new(enum RE_plugin_version version)
struct RE_renderer *RE_renderer_new(void)
{
struct RE_renderer *r = xcalloc(1, sizeof(struct RE_renderer));
r->program = load_shader("shaders/reign.v.glsl", "shaders/reign.f.glsl", version);
r->program = load_shader("shaders/reign.v.glsl", "shaders/reign.f.glsl");
r->view_transform = glGetUniformLocation(r->program, "view_transform");
r->texture = glGetUniformLocation(r->program, "tex");
r->local_transform = glGetUniformLocation(r->program, "local_transform");
@@ -258,8 +258,8 @@ struct RE_renderer *RE_renderer_new(enum RE_plugin_version version)
glGenRenderbuffers(1, &r->depth_buffer);
init_shadow_renderer(&r->shadow, version);
init_outline_renderer(&r->outline, version);
init_shadow_renderer(&r->shadow);
init_outline_renderer(&r->outline);
init_billboard_mesh(r);
r->billboard_textures = ht_create(256);
r->last_frame_timestamp = SDL_GetTicks();
@@ -913,7 +913,7 @@ void RE_render(struct sact_sprite *sp)
if (!r || plugin->suspended)
return;
if (plugin->version == RE_TAPIR_PLUGIN) {
if (re_plugin_version == RE_TAPIR_PLUGIN) {
uint32_t timestamp = SDL_GetTicks();
RE_build_model(plugin, timestamp - r->last_frame_timestamp);
r->last_frame_timestamp = timestamp;