[Tuxracer-checkins] CVS: tuxracer/src course_render.c,1.12,1.13 course_render.h,1.5,1.6
Status: Beta
Brought to you by:
jfpatry
From: Jasmin P. <jf...@us...> - 2000-08-31 15:47:47
|
Update of /cvsroot/tuxracer/tuxracer/src In directory slayer.i.sourceforge.net:/tmp/cvs-serv2917 Modified Files: course_render.c course_render.h Log Message: - Added routine to draw the fog plane - Cleaned up the rest of the code a bit Index: course_render.c =================================================================== RCS file: /cvsroot/tuxracer/tuxracer/src/course_render.c,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -r1.12 -r1.13 *** course_render.c 2000/08/26 23:29:31 1.12 --- course_render.c 2000/08/31 15:47:43 1.13 *************** *** 29,32 **** --- 29,33 ---- #include "fog.h" #include "course_quad.h" + #include "viewfrustum.h" /* *************** *** 299,308 **** setup_course_lighting(); - - glShadeModel( GL_SMOOTH ); } else { glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL ); set_material( white, black, 0.0 ); - glShadeModel( GL_FLAT ); } --- 300,306 ---- *************** *** 524,533 **** setup_course_lighting(); - - glShadeModel( GL_SMOOTH ); } else { glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL ); set_material( white, black, 0.0 ); - glShadeModel( GL_FLAT ); } --- 522,528 ---- *************** *** 585,594 **** setup_course_lighting(); - - glShadeModel( GL_SMOOTH ); } else { glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL ); set_material( white, black, 0.0 ); - glShadeModel( GL_FLAT ); } --- 580,586 ---- *************** *** 625,643 **** glVertex3f( -treeRadius, treeHeight, 0.0 ); ! if ( clip_course ) { ! if ( eye_pt.z - treeLocs[i].ray.pt.z > fwd_tree_detail_limit ) ! goto End_Quads; } - glTexCoord2f( 0., 0. ); - glVertex3f( 0.0, 0.0, -treeRadius ); - glTexCoord2f( 1., 0. ); - glVertex3f( 0.0, 0.0, treeRadius ); - glTexCoord2f( 1., 1. ); - glVertex3f( 0.0, treeHeight, treeRadius ); - glTexCoord2f( 0., 1. ); - glVertex3f( 0.0, treeHeight, -treeRadius ); - - End_Quads: glEnd(); glPopMatrix(); --- 617,633 ---- glVertex3f( -treeRadius, treeHeight, 0.0 ); ! if ( !clip_course || ! eye_pt.z - treeLocs[i].ray.pt.z < fwd_tree_detail_limit ) ! { ! glTexCoord2f( 0., 0. ); ! glVertex3f( 0.0, 0.0, -treeRadius ); ! glTexCoord2f( 1., 0. ); ! glVertex3f( 0.0, 0.0, treeRadius ); ! glTexCoord2f( 1., 1. ); ! glVertex3f( 0.0, treeHeight, treeRadius ); ! glTexCoord2f( 0., 1. ); ! glVertex3f( 0.0, treeHeight, -treeRadius ); } glEnd(); glPopMatrix(); *************** *** 645,646 **** --- 635,776 ---- } + + + /*! + Draws a fog plane at the far clipping plane to mask out clipping of terrain. + + \return none + \author jfpatry + \date Created: 2000-08-31 + \date Modified: 2000-08-31 + */ + void draw_fog_plane() + { + plane_t left_edge_plane, right_edge_plane; + plane_t left_clip_plane, right_clip_plane; + plane_t far_clip_plane; + plane_t bottom_clip_plane; + plane_t bottom_plane, top_plane; + + scalar_t course_width, course_length; + scalar_t course_angle, slope; + + point_t left_pt, right_pt, pt; + point_t top_left_pt, top_right_pt; + point_t bottom_left_pt, bottom_right_pt; + vector_t left_vec, right_vec; + scalar_t height; + + GLfloat *fog_colour; + + if ( is_fog_on() == False ) { + return; + } + + set_gl_options( FOG_PLANE ); + + get_course_dimensions( &course_width, &course_length ); + course_angle = get_course_angle(); + slope = tan( course_angle * M_PI / 180.0 ); + + left_edge_plane = make_plane( 1.0, 0.0, 0.0, 0.0 ); + + right_edge_plane = make_plane( -1.0, 0.0, 0.0, course_width ); + + far_clip_plane = get_far_clip_plane(); + left_clip_plane = get_left_clip_plane(); + right_clip_plane = get_right_clip_plane(); + bottom_clip_plane = get_bottom_clip_plane(); + + + /* Find the bottom plane */ + bottom_plane.nml = make_vector( 0.0, 1, -slope ); + height = get_terrain_base_height( 0 ); + + /* Unoptimized version + pt = make_point( 0, height, 0 ); + bottom_plane.d = -( pt.x * bottom_plane.nml.x + + pt.y * bottom_plane.nml.y + + pt.z * bottom_plane.nml.z ); + */ + bottom_plane.d = -height * bottom_plane.nml.y; + + /* Find the top plane */ + top_plane.nml = bottom_plane.nml; + height = get_terrain_max_height( 0 ); + top_plane.d = -height * top_plane.nml.y; + + /* Now find the bottom left and right points of the fog plane */ + if ( !intersect_planes( bottom_plane, far_clip_plane, left_clip_plane, + &left_pt ) ) + { + return; + } + + if ( !intersect_planes( bottom_plane, far_clip_plane, right_clip_plane, + &right_pt ) ) + { + return; + } + + if ( !intersect_planes( top_plane, far_clip_plane, left_clip_plane, + &top_left_pt ) ) + { + return; + } + + if ( !intersect_planes( top_plane, far_clip_plane, right_clip_plane, + &top_right_pt ) ) + { + return; + } + + if ( !intersect_planes( bottom_clip_plane, far_clip_plane, + left_clip_plane, &bottom_left_pt ) ) + { + return; + } + + if ( !intersect_planes( bottom_clip_plane, far_clip_plane, + right_clip_plane, &bottom_right_pt ) ) + { + return; + } + + left_vec = subtract_points( top_left_pt, left_pt ); + right_vec = subtract_points( top_right_pt, right_pt ); + + + /* Now draw the fog plane */ + + set_gl_options( FOG_PLANE ); + + fog_colour = get_fog_colour(); + + glColor4fv( fog_colour ); + + glBegin( GL_QUAD_STRIP ); + + glVertex3f( bottom_left_pt.x, bottom_left_pt.y, bottom_left_pt.z ); + glVertex3f( bottom_right_pt.x, bottom_right_pt.y, bottom_right_pt.z ); + glVertex3f( left_pt.x, left_pt.y, left_pt.z ); + glVertex3f( right_pt.x, right_pt.y, right_pt.z ); + + glColor4f( fog_colour[0], fog_colour[1], fog_colour[2], 0.9 ); + glVertex3f( top_left_pt.x, top_left_pt.y, top_left_pt.z ); + glVertex3f( top_right_pt.x, top_right_pt.y, top_right_pt.z ); + + glColor4f( fog_colour[0], fog_colour[1], fog_colour[2], 0.3 ); + pt = move_point( top_left_pt, left_vec ); + glVertex3f( pt.x, pt.y, pt.z ); + pt = move_point( top_right_pt, right_vec ); + glVertex3f( pt.x, pt.y, pt.z ); + + glColor4f( fog_colour[0], fog_colour[1], fog_colour[2], 0.0 ); + pt = move_point( top_left_pt, scale_vector( 3.0, left_vec ) ); + glVertex3f( pt.x, pt.y, pt.z ); + pt = move_point( top_right_pt, scale_vector( 3.0, right_vec ) ); + glVertex3f( pt.x, pt.y, pt.z ); + + glEnd(); + } Index: course_render.h =================================================================== RCS file: /cvsroot/tuxracer/tuxracer/src/course_render.h,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -r1.5 -r1.6 *** course_render.h 2000/08/15 03:08:12 1.5 --- course_render.h 2000/08/31 15:47:43 1.6 *************** *** 40,43 **** --- 40,44 ---- void set_course_lighting( bool_t state ); bool_t get_course_lighting(); + void draw_fog_plane(); #endif |