void item_draw(struct s_rend *rend, const struct v_item *hp, const GLfloat *M, float t) { const GLfloat s = ITEM_RADIUS; struct s_draw *draw = item_file(hp); glPushMatrix(); { glScalef(s, s, s); glDepthMask(GL_FALSE); { sol_bill(draw, rend, M, t); } glDepthMask(GL_TRUE); sol_draw(draw, rend, 0, 1); } glPopMatrix(); }
static void game_draw_fore(struct s_rend *rend, struct game_draw *gd, int pose, const float *M, int d, float t) { const float *ball_p = gd->vary.uv[0].p; struct s_draw *draw = &gd->draw; glPushMatrix(); { /* Rotate the environment about the position of the ball. */ game_draw_tilt(gd, d); /* Compute clipping planes for reflection and ball facing. */ game_clip_refl(d); game_clip_ball(gd, d, ball_p); if (d < 0) glEnable(GL_CLIP_PLANE0); switch (pose) { case POSE_LEVEL: sol_draw(draw, rend, 0, 1); break; case POSE_BALL: if (curr_tex_env == &tex_env_pose) { /* * We need the check above because otherwise the * active texture env is set up in a way that makes * level geometry visible, and we don't want that. */ glDepthMask(GL_FALSE); sol_draw(draw, rend, 0, 1); glDepthMask(GL_TRUE); } game_draw_balls(rend, draw->vary, M, t); break; case POSE_NONE: /* Draw the coins. */ game_draw_items(rend, draw->vary, M, t); /* Draw the floor. */ sol_draw(draw, rend, 0, 1); /* Draw the ball. */ game_draw_balls(rend, draw->vary, M, t); break; } /* Draw the billboards, entities, and particles. */ glDisable(GL_LIGHTING); glDepthMask(GL_FALSE); { sol_bill(draw, rend, M, t); game_draw_goals(rend, gd, M, t); game_draw_jumps(rend, gd, M, t); game_draw_swchs(rend, draw->vary); part_draw_coin(rend); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); } glDepthMask(GL_TRUE); glEnable(GL_LIGHTING); if (d < 0) glDisable(GL_CLIP_PLANE0); } glPopMatrix(); }