From 42728f52c209be623c1c58b3009855ef75bf5613 Mon Sep 17 00:00:00 2001 From: curt Date: Thu, 10 Sep 1998 19:07:09 +0000 Subject: [PATCH] /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, doesn't have mem_fun_ref() needed by callbacks. some std include files have different names. template member functions not supported. --- Objects/fragment.hxx | 67 ++++++++++++------ Objects/material.cxx | 115 +++++++++++++++++++++++++++---- Objects/material.hxx | 52 +++++++++++++- Scenery/tilemgr.cxx | 158 ++++++++++++++----------------------------- 4 files changed, 247 insertions(+), 145 deletions(-) diff --git a/Objects/fragment.hxx b/Objects/fragment.hxx index 3c9e728e4..b2d4f81d8 100644 --- a/Objects/fragment.hxx +++ b/Objects/fragment.hxx @@ -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, +// 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. // diff --git a/Objects/material.cxx b/Objects/material.cxx index 6625a334b..2b83892e3 100644 --- a/Objects/material.cxx +++ b/Objects/material.cxx @@ -35,20 +35,28 @@ #include +#include "Include/fg_stl_config.h" #include #include
#include +#include
+#include #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, +// 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 // - The new classes in libmisc.tgz define a stream interface into zlib. diff --git a/Objects/material.hxx b/Objects/material.hxx index 0e1302fd1..4bbe5128e 100644 --- a/Objects/material.hxx +++ b/Objects/material.hxx @@ -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, +// 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 // - The new classes in libmisc.tgz define a stream interface into zlib. diff --git a/Scenery/tilemgr.cxx b/Scenery/tilemgr.cxx index 40ca1bed7..1d5740ac9 100644 --- a/Scenery/tilemgr.cxx +++ b/Scenery/tilemgr.cxx @@ -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 = ¤t_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 > :: iterator mapcurrent = - material_mgr.material_map.begin(); - map < string, fgMATERIAL, less > :: 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, +// 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. // -- 2.39.5