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;
+ FGNewMat *m = matlib[src_mat];
+ if ( m != NULL ) {
+ matlib[dst_mat] = m;
+ } 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;
// build the ssgSimpleState
SGPath tex_path( globals->get_fg_root() );
tex_path.append( "Textures.high" );
- tex_path.append( m.get_texture_name() );
+ tex_path.append( m->get_texture_name() );
if ( ! local_file_exists(tex_path.str())
|| general.get_glMaxTexSize() < 512 ) {
tex_path = SGPath( globals->get_fg_root() );
tex_path.append( "Textures" );
- tex_path.append( m.get_texture_name() );
+ tex_path.append( m->get_texture_name() );
}
SG_LOG( SG_TERRAIN, SG_INFO, " Loading material "
shade_model = GL_FLAT;
}
- m.set_texture_name( tex_path.str() );
- m.build_ssg_state( shade_model,
- fgGetBool("/sim/rendering/textures"),
- false );
+ 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;
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;
string tex_name = full_path.substr( pos + 1 );
string tex_path = full_path.substr( 0, pos );
- FGNewMat m( mat_name, full_path );
+ FGNewMat *m = new FGNewMat( mat_name, full_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;
shade_model = GL_FLAT;
}
- m.build_ssg_state( shade_model, fgGetBool("/sim/rendering/textures"),
- true );
+ m->build_ssg_state( shade_model,
+ fgGetBool("/sim/rendering/textures"),
+ true );
material_lib.matlib[mat_name] = m;
// 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 );
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;
FGNewMat *result = NULL;
material_map_iterator it = matlib.find( material );
if ( it != end() ) {
- result = &((*it).second);
+ result = it->second;
return result;
}
// Destructor
FGMaterialLib::~FGMaterialLib ( void ) {
+ // Free up all the material entries first
+ for ( material_map_iterator it = begin(); it != end(); it++ ) {
+ FGNewMat *slot = it->second;
+ if ( slot != NULL ) {
+ delete slot;
+ }
+ }
}
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);
}
}
// container::iterator it = begin();
for ( material_map_iterator it = begin(); it != end(); it++ ) {
const string &key = it->first;
- FGNewMat &slot = it->second;
- if ( ! slot.get_texture_loaded() ) {
- SG_LOG( SG_GENERAL, SG_INFO, "Loading texture for " << key );
+ 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 );
+ 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, 0 );
+ slot->get_textured()->
+ setTexture( (char *)slot->get_texture_name_c_str(), 0, 0, 1 );
#endif
- slot.set_texture_loaded( true );
+ slot->set_texture_loaded( true );
}
}
}