Fixed rendering decals after opaque material and before transparent material. This...
authorrlk <rlk@78b8d119-cf0a-0410-b17c-f493084dd1d7>
Sun, 27 Mar 2011 19:38:28 +0000 (19:38 +0000)
committerrlk <rlk@78b8d119-cf0a-0410-b17c-f493084dd1d7>
Sun, 27 Mar 2011 19:38:28 +0000 (19:38 +0000)
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

share/solid_draw.c

index f38a4e1..1712b6e 100644 (file)
@@ -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. */