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

OpenGL

开发平台:

Visual C++

  1. // body.h
  2. //
  3. // Copyright (C) 2001-2006 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_BODY_H_
  10. #define _CELENGINE_BODY_H_
  11. #include <string>
  12. #include <vector>
  13. #include <map>
  14. #include <list>
  15. #include <celutil/utf8.h>
  16. #include <celmath/quaternion.h>
  17. #include <celengine/surface.h>
  18. #include <celengine/atmosphere.h>
  19. #include <celengine/orbit.h>
  20. #include <celengine/star.h>
  21. #include <celengine/location.h>
  22. #include <celengine/rotation.h>
  23. #include <celengine/timeline.h>
  24. class ReferenceFrame;
  25. class Body;
  26. class FrameTree;
  27. class ReferenceMark;
  28. class PlanetarySystem
  29. {
  30.  public:
  31.     PlanetarySystem(Body* _primary);
  32.     PlanetarySystem(Star* _star);
  33.     ~PlanetarySystem();
  34.     Star* getStar() const { return star; };
  35.     Body* getPrimaryBody() const { return primary; };
  36.     int getSystemSize() const { return satellites.size(); };
  37.     Body* getBody(int i) const { return satellites[i]; };
  38.     
  39.     void addAlias(Body* body, const std::string& alias);
  40.     void removeAlias(const Body* body, const std::string& alias);
  41.     void addBody(Body* body);
  42.     void removeBody(Body* body);
  43.     void replaceBody(Body* oldBody, Body* newBody);
  44.     int getOrder(const Body* body) const;
  45.     enum TraversalResult
  46.     {
  47.         ContinueTraversal   = 0,
  48.         StopTraversal       = 1
  49.     };
  50.     typedef bool (*TraversalFunc)(Body*, void*);
  51.     bool traverse(TraversalFunc, void*) const;
  52.     Body* find(const std::string&, bool deepSearch = false, bool i18n = false) const;
  53.     std::vector<std::string> getCompletion(const std::string& _name, bool rec = true) const;
  54.  private:
  55.     void addBodyToNameIndex(Body* body);
  56.     void removeBodyFromNameIndex(const Body* body);
  57.     
  58.  private:
  59.     typedef std::map<std::string, Body*, UTF8StringOrderingPredicate> ObjectIndex;
  60.  private:
  61.     Star* star;
  62.     Body* primary;
  63.     std::vector<Body*> satellites;
  64.     ObjectIndex objectIndex;  // index of bodies by name
  65. };
  66. class RingSystem 
  67. {
  68.  public:
  69.     float innerRadius;
  70.     float outerRadius;
  71.     Color color;
  72.     MultiResTexture texture;
  73.     RingSystem(float inner, float outer) :
  74.         innerRadius(inner), outerRadius(outer),
  75. #ifdef HDR_COMPRESS
  76.         color(0.5f, 0.5f, 0.5f),
  77. #else
  78.         color(1.0f, 1.0f, 1.0f),
  79. #endif
  80.         texture()
  81.         { };
  82.     RingSystem(float inner, float outer, Color _color, int _loTexture = -1, int _texture = -1) :
  83.         innerRadius(inner), outerRadius(outer), color(_color), texture(_loTexture, _texture)
  84.         { };
  85.     RingSystem(float inner, float outer, Color _color, const MultiResTexture& _texture) :
  86.         innerRadius(inner), outerRadius(outer), color(_color), texture(_texture)
  87.         { };
  88. };
  89. class Body
  90. {
  91.  public:
  92.      Body(PlanetarySystem*, const std::string& name);
  93.     ~Body();
  94.     // Object class enumeration:
  95.     // All of these values must be powers of two so that they can
  96.     // be used in an object type bit mask.
  97.     //
  98.     // The values of object class enumerants cannot be modified
  99.     // without consequence. The object orbit mask is a stored user
  100.     // setting, so there will be unexpected results when the user
  101.     // upgrades if the orbit mask values mean something different
  102.     // in the new version.
  103.     //
  104.     // * Planet, Moon, Asteroid, DwarfPlanet, and MinorMoon all behave
  105.     // essentially the same. They're distinguished from each other for
  106.     // user convenience, so that it's possible to assign them different
  107.     // orbit and label colors, and to categorize them in the solar
  108.     // system browser.
  109.     //
  110.     // * Comet is identical to the asteroid class except that comets may
  111.     // be rendered with dust and ion tails.
  112.     //
  113.     // Other classes have different default settings for the properties
  114.     // Clickable, VisibleAsPoint, Visible, and SecondaryIlluminator. These
  115.     // defaults are assigned in the ssc file parser and may be overridden
  116.     // for a particular body.
  117.     //
  118.     // * Invisible is used for barycenters and other reference points.
  119.     // An invisible object is not clickable, visibleAsPoint, visible, or
  120.     // a secondary illuminator.
  121.     //
  122.     // * SurfaceFeature is meant to be used for buildings and landscape.
  123.     // SurfaceFeatures is clickable and visible, but not visibleAsPoint or
  124.     // a secondary illuminator.
  125.     //
  126.     // * Component should be used for parts of spacecraft or buildings that
  127.     // are separate ssc objects. A component is clickable and visible, but
  128.     // not visibleAsPoint or a secondary illuminator.
  129.     //
  130.     // * Diffuse is used for gas clouds, dust plumes, and the like. They are
  131.     // visible, but other properties are false by default. It is expected
  132.     // that an observer will move through a diffuse object, so there's no
  133.     // need for any sort of collision detection to be applied.
  134.     //
  135.     // * Stellar is a pseudo-class used only for orbit rendering.
  136.     //
  137.     // * Barycenter and SmallBody are not used currently. Invisible is used
  138.     // instead of barycenter.
  139.     enum
  140.     {
  141.         Planet         =    0x01,
  142.         Moon           =    0x02,
  143.         Asteroid       =    0x04,
  144.         Comet          =    0x08,
  145.         Spacecraft     =    0x10,
  146.         Invisible      =    0x20,
  147.         Barycenter     =    0x40, // Not used (invisible is used instead)
  148.         SmallBody      =    0x80, // Not used
  149.         DwarfPlanet    =   0x100,
  150.         Stellar        =   0x200, // only used for orbit mask
  151.         SurfaceFeature =   0x400,
  152.         Component      =   0x800,
  153.         MinorMoon      =  0x1000,
  154.         Diffuse        =  0x2000,
  155.         Unknown        = 0x10000,
  156.     };
  157.     enum VisibilityPolicy
  158.     {
  159.         NeverVisible       = 0,
  160.         UseClassVisibility = 1,
  161.         AlwaysVisible      = 2,
  162.     };
  163.     void setDefaultProperties();
  164.     PlanetarySystem* getSystem() const;
  165.     const std::vector<std::string>& getNames() const;
  166.     std::string getName(bool i18n = false) const;
  167.     std::string getLocalizedName() const;
  168.     bool hasLocalizedName() const;
  169.     void addAlias(const std::string& alias);
  170.     void setTimeline(Timeline* timeline);
  171.     const Timeline* getTimeline() const;
  172.     FrameTree* getFrameTree() const;
  173.     FrameTree* getOrCreateFrameTree();
  174.     const ReferenceFrame* getOrbitFrame(double tdb) const;
  175.     const Orbit* getOrbit(double tdb) const;
  176.     const ReferenceFrame* getBodyFrame(double tdb) const;
  177.     const RotationModel* getRotationModel(double tdb) const;
  178.  
  179.     // Size methods
  180.     void setSemiAxes(const Vec3f&);
  181.     Vec3f getSemiAxes() const;
  182.     float getRadius() const;
  183.     bool isSphere() const;
  184.     bool isEllipsoid() const;
  185.     float getMass() const;
  186.     void setMass(float);
  187.     float getAlbedo() const;
  188.     void setAlbedo(float);
  189.     Quatf getOrientation() const;
  190.     void setOrientation(const Quatf&);
  191.     int getClassification() const;
  192.     void setClassification(int);
  193.     std::string getInfoURL() const;
  194.     void setInfoURL(const std::string&);
  195.     PlanetarySystem* getSatellites() const;
  196.     void setSatellites(PlanetarySystem*);
  197.     float getBoundingRadius() const;
  198.     float getCullingRadius() const;
  199.     RingSystem* getRings() const;
  200.     void setRings(const RingSystem&);
  201.     const Atmosphere* getAtmosphere() const;
  202.     Atmosphere* getAtmosphere();
  203.     void setAtmosphere(const Atmosphere&);
  204.     ResourceHandle getGeometry() const { return geometry; }
  205.     void setGeometry(ResourceHandle);
  206.     float getGeometryScale() const { return geometryScale; }
  207.     void setGeometryScale(float scale);
  208.     void setSurface(const Surface&);
  209.     const Surface& getSurface() const;
  210.     Surface& getSurface();
  211.     float getLuminosity(const Star& sun,
  212.                         float distanceFromSun) const;
  213.     float getLuminosity(float sunLuminosity,
  214.                         float distanceFromSun) const;
  215.     float getApparentMagnitude(const Star& sun,
  216.                                float distanceFromSun,
  217.                                float distanceFromViewer) const;
  218.     float getApparentMagnitude(float sunLuminosity,
  219.                                float distanceFromSun,
  220.                                float distanceFromViewer) const;
  221.     float getApparentMagnitude(const Star& sun,
  222.                                const Vec3d& sunPosition,
  223.                                const Vec3d& viewerPosition) const;
  224.     float getApparentMagnitude(float sunLuminosity,
  225.                                const Vec3d& sunPosition,
  226.                                const Vec3d& viewerPosition) const;
  227.     UniversalCoord getPosition(double tdb) const;
  228.     Quatd getOrientation(double tdb) const;
  229. Vec3d getVelocity(double tdb) const;
  230. Vec3d getAngularVelocity(double tdb) const;
  231.     Mat4d getLocalToAstrocentric(double) const;
  232.     Point3d getAstrocentricPosition(double) const;
  233.     Quatd getEquatorialToBodyFixed(double) const;
  234.     Quatd getEclipticToFrame(double) const;
  235.     Quatd getEclipticToEquatorial(double) const;
  236.     Quatd getEclipticToBodyFixed(double) const;
  237.     Mat4d getBodyFixedToAstrocentric(double) const;
  238.     Vec3d planetocentricToCartesian(double lon, double lat, double alt) const;
  239.     Vec3d planetocentricToCartesian(const Vec3d& lonLatAlt) const;
  240.     Vec3d cartesianToPlanetocentric(const Vec3d& v) const;
  241.     Vec3d eclipticToPlanetocentric(const Vec3d& ecl, double tdb) const;  
  242.     bool extant(double) const;
  243.     void setLifespan(double, double);
  244.     void getLifespan(double&, double&) const;
  245.     Surface* getAlternateSurface(const std::string&) const;
  246.     void addAlternateSurface(const std::string&, Surface*);
  247.     std::vector<std::string>* getAlternateSurfaceNames() const;
  248.     std::vector<Location*>* getLocations() const;
  249.     void addLocation(Location*);
  250.     Location* findLocation(const std::string&, bool i18n = false) const;
  251.     void computeLocations();
  252.     bool isVisible() const { return visible == 1; }
  253.     void setVisible(bool _visible);
  254.     bool isClickable() const { return clickable == 1; }
  255.     void setClickable(bool _clickable);
  256.     bool isVisibleAsPoint() const { return visibleAsPoint == 1; }
  257.     void setVisibleAsPoint(bool _visibleAsPoint);
  258.     bool isOrbitColorOverridden() const { return overrideOrbitColor == 1; }
  259.     void setOrbitColorOverridden(bool override);
  260.     bool isSecondaryIlluminator() const { return secondaryIlluminator; }
  261.     void setSecondaryIlluminator(bool enable);
  262.     bool hasVisibleGeometry() const { return classification != Invisible && visible != 0; }
  263.     VisibilityPolicy getOrbitVisibility() const { return orbitVisibility; }
  264.     void setOrbitVisibility(VisibilityPolicy _orbitVisibility);
  265.     Color getOrbitColor() const { return orbitColor; }
  266.     void setOrbitColor(const Color&);
  267.     int getOrbitClassification() const;
  268.     enum
  269.     {
  270.         BodyAxes       =   0x01,
  271.         FrameAxes      =   0x02,
  272.         LongLatGrid    =   0x04,
  273.         SunDirection   =   0x08,
  274.         VelocityVector =   0x10,
  275.     };
  276.     bool referenceMarkVisible(uint32) const;
  277.     uint32 getVisibleReferenceMarks() const;
  278.     void setVisibleReferenceMarks(uint32);
  279.     void addReferenceMark(ReferenceMark* refMark);
  280.     void removeReferenceMark(const std::string& tag);
  281.     ReferenceMark* findReferenceMark(const std::string& tag) const;
  282.     const std::list<ReferenceMark*>* getReferenceMarks() const;
  283.     Star* getReferenceStar() const;
  284.     Star* getFrameReferenceStar() const;
  285.     void markChanged();
  286.     void markUpdated();
  287.  private:
  288.     void setName(const std::string& _name);
  289.     void recomputeCullingRadius();
  290.  private:
  291.     std::vector<std::string> names;
  292.     unsigned int localizedNameIndex;
  293.     // Parent in the name hierarchy
  294.     PlanetarySystem* system;
  295.     // Children in the name hierarchy
  296.     PlanetarySystem* satellites;
  297.     Timeline* timeline;
  298.     // Children in the frame hierarchy
  299.     FrameTree* frameTree;
  300.     float radius;
  301.     Vec3f semiAxes;
  302.     float mass;
  303.     float albedo;
  304.     Quatf orientation;
  305.     float cullingRadius;
  306.     ResourceHandle geometry;
  307.     float geometryScale;
  308.     Surface surface;
  309.     Atmosphere* atmosphere;
  310.     RingSystem* rings;
  311.     int classification;
  312.     std::string infoURL;
  313.     typedef std::map<std::string, Surface*> AltSurfaceTable;
  314.     AltSurfaceTable *altSurfaces;
  315.     std::vector<Location*>* locations;
  316.     mutable bool locationsComputed;
  317.     std::list<ReferenceMark*>* referenceMarks;
  318.     Color orbitColor;
  319.     unsigned int visible : 1;
  320.     unsigned int clickable : 1;
  321.     unsigned int visibleAsPoint : 1;
  322.     unsigned int overrideOrbitColor : 1;
  323.     VisibilityPolicy orbitVisibility : 3;
  324.     bool secondaryIlluminator : 1;
  325. };
  326. #endif // _CELENGINE_BODY_H_