Cleanup.
Additional null pointer checks. Simplify redundant interface arguments. Modified Files: simgear/scene/material/mat.cxx simgear/scene/material/mat.hxx simgear/scene/material/matlib.cxx simgear/scene/material/matlib.hxx simgear/scene/tgdb/ReaderWriterSTG.cxx simgear/scene/tgdb/SGReaderWriterBTG.cxx simgear/scene/tgdb/SGReaderWriterBTGOptions.hxx simgear/scene/tgdb/TileEntry.cxx simgear/scene/tgdb/TileEntry.hxx simgear/scene/tgdb/obj.cxx
This commit is contained in:
parent
01c64fd554
commit
bfa5fff500
@ -57,10 +57,10 @@ using namespace simgear;
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
SGMaterial::SGMaterial( const string &fg_root, const SGPropertyNode *props, const char *season )
|
||||
SGMaterial::SGMaterial( const string &fg_root, const SGPropertyNode *props )
|
||||
{
|
||||
init();
|
||||
read_properties( fg_root, props, season );
|
||||
read_properties( fg_root, props );
|
||||
build_state( false );
|
||||
}
|
||||
|
||||
@ -84,23 +84,20 @@ SGMaterial::~SGMaterial (void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// Public methods.
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void
|
||||
SGMaterial::read_properties( const string &fg_root, const SGPropertyNode * props, const char *season )
|
||||
SGMaterial::read_properties( const string &fg_root, const SGPropertyNode *props)
|
||||
{
|
||||
// Gather the path(s) to the texture(s)
|
||||
vector<SGPropertyNode_ptr> textures = props->getChildren("texture");
|
||||
for (unsigned int i = 0; i < textures.size(); i++)
|
||||
{
|
||||
string tname = textures[i]->getStringValue();
|
||||
string otname = tname;
|
||||
|
||||
if (tname == "") {
|
||||
if (tname.empty()) {
|
||||
tname = "unknown.rgb";
|
||||
}
|
||||
|
||||
@ -304,9 +301,8 @@ void SGMaterial::assignTexture( osg::StateSet *state, const std::string &fname,
|
||||
texture->setMaxAnisotropy( SGGetTextureFilter());
|
||||
state->setTextureAttributeAndModes(0, texture);
|
||||
|
||||
osg::TexEnv* texEnv = new osg::TexEnv;
|
||||
texEnv->setMode(osg::TexEnv::MODULATE);
|
||||
state->setTextureAttributeAndModes(0, texEnv);
|
||||
StateAttributeFactory *attrFact = StateAttributeFactory::instance();
|
||||
state->setTextureAttributeAndModes(0, attrFact->getStandardTexEnv());
|
||||
}
|
||||
|
||||
SGMaterialGlyph* SGMaterial::get_glyph (const string& name) const
|
||||
|
@ -79,7 +79,7 @@ public:
|
||||
* state information for the material. This node is usually
|
||||
* loaded from the $FG_ROOT/materials.xml file.
|
||||
*/
|
||||
SGMaterial( const string &fg_root, const SGPropertyNode *props, const char *season );
|
||||
SGMaterial( const string &fg_root, const SGPropertyNode *props);
|
||||
|
||||
|
||||
/**
|
||||
@ -355,7 +355,7 @@ private:
|
||||
|
||||
SGMaterial( const string &fg_root, const SGMaterial &mat ); // unimplemented
|
||||
|
||||
void read_properties( const string &fg_root, const SGPropertyNode *props, const char *season );
|
||||
void read_properties( const string &fg_root, const SGPropertyNode *props );
|
||||
void build_state( bool defer_tex_load );
|
||||
void set_state( osg::StateSet *s );
|
||||
|
||||
|
@ -67,7 +67,7 @@ SGMaterialLib::SGMaterialLib ( void ) {
|
||||
}
|
||||
|
||||
// Load a library of material properties
|
||||
bool SGMaterialLib::load( const string &fg_root, const string& mpath, const char *season,
|
||||
bool SGMaterialLib::load( const string &fg_root, const string& mpath,
|
||||
SGPropertyNode *prop_root )
|
||||
{
|
||||
SGPropertyNode materials;
|
||||
@ -95,7 +95,7 @@ bool SGMaterialLib::load( const string &fg_root, const string& mpath, const char
|
||||
}
|
||||
}
|
||||
|
||||
SGSharedPtr<SGMaterial> m = new SGMaterial(fg_root, node, season);
|
||||
SGSharedPtr<SGMaterial> m = new SGMaterial(fg_root, node);
|
||||
|
||||
vector<SGPropertyNode_ptr>names = node->getChildren("name");
|
||||
for ( unsigned int j = 0; j < names.size(); j++ ) {
|
||||
|
@ -66,7 +66,7 @@ public:
|
||||
SGMaterialLib ( void );
|
||||
|
||||
// Load a library of material properties
|
||||
bool load( const string &fg_root, const string& mpath, const char *season,
|
||||
bool load( const string &fg_root, const string& mpath,
|
||||
SGPropertyNode *prop_root );
|
||||
|
||||
// Add the named texture with default properties
|
||||
|
@ -57,6 +57,7 @@ ReaderWriterSTG::readNode(const std::string& fileName,
|
||||
const osgDB::ReaderWriter::Options* options) const
|
||||
{
|
||||
std::string tileName = osgDB::getNameLessExtension(fileName);
|
||||
|
||||
osg::Node* result = TileEntry::loadTileByName(tileName, options);
|
||||
// For debugging race conditions
|
||||
#ifdef SLOW_PAGER
|
||||
|
@ -26,11 +26,6 @@
|
||||
|
||||
using namespace simgear;
|
||||
|
||||
// SGReaderWriterBTGOptions static value here to avoid an additional,
|
||||
// tiny source file.
|
||||
|
||||
std::string SGReaderWriterBTGOptions::defaultOptions;
|
||||
|
||||
SGReaderWriterBTG::SGReaderWriterBTG()
|
||||
{
|
||||
supportsExtension("btg", "SimGear btg database format");
|
||||
|
@ -21,7 +21,7 @@
|
||||
#include <simgear/scene/tgdb/obj.hxx>
|
||||
class SGReaderWriterBTGOptions : public osgDB::ReaderWriter::Options {
|
||||
public:
|
||||
SGReaderWriterBTGOptions(const std::string& str = defaultOptions) :
|
||||
SGReaderWriterBTGOptions(const std::string& str = std::string()) :
|
||||
osgDB::ReaderWriter::Options(str),
|
||||
_matlib(0), _calcLights(true),
|
||||
_useRandomObjects(false),
|
||||
@ -57,6 +57,5 @@ protected:
|
||||
bool _calcLights;
|
||||
bool _useRandomObjects;
|
||||
bool _useRandomVegetation;
|
||||
static std::string defaultOptions;
|
||||
};
|
||||
#endif
|
||||
|
@ -141,7 +141,6 @@ TileEntry::TileEntry ( const SGBucket& b )
|
||||
: tile_bucket( b ),
|
||||
_node( new osg::LOD ),
|
||||
is_inner_ring(false),
|
||||
free_tracker(0),
|
||||
tileFileName(b.gen_index_str())
|
||||
{
|
||||
_node->setUpdateCallback(new FGTileUpdateCallback);
|
||||
@ -172,50 +171,16 @@ static void WorldCoordinate(osg::Matrix& obj_pos, double lat,
|
||||
}
|
||||
|
||||
|
||||
// Free "n" leaf elements of an ssg tree. returns the number of
|
||||
// elements freed. An empty branch node is considered a leaf. This
|
||||
// is intended to spread the load of freeing a complex tile out over
|
||||
// several frames.
|
||||
static int fgPartialFreeSSGtree( osg::Group *b, int n ) {
|
||||
int num_deletes = b->getNumChildren();
|
||||
|
||||
b->removeChildren(0, b->getNumChildren());
|
||||
|
||||
return num_deletes;
|
||||
}
|
||||
|
||||
|
||||
// Clean up the memory used by this tile and delete the arrays used by
|
||||
// ssg as well as the whole ssg branch
|
||||
bool TileEntry::free_tile() {
|
||||
int delete_size = 100;
|
||||
SG_LOG( SG_TERRAIN, SG_DEBUG,
|
||||
"FREEING TILE = (" << tile_bucket << ")" );
|
||||
|
||||
SG_LOG( SG_TERRAIN, SG_DEBUG, "(start) free_tracker = " << free_tracker );
|
||||
_node->removeChildren(0, _node->getNumChildren());
|
||||
_node = 0;
|
||||
|
||||
if ( !(free_tracker & NODES) ) {
|
||||
free_tracker |= NODES;
|
||||
} else if ( !(free_tracker & VEC_PTRS) ) {
|
||||
free_tracker |= VEC_PTRS;
|
||||
} else if ( !(free_tracker & TERRA_NODE) ) {
|
||||
// delete the terrain branch (this should already have been
|
||||
// disconnected from the scene graph)
|
||||
SG_LOG( SG_TERRAIN, SG_DEBUG, "FREEING terra_transform" );
|
||||
if ( fgPartialFreeSSGtree( _node.get(), delete_size ) == 0 ) {
|
||||
_node = 0;
|
||||
free_tracker |= TERRA_NODE;
|
||||
}
|
||||
} else if ( !(free_tracker & LIGHTMAPS) ) {
|
||||
free_tracker |= LIGHTMAPS;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
|
||||
SG_LOG( SG_TERRAIN, SG_DEBUG, "(end) free_tracker = " << free_tracker );
|
||||
|
||||
// if we fall down to here, we still have work todo, return false
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@ -230,8 +195,8 @@ void TileEntry::prep_ssg_node(float vis) {
|
||||
_node->setRange( 0, 0, vis + bounding_radius );
|
||||
}
|
||||
|
||||
bool TileEntry::obj_load( const string& path,
|
||||
osg::Group *geometry, bool is_base, const osgDB::ReaderWriter::Options*options)
|
||||
bool TileEntry::obj_load(const string& path, osg::Group *geometry, bool is_base,
|
||||
const osgDB::ReaderWriter::Options* options)
|
||||
{
|
||||
osg::Node* node = osgDB::readNodeFile(path, options);
|
||||
if (node)
|
||||
@ -386,7 +351,13 @@ TileEntry::loadTileByName(const string& index_str,
|
||||
}
|
||||
}
|
||||
|
||||
SGReaderWriterBTGOptions *opt = new SGReaderWriterBTGOptions(*dynamic_cast<const SGReaderWriterBTGOptions *>(options));
|
||||
const SGReaderWriterBTGOptions* btgOpt;
|
||||
btgOpt = dynamic_cast<const SGReaderWriterBTGOptions *>(options);
|
||||
osg::ref_ptr<SGReaderWriterBTGOptions> opt;
|
||||
if (btgOpt)
|
||||
opt = new SGReaderWriterBTGOptions(*btgOpt);
|
||||
else
|
||||
opt = new SGReaderWriterBTGOptions;
|
||||
|
||||
// obj_load() will generate ground lighting for us ...
|
||||
osg::Group* new_tile = new osg::Group;
|
||||
@ -394,7 +365,7 @@ TileEntry::loadTileByName(const string& index_str,
|
||||
if (found_tile_base) {
|
||||
// load tile if found ...
|
||||
opt->setCalcLights(true);
|
||||
obj_load( object_base.str(), new_tile, true, options);
|
||||
obj_load( object_base.str(), new_tile, true, opt);
|
||||
|
||||
} else {
|
||||
// ... or generate an ocean tile on the fly
|
||||
@ -415,7 +386,7 @@ TileEntry::loadTileByName(const string& index_str,
|
||||
SGPath custom_path = obj->path;
|
||||
custom_path.append( obj->name );
|
||||
opt->setCalcLights(true);
|
||||
obj_load( custom_path.str(), new_tile, false, options);
|
||||
obj_load( custom_path.str(), new_tile, false, opt);
|
||||
|
||||
} else if (obj->type == OBJECT_SHARED || obj->type == OBJECT_STATIC) {
|
||||
// object loading is deferred to main render thread,
|
||||
|
@ -91,22 +91,6 @@ private:
|
||||
*/
|
||||
bool is_inner_ring;
|
||||
|
||||
/**
|
||||
* this variable tracks the status of the incremental memory
|
||||
* freeing.
|
||||
*/
|
||||
enum {
|
||||
NODES = 0x01,
|
||||
VEC_PTRS = 0x02,
|
||||
TERRA_NODE = 0x04,
|
||||
GROUND_LIGHTS = 0x08,
|
||||
VASI_LIGHTS = 0x10,
|
||||
RWY_LIGHTS = 0x20,
|
||||
TAXI_LIGHTS = 0x40,
|
||||
LIGHTMAPS = 0x80
|
||||
};
|
||||
int free_tracker;
|
||||
|
||||
static ModelLoadHelper *_modelLoader;
|
||||
|
||||
public:
|
||||
|
@ -129,7 +129,9 @@ struct SGTileGeometryBin {
|
||||
|
||||
for (unsigned grp = 0; grp < obj.get_pts_v().size(); ++grp) {
|
||||
std::string materialName = obj.get_pt_materials()[grp];
|
||||
SGMaterial* material = matlib->find(materialName);
|
||||
SGMaterial* material = 0;
|
||||
if (matlib)
|
||||
material = matlib->find(materialName);
|
||||
SGVec4f color = getMaterialLightColor(material);
|
||||
|
||||
if (3 <= materialName.size() && materialName.substr(0, 3) != "RWY") {
|
||||
@ -369,7 +371,9 @@ struct SGTileGeometryBin {
|
||||
SGMaterialTriangleMap::const_iterator i;
|
||||
for (i = materialTriangleMap.begin(); i != materialTriangleMap.end(); ++i) {
|
||||
osg::Geometry* geometry = i->second.buildGeometry();
|
||||
SGMaterial *mat = matlib->find(i->first);
|
||||
SGMaterial *mat = 0;
|
||||
if (matlib)
|
||||
mat = matlib->find(i->first);
|
||||
if (mat)
|
||||
geometry->setStateSet(mat->get_state());
|
||||
geode->addDrawable(geometry);
|
||||
@ -584,7 +588,8 @@ SGLoadBTG(const std::string& path, SGMaterialLib *matlib, bool calc_lights, bool
|
||||
|
||||
if (use_random_objects || use_random_vegetation) {
|
||||
if (use_random_objects) {
|
||||
tileGeometryBin.computeRandomObjects(matlib);
|
||||
if (matlib)
|
||||
tileGeometryBin.computeRandomObjects(matlib);
|
||||
|
||||
if (tileGeometryBin.randomModels.getNumModels() > 0) {
|
||||
// Generate a repeatable random seed
|
||||
@ -621,7 +626,7 @@ SGLoadBTG(const std::string& path, SGMaterialLib *matlib, bool calc_lights, bool
|
||||
}
|
||||
}
|
||||
|
||||
if (use_random_vegetation) {
|
||||
if (use_random_vegetation && matlib) {
|
||||
// Now add some random forest.
|
||||
tileGeometryBin.computeRandomForest(matlib);
|
||||
|
||||
@ -635,7 +640,8 @@ SGLoadBTG(const std::string& path, SGMaterialLib *matlib, bool calc_lights, bool
|
||||
|
||||
if (calc_lights) {
|
||||
// FIXME: ugly, has a side effect
|
||||
tileGeometryBin.computeRandomSurfaceLights(matlib);
|
||||
if (matlib)
|
||||
tileGeometryBin.computeRandomSurfaceLights(matlib);
|
||||
|
||||
if (tileGeometryBin.tileLights.getNumLights() > 0
|
||||
|| tileGeometryBin.randomTileLights.getNumLights() > 0) {
|
||||
@ -669,11 +675,15 @@ SGLoadBTG(const std::string& path, SGMaterialLib *matlib, bool calc_lights, bool
|
||||
if (!tileGeometryBin.vasiLights.empty()) {
|
||||
osg::Geode* vasiGeode = new osg::Geode;
|
||||
SGVec4f red(1, 0, 0, 1);
|
||||
SGMaterial* mat = matlib->find("RWY_RED_LIGHTS");
|
||||
SGMaterial* mat = 0;
|
||||
if (matlib)
|
||||
mat = matlib->find("RWY_RED_LIGHTS");
|
||||
if (mat)
|
||||
red = mat->get_light_color();
|
||||
SGVec4f white(1, 1, 1, 1);
|
||||
mat = matlib->find("RWY_WHITE_LIGHTS");
|
||||
mat = 0;
|
||||
if (matlib)
|
||||
mat = matlib->find("RWY_WHITE_LIGHTS");
|
||||
if (mat)
|
||||
white = mat->get_light_color();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user