void CEnvironment::DrawFog () { TPlane bottom_plane, top_plane; TVector3 left, right; TVector3 topleft, topright; TVector3 bottomleft = NullVec; TVector3 bottomright = NullVec; float height; if (!fog.is_on) return; // the clipping planes are calculated by view frustum (view.cpp) leftclip = get_left_clip_plane (); rightclip = get_right_clip_plane (); farclip = get_far_clip_plane (); bottomclip = get_bottom_clip_plane (); // --------------- calculate the planes --------------------------- float slope = tan (ANGLES_TO_RADIANS (Course.GetCourseAngle())); // TPlane left_edge_plane = MakePlane (1.0, 0.0, 0.0, 0.0); // TPlane right_edge_plane = MakePlane (-1.0, 0.0, 0.0, Course.width); bottom_plane.nml = MakeVector (0.0, 1, -slope); height = Course.GetBaseHeight (0); bottom_plane.d = -height * bottom_plane.nml.y; top_plane.nml = bottom_plane.nml; height = Course.GetMaxHeight (0) + fog.height; top_plane.d = -height * top_plane.nml.y; if (!IntersectPlanes (bottom_plane, farclip, leftclip, &left)) return; if (!IntersectPlanes (bottom_plane, farclip, rightclip, &right)) return; if (!IntersectPlanes (top_plane, farclip, leftclip, &topleft)) return; if (!IntersectPlanes (top_plane, farclip, rightclip, &topright)) return; if (!IntersectPlanes (bottomclip, farclip, leftclip, &bottomleft)) return; if (!IntersectPlanes (bottomclip, farclip, rightclip, &bottomright)) return; TVector3 leftvec = SubtractVectors (topleft, left); TVector3 rightvec = SubtractVectors (topright, right); TVector3 vpoint1 = AddVectors (topleft, leftvec); TVector3 vpoint2 = AddVectors (topright, rightvec); TVector3 vpoint3 = AddVectors (topleft, ScaleVector (3.0, leftvec)); TVector3 vpoint4 = AddVectors (topright, ScaleVector (3.0, rightvec)); // --------------- draw the fog plane ----------------------------- set_gl_options (FOG_PLANE); glEnable (GL_FOG); glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); // only the alpha channel is used const GLfloat col[] = { // bottom density 0, 0, 0, 1.0, 0, 0, 0, 1.0, 0, 0, 0, 1.0, 0, 0, 0, 1.0, // top density 0, 0, 0, 0.9, 0, 0, 0, 0.9, // left/right density 0, 0, 0, 0.3, 0, 0, 0, 0.3, // top/bottom density 0, 0, 0, 0.0, 0, 0, 0, 0.0 }; const GLfloat vtx[] = { bottomleft.x, bottomleft.y, bottomleft.z, bottomright.x, bottomright.y, bottomright.z, left.x, left.y, left.z, right.x, right.y, right.z, topleft.x, topleft.y, topleft.z, topright.x, topright.y, topright.z, vpoint1.x, vpoint1.y, vpoint1.z, vpoint2.x, vpoint2.y, vpoint2.z, vpoint3.x, vpoint3.y, vpoint3.z, vpoint4.x, vpoint4.y, vpoint4.z }; glColorPointer(4, GL_FLOAT, 0, col); glVertexPointer(3, GL_FLOAT, 0, vtx); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); }
void CEnvironment::DrawFog () { if (!fog.is_on) return; TPlane bottom_plane, top_plane; TVector3 left, right, vpoint; TVector3 topleft, topright; TVector3 bottomleft, bottomright; // the clipping planes are calculated by view frustum (view.cpp) const TPlane& leftclip = get_left_clip_plane (); const TPlane& rightclip = get_right_clip_plane (); const TPlane& farclip = get_far_clip_plane (); const TPlane& bottomclip = get_bottom_clip_plane (); // --------------- calculate the planes --------------------------- float slope = tan (ANGLES_TO_RADIANS (Course.GetCourseAngle())); // TPlane left_edge_plane = MakePlane (1.0, 0.0, 0.0, 0.0); // TPlane right_edge_plane = MakePlane (-1.0, 0.0, 0.0, Course.width); bottom_plane.nml = TVector3(0.0, 1, -slope); float height = Course.GetBaseHeight (0); bottom_plane.d = -height * bottom_plane.nml.y; top_plane.nml = bottom_plane.nml; height = Course.GetMaxHeight (0) + fog.height; top_plane.d = -height * top_plane.nml.y; if (!IntersectPlanes (bottom_plane, farclip, leftclip, &left)) return; if (!IntersectPlanes (bottom_plane, farclip, rightclip, &right)) return; if (!IntersectPlanes (top_plane, farclip, leftclip, &topleft)) return; if (!IntersectPlanes (top_plane, farclip, rightclip, &topright)) return; if (!IntersectPlanes (bottomclip, farclip, leftclip, &bottomleft)) return; if (!IntersectPlanes (bottomclip, farclip, rightclip, &bottomright)) return; TVector3 leftvec = SubtractVectors (topleft, left); TVector3 rightvec = SubtractVectors (topright, right); // --------------- draw the fog plane ----------------------------- ScopedRenderMode rm(FOG_PLANE); glEnable (GL_FOG); // only the alpha channel is used float bottom_dens[4] = {0, 0, 0, 1.0}; float top_dens[4] = {0, 0, 0, 0.9}; float leftright_dens[4] = {0, 0, 0, 0.3}; float top_bottom_dens[4] = {0, 0, 0, 0.0}; glBegin (GL_QUAD_STRIP); glColor4fv (bottom_dens); glVertex3f (bottomleft.x, bottomleft.y, bottomleft.z); glVertex3f (bottomright.x, bottomright.y, bottomright.z); glVertex3f (left.x, left.y, left.z); glVertex3f (right.x, right.y, right.z); glColor4fv (top_dens); glVertex3f (topleft.x, topleft.y, topleft.z); glVertex3f (topright.x, topright.y, topright.z); glColor4fv (leftright_dens); vpoint = AddVectors (topleft, leftvec); glVertex3f (vpoint.x, vpoint.y, vpoint.z); vpoint = AddVectors (topright, rightvec); glVertex3f (vpoint.x, vpoint.y, vpoint.z); glColor4fv (top_bottom_dens); vpoint = AddVectors (topleft, ScaleVector (3.0, leftvec)); glVertex3f (vpoint.x, vpoint.y, vpoint.z); vpoint = AddVectors (topright, ScaleVector (3.0, rightvec)); glVertex3f (vpoint.x, vpoint.y, vpoint.z); glEnd(); }
/*! 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( ANGLES_TO_RADIANS( course_angle ) ); 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; if(get_player_data(local_player())->view.mode == TUXEYE) { bottom_clip_plane.nml = make_vector( 0.0, 1, -slope ); height = get_terrain_base_height( 0 ) - 40; bottom_clip_plane.d = -height * bottom_clip_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 ); #ifdef __APPLE__DISABLED__ #undef glEnableClientState #undef glDisableClientState #undef glVertexPointer #undef glColorPointer #undef glDrawArrays point_t pt1,pt2,pt3,pt4; pt1 = move_point( top_left_pt, left_vec ); pt2 = move_point( top_right_pt, right_vec ); pt3 = move_point( top_left_pt, scale_vector( 3.0, left_vec ) ); pt4 = move_point( top_right_pt, scale_vector( 3.0, right_vec ) ); const GLfloat verticesFog []= { bottom_left_pt.x, bottom_left_pt.y, bottom_left_pt.z, bottom_right_pt.x, bottom_right_pt.y, bottom_right_pt.z, left_pt.x, left_pt.y, left_pt.z, right_pt.x, right_pt.y, right_pt.z, top_left_pt.x, top_left_pt.y, top_left_pt.z, top_right_pt.x, top_right_pt.y, top_right_pt.z, pt1.x, pt1.y, pt1.z, pt2.x, pt2.y, pt2.z, pt3.x, pt3.y, pt3.z, pt4.x, pt4.y, pt4.z }; const GLfloat colorsFog []= { fog_colour[0], fog_colour[1], fog_colour[2], fog_colour[3], fog_colour[0], fog_colour[1], fog_colour[2], fog_colour[3], fog_colour[0], fog_colour[1], fog_colour[2], fog_colour[3], fog_colour[0], fog_colour[1], fog_colour[2], fog_colour[3], fog_colour[0], fog_colour[1], fog_colour[2], 0.9 , fog_colour[0], fog_colour[1], fog_colour[2], 0.9 , fog_colour[0], fog_colour[1], fog_colour[2], 0.3 , fog_colour[0], fog_colour[1], fog_colour[2], 0.3 , fog_colour[0], fog_colour[1], fog_colour[2], 0.0 , fog_colour[0], fog_colour[1], fog_colour[2], 0.0 , }; glEnableClientState (GL_VERTEX_ARRAY); // glEnableClientState (GL_COLOR_ARRAY); // glDisableClientState(GL_TEXTURE_COORD_ARRAY); glVertexPointer (3, GL_FLOAT , 0, verticesFog); glColorPointer(4, GL_FLOAT, 0, colorsFog); glDrawArrays(GL_TRIANGLE_STRIP, 0, 10); //glDisableClientState(GL_COLOR_ARRAY_POINTER); #else 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(); #endif }