X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FObjects%2Fmatlib.cxx;h=9d110bd692d762b0fc86cfec8882faba095b882d;hb=9d54df6d87907c8de4cca4b745006db205de405f;hp=ffb5422ceaa24fb428a77502760a92e856205264;hpb=bb108c7917e8b65ecf626cbf0440944cf2e4ee90;p=flightgear.git diff --git a/src/Objects/matlib.cxx b/src/Objects/matlib.cxx index ffb5422ce..9d110bd69 100644 --- a/src/Objects/matlib.cxx +++ b/src/Objects/matlib.cxx @@ -25,7 +25,7 @@ # include #endif -#ifdef FG_MATH_EXCEPTION_CLASH +#ifdef SG_MATH_EXCEPTION_CLASH # include #endif @@ -34,7 +34,7 @@ #endif #include -#include +#include #include @@ -42,16 +42,17 @@ #include STL_STRING #include -#include -#include +#include +#include #include #include
+#include
#include #include "matlib.hxx" -FG_USING_STD(string); +SG_USING_STD(string); // global material management class @@ -60,28 +61,17 @@ FGMaterialLib material_lib; // Constructor FGMaterialLib::FGMaterialLib ( void ) { + set_step(0); } static bool local_file_exists( const string& path ) { - fg_gzifstream in( 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 } @@ -89,9 +79,9 @@ static bool local_file_exists( const string& path ) { bool FGMaterialLib::load( const string& mpath ) { string material_name; - fg_gzifstream in( mpath ); + sg_gzifstream in( mpath ); if ( ! in.is_open() ) { - FG_LOG( FG_GENERAL, FG_ALERT, "Cannot open file: " << mpath ); + SG_LOG( SG_GENERAL, SG_ALERT, "Cannot open file: " << mpath ); exit(-1); } @@ -116,44 +106,58 @@ bool FGMaterialLib::load( const string& mpath ) { if ( material_name == "alias" ) { string src_mat, dst_mat; in >> dst_mat >> src_mat; - FG_LOG( FG_GENERAL, FG_INFO, " Material alias: " << dst_mat << + SG_LOG( SG_GENERAL, SG_INFO, " Material alias: " << dst_mat << " mapped to " << src_mat ); - FGNewMat m = matlib[src_mat]; - matlib[dst_mat] = m; + FGNewMat *m = matlib[src_mat]; + if ( m != NULL ) { + matlib[dst_mat] = m; + m->ref(); + } else { + SG_LOG( SG_GENERAL, SG_ALERT, + "Bad material alias pointing to nonexistant material" ); + } } else { in >> token; if ( token == '{' ) { - FGNewMat m; - in >> m; + // Read the data into a temporary but stack allocated + // copy of the structure + FGNewMat tmp; + in >> tmp; + + // create a pointer to a heap allocated copy of the structure + FGNewMat *m = new FGNewMat; + *m = tmp; + m->ref(); // build the ssgSimpleState - FGPath tex_path( globals->get_options()->get_fg_root() ); + SGPath tex_path( globals->get_fg_root() ); tex_path.append( "Textures.high" ); - - FGPath tmp_path = tex_path; - tmp_path.append( m.get_texture_name() ); - if ( ! local_file_exists(tmp_path.str()) + tex_path.append( m->get_texture_name() ); + if ( ! local_file_exists(tex_path.str()) || general.get_glMaxTexSize() < 512 ) { - tex_path = FGPath( globals->get_options()->get_fg_root() ); + tex_path = SGPath( globals->get_fg_root() ); tex_path.append( "Textures" ); + tex_path.append( m->get_texture_name() ); } - FG_LOG( FG_TERRAIN, FG_INFO, " Loading material " + SG_LOG( SG_TERRAIN, SG_INFO, " Loading material " << material_name << " (" << tex_path.c_str() << ")"); GLenum shade_model = GL_SMOOTH; - if ( globals->get_options()->get_shading() == 1 ) { + if ( fgGetBool("/sim/rendering/shading") ) { shade_model = GL_SMOOTH; } else { shade_model = GL_FLAT; } - m.build_ssg_state( tex_path.str(), shade_model, - globals->get_options()->get_textures() ); + m->set_texture_name( tex_path.str() ); + m->build_ssg_state( shade_model, + fgGetBool("/sim/rendering/textures"), + false ); #if EXTRA_DEBUG - m.dump_info(); + m->dump_info(); #endif matlib[material_name] = m; @@ -170,12 +174,12 @@ bool FGMaterialLib::load( const string& mpath ) { lights->setColourMaterial( GL_AMBIENT_AND_DIFFUSE ); lights->setMaterial( GL_EMISSION, 0, 0, 0, 1 ); lights->setMaterial( GL_SPECULAR, 0, 0, 0, 1 ); - lights->disable( GL_BLEND ); + lights->enable( GL_BLEND ); lights->disable( GL_ALPHA_TEST ); lights->disable( GL_LIGHTING ); - FGNewMat m; - m.set_ssg_state( lights ); + FGNewMat *m = new FGNewMat; + m->set_ssg_state( lights ); matlib["LIGHTS"] = m; return true; @@ -200,24 +204,25 @@ 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 ); + FGNewMat *m = new FGNewMat( mat_name, full_path ); - FG_LOG( FG_TERRAIN, FG_INFO, " Loading material " - << mat_name << " (" << tex_path << ")"); + SG_LOG( SG_TERRAIN, SG_INFO, " Loading material " + << mat_name << " (" << full_path << ")"); #if EXTRA_DEBUG - m.dump_info(); + m->dump_info(); #endif GLenum shade_model = GL_SMOOTH; - if ( globals->get_options()->get_shading() == 1 ) { + if ( fgGetBool("/sim/rendering/shading") ) { shade_model = GL_SMOOTH; } else { shade_model = GL_FLAT; } - m.build_ssg_state( tex_path, shade_model, - globals->get_options()->get_textures() ); + m->build_ssg_state( shade_model, + fgGetBool("/sim/rendering/textures"), + true ); material_lib.matlib[mat_name] = m; @@ -228,14 +233,14 @@ 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( mat_name ); + m->set_ssg_state( state ); - FG_LOG( FG_TERRAIN, FG_INFO, " Loading material given a premade " + SG_LOG( SG_TERRAIN, SG_INFO, " Loading material given a premade " << "ssgSimpleState = " << mat_name ); #if EXTRA_DEBUG - m.dump_info(); + m->dump_info(); #endif material_lib.matlib[mat_name] = m; @@ -249,7 +254,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; } @@ -259,6 +264,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; + } + } } @@ -268,19 +281,41 @@ void FGMaterialLib::set_step ( int step ) // container::iterator it = begin(); for ( material_map_iterator it = begin(); it != end(); it++ ) { const string &key = it->first; - FG_LOG( FG_GENERAL, FG_INFO, + 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; + // SG_LOG( SG_GENERAL, SG_INFO, "slot = " << slot ); + if ( ! slot->get_texture_loaded() ) { + SG_LOG( SG_GENERAL, SG_INFO, "Loading deferred texture for " + << key ); +#ifdef PLIB_1_2_X + slot->get_textured()-> + setTexture( (char *)slot->get_texture_name_c_str(), 0, 0 ); +#else + slot->get_textured()-> + setTexture( (char *)slot->get_texture_name_c_str(), 0, 0, 1 ); +#endif + slot->set_texture_loaded( true ); + } + } +}