3d: Add reset_draw_uniforms() to prevent per-draw state leaks

This adds a helper that resets every per-draw uniform to a neutral
default and call it at the start of the billboard, .pae and .3de paths.

This fixes uv_scroll and use_blend_texture leaks from a previously
rendered model.
This commit is contained in:
kichikuou
2026-06-12 15:00:40 +09:00
parent 4dcc50d6ca
commit 7b9565fe25
+24 -32
View File
@@ -551,6 +551,26 @@ static void render_skinned_model(struct RE_instance *inst, struct RE_renderer *r
render_static_model(inst->shadow_volume_instance, r, phase);
}
static void reset_draw_uniforms(struct RE_renderer *r)
{
glUniform1f(r->alpha_mod, 1.0f);
glUniform3f(r->diffuse_mod, 1.0f, 1.0f, 1.0f);
glUniform3f(r->color_add, 0.0f, 0.0f, 0.0f);
glUniform2f(r->uv_scroll, 0.0f, 0.0f);
glUniform1i(r->has_bones, GL_FALSE);
glUniform1f(r->specular_strength, 0.0f);
glUniform1f(r->specular_shininess, 0.0f);
glUniform1i(r->use_specular_map, GL_FALSE);
glUniform1f(r->rim_exponent, 0.0f);
glUniform3f(r->rim_color, 0.0f, 0.0f, 0.0f);
glUniform1i(r->use_normal_map, GL_FALSE);
glUniform1i(r->use_blend_texture, GL_FALSE);
glUniform1f(r->shadow_darkness, 0.0f);
glUniform1i(r->alpha_mode, ALPHA_BLEND);
glUniform1i(r->fog_type, 0);
glUniform1i(r->diffuse_type, DIFFUSE_NORMAL);
}
static void render_billboard(struct RE_instance *inst, struct RE_renderer *r, mat4 view_mat, enum draw_phase phase)
{
if (!inst->draw)
@@ -576,20 +596,11 @@ static void render_billboard(struct RE_instance *inst, struct RE_renderer *r, ma
glm_mat4_pick3(local_transform, normal_transform);
glUniform3fv(r->instance_ambient, 1, inst->ambient);
glUniform3f(r->diffuse_mod, 1.f, 1.f, 1.f);
glUniformMatrix4fv(r->local_transform, 1, GL_FALSE, local_transform[0]);
glUniformMatrix3fv(r->normal_transform, 1, GL_FALSE, normal_transform[0]);
glUniform1i(r->has_bones, GL_FALSE);
reset_draw_uniforms(r);
glUniform1f(r->alpha_mod, inst->alpha);
glUniform1f(r->specular_strength, 0.0);
glUniform1f(r->specular_shininess, 0.0);
glUniform1i(r->use_specular_map, GL_FALSE);
glUniform1f(r->rim_exponent, 0.0);
glUniform1i(r->diffuse_type, DIFFUSE_NORMAL);
glUniform1i(r->use_normal_map, GL_FALSE);
glUniform1f(r->shadow_darkness, 0.0f);
glUniform1i(r->alpha_mode, ALPHA_BLEND);
glUniform1i(r->fog_type, inst->plugin->fog_mode ? inst->plugin->fog_type : 0);
switch (inst->draw_type) {
case RE_DRAW_TYPE_NORMAL:
@@ -825,17 +836,7 @@ static void render_s3de_effect(struct RE_instance *inst, struct RE_renderer *r,
RE_instance_update_local_transform(inst);
glUniform3fv(r->instance_ambient, 1, inst->ambient);
glUniform3f(r->diffuse_mod, 1.f, 1.f, 1.f);
glUniform1i(r->has_bones, GL_FALSE);
glUniform1f(r->specular_strength, 0.0);
glUniform1f(r->specular_shininess, 0.0);
glUniform1i(r->use_specular_map, GL_FALSE);
glUniform1f(r->rim_exponent, 0.0);
glUniform1i(r->use_normal_map, GL_FALSE);
glUniform1f(r->shadow_darkness, 0.0f);
glUniform1i(r->alpha_mode, ALPHA_BLEND);
glUniform1i(r->fog_type, 0);
reset_draw_uniforms(r);
if (phase == DRAW_TRANSPARENT)
glDepthMask(GL_FALSE);
@@ -905,16 +906,7 @@ static void render_particle_effect(struct RE_instance *inst, struct RE_renderer
return;
glUniform3fv(r->instance_ambient, 1, inst->ambient);
glUniform3f(r->diffuse_mod, 1.f, 1.f, 1.f);
glUniform1i(r->has_bones, GL_FALSE);
glUniform1f(r->specular_strength, 0.0);
glUniform1f(r->specular_shininess, 0.0);
glUniform1i(r->use_specular_map, GL_FALSE);
glUniform1f(r->rim_exponent, 0.0);
glUniform1i(r->use_normal_map, GL_FALSE);
glUniform1f(r->shadow_darkness, 0.0f);
glUniform1i(r->alpha_mode, ALPHA_BLEND);
reset_draw_uniforms(r);
glDepthMask(GL_FALSE);