trajmanager.cpp
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:3k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // trajmanager.cpp
  2. //
  3. // Copyright (C) 2001-2008 Chris Laurel <claurel@gmail.com>
  4. //
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU General Public License
  7. // as published by the Free Software Foundation; either version 2
  8. // of the License, or (at your option) any later version.
  9. #include <iostream>
  10. #include <fstream>
  11. #include <cassert>
  12. #include "celestia.h"
  13. #include <celutil/debug.h>
  14. #include <celutil/filetype.h>
  15. #include "samporbit.h"
  16. #include "trajmanager.h"
  17. using namespace std;
  18. static TrajectoryManager* trajectoryManager = NULL;
  19. static const char UniqueSuffixChar = '!';
  20. TrajectoryManager* GetTrajectoryManager()
  21. {
  22.     if (trajectoryManager == NULL)
  23.         trajectoryManager = new TrajectoryManager("data");
  24.     return trajectoryManager;
  25. }
  26. string TrajectoryInfo::resolve(const string& baseDir)
  27. {
  28.     // Ensure that trajectories with different interpolation or precision get resolved to different objects by
  29.     // adding a 'uniquifying' suffix to the filename that encodes the properties other than filename which can
  30.     // distinguish two trajectories. This suffix is stripped before the file is actually loaded.
  31.     char uniquifyingSuffix[32];
  32.     sprintf(uniquifyingSuffix, "%c%u%u", UniqueSuffixChar, (unsigned int) interpolation, (unsigned int) precision);
  33.     if (!path.empty())
  34.     {
  35.         string filename = path + "/data/" + source;
  36.         ifstream in(filename.c_str());
  37.         if (in.good())
  38.             return filename + uniquifyingSuffix;
  39.     }
  40.     return baseDir + "/" + source + uniquifyingSuffix;
  41. }
  42. Orbit* TrajectoryInfo::load(const string& filename)
  43. {
  44.     // strip off the uniquifying suffix
  45.     string::size_type uniquifyingSuffixStart = filename.rfind(UniqueSuffixChar);
  46.     string strippedFilename(filename, 0, uniquifyingSuffixStart);
  47.     ContentType filetype = DetermineFileType(strippedFilename);
  48.     DPRINTF(1, "Loading trajectory: %sn", strippedFilename.c_str());
  49.     Orbit* sampTrajectory = NULL;
  50.     if (filetype == Content_CelestiaXYZVTrajectory)
  51.     {
  52.         switch (precision)
  53.         {
  54.         case TrajectoryPrecisionSingle:
  55.             sampTrajectory = LoadXYZVTrajectorySinglePrec(strippedFilename, interpolation);
  56.             break;
  57.         case TrajectoryPrecisionDouble:
  58.             sampTrajectory = LoadXYZVTrajectoryDoublePrec(strippedFilename, interpolation);
  59.             break;
  60.         default:
  61.             assert(0);
  62.             break;
  63.         }
  64.     }
  65.     else
  66.     {   
  67.         switch (precision)
  68.         {
  69.         case TrajectoryPrecisionSingle:
  70.             sampTrajectory = LoadSampledTrajectorySinglePrec(strippedFilename, interpolation);
  71.             break;
  72.         case TrajectoryPrecisionDouble:
  73.             sampTrajectory = LoadSampledTrajectoryDoublePrec(strippedFilename, interpolation);
  74.             break;
  75.         default:
  76.             assert(0);
  77.             break;
  78.         }
  79.     }
  80.     return sampTrajectory;
  81. }