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(); }
void game_draw(int pose, float t) { static const float a[4] = { 0.2f, 0.2f, 0.2f, 1.0f }; static const float s[4] = { 0.0f, 0.0f, 0.0f, 1.0f }; static const float e[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; static const float h[1] = { 0.0f }; const float light_p[4] = { 8.f, 32.f, 8.f, 1.f }; const struct s_file *fp = &file; float fov = FOV; if (jump_b) fov *= 2.0f * fabsf(jump_dt - 0.5f); video_push_persp(fov, 0.1f, FAR_DIST); glPushAttrib(GL_LIGHTING_BIT); glPushMatrix(); { float T[16], M[16], v[3], rx, ry; m_view(T, view_c, view_p, view_e[1]); m_xps(M, T); v_sub(v, view_c, view_p); rx = V_DEG(fatan2f(-v[1], fsqrtf(v[0] * v[0] + v[2] * v[2]))); ry = V_DEG(fatan2f(+v[0], -v[2])); glTranslatef(0.f, 0.f, -v_len(v)); glMultMatrixf(M); glTranslatef(-view_c[0], -view_c[1], -view_c[2]); /* Center the skybox about the position of the camera. */ glPushMatrix(); { glTranslatef(view_p[0], view_p[1], view_p[2]); back_draw(0); } glPopMatrix(); glEnable(GL_LIGHT0); glLightfv(GL_LIGHT0, GL_POSITION, light_p); /* Draw the floor. */ sol_draw(fp, 0, 1); if (config_get_d(CONFIG_SHADOW) && !pose) { shad_draw_set(fp->uv[ball].p, fp->uv[ball].r); sol_shad(fp); shad_draw_clr(); } /* Draw the game elements. */ glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); if (pose == 0) { game_draw_balls(fp, T, t); game_draw_vect(fp); } glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, a); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, s); glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, e); glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, h); game_draw_goals(fp); glEnable(GL_COLOR_MATERIAL); glDisable(GL_LIGHTING); glDisable(GL_TEXTURE_2D); glDepthMask(GL_FALSE); { game_draw_jumps(fp); game_draw_swchs(fp); } glDepthMask(GL_TRUE); glEnable(GL_TEXTURE_2D); glEnable(GL_LIGHTING); glDisable(GL_COLOR_MATERIAL); } glPopMatrix(); glPopAttrib(); video_pop_matrix(); }
void game_draw(int pose, float t) { const float light_p[4] = { 8.f, 32.f, 8.f, 0.f }; struct s_draw *fp = &file.draw; struct s_rend rend; float fov = FOV; if (!state) return; fp->shadow_ui = ball; game_shadow_conf(1); sol_draw_enable(&rend); if (jump_b) fov *= 2.0f * fabsf(jump_dt - 0.5f); video_push_persp(fov, 0.1f, FAR_DIST); glPushMatrix(); { float T[16], M[16], v[3], rx, ry; m_view(T, view_c, view_p, view_e[1]); m_xps(M, T); v_sub(v, view_c, view_p); rx = V_DEG(fatan2f(-v[1], fsqrtf(v[0] * v[0] + v[2] * v[2]))); ry = V_DEG(fatan2f(+v[0], -v[2])); glTranslatef(0.f, 0.f, -v_len(v)); glMultMatrixf(M); glTranslatef(-view_c[0], -view_c[1], -view_c[2]); /* Center the skybox about the position of the camera. */ glPushMatrix(); { glTranslatef(view_p[0], view_p[1], view_p[2]); back_draw(&rend, 0); } glPopMatrix(); glEnable(GL_LIGHT0); glLightfv(GL_LIGHT0, GL_POSITION, light_p); /* Draw the floor. */ sol_draw(fp, &rend, 0, 1); /* Draw the game elements. */ glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); if (pose == 0) { game_draw_balls(&rend, fp->vary, T, t); game_draw_vect(&rend, fp->vary); } glDisable(GL_LIGHTING); glDepthMask(GL_FALSE); { game_draw_goals(&rend, fp->base); game_draw_jumps(&rend, fp->base); game_draw_swchs(&rend, fp->vary); } glDepthMask(GL_TRUE); glEnable(GL_LIGHTING); } glPopMatrix(); video_pop_matrix(); sol_draw_disable(&rend); game_shadow_conf(0); }
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(); }