]> git.mxchange.org Git - flightgear.git/commitdiff
/Simulator/Objects/fragment.hxx
authorcurt <curt>
Thu, 10 Sep 1998 19:07:09 +0000 (19:07 +0000)
committercurt <curt>
Thu, 10 Sep 1998 19:07:09 +0000 (19:07 +0000)
  Nested fgFACE inside fgFRAGMENT since its not used anywhere else.

./Simulator/Objects/material.cxx
./Simulator/Objects/material.hxx
  Made fgMATERIAL and fgMATERIAL_MGR bona fide classes with private
  data members - that should keep the rabble happy :)

./Simulator/Scenery/tilemgr.cxx
  In viewable() delay evaluation of eye[0] and eye[1] in until they're
  actually needed.
  Change to fgTileMgrRender() to call fgMATERIAL_MGR::render_fragments()
  method.

./Include/fg_stl_config.h
./Include/auto_ptr.hxx
  Added support for g++ 2.7.
  Further changes to other files are forthcoming.

Brief summary of changes required for g++ 2.7.
  operator->() not supported by iterators: use (*i).x instead of i->x
  default template arguments not supported,
  <functional> doesn't have mem_fun_ref() needed by callbacks.
  some std include files have different names.
  template member functions not supported.

Objects/fragment.hxx
Objects/material.cxx
Objects/material.hxx
Scenery/tilemgr.cxx

index 3c9e728e4a92c8597ab6be9b8995a241af862626..b2d4f81d8d7d6edea73ee1902e03c05f8726dda2 100644 (file)
@@ -66,30 +66,21 @@ using namespace std;
 class fgTILE;
 class fgMATERIAL;
 
+// Object fragment data class
+class fgFRAGMENT {
 
-class fgFACE {
-public:
-    int n1, n2, n3;
-
-    explicit fgFACE( int a = 0, int b =0, int c =0 )
-       : n1(a), n2(b), n3(c) {}
-
-    fgFACE( const fgFACE & image )
-       : n1(image.n1), n2(image.n2), n3(image.n3) {}
+private:
+    struct fgFACE {
+       int n1, n2, n3;
 
-    ~fgFACE() {}
+       fgFACE( int a = 0, int b =0, int c =0 )
+           : n1(a), n2(b), n3(c) {}
 
-    bool operator < ( const fgFACE & rhs ) { return n1 < rhs.n1; }
-};
+       fgFACE( const fgFACE & image )
+           : n1(image.n1), n2(image.n2), n3(image.n3) {}
 
-inline bool
-operator == ( const fgFACE& lhs, const fgFACE & rhs )
-{
-    return (lhs.n1 == rhs.n1) && (lhs.n2 == rhs.n2) && (lhs.n3 == rhs.n3);
-}
-
-// Object fragment data class
-class fgFRAGMENT {
+       ~fgFACE() {}
+    };
 
 public:
     // culling data for this object fragment (fine grain culling)
@@ -151,7 +142,7 @@ public:
     // operators
     fgFRAGMENT & operator = ( const fgFRAGMENT & rhs );
 
-    bool operator <  ( const fgFRAGMENT & rhs ) {
+    bool operator <  ( const fgFRAGMENT & rhs ) const {
        // This is completely arbitrary. It satisfies RW's STL implementation
        return bounding_radius < rhs.bounding_radius;
     }
@@ -166,6 +157,13 @@ public:
     }
 };
 
+inline bool
+operator == ( const fgFRAGMENT::fgFACE& lhs,
+             const fgFRAGMENT::fgFACE& rhs )
+{
+    return (lhs.n1 == rhs.n1) && (lhs.n2 == rhs.n2) && (lhs.n3 == rhs.n3);
+}
+
 inline bool
 operator == ( const fgFRAGMENT & lhs, const fgFRAGMENT & rhs ) {
     return (( lhs.center.x - rhs.center.x ) < FG_EPSILON &&
@@ -178,6 +176,33 @@ operator == ( const fgFRAGMENT & lhs, const fgFRAGMENT & rhs ) {
 
 
 // $Log$
+// Revision 1.4  1998/09/10 19:07:09  curt
+// /Simulator/Objects/fragment.hxx
+//   Nested fgFACE inside fgFRAGMENT since its not used anywhere else.
+//
+// ./Simulator/Objects/material.cxx
+// ./Simulator/Objects/material.hxx
+//   Made fgMATERIAL and fgMATERIAL_MGR bona fide classes with private
+//   data members - that should keep the rabble happy :)
+//
+// ./Simulator/Scenery/tilemgr.cxx
+//   In viewable() delay evaluation of eye[0] and eye[1] in until they're
+//   actually needed.
+//   Change to fgTileMgrRender() to call fgMATERIAL_MGR::render_fragments()
+//   method.
+//
+// ./Include/fg_stl_config.h
+// ./Include/auto_ptr.hxx
+//   Added support for g++ 2.7.
+//   Further changes to other files are forthcoming.
+//
+// Brief summary of changes required for g++ 2.7.
+//   operator->() not supported by iterators: use (*i).x instead of i->x
+//   default template arguments not supported,
+//   <functional> doesn't have mem_fun_ref() needed by callbacks.
+//   some std include files have different names.
+//   template member functions not supported.
+//
 // Revision 1.3  1998/09/08 21:40:44  curt
 // Updates from Bernie Bright.
 //
index 6625a334b3d24a5552a602c152fd5fe8dc48fc09..2b83892e361694c3ee7ee1b20b78c94ad08bd3d7 100644 (file)
 
 #include <string.h>
 
+#include "Include/fg_stl_config.h"
 #include <Debug/fg_debug.h>
 #include <Main/options.hxx>
 #include <Misc/fgstream.hxx>
+#include <Main/views.hxx>
+#include <Scenery/tile.hxx>
 
 #include "material.hxx"
+#include "fragment.hxx"
 #include "texload.h"
 
+
 // global material management class
 fgMATERIAL_MGR material_mgr;
 
 
 // Constructor
-fgMATERIAL::fgMATERIAL ( void ) {
-    alpha = 0;
+fgMATERIAL::fgMATERIAL ( void )
+    : texture_name(""),
+      alpha(0),
+      list_size(0)
+{
     ambient[0]  = ambient[1]  = ambient[2]  = ambient[3]  = 0.0;
     diffuse[0]  = diffuse[1]  = diffuse[2]  = diffuse[3]  = 0.0;
     specular[0] = specular[1] = specular[2] = specular[3] = 0.0;
@@ -60,11 +68,11 @@ int fgMATERIAL::append_sort_list( fgFRAGMENT *object ) {
     if ( list_size < FG_MAX_MATERIAL_FRAGS )
     {
        list[ list_size++ ] = object;
-       return 0;
+       return 1;
     }
     else
     {
-       return 1;
+       return 0;
     }
 }
 
@@ -220,6 +228,45 @@ fgMATERIAL_MGR::fgMATERIAL_MGR ( void ) {
 }
 
 
+void
+fgMATERIAL::render_fragments()
+{
+    if ( empty() )
+       return;
+
+    if ( current_options.get_textures() )
+    {
+#ifdef GL_VERSION_1_1
+       xglBindTexture(GL_TEXTURE_2D, texture_id);
+#elif GL_EXT_texture_object
+       xglBindTextureEXT(GL_TEXTURE_2D, texture_id);
+#else
+#  error port me
+#endif
+    } else {
+       xglMaterialfv (GL_FRONT, GL_AMBIENT, ambient);
+       xglMaterialfv (GL_FRONT, GL_DIFFUSE, diffuse);
+    }
+
+    fgTILE* last_tile_ptr = NULL;
+    for ( size_t i = 0; i < list_size; ++i )
+    {
+       fgFRAGMENT* frag_ptr = list[i];
+       current_view.tris_rendered += frag_ptr->num_faces;
+       if ( frag_ptr->tile_ptr != last_tile_ptr )
+       {
+           // new tile, new translate
+           xglLoadMatrixd( frag_ptr->tile_ptr->model_view );
+       }
+
+       // Woohoo!!!  We finally get to draw something!
+       // printf("  display_list = %d\n", frag_ptr->display_list);
+       xglCallList( frag_ptr->display_list );
+       last_tile_ptr = frag_ptr->tile_ptr;
+    }
+}
+
+
 // Load a library of material properties
 int fgMATERIAL_MGR::load_lib ( void ) {
     string material_name;
@@ -244,18 +291,19 @@ int fgMATERIAL_MGR::load_lib ( void ) {
        in.stream() >> material_name >> token;
 
        if ( token == '{' ) {
-           cout << "Loading material " << material_name << endl;
+           printf( "  Loading material %s\n", material_name.c_str() );
            fgMATERIAL m;
            in.stream() >> m;
+           m.load_texture();
            material_mgr.material_map[material_name] = m;
        }
     }
 
-    for ( iterator it = material_map.begin();
-         it != material_map.end(); ++it )
-    {
-       it->second.load_texture();
-    }
+//     iterator last = end();
+//     for ( iterator it = begin(); it != last; ++it )
+//     {
+//     (*it).second.load_texture();
+//     }
 
     return(1);
 }
@@ -263,10 +311,10 @@ int fgMATERIAL_MGR::load_lib ( void ) {
 
 // Initialize the transient list of fragments for each material property
 void fgMATERIAL_MGR::init_transient_material_lists( void ) {
-    for ( iterator it = material_map.begin();
-         it != material_map.end(); ++it )
+    iterator last = end();
+    for ( iterator it = begin(); it != last; ++it )
     {
-       it->second.init_sort_list();
+       (*it).second.init_sort_list();
     }
 }
 
@@ -274,9 +322,9 @@ bool
 fgMATERIAL_MGR::find( const string& material, fgMATERIAL*& mtl_ptr )
 {
     iterator it = material_map.find( material );
-    if ( it != material_map.end() )
+    if ( it != end() )
     {
-       mtl_ptr = &(it->second);
+       mtl_ptr = &((*it).second);
        return true;
     }
 
@@ -289,7 +337,44 @@ fgMATERIAL_MGR::~fgMATERIAL_MGR ( void ) {
 }
 
 
+void
+fgMATERIAL_MGR::render_fragments()
+{
+    current_view.tris_rendered = 0;
+    iterator last = end();
+    for ( iterator current = begin(); current != last; ++current )
+       (*current).second.render_fragments();
+}
+
+
 // $Log$
+// Revision 1.5  1998/09/10 19:07:11  curt
+// /Simulator/Objects/fragment.hxx
+//   Nested fgFACE inside fgFRAGMENT since its not used anywhere else.
+//
+// ./Simulator/Objects/material.cxx
+// ./Simulator/Objects/material.hxx
+//   Made fgMATERIAL and fgMATERIAL_MGR bona fide classes with private
+//   data members - that should keep the rabble happy :)
+//
+// ./Simulator/Scenery/tilemgr.cxx
+//   In viewable() delay evaluation of eye[0] and eye[1] in until they're
+//   actually needed.
+//   Change to fgTileMgrRender() to call fgMATERIAL_MGR::render_fragments()
+//   method.
+//
+// ./Include/fg_stl_config.h
+// ./Include/auto_ptr.hxx
+//   Added support for g++ 2.7.
+//   Further changes to other files are forthcoming.
+//
+// Brief summary of changes required for g++ 2.7.
+//   operator->() not supported by iterators: use (*i).x instead of i->x
+//   default template arguments not supported,
+//   <functional> doesn't have mem_fun_ref() needed by callbacks.
+//   some std include files have different names.
+//   template member functions not supported.
+//
 // Revision 1.4  1998/09/01 19:03:08  curt
 // Changes contributed by Bernie Bright <bbright@c031.aone.net.au>
 //  - The new classes in libmisc.tgz define a stream interface into zlib.
index 0e1302fd1cee350c47817fa1ebe247b6e1260b0a..4bbe5128e7ca96921a3bff100d193a559d83c3ef 100644 (file)
@@ -63,7 +63,7 @@ class fgFRAGMENT;
 // Material property class
 class fgMATERIAL {
 
-public:
+private:
     // OpenGL texture name
     GLuint texture_id;
 
@@ -80,11 +80,16 @@ public:
     // transient list of objects with this material type (used for sorting
     // by material to reduce GL state changes when rendering the scene
     fgFRAGMENT * list[FG_MAX_MATERIAL_FRAGS];
-    int list_size;
+    size_t list_size;
+
+public:
 
     // Constructor
     fgMATERIAL ( void );
 
+    size_t size() const { return list_size; }
+    bool empty() const { return list_size == 0; }
+
     // Sorting routines
     void init_sort_list( void ) {
        list_size = 0;
@@ -92,10 +97,14 @@ public:
 
     int append_sort_list( fgFRAGMENT *object );
 
+    void render_fragments();
+
     void load_texture();
 
     // Destructor
     ~fgMATERIAL ( void );
+
+    friend istream& operator >> ( istream& in, fgMATERIAL& m );
 };
 
 istream& operator >> ( istream& in, fgMATERIAL& m );
@@ -110,7 +119,11 @@ public:
     typedef container::iterator iterator;
     typedef container::const_iterator const_iterator;
 
-    container material_map;
+    iterator begin() { return material_map.begin(); }
+    const_iterator begin() const { return material_map.begin(); }
+
+    iterator end() { return material_map.end(); }
+    const_iterator end() const { return material_map.end(); }
 
     // Constructor
     fgMATERIAL_MGR ( void );
@@ -123,8 +136,14 @@ public:
 
     bool find( const string& material, fgMATERIAL*& mtl_ptr );
 
+    void render_fragments();
+
     // Destructor
     ~fgMATERIAL_MGR ( void );
+
+private:
+
+    container material_map;
 };
 
 
@@ -136,6 +155,33 @@ extern fgMATERIAL_MGR material_mgr;
 
 
 // $Log$
+// Revision 1.3  1998/09/10 19:07:12  curt
+// /Simulator/Objects/fragment.hxx
+//   Nested fgFACE inside fgFRAGMENT since its not used anywhere else.
+//
+// ./Simulator/Objects/material.cxx
+// ./Simulator/Objects/material.hxx
+//   Made fgMATERIAL and fgMATERIAL_MGR bona fide classes with private
+//   data members - that should keep the rabble happy :)
+//
+// ./Simulator/Scenery/tilemgr.cxx
+//   In viewable() delay evaluation of eye[0] and eye[1] in until they're
+//   actually needed.
+//   Change to fgTileMgrRender() to call fgMATERIAL_MGR::render_fragments()
+//   method.
+//
+// ./Include/fg_stl_config.h
+// ./Include/auto_ptr.hxx
+//   Added support for g++ 2.7.
+//   Further changes to other files are forthcoming.
+//
+// Brief summary of changes required for g++ 2.7.
+//   operator->() not supported by iterators: use (*i).x instead of i->x
+//   default template arguments not supported,
+//   <functional> doesn't have mem_fun_ref() needed by callbacks.
+//   some std include files have different names.
+//   template member functions not supported.
+//
 // Revision 1.2  1998/09/01 19:03:09  curt
 // Changes contributed by Bernie Bright <bbright@c031.aone.net.au>
 //  - The new classes in libmisc.tgz define a stream interface into zlib.
index 40ca1bed73b0a1f9d0c4158ddb89f8febe4e05f9..1d5740ac987edc9c011cca2a82c216bb88507f16 100644 (file)
@@ -266,8 +266,6 @@ static int viewable( fgPoint3d *cp, double radius ) {
        
     mat = (double *)(current_view.WORLD_TO_EYE);
        
-    eye[0] = (x*mat[0] + y*mat[4] + z*mat[8] + mat[12]) * current_view.slope_x;
-    eye[1] = (x*mat[1] + y*mat[5] + z*mat[9] + mat[13]) * current_view.slope_y; 
     eye[2] =  x*mat[2] + y*mat[6] + z*mat[10] + mat[14];
        
     // Check near and far clip plane
@@ -277,6 +275,8 @@ static int viewable( fgPoint3d *cp, double radius ) {
        return(0);
     }
        
+    eye[0] = (x*mat[0] + y*mat[4] + z*mat[8] + mat[12]) * current_view.slope_x;
+
     // check right and left clip plane (from eye perspective)
     x1 = radius * current_view.fov_x_clip;
     if( (eye[2] > -(eye[0]+x1)) || (eye[2] > (eye[0]-x1)) )
@@ -284,6 +284,8 @@ static int viewable( fgPoint3d *cp, double radius ) {
        return(0);
     }
        
+    eye[1] = (x*mat[1] + y*mat[5] + z*mat[9] + mat[13]) * current_view.slope_y;
+
     // check bottom and top clip plane (from eye perspective)
     y1 = radius * current_view.fov_y_clip;
     if( (eye[2] > -(eye[1]+y1)) || (eye[2] > (eye[1]-y1)) )
@@ -302,12 +304,17 @@ static int viewable( fgPoint3d *cp, double radius ) {
     v = &current_view;
 
     MAT3_SET_HVEC(world, cp->x, cp->y, cp->z, 1.0);
-    MAT3mult_vec(eye, world, v->WORLD_TO_EYE);
+    // MAT3mult_vec(eye, world, v->WORLD_TO_EYE);
     // printf( "\nworld -> eye = %.2f %.2f %.2f  radius = %.2f\n", 
     //         eye[0], eye[1], eye[2], radius);
 
+    // Use lazy evaluation for calculating eye hvec.
+#define vec world
+#define mat v->WORLD_TO_EYE
+    eye[2] = vec[0]*mat[0][2]+vec[1]*mat[1][2]+vec[2]*mat[2][2]+mat[3][2];
+
     // Check near clip plane
-    if ( eye[2] - radius > 0.0 ) {
+    if ( eye[2] > radius ) {
        return(0);
     }
 
@@ -321,58 +328,32 @@ static int viewable( fgPoint3d *cp, double radius ) {
     x1 = v->cos_fov_x * radius;
     y1 = v->sin_fov_x * radius;
     slope = v->slope_x;
-    x0 = x1 - y1 / slope;
+    eye[0] = vec[0]*mat[0][0]+vec[1]*mat[1][0]+vec[2]*mat[2][0]+mat[3][0];
 
-    // printf("(r) x1 = %.2f  y1 = %.2f\n", x1, y1);
-    // printf("eye[0] = %.2f  eye[2] = %.2f\n", eye[0], eye[2]);
-    // printf("(r) x0 = %.2f  slope_x = %.2f  radius = %.2f\n", 
-    //        x0, slope, radius);
-
-    if ( eye[2] > slope * (eye[0] - x0) ) {
-       return(0);
+    if ( eye[2] > ((slope * (eye[0] - x1)) + y1) ) {
+       return( false );
     }
 
     // check left clip plane (from eye perspective)
-    x1 = -x1;
-    slope = -slope;
-    x0 = x1 - y1 / slope;
-
-    // printf("(r) x1 = %.2f  y1 = %.2f\n", x1, y1);
-    // printf("eye[0] = %.2f  eye[2] = %.2f\n", eye[0], eye[2]);
-    // printf("(r) x0 = %.2f  slope_x = %.2f  radius = %.2f\n", 
-    //        x0, slope, radius);
-
-    if ( eye[2] > slope * (eye[0] - x0) ) {
-       return(0);
+    if ( eye[2] > -((slope * (eye[0] + x1)) - y1) ) {
+       return( false );
     }
 
     // check bottom clip plane (from eye perspective)
     x1 = -(v->cos_fov_y) * radius;
     y1 = v->sin_fov_y * radius;
     slope = v->slope_y;
-    x0 = x1 - y1 / slope;
-
-    // printf("(r) x1 = %.2f  y1 = %.2f\n", x1, y1);
-    // printf("eye[1] = %.2f  eye[2] = %.2f\n", eye[1], eye[2]);
-    // printf("(r) x0 = %.2f  slope_y = %.2f  radius = %.2f\n", 
-    //       x0, slope, radius);
+    eye[1] = vec[0]*mat[0][1]+vec[1]*mat[1][1]+vec[2]*mat[2][1]+mat[3][1];
+#undef vec
+#undef mat
 
-    if ( eye[2] > slope * (eye[1] - x0) ) {
-       return(0);
+    if ( eye[2] > ((slope * (eye[1] - x1)) + y1) ) {
+       return( false );
     }
 
     // check top clip plane (from eye perspective)
-    x1 = -x1;
-    slope = -slope;
-    x0 = x1 - y1 / slope;
-
-    // printf("(r) x1 = %.2f  y1 = %.2f\n", x1, y1);
-    // printf("eye[1] = %.2f  eye[2] = %.2f\n", eye[1], eye[2]);
-    // printf("(r) x0 = %.2f  slope_y = %.2f  radius = %.2f\n", 
-    //        x0, slope, radius);
-
-    if ( eye[2] > slope * (eye[1] - x0) ) {
-       return(0);
+    if ( eye[2] > -((slope * (eye[1] + x1)) - y1) ) {
+       return( false );
     }
 
 #endif // defined( USE_FAST_FOV_CLIP )
@@ -669,10 +650,7 @@ void fgTileMgrRender( void ) {
 
                        mtl_ptr = frag_ptr->material_ptr;
                        // printf(" lookup = %s\n", mtl_ptr->texture_name);
-                       if ( mtl_ptr->list_size < FG_MAX_MATERIAL_FRAGS ) {
-                           mtl_ptr->list[mtl_ptr->list_size] = frag_ptr;
-                           (mtl_ptr->list_size)++;
-                       } else {
+                       if ( ! mtl_ptr->append_sort_list( frag_ptr ) ) {
                            fgPrintf( FG_TERRAIN, FG_ALERT,
                                      "Overran material sorting array\n" );
                        }
@@ -705,72 +683,40 @@ void fgTileMgrRender( void ) {
     // Pass 2
     // traverse the transient per-material fragment lists and render
     // out all fragments for each material property.
-    map < string, fgMATERIAL, less<string> > :: iterator mapcurrent = 
-       material_mgr.material_map.begin();
-    map < string, fgMATERIAL, less<string> > :: iterator maplast = 
-       material_mgr.material_map.end();
-
     xglPushMatrix();
-
-    for ( ; mapcurrent != maplast; ++mapcurrent ) {
-        // (char *)key = (*mapcurrent).first;
-        // (fgMATERIAL)value = (*mapcurrent).second;
-       mtl_ptr = &(*mapcurrent).second;
-
-       last_tile_ptr = NULL;
-
-       size = mtl_ptr->list_size;
-       if ( size > 0 ) {
-           if ( textures ) {
-#ifdef GL_VERSION_1_1
-               xglBindTexture(GL_TEXTURE_2D, mtl_ptr->texture_id);
-#elif GL_EXT_texture_object
-               xglBindTextureEXT(GL_TEXTURE_2D, mtl_ptr->texture_id);
-#else
-#  error port me
-#endif
-           } else {
-               xglMaterialfv (GL_FRONT, GL_AMBIENT, mtl_ptr->ambient);
-               xglMaterialfv (GL_FRONT, GL_DIFFUSE, mtl_ptr->diffuse);
-           }
-
-           // printf("traversing = %s, size = %d\n", 
-           //       mtl_ptr->texture_name, size);
-           for ( i = 0; i < size; i++ ) {
-               frag_ptr = mtl_ptr->list[i];
-               
-               // count up the number of polygons we are drawing in
-               // case someone is interested.
-               total_faces += frag_ptr->num_faces;
-
-               if ( frag_ptr->tile_ptr == last_tile_ptr ) {
-                   // same tile as last time, no transform necessary
-               } else {
-                   // new tile, new translate
-                   // xglLoadMatrixf( frag_ptr->matrix );
-                   t = frag_ptr->tile_ptr;
-                   xglLoadMatrixd(t->model_view );
-               }
-           
-               // Woohoo!!!  We finally get to draw something!
-               // printf("  display_list = %d\n", frag_ptr->display_list);
-               xglCallList(frag_ptr->display_list);
-
-               last_tile_ptr = frag_ptr->tile_ptr;
-           }
-       }
-    }
-
+    material_mgr.render_fragments();
     xglPopMatrix();
-
-    v->tris_rendered = total_faces;
-
-    fgPrintf( FG_TERRAIN, FG_DEBUG, "Rendered %d polygons this frame.\n", 
-             total_faces);
 }
 
 
 // $Log$
+// Revision 1.35  1998/09/10 19:07:16  curt
+// /Simulator/Objects/fragment.hxx
+//   Nested fgFACE inside fgFRAGMENT since its not used anywhere else.
+//
+// ./Simulator/Objects/material.cxx
+// ./Simulator/Objects/material.hxx
+//   Made fgMATERIAL and fgMATERIAL_MGR bona fide classes with private
+//   data members - that should keep the rabble happy :)
+//
+// ./Simulator/Scenery/tilemgr.cxx
+//   In viewable() delay evaluation of eye[0] and eye[1] in until they're
+//   actually needed.
+//   Change to fgTileMgrRender() to call fgMATERIAL_MGR::render_fragments()
+//   method.
+//
+// ./Include/fg_stl_config.h
+// ./Include/auto_ptr.hxx
+//   Added support for g++ 2.7.
+//   Further changes to other files are forthcoming.
+//
+// Brief summary of changes required for g++ 2.7.
+//   operator->() not supported by iterators: use (*i).x instead of i->x
+//   default template arguments not supported,
+//   <functional> doesn't have mem_fun_ref() needed by callbacks.
+//   some std include files have different names.
+//   template member functions not supported.
+//
 // Revision 1.34  1998/09/09 20:58:09  curt
 // Tweaks to loop constructs with STL usage.
 //