Proper ball shadow removal in poser mode. Patch from Elviz.
[neverball] / ball / game.c
index 9ba923b..e66021b 100644 (file)
@@ -66,6 +66,8 @@ static float jump_p[3];                 /* Jump destination                  */
 static float fade_k = 0.0;              /* Fade in/out level                 */
 static float fade_d = 0.0;              /* Fade in/out direction             */
 
+/*---------------------------------------------------------------------------*/
+
 static int   grow = 0;                  /* Should the ball be changing size? */
 static float grow_orig = 0;             /* the original ball size            */
 static float grow_goal = 0;             /* how big or small to get!          */
@@ -77,58 +79,64 @@ static int   got_orig = 0;              /* Do we know original ball size?    */
 #define GROW_BIG   1.5f                 /* large factor                      */
 #define GROW_SMALL 0.5f                 /* small factor                      */
 
-/*---------------------------------------------------------------------------*/
+static int   grow_state = 0;            /* Current state (values -1, 0, +1)  */
 
-static void grow_set(const struct s_file *fp, int type)
+static void grow_init(const struct s_file *fp, int type)
 {
     if (!got_orig)
     {
-        grow_orig = fp->uv->r;
-        grow_goal = grow_orig;
-        grow_strt = grow_orig;
-        got_orig  = 1;
+        grow_orig  = fp->uv->r;
+        grow_goal  = grow_orig;
+        grow_strt  = grow_orig;
+
+        grow_state = 0;
+
+        got_orig   = 1;
     }
 
-    switch (type)
+    if (type == ITEM_SHRINK)
     {
-    case ITEM_SHRINK:
         audio_play(AUD_SHRINK, 1.f);
 
-        if (grow_goal == grow_orig * GROW_SMALL)
-            return;
-        else if (grow_goal == grow_orig * GROW_BIG)
-        {
-            grow_goal = grow_orig;
-            grow = 1;
-        }
-        else
+        switch (grow_state)
         {
+        case -1:
+            break;
+
+        case  0:
             grow_goal = grow_orig * GROW_SMALL;
+            grow_state = -1;
             grow = 1;
-        }
-
-        break;
+            break;
 
-    case ITEM_GROW:
+        case +1:
+            grow_goal = grow_orig;
+            grow_state = 0;
+            grow = 1;
+            break;
+        }
+    }
+    else if (type == ITEM_GROW)
+    {
         audio_play(AUD_GROW, 1.f);
 
-        if (grow_goal == grow_orig * GROW_BIG)
-            return;
-        else if (grow_goal == grow_orig * GROW_SMALL)
+        switch (grow_state)
         {
-            grow = 1;
+        case -1:
             grow_goal = grow_orig;
-        }
-        else
-        {
-            grow_goal = grow_orig * GROW_BIG;
+            grow_state = 0;
             grow = 1;
-        }
+            break;
 
-        break;
+        case  0:
+            grow_goal = grow_orig * GROW_BIG;
+            grow_state = +1;
+            grow = 1;
+            break;
 
-    default:
-        break;
+        case +1:
+            break;
+        }
     }
 
     if (grow)
@@ -138,10 +146,13 @@ static void grow_set(const struct s_file *fp, int type)
     }
 }
 
-static void grow_ball(const struct s_file *fp, float dt)
+static void grow_step(const struct s_file *fp, float dt)
 {
     float dr;
 
+    if (!grow)
+        return;
+
     /* Calculate new size based on how long since you touched the coin... */
 
     grow_t += dt;
@@ -159,6 +170,8 @@ static void grow_ball(const struct s_file *fp, float dt)
     fp->uv->r = dr;
 }
 
+/*---------------------------------------------------------------------------*/
+
 static void view_init(void)
 {
     view_a  = 0.f;
@@ -533,7 +546,7 @@ static void game_draw_fore(int pose, float rx, float ry, int d, const float p[3]
 
             sol_draw(&file);
 
-            if (config_get_d(CONFIG_SHADOW))
+            if (pose == 0 && config_get_d(CONFIG_SHADOW))
             {
                 shad_draw_set(ball_p, ball_r);
                 sol_shad(&file);
@@ -777,7 +790,7 @@ static int game_update_state(int bt)
         item_color(hp, c);
         part_burst(p, c);
 
-        grow_set(fp, hp->t);
+        grow_init(fp, hp->t);
 
         if (hp->t == ITEM_COIN)
         {
@@ -886,8 +899,7 @@ int game_step(const float g[3], float dt, int bt)
             game_rz = game_iz;
         }
 
-        if (grow)
-            grow_ball(fp, dt);
+        grow_step(fp, dt);
 
         game_update_grav(h, g);
         part_step(h, t);