From 1e7d072eed9060bede14ff04f8aca57237fad3cd Mon Sep 17 00:00:00 2001 From: Torsten Dreyer Date: Tue, 9 Aug 2011 18:02:37 +0200 Subject: [PATCH] Add LOD to each AI model Add a LOD (range animation) to each AI model if the property /sim/rendering/static-lod/ai is set to any number greater than zero. AI models get loaded but only displayed when closer than the number given in the property (in meters). If the property is absent or it's value is less or equal 0.0 than no LOD is added to the AI model. --- src/AIModel/AIBase.cxx | 23 +++++++++++++++-------- src/AIModel/AIBase.hxx | 3 --- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/AIModel/AIBase.cxx b/src/AIModel/AIBase.cxx index ac907c2e3..8a8e1c8f3 100644 --- a/src/AIModel/AIBase.cxx +++ b/src/AIModel/AIBase.cxx @@ -225,8 +225,22 @@ bool FGAIBase::init(bool search_in_AI_path) { else _installed = true; - model = load3DModel(f, props); + osg::Node * mdl = SGModelLib::loadPagedModel(f, props, new FGNasalModelData(props)); + model = mdl; + double aiModelMaxRange = fgGetDouble("/sim/rendering/static-lod/ai", 0.0); + if( aiModelMaxRange > 0.0 ) { + osg::LOD * lod = new osg::LOD; + lod->setName("AI-model range animation node"); + + lod->addChild( mdl, 0, aiModelMaxRange ); + lod->setCenterMode(osg::LOD::USE_BOUNDING_SPHERE_CENTER); + lod->setRangeMode(osg::LOD::DISTANCE_FROM_EYE_POINT); + + model = lod; + } + + initModel(mdl); if (model.valid() && _initialized == false) { aip.init( model.get() ); aip.setVisible(true); @@ -266,13 +280,6 @@ void FGAIBase::initModel(osg::Node *node) } -osg::Node* FGAIBase::load3DModel(const string &path, SGPropertyNode *prop_root) -{ - model = SGModelLib::loadPagedModel(path, prop_root, new FGNasalModelData(prop_root)); - initModel(model.get()); - return model.get(); -} - bool FGAIBase::isa( object_type otype ) { return otype == _otype; } diff --git a/src/AIModel/AIBase.hxx b/src/AIModel/AIBase.hxx index afedabc3f..fa85d5d2b 100644 --- a/src/AIModel/AIBase.hxx +++ b/src/AIModel/AIBase.hxx @@ -300,9 +300,6 @@ public: inline double _getRange() { return range; }; inline double _getBearing() { return bearing; }; - virtual osg::Node* load3DModel(const string &path, - SGPropertyNode *prop_root); - static bool _isNight(); string & getCallSign(); -- 2.39.2