X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FObjects%2Fmatlib.cxx;h=0ea5d7b90e2e19bb4232c07be8808a0758081433;hb=b4a9d7621597c9eef97f8ec84d246d5585b4b7ea;hp=b1449a08e3988eb35147da6913b01b28b2442c51;hpb=f1b1077d930d542014baf54a328b7a233182647a;p=flightgear.git diff --git a/src/Objects/matlib.cxx b/src/Objects/matlib.cxx index b1449a08e..0ea5d7b90 100644 --- a/src/Objects/matlib.cxx +++ b/src/Objects/matlib.cxx @@ -34,9 +34,10 @@ #endif #include -#include +#include #include +#include #include #include STL_STRING @@ -61,106 +62,41 @@ FGMaterialLib material_lib; // Constructor FGMaterialLib::FGMaterialLib ( void ) { -} - - -static bool local_file_exists( const string& path ) { - sg_gzifstream in( path ); - if ( ! in.is_open() ) { - return false; - } else { - return true; - } - -#if 0 - cout << path << " "; - FILE *fp = fopen( path.c_str(), "r" ); - if ( fp == NULL ) { - cout << " doesn't exist\n"; - return false; - } else { - cout << " exists\n"; - return true; - } -#endif + set_step(0); } // Load a library of material properties bool FGMaterialLib::load( const string& mpath ) { - string material_name; - sg_gzifstream in( mpath ); - if ( ! in.is_open() ) { - SG_LOG( SG_GENERAL, SG_ALERT, "Cannot open file: " << mpath ); - exit(-1); - } - -#ifndef __MWERKS__ - while ( ! in.eof() ) { -#else - char c = '\0'; - while ( in.get(c) && c != '\0' ) { - in.putback(c); -#endif - // printf("%s", line); - - // strip leading white space and comments - in >> skipcomment; - - // set to zero to prevent its value accidently being '{' - // after a failed >> operation. - char token = 0; - - in >> material_name; - - if ( material_name == "alias" ) { - string src_mat, dst_mat; - in >> dst_mat >> src_mat; - SG_LOG( SG_GENERAL, SG_INFO, " Material alias: " << dst_mat << - " mapped to " << src_mat ); - FGNewMat m = matlib[src_mat]; - matlib[dst_mat] = m; - } else { - in >> token; - - if ( token == '{' ) { - FGNewMat m; - in >> m; - - // build the ssgSimpleState - SGPath tex_path( globals->get_fg_root() ); - tex_path.append( "Textures.high" ); - - SGPath tmp_path = tex_path; - tmp_path.append( m.get_texture_name() ); - if ( ! local_file_exists(tmp_path.str()) - || general.get_glMaxTexSize() < 512 ) { - tex_path = SGPath( globals->get_fg_root() ); - tex_path.append( "Textures" ); - } - - SG_LOG( SG_TERRAIN, SG_INFO, " Loading material " - << material_name << " (" << tex_path.c_str() << ")"); - - GLenum shade_model = GL_SMOOTH; - if ( fgGetBool("/sim/rendering/shading") ) { - shade_model = GL_SMOOTH; - } else { - shade_model = GL_FLAT; - } - - m.build_ssg_state( tex_path.str(), shade_model, - fgGetBool("/sim/rendering/textures") ); - -#if EXTRA_DEBUG - m.dump_info(); -#endif - - matlib[material_name] = m; - } - } + SGPropertyNode materials; + + cout << "Reading materials from " << mpath << endl; + try { + readProperties(mpath, &materials); + } catch (const sg_exception &ex) { + SG_LOG(SG_INPUT, SG_ALERT, "Error reading materials: " << ex.getMessage()); + throw ex; + } + + int nMaterials = materials.nChildren(); + for (int i = 0; i < nMaterials; i++) { + const SGPropertyNode * node = materials.getChild(i); + if (node->getName() == "material") { + FGNewMat * m = new FGNewMat(node); + + vectornames = node->getChildren("name"); + for (unsigned int j = 0; j < names.size(); j++) { + m->ref(); + matlib[names[j]->getStringValue()] = m; + SG_LOG( SG_TERRAIN, SG_INFO, " Loading material " + << names[j]->getStringValue()); + } + } else { + SG_LOG(SG_INPUT, SG_ALERT, + "Skipping bad material entry " << node->getName()); } + } // hard coded light state ssgSimpleState *lights = new ssgSimpleState; @@ -175,9 +111,7 @@ bool FGMaterialLib::load( const string& mpath ) { lights->disable( GL_ALPHA_TEST ); lights->disable( GL_LIGHTING ); - FGNewMat m; - m.set_ssg_state( lights ); - matlib["LIGHTS"] = m; + matlib["LIGHTS"] = new FGNewMat(lights); return true; } @@ -201,26 +135,10 @@ bool FGMaterialLib::add_item ( const string &mat_name, const string &full_path ) string tex_name = full_path.substr( pos + 1 ); string tex_path = full_path.substr( 0, pos ); - FGNewMat m( mat_name, tex_name ); - SG_LOG( SG_TERRAIN, SG_INFO, " Loading material " - << mat_name << " (" << tex_path << ")"); + << mat_name << " (" << full_path << ")"); -#if EXTRA_DEBUG - m.dump_info(); -#endif - - GLenum shade_model = GL_SMOOTH; - if ( fgGetBool("/sim/rendering/shading") ) { - shade_model = GL_SMOOTH; - } else { - shade_model = GL_FLAT; - } - - m.build_ssg_state( tex_path, shade_model, - fgGetBool("/sim/rendering/textures") ); - - material_lib.matlib[mat_name] = m; + material_lib.matlib[mat_name] = new FGNewMat(full_path); return true; } @@ -229,16 +147,11 @@ bool FGMaterialLib::add_item ( const string &mat_name, const string &full_path ) // Load a library of material properties bool FGMaterialLib::add_item ( const string &mat_name, ssgSimpleState *state ) { - FGNewMat m( mat_name ); - m.set_ssg_state( state ); + FGNewMat *m = new FGNewMat(state); SG_LOG( SG_TERRAIN, SG_INFO, " Loading material given a premade " << "ssgSimpleState = " << mat_name ); -#if EXTRA_DEBUG - m.dump_info(); -#endif - material_lib.matlib[mat_name] = m; return true; @@ -250,7 +163,7 @@ FGNewMat *FGMaterialLib::find( const string& material ) { FGNewMat *result = NULL; material_map_iterator it = matlib.find( material ); if ( it != end() ) { - result = &((*it).second); + result = it->second; return result; } @@ -260,6 +173,14 @@ FGNewMat *FGMaterialLib::find( const string& material ) { // Destructor FGMaterialLib::~FGMaterialLib ( void ) { + // Free up all the material entries first + for ( material_map_iterator it = begin(); it != end(); it++ ) { + FGNewMat *slot = it->second; + slot->deRef(); + if ( slot->getRef() <= 0 ) { + delete slot; + } + } } @@ -271,17 +192,30 @@ void FGMaterialLib::set_step ( int step ) const string &key = it->first; SG_LOG( SG_GENERAL, SG_INFO, "Updating material " << key << " to step " << step ); - FGNewMat &slot = it->second; - slot.get_state()->selectStep(step); + FGNewMat *slot = it->second; + slot->get_state()->selectStep(step); } } +// Get the step for the state selectors +int FGMaterialLib::get_step () +{ + material_map_iterator it = begin(); + return it->second->get_state()->getSelectStep(); +} - - - - +// Load one pending "deferred" texture. Return true if a texture +// loaded successfully, false if no pending, or error. +void FGMaterialLib::load_next_deferred() { + // container::iterator it = begin(); + for ( material_map_iterator it = begin(); it != end(); it++ ) { + const string &key = it->first; + FGNewMat *slot = it->second; + if (slot->load_texture()) + return; + } +}