]> git.mxchange.org Git - flightgear.git/blobdiff - src/Model/acmodel.cxx
Mathias Fröhlich:
[flightgear.git] / src / Model / acmodel.cxx
index e28e100459f94099c4100ddb283d8de593e49fd6..7e4f7cbd94e785e4fcc65967b500155f71e1a27f 100644 (file)
 #include "acmodel.hxx"
 
 
+class fgLoaderOptions : ssgLoaderOptions {
+
+public:
+    virtual void makeTexturePath ( char* path, const char *fname ) const ;
+    string livery_path;
+
+};
+
+void fgLoaderOptions::makeTexturePath ( char *path, const char *fname ) const
+{
+  /* Remove all leading path information. */
+  const char* seps = "\\/" ;
+  const char* fn = & fname [ strlen ( fname ) - 1 ] ;
+  for ( ; fn != fname && strchr(seps,*fn) == NULL ; fn-- )
+    /* Search back for a seperator */ ;
+  if ( strchr(seps,*fn) != NULL )
+    fn++ ;
+  fname = fn ;
+  // if we have a livery path and the texture is found there then we use that
+  // path in priority, if the texture was not found or we add no additional 
+  // livery path then we use the current model path or model/texture-path
+  if( livery_path.size() ) {
+      make_path( path, livery_path.c_str(), fname );
+      if( ulFileExists( path ) )
+          return;
+  }
+  make_path ( path, texture_dir, fname ) ;
+}
+
+static fgLoaderOptions _fgLoaderOptions;
+
 \f
 ////////////////////////////////////////////////////////////////////////
 // Implementation of FGAircraftModel
@@ -40,7 +71,7 @@ FGAircraftModel::FGAircraftModel ()
   : _aircraft(0),
     _selector(new ssgSelector),
     _scene(new ssgRoot),
-    _nearplane(0.01f),
+    _nearplane(0.10f),
     _farplane(1000.0f)
 {
 }
@@ -52,7 +83,6 @@ FGAircraftModel::~FGAircraftModel ()
     globals->get_scenery()->unregister_placement_transform(_aircraft->getTransform());
 
   delete _aircraft;
-  delete _scene;
                                // SSG will delete it
   globals->get_scenery()->get_aircraft_branch()->removeKid(_selector);
 }
@@ -60,8 +90,21 @@ FGAircraftModel::~FGAircraftModel ()
 void 
 FGAircraftModel::init ()
 {
+  ssgLoaderOptions *currLoaderOptions = ssgGetCurrentOptions();
+  ssgSetCurrentOptions( (ssgLoaderOptions*)&_fgLoaderOptions );
   _aircraft = new SGModelPlacement;
   string path = fgGetString("/sim/model/path", "Models/Geometry/glider.ac");
+  string texture_path = fgGetString("/sim/model/texture-path");
+  if( texture_path.size() ) {
+      SGPath temp_path;
+      if ( !ulIsAbsolutePathName( texture_path.c_str() ) ) {
+          temp_path = globals->get_fg_root();
+          temp_path.append( SGPath( path ).dir() );
+          temp_path.append( texture_path );
+          _fgLoaderOptions.livery_path = temp_path.str();
+      } else
+          _fgLoaderOptions.livery_path = texture_path;
+  }
   try {
     ssgBranch *model = fgLoad3DModelPanel( globals->get_fg_root(),
                                            path,
@@ -83,6 +126,7 @@ FGAircraftModel::init ()
 
   // Register that one at the scenery manager
   globals->get_scenery()->register_placement_transform(_aircraft->getTransform());
+  ssgSetCurrentOptions( currLoaderOptions );
 }
 
 void 
@@ -115,8 +159,7 @@ FGAircraftModel::update (double dt)
   _aircraft->setOrientation(fgGetDouble("/orientation/roll-deg"),
                            fgGetDouble("/orientation/pitch-deg"),
                            fgGetDouble("/orientation/heading-deg"));
-  _aircraft->update( globals->get_scenery()->get_center() );
-
+  _aircraft->update();
 }
 
 void