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(); }
static void game_draw_fore(int pose, float rx, float ry, int d, const float p[3]) { const float *ball_p = file.uv->p; const float ball_r = file.uv->r; #ifndef NO_LIGHT glPushAttrib(GL_LIGHTING_BIT | GL_COLOR_BUFFER_BIT); #else glPushAttrib(GL_COLOR_BUFFER_BIT); #endif { glPushMatrix(); { /* Rotate the environment about the position of the ball. */ glTranslatef(+ball_p[0], +ball_p[1] * d, +ball_p[2]); glRotatef(-game_rz * d, view_e[2][0], view_e[2][1], view_e[2][2]); glRotatef(-game_rx * d, view_e[0][0], view_e[0][1], view_e[0][2]); glTranslatef(-ball_p[0], -ball_p[1] * d, -ball_p[2]); #ifndef DREAMCAST_KGL_NOT_IMPLEMENT if (d < 0) { GLdouble e[4]; e[0] = +0; e[1] = +1; e[2] = +0; e[3] = -0.00001; glEnable(GL_CLIP_PLANE0); glClipPlane(GL_CLIP_PLANE0, e); } #endif /* Draw the floor. */ sol_draw(&file); // 50 % if (config_get_d(CONFIG_SHADOW)) { shad_draw_set(ball_p, ball_r); sol_shad(&file); shad_draw_clr(); } /* Draw the game elements. */ glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); if (pose == 0) { part_draw_coin(-rx * d, -ry); game_draw_coins(&file); // 5% game_draw_balls(&file); // 5% } game_draw_goals(&file, -rx * d, -ry); game_draw_jumps(&file); game_draw_swchs(&file); #ifndef DREAMCAST_KGL_NOT_IMPLEMENT glDisable(GL_CLIP_PLANE0); #endif } glPopMatrix(); } glPopAttrib(); }