From: rlk Date: Sun, 27 Mar 2011 19:38:28 +0000 (+0000) Subject: Fixed rendering decals after opaque material and before transparent material. This... X-Git-Url: https://vcs.maemo.org/git/?a=commitdiff_plain;h=568ad3a6d98b5f265dd70be7184bb82172e037e3;p=neverball Fixed rendering decals after opaque material and before transparent material. This was causing Z fighting. Fixed material state revert in sol_draw. This was allowing state to leak the level and corrupt the GUI. git-svn-id: https://s.snth.net/svn/neverball/branches/gles@3533 78b8d119-cf0a-0410-b17c-f493084dd1d7 --- diff --git a/share/solid_draw.c b/share/solid_draw.c index f38a4e1..1712b6e 100644 --- a/share/solid_draw.c +++ b/share/solid_draw.c @@ -54,17 +54,21 @@ static void sol_transform(const struct s_vary *vary, /* Compute the shadow texture transform */ - v_sub(d, vary->uv->p, p); - glActiveTexture_(GL_TEXTURE1); glMatrixMode(GL_TEXTURE); { - float k = 0.25f / vary->uv->r; - glLoadIdentity(); - glTranslatef(0.5f - k * d[0], - 0.5f - k * d[2], 0.0f); - glScalef(k, k, 0.0f); + + if (vary->uc) + { + float k = 0.25f / vary->uv->r; + + v_sub(d, vary->uv->p, p); + + glTranslatef(0.5f - k * d[0], + 0.5f - k * d[2], 0.0f); + glScalef(k, k, 0.0f); + } } glMatrixMode(GL_MODELVIEW); glActiveTexture_(GL_TEXTURE0); @@ -637,20 +641,24 @@ void sol_draw(const struct s_draw *draw, int mask, int test) { const struct d_mtrl *mq = &default_draw_mtrl; - /* Render all opaque geometry. */ + /* Render all opaque geometry, decals last. */ - mq = sol_draw_all(draw, mq, M_TRANSPARENT | M_REFLECTIVE, 0); + mq = sol_draw_all(draw, mq, M_TRANSPARENT | M_REFLECTIVE | M_DECAL, 0); + mq = sol_draw_all(draw, mq, M_TRANSPARENT | M_REFLECTIVE, M_DECAL); - /* Render all transparent geometry. */ + /* Render all transparent geometry, decals first. */ if (!test) glDisable(GL_DEPTH_TEST); if (!mask) glDepthMask(GL_FALSE); { - sol_draw_all(draw, mq, M_REFLECTIVE, M_TRANSPARENT); + mq = sol_draw_all(draw, mq, M_REFLECTIVE, M_DECAL | M_TRANSPARENT); + mq = sol_draw_all(draw, mq, M_REFLECTIVE | M_DECAL, M_TRANSPARENT); } if (!mask) glDepthMask(GL_TRUE); if (!test) glEnable(GL_DEPTH_TEST); + /* Revert the material state. */ + mq = sol_apply_mtrl(&default_draw_mtrl, mq); /* Revert the buffer object state. */