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

OpenGL

开发平台:

Visual C++

  1. // star.h
  2. //
  3. // Copyright (C) 2001, 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 _STAR_H_
  10. #define _STAR_H_
  11. #include <vector>
  12. #include <celutil/basictypes.h>
  13. #include <celutil/reshandle.h>
  14. #include <celutil/color.h>
  15. #include <celmath/vecmath.h>
  16. #include <celengine/univcoord.h>
  17. #include <celengine/celestia.h>
  18. #include <celengine/stellarclass.h>
  19. #include <celengine/rotation.h>
  20. #include <celengine/multitexture.h>
  21. class Orbit;
  22. class Star;
  23. class StarDetails
  24. {
  25.     friend class Star;
  26.  public:
  27.     StarDetails();
  28.     StarDetails(const StarDetails&);
  29.     ~StarDetails();
  30.     
  31.  private:
  32.     // Prohibit assignment of StarDetails objects
  33.     StarDetails& operator=(const StarDetails&);
  34.  public:
  35.     inline float getRadius() const;
  36.     inline float getTemperature() const;
  37.     inline ResourceHandle getGeometry() const;
  38.     inline MultiResTexture getTexture() const;
  39.     inline Orbit* getOrbit() const;
  40.     inline float getOrbitalRadius() const;
  41.     inline const char* getSpectralType() const;
  42.     inline float getBolometricCorrection() const;
  43.     inline Star* getOrbitBarycenter() const;
  44.     inline bool getVisibility() const;
  45.     inline const RotationModel* getRotationModel() const;
  46.     inline Vec3f getEllipsoidSemiAxes() const;
  47.     const std::string& getInfoURL() const;
  48.     void setRadius(float);
  49.     void setTemperature(float);
  50.     void setSpectralType(const std::string&);
  51.     void setBolometricCorrection(float);
  52.     void setTexture(const MultiResTexture&);
  53.     void setGeometry(ResourceHandle);
  54.     void setOrbit(Orbit*);
  55.     void setOrbitBarycenter(Star*);
  56.     void setOrbitalRadius(float);
  57.     void computeOrbitalRadius();
  58.     void setVisibility(bool);
  59.     void setRotationModel(const RotationModel*);
  60.     void setEllipsoidSemiAxes(const Vec3f&);
  61.     void setInfoURL(const std::string& _infoURL);
  62.     bool shared() const;
  63.     
  64.     enum
  65.     {
  66.         KnowRadius   = 0x1,
  67.         KnowRotation = 0x2,
  68.         KnowTexture  = 0x4,
  69.     };
  70.     inline uint32 getKnowledge() const;
  71.     inline bool getKnowledge(uint32) const;
  72.     void setKnowledge(uint32);
  73.     void addKnowledge(uint32);
  74.  private:
  75.     void addOrbitingStar(Star*);
  76.  private:
  77.     float radius;
  78.     float temperature;
  79.     float bolometricCorrection;
  80.     uint32 knowledge;
  81.     bool visible;
  82.     char spectralType[8];
  83.     MultiResTexture texture;
  84.     ResourceHandle geometry;
  85.     Orbit* orbit;
  86.     float orbitalRadius;
  87.     Star* barycenter;
  88.     const RotationModel* rotationModel;
  89.     Vec3f semiAxes;
  90.     std::string* infoURL;
  91.     
  92.     std::vector<Star*>* orbitingStars;
  93.     bool isShared;
  94.  public:
  95.     struct StarTextureSet
  96.     {
  97.         MultiResTexture defaultTex;
  98.         MultiResTexture neutronStarTex;
  99.         MultiResTexture starTex[StellarClass::Spectral_Count];
  100.     };
  101.     
  102.  public:
  103.     static StarDetails* GetStarDetails(const StellarClass&);
  104.     static StarDetails* CreateStandardStarType(const std::string& _specType,
  105.                                                float _temperature,
  106.                                                float _rotationPeriod);
  107.     static StarDetails* GetNormalStarDetails(StellarClass::SpectralClass specClass,
  108.                                              unsigned int subclass,
  109.                                              StellarClass::LuminosityClass lumClass);
  110.     static StarDetails* GetWhiteDwarfDetails(StellarClass::SpectralClass specClass,
  111.                                              unsigned int subclass);
  112.     static StarDetails* GetNeutronStarDetails();
  113.     static StarDetails* GetBlackHoleDetails();
  114.     static StarDetails* GetBarycenterDetails();
  115.     
  116.     static void SetStarTextures(const StarTextureSet&);
  117.     
  118.  private:
  119.     static StarTextureSet starTextures;
  120. };
  121. float
  122. StarDetails::getRadius() const
  123. {
  124.     return radius;
  125. }
  126. float
  127. StarDetails::getTemperature() const
  128. {
  129.     return temperature;
  130. }
  131. ResourceHandle
  132. StarDetails::getGeometry() const
  133. {
  134.     return geometry;
  135. }
  136. MultiResTexture
  137. StarDetails::getTexture() const
  138. {
  139.     return texture;
  140. }
  141. Orbit*
  142. StarDetails::getOrbit() const
  143. {
  144.     return orbit;
  145. }
  146. float
  147. StarDetails::getOrbitalRadius() const
  148. {
  149.     return orbitalRadius;
  150. }
  151. uint32
  152. StarDetails::getKnowledge() const
  153. {
  154.     return knowledge;
  155. }
  156. bool
  157. StarDetails::getKnowledge(uint32 knowledgeFlags) const
  158. {
  159.     return ((knowledge & knowledgeFlags) == knowledgeFlags);
  160. }
  161. const char*
  162. StarDetails::getSpectralType() const
  163. {
  164.     return spectralType;
  165. }
  166. float
  167. StarDetails::getBolometricCorrection() const
  168. {
  169.     return bolometricCorrection;
  170. }
  171. Star*
  172. StarDetails::getOrbitBarycenter() const
  173. {
  174.     return barycenter;
  175. }
  176. bool
  177. StarDetails::getVisibility() const
  178. {
  179.     return visible;
  180. }
  181. const RotationModel*
  182. StarDetails::getRotationModel() const
  183. {
  184.     return rotationModel;
  185. }
  186. Vec3f
  187. StarDetails::getEllipsoidSemiAxes() const
  188. {
  189.     return semiAxes;
  190. }
  191. class Star
  192. {
  193. public:
  194.     inline Star();
  195.     ~Star();
  196.     // Accessor methods for members of the star class
  197.     inline uint32 getCatalogNumber() const;
  198.     inline Point3f getPosition() const;
  199.     inline float getAbsoluteMagnitude() const;
  200.     float getApparentMagnitude(float) const;
  201.     float getLuminosity() const;
  202.     // Return the exact position of the star, accounting for its orbit
  203.     UniversalCoord getPosition(double t) const;
  204.     UniversalCoord getOrbitBarycenterPosition(double t) const;
  205. Vec3d getVelocity(double t) const;
  206.     void setCatalogNumber(uint32);
  207.     void setPosition(float, float, float);
  208.     void setPosition(Point3f);
  209.     void setAbsoluteMagnitude(float);
  210.     void setLuminosity(float);
  211.     StarDetails* getDetails() const;
  212.     void setDetails(StarDetails*);
  213.     void setOrbitBarycenter(Star*);
  214.     void computeOrbitalRadius();
  215.     void setRotationModel(const RotationModel*);
  216.     void addOrbitingStar(Star*);
  217.     inline const std::vector<Star*>* getOrbitingStars() const;
  218.     // Accessor methods that delegate to StarDetails
  219.     float getRadius() const;
  220.     inline float getTemperature() const;
  221.     inline const char* getSpectralType() const;
  222.     inline float getBolometricMagnitude() const;
  223.     MultiResTexture getTexture() const;
  224.     ResourceHandle getGeometry() const;
  225.     inline Orbit* getOrbit() const;
  226.     inline float getOrbitalRadius() const;
  227.     inline Star* getOrbitBarycenter() const;
  228.     inline bool getVisibility() const;
  229.     inline uint32 getKnowledge() const;
  230.     inline const RotationModel* getRotationModel() const;
  231.     inline Vec3f getEllipsoidSemiAxes() const;
  232.     const std::string& getInfoURL() const;
  233.     enum {
  234.         MaxTychoCatalogNumber = 0xf0000000,
  235.         InvalidCatalogNumber = 0xffffffff,
  236.     };
  237. private:
  238.     uint32 catalogNumber;
  239.     Point3f position;
  240.     float absMag;
  241.     StarDetails* details;
  242. };
  243. Star::Star() :
  244.     catalogNumber(InvalidCatalogNumber),
  245.     position(0, 0, 0),
  246.     absMag(4.83f),
  247.     details(NULL)
  248. {
  249. }
  250. uint32
  251. Star::getCatalogNumber() const
  252. {
  253.     return catalogNumber;
  254. }
  255. float
  256. Star::getAbsoluteMagnitude() const
  257. {
  258.     return absMag;
  259. }
  260. // This getPosition() method returns the approximate star position; that is,
  261. // star position without any orbital motion taken into account.  For a
  262. // star in an orbit, the position should be set to the 'root' barycenter
  263. // of the system.
  264. Point3f
  265. Star::getPosition() const
  266. {
  267.     return position;
  268. }
  269. float
  270. Star::getTemperature() const
  271. {
  272.     return details->getTemperature();
  273. }
  274. const char*
  275. Star::getSpectralType() const
  276. {
  277.     return details->getSpectralType();
  278. }
  279. float
  280. Star::getBolometricMagnitude() const
  281. {
  282.     return absMag + details->getBolometricCorrection();
  283. }
  284. Orbit*
  285. Star::getOrbit() const
  286. {
  287.     return details->getOrbit();
  288. }
  289. float
  290. Star::getOrbitalRadius() const
  291. {
  292.     return details->getOrbitalRadius();
  293. }
  294. Star*
  295. Star::getOrbitBarycenter() const
  296. {
  297.     return details->getOrbitBarycenter();
  298. }
  299. bool
  300. Star::getVisibility() const
  301. {
  302.     return details->getVisibility();
  303. }
  304. const RotationModel*
  305. Star::getRotationModel() const
  306. {
  307.     return details->getRotationModel();
  308. }
  309. Vec3f
  310. Star::getEllipsoidSemiAxes() const
  311. {
  312.     return details->getEllipsoidSemiAxes();
  313. }
  314. const std::vector<Star*>*
  315. Star::getOrbitingStars() const
  316. {
  317.     return details->orbitingStars;
  318. }
  319. #endif // _STAR_H_