mirror of
https://github.com/nunuhara/xsystem4.git
synced 2026-09-22 23:18:01 +03:00
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:
+24
-32
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user