Add a material flag to force shadowing even on transparent materials
authorparasti <parasti@78b8d119-cf0a-0410-b17c-f493084dd1d7>
Fri, 21 Jan 2011 10:25:37 +0000 (10:25 +0000)
committerparasti <parasti@78b8d119-cf0a-0410-b17c-f493084dd1d7>
Fri, 21 Jan 2011 10:25:37 +0000 (10:25 +0000)
I probably shouldn't do this.

git-svn-id: https://s.snth.net/svn/neverball/trunk@3450 78b8d119-cf0a-0410-b17c-f493084dd1d7

share/solid.h
share/solid_gl.c

index 4e694b0..5700bd7 100644 (file)
@@ -87,6 +87,7 @@
 #define M_CLAMPED     32
 #define M_DECAL       64
 #define M_TWO_SIDED  128
+#define M_SHADOWED   256
 
 /* Billboard types. */
 
index 8515b26..6253257 100644 (file)
@@ -584,6 +584,7 @@ static void sol_load_objects(struct s_file *fp, int s)
         int tn = sol_enum_body(fp, bp, M_TRANSPARENT);
         int rn = sol_enum_body(fp, bp, M_REFLECTIVE);
         int dn = sol_enum_body(fp, bp, M_DECAL);
+        int sn = sol_enum_body(fp, bp, M_SHADOWED);
 
         /* Draw all opaque geometry, decals last. */
 
@@ -640,7 +641,7 @@ static void sol_load_objects(struct s_file *fp, int s)
 
         /* Draw all shadowed geometry. */
 
-        if (s && (on || rn))
+        if (s && (on || rn || sn))
         {
             fp->bv[i].sl = glGenLists(1);
 
@@ -649,6 +650,15 @@ static void sol_load_objects(struct s_file *fp, int s)
                 if (on) sol_shad_body(fp, fp->bv + i, M_OPAQUE, 0);
                 if (rn) sol_shad_body(fp, fp->bv + i, M_REFLECTIVE, 0);
                 if (dn) sol_shad_body(fp, fp->bv + i, M_OPAQUE, M_DECAL);
+                if (sn)
+                {
+                    /* Transparent shadowed geometry hack. */
+
+                    if (dn)
+                        sol_shad_body(fp, fp->bv + i, M_SHADOWED, M_DECAL);
+
+                    sol_shad_body(fp, fp->bv + i, M_SHADOWED, 0);
+                }
             }
             glEndList();
         }