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

OpenGL

开发平台:

Visual C++

  1. // stardb.h
  2. //
  3. // Copyright (C) 2001-2008, Chris Laurel <claurel@shatters.net>
  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. #ifndef _CELENGINE_STARDB_H_
  10. #define _CELENGINE_STARDB_H_
  11. #include <iostream>
  12. #include <vector>
  13. #include <map>
  14. #include <celengine/constellation.h>
  15. #include <celengine/starname.h>
  16. #include <celengine/star.h>
  17. #include <celengine/staroctree.h>
  18. #include <celengine/parser.h>
  19. static const unsigned int MAX_STAR_NAMES = 10;
  20. // TODO: Move BlockArray to celutil; consider making it a full STL
  21. // style container with iterator support.
  22. /*! BlockArray is a container class that is similar to an STL vector
  23.  *  except for two very important differences:
  24.  *  - The elements of a BlockArray are not necessarily in one
  25.  *    contiguous block of memory.
  26.  *  - The address of a BlockArray element is guaranteed not to
  27.  *    change over the lifetime of the BlockArray (or until the
  28.  *    BlockArray is cleared.)
  29.  */
  30. template<class T> class BlockArray
  31. {
  32. public:
  33.     BlockArray() :
  34.         m_blockSize(1000),
  35.         m_elementCount(0)
  36.     {
  37.     }
  38.     
  39.     ~BlockArray()
  40.     {
  41.         clear();
  42.     }
  43.     
  44.     unsigned int size() const
  45.     {
  46.         return m_elementCount;
  47.     }
  48.     
  49.     /*! Append an item to the BlockArray. */
  50.     void add(T& element)
  51.     {
  52.         unsigned int blockIndex = m_elementCount / m_blockSize;
  53.         if (blockIndex == m_blocks.size())
  54.         {
  55.             T* newBlock = new T[m_blockSize];
  56.             m_blocks.push_back(newBlock);
  57.         }
  58.         
  59.         unsigned int elementIndex = m_elementCount % m_blockSize;
  60.         m_blocks.back()[elementIndex] = element;
  61.         
  62.         ++m_elementCount;
  63.     }
  64.     
  65.     void clear()
  66.     {
  67.         for (typename std::vector<T*>::const_iterator iter = m_blocks.begin(); iter != m_blocks.end(); ++iter)
  68.         {
  69.             delete[] *iter;
  70.         }
  71.         m_elementCount = 0;
  72.         m_blocks.clear();
  73.     }
  74.     
  75.     T& operator[](int index)
  76.     {
  77.         unsigned int blockNumber = index / m_blockSize;
  78.         unsigned int elementNumber = index % m_blockSize;
  79.         return m_blocks[blockNumber][elementNumber];
  80.     }
  81.     const T& operator[](int index) const
  82.     {
  83.         unsigned int blockNumber = index / m_blockSize;
  84.         unsigned int elementNumber = index % m_blockSize;
  85.         return m_blocks[blockNumber][elementNumber];
  86.     }
  87.     
  88. private:
  89.     unsigned int m_blockSize;
  90.     unsigned int m_elementCount;
  91.     std::vector<T*> m_blocks;
  92. };
  93. class StarDatabase
  94. {        
  95.  public:
  96.     StarDatabase();
  97.     ~StarDatabase();
  98.     inline Star*  getStar(const uint32) const;
  99.     inline uint32 size() const;
  100.     Star* find(uint32 catalogNumber) const;
  101.     Star* find(const std::string&) const;
  102.     uint32 findCatalogNumberByName(const std::string&) const;
  103.     std::vector<std::string> getCompletion(const std::string&) const;
  104.     void findVisibleStars(StarHandler& starHandler,
  105.                           const Point3f& obsPosition,
  106.                           const Quatf&   obsOrientation,
  107.                           float fovY,
  108.                           float aspectRatio,
  109.                           float limitingMag) const;
  110.     void findCloseStars(StarHandler& starHandler,
  111.                         const Point3f& obsPosition,
  112.                         float radius) const;
  113.     std::string getStarName    (const Star&, bool i18n = false) const;
  114.     void getStarName(const Star& star, char* nameBuffer, unsigned int bufferSize, bool i18n = false) const;
  115.     std::string getStarNameList(const Star&, const unsigned int maxNames = MAX_STAR_NAMES) const;
  116.     StarNameDatabase* getNameDatabase() const;
  117.     void setNameDatabase(StarNameDatabase*);
  118.     
  119.     bool load(std::istream&, const std::string& resourcePath);
  120.     bool loadBinary(std::istream&);
  121.     enum Catalog
  122.     {
  123.         HenryDraper = 0,
  124.         Gliese      = 1,
  125.         SAO         = 2,
  126.         MaxCatalog  = 3,
  127.     };
  128.     enum StcDisposition
  129.     {
  130.         AddStar,
  131.         ReplaceStar,
  132.         ModifyStar,
  133.     };
  134.     
  135. // Not exact, but any star with a catalog number greater than this is assumed to not be
  136. // a HIPPARCOS stars.
  137. static const uint32 MAX_HIPPARCOS_NUMBER = 999999;
  138.     struct CrossIndexEntry
  139.     {
  140.         uint32 catalogNumber;
  141.         uint32 celCatalogNumber;
  142.         bool operator<(const CrossIndexEntry&) const;
  143.     };
  144.     typedef std::vector<CrossIndexEntry> CrossIndex;
  145.     bool   loadCrossIndex  (const Catalog, std::istream&);
  146.     uint32 searchCrossIndexForCatalogNumber(const Catalog, const uint32 number) const;
  147.     Star*  searchCrossIndex(const Catalog, const uint32 number) const;
  148.     uint32 crossIndex      (const Catalog, const uint32 number) const;
  149.     void finish();
  150.     static StarDatabase* read(std::istream&);
  151.     static const char* FILE_HEADER;
  152.     static const char* CROSSINDEX_FILE_HEADER;
  153. private:
  154.     bool createStar(Star* star,
  155.                     StcDisposition disposition,
  156.                     uint32 catalogNumber,
  157.                     Hash* starData,
  158.                     const std::string& path,
  159.                     const bool isBarycenter);
  160.     void buildOctree();
  161.     void buildIndexes();
  162.     Star* findWhileLoading(uint32 catalogNumber) const;
  163.     int nStars;
  164.         
  165.     Star*             stars;
  166.     StarNameDatabase* namesDB;
  167.     Star**            catalogNumberIndex;
  168.     StarOctree*       octreeRoot;
  169.     uint32            nextAutoCatalogNumber;
  170.     std::vector<CrossIndex*> crossIndexes;
  171.     // These values are used by the star database loader; they are
  172.     // not used after loading is complete.
  173.     BlockArray<Star> unsortedStars;
  174.     // List of stars loaded from binary file, sorted by catalog number
  175.     Star** binFileCatalogNumberIndex;
  176.     unsigned int binFileStarCount;
  177.     // Catalog number -> star mapping for stars loaded from stc files
  178.     std::map<uint32, Star*> stcFileCatalogNumberIndex;    
  179.     struct BarycenterUsage
  180.     {
  181.         uint32 catNo;
  182.         uint32 barycenterCatNo;
  183.     };
  184.     std::vector<BarycenterUsage> barycenters;
  185. };
  186. Star* StarDatabase::getStar(const uint32 n) const
  187. {
  188.     return stars + n;
  189. }
  190. uint32 StarDatabase::size() const
  191. {
  192.     return nStars;
  193. }
  194. #endif // _CELENGINE_STARDB_H_