From 41865b15c9975aa070a8275e8f49445c943d4935 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Cl=C3=A9ment=20de=20l=27Hamaide?= Date: Sun, 21 Sep 2014 22:08:57 +0200 Subject: [PATCH] Improve tag feature - Introduce a new LOD: ai-interior - Load a with interior on-demand - Avoid to load the cockpit of players in MP - Default LOD is 0.0 - 50.0 meters --- src/AIModel/AIBase.cxx | 41 ++++++++++++++++++++++++++++++++++++++++- src/AIModel/AIBase.hxx | 3 +++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/AIModel/AIBase.cxx b/src/AIModel/AIBase.cxx index 3e00f5542..41ef040ae 100644 --- a/src/AIModel/AIBase.cxx +++ b/src/AIModel/AIBase.cxx @@ -62,7 +62,9 @@ public: FGAIModelData(SGPropertyNode *root = NULL) : _nasal( new FGNasalModelDataProxy(root) ), _ready(false), - _initialized(false) + _initialized(false), + _hasInteriorPath(false), + _interiorLoaded(false) { } @@ -80,6 +82,11 @@ public: if (_ready) return; + if(prop->hasChild("interior-path")){ + _interiorPath = prop->getStringValue("interior-path"); + _hasInteriorPath = true; + } + _fxpath = prop->getStringValue("sound/path"); _nasal->modelLoaded(path, prop, n); @@ -94,12 +101,21 @@ public: bool needInitilization(void) { return _ready && !_initialized;} bool isInitialized(void) { return _initialized;} inline std::string& get_sound_path() { return _fxpath;} + + void setInteriorLoaded(const bool state) { _interiorLoaded = state;} + bool getInteriorLoaded(void) { return _interiorLoaded;} + bool hasInteriorPath(void) { return _hasInteriorPath;} + inline std::string& getInteriorPath() { return _interiorPath; } private: std::auto_ptr _nasal; std::string _fxpath; bool _ready; bool _initialized; + + std::string _interiorPath; + bool _hasInteriorPath; + bool _interiorLoaded; }; FGAIBase::FGAIBase(object_type ot, bool enableHot) : @@ -293,6 +309,27 @@ void FGAIBase::update(double dt) { } } } + + updateInterior(); +} + +void FGAIBase::updateInterior() +{ + if(!_modeldata || !_modeldata->hasInteriorPath()) + return; + + if(!_modeldata->getInteriorLoaded()){ // interior is not yet load + double d2 = dist(SGVec3d::fromGeod(pos), globals->get_aircraft_position_cart()); + if(d2 <= _maxRangeInterior){ // if the AI is in-range we load the interior + _interior = SGModelLib::loadPagedModel(_modeldata->getInteriorPath(), props, _modeldata); + if(_interior.valid()){ + _interior->setRange(0, 0.0, _maxRangeInterior); + aip.add(_interior.get()); + _modeldata->setInteriorLoaded(true); + SG_LOG(SG_AI, SG_INFO, "AIBase: Loaded interior model " << _interior->getName()); + } + } + } } /** update LOD properties of the model */ @@ -300,6 +337,7 @@ void FGAIBase::updateLOD() { double maxRangeDetail = fgGetDouble("/sim/rendering/static-lod/ai-detailed", 10000.0); double maxRangeBare = fgGetDouble("/sim/rendering/static-lod/ai-bare", 20000.0); + _maxRangeInterior = fgGetDouble("/sim/rendering/static-lod/ai-interior", 50.0); if (_model.valid()) { if( maxRangeDetail == 0.0 ) @@ -364,6 +402,7 @@ bool FGAIBase::init(bool search_in_AI_path) else _installed = true; + props->addChild("type")->setStringValue("AI"); _modeldata = new FGAIModelData(props); _model= SGModelLib::loadPagedModel(f, props, _modeldata); diff --git a/src/AIModel/AIBase.hxx b/src/AIModel/AIBase.hxx index dd88987cd..504419c7c 100644 --- a/src/AIModel/AIBase.hxx +++ b/src/AIModel/AIBase.hxx @@ -67,6 +67,7 @@ public: virtual void reinit() {} void updateLOD(); + void updateInterior(); void setManager(FGAIManager* mgr, SGPropertyNode* p); void setPath( const char* model ); void setSMPath( const std::string& p ); @@ -124,6 +125,7 @@ public: protected: double _elevation_m; + double _maxRangeInterior; double _x_offset; double _y_offset; @@ -235,6 +237,7 @@ private: object_type _otype; bool _initialized; osg::ref_ptr _model; + osg::ref_ptr _interior; osg::ref_ptr _modeldata; -- 2.39.5