#include <simgear/props/condition.hxx>
#include "BoundingVolumeBuildVisitor.hxx"
+#include "model.hxx"
+#include "SGReaderWriterXMLOptions.hxx"
using namespace std;
using namespace osg;
static SGReadCallbackInstaller readCallbackInstaller;
-// we get optimal geometry from the loader.
+// we get optimal geometry from the loader (Hah!).
struct ACOptimizePolicy : public OptimizeModelPolicy {
ACOptimizePolicy(const string& extension) :
OptimizeModelPolicy(extension)
&& group->getNumChildren() == 1)
optimized = static_cast<Node*>(group->getChild(0));
}
+ const SGReaderWriterXMLOptions* sgopt
+ = dynamic_cast<const SGReaderWriterXMLOptions*>(opt);
+ if (sgopt && sgopt->getInstantiateEffects())
+ optimized = instantiateEffects(optimized.get(), sgopt);
return optimized.release();
}
};
typedef osg::Node *(*panel_func)(SGPropertyNode *);
SGReaderWriterXMLOptions():
- osgDB::ReaderWriter::Options(),
- _prop_root(0),
- _load_panel(0),
- _model_data(0) {}
+ osgDB::ReaderWriter::Options(),
+ _prop_root(0),
+ _load_panel(0),
+ _model_data(0),
+ _instantiateEffects(false)
+ {}
SGReaderWriterXMLOptions(const std::string& str):
- osgDB::ReaderWriter::Options(str),
- _prop_root(0),
- _load_panel(0),
- _model_data(0) {}
+ osgDB::ReaderWriter::Options(str),
+ _prop_root(0),
+ _load_panel(0),
+ _model_data(0),
+ _instantiateEffects(false)
+ {}
SGReaderWriterXMLOptions(const SGReaderWriterXMLOptions& options,
const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY):
- osgDB::ReaderWriter::Options(options, copyop),
- _prop_root(options._prop_root),
- _load_panel(options._load_panel),
- _model_data(options._model_data) {}
+ osgDB::ReaderWriter::Options(options, copyop),
+ _prop_root(options._prop_root),
+ _load_panel(options._load_panel),
+ _model_data(options._model_data),
+ _instantiateEffects(options._instantiateEffects)
+ {}
SGReaderWriterXMLOptions(const osgDB::ReaderWriter::Options& options,
const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY):
- osgDB::ReaderWriter::Options(options, copyop),
- _prop_root(0),
- _load_panel(0),
- _model_data(0) {}
+ osgDB::ReaderWriter::Options(options, copyop),
+ _prop_root(0),
+ _load_panel(0),
+ _model_data(0),
+ _instantiateEffects(false)
+ {}
SGPropertyNode *getPropRoot() const {
return _prop_root;
SGModelData *getModelData() const {
return _model_data.get();
}
+ bool getInstantiateEffects() const
+ {
+ return _instantiateEffects;
+ }
void setPropRoot(SGPropertyNode *p) {
_prop_root=p;
void setModelData(SGModelData *d) {
_model_data=d;
}
-
+ void setInstantiateEffects(bool doit)
+ {
+ _instantiateEffects = doit;
+ }
+
+
protected:
virtual ~SGReaderWriterXMLOptions() {}
SGPropertyNode_ptr _prop_root;
osg::Node *(*_load_panel)(SGPropertyNode *);
osg::ref_ptr<SGModelData> _model_data;
+ bool _instantiateEffects;
};
}
namespace
{
-osg::Node* loadFile(const string& path, osgDB::ReaderWriter::Options* options)
+osg::Node* loadFile(const string& path, SGReaderWriterXMLOptions* options)
{
using namespace osg;
using namespace osgDB;
+ if (boost::iends_with(path, ".ac"))
+ options->setInstantiateEffects(true);
ref_ptr<Node> model = readRefNodeFile(path, options);
if (!model)
return 0;
- if (boost::iends_with(path, ".ac")) {
- ref_ptr<SGReaderWriterXMLOptions> sgOptions;
- if (options)
- sgOptions = new SGReaderWriterXMLOptions(*options);
- model = instantiateEffects(model.get(), sgOptions.get());
- }
+ else
return model.release();
}
}
}
osg::Node*
-SGModelLib::loadPagedModel(const string &path,
- SGPropertyNode *prop_root,
+SGModelLib::loadPagedModel(const string &path, SGPropertyNode *prop_root,
SGModelData *data)
{
SGPagedLOD *plod = new SGPagedLOD;
plod->setFileName(0, path);
plod->setRange(0, 0.0, 50.0*SG_NM_TO_METER);
- osg::ref_ptr<SGReaderWriterXMLOptions> opt = new SGReaderWriterXMLOptions(*(osgDB::Registry::instance()->getOptions()));
+ osg::ref_ptr<SGReaderWriterXMLOptions> opt
+ = new SGReaderWriterXMLOptions(*(osgDB::Registry::instance()
+ ->getOptions()));
opt->setPropRoot(prop_root ? prop_root: static_propRoot.get());
opt->setModelData(data);
opt->setLoadPanel(static_panelFunc);
-
+ if (boost::iends_with(path, ".ac"))
+ opt->setInstantiateEffects(true);
plod->setReaderWriterOptions(opt.get());
return plod;
}