00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef _PLANET_HPP_
00021 #define _PLANET_HPP_
00022
00023 #include <QString>
00024
00025 #include "StelObject.hpp"
00026 #include "VecMath.hpp"
00027 #include "StelFader.hpp"
00028 #include "StelTextureTypes.hpp"
00029 #include "StelProjectorType.hpp"
00030
00031
00032
00033 typedef void (*posFuncType)(double, double*, void*);
00034
00035 typedef void (OsulatingFunctType)(double jd0,double jd,double xyz[3]);
00036
00037
00038 #define J2000 2451545.0
00039 #define ORBIT_SEGMENTS 72
00040
00041 class StelFont;
00042 class StelPainter;
00043 class StelTranslator;
00044
00045 struct TrailPoint
00046 {
00047 Vec3d point;
00048 double date;
00049 };
00050
00051
00052
00053 class RotationElements
00054 {
00055 public:
00056 RotationElements(void) : period(1.), offset(0.), epoch(J2000), obliquity(0.), ascendingNode(0.), precessionRate(0.) {}
00057 float period;
00058 float offset;
00059 double epoch;
00060 float obliquity;
00061 float ascendingNode;
00062 float precessionRate;
00063 double siderealPeriod;
00064 };
00065
00066
00067 class Ring
00068 {
00069 public:
00070 Ring(double radiusMin,double radiusMax,const QString &texname);
00071 ~Ring(void);
00072 void draw(StelPainter* painter,const Mat4d& mat,double screenSz);
00073 double getSize(void) const {return radiusMax;}
00074 private:
00075 const double radiusMin;
00076 const double radiusMax;
00077 StelTextureSP tex;
00078 };
00079
00080
00081 class Planet : public StelObject
00082 {
00083 public:
00084 friend class SolarSystem;
00085 Planet(const QString& englishName,
00086 int flagLighting,
00087 double radius,
00088 double oblateness,
00089 Vec3f color,
00090 float albedo,
00091 const QString& texMapName,
00092 posFuncType _coordFunc,
00093 void* userDataPtr,
00094 OsulatingFunctType *osculatingFunc,
00095 bool closeOrbit,
00096 bool hidden,
00097 bool hasAtmosphere);
00098
00099 ~Planet();
00100
00102
00115 virtual QString getInfoString(const StelCore *core, const InfoStringGroup& flags) const;
00116 virtual double getCloseViewFov(const StelNavigator * nav) const;
00117 virtual double getSatellitesFov(const StelNavigator * nav) const;
00118 virtual double getParentSatellitesFov(const StelNavigator * nav) const;
00119 virtual float getVMagnitude(const StelNavigator * nav) const;
00120 virtual float getSelectPriority(const StelNavigator *nav) const;
00121 virtual Vec3f getInfoColor(void) const;
00122 virtual QString getType(void) const {return "Planet";}
00123 virtual Vec3d getJ2000EquatorialPos(const StelNavigator *nav) const;
00124 virtual QString getEnglishName(void) const {return englishName;}
00125 virtual QString getNameI18n(void) const {return nameI18;}
00126 virtual double getAngularSize(const StelCore* core) const;
00127 virtual bool hasAtmosphere(void) {return atmosphere;}
00128
00130
00132 virtual void translateName(StelTranslator& trans);
00133
00134
00135 void draw(StelCore* core, float maxMagLabels, const QFont& planetNameFont);
00136
00138
00141 double getRadius(void) const {return radius;}
00142 double getSiderealDay(void) const {return re.period;}
00143
00144 const QString& getTextMapName() const {return texMapName;}
00145
00146
00147 double getSiderealTime(double jd) const;
00148 Mat4d getRotEquatorialToVsop87(void) const;
00149 void setRotEquatorialToVsop87(const Mat4d &m);
00150
00151 const RotationElements &getRotationElements(void) const {return re;}
00152
00153
00154 void computePositionWithoutOrbits(const double date);
00155 void computePosition(const double date);
00156
00157
00158 void computeTransMatrix(double date);
00159
00160
00161 double getPhase(const Vec3d& obsPos) const;
00162
00163 double getSpheroidAngularSize(const StelCore* core) const;
00164
00165
00166 void setRotationElements(float _period, float _offset, double _epoch,
00167 float _obliquity, float _ascendingNode, float _precessionRate, double _siderealPeriod);
00168 double getRotAscendingnode(void) const {return re.ascendingNode;}
00169 double getRotObliquity(void) const {return re.obliquity;}
00170
00172 Vec3d getEclipticPos() const;
00173
00174
00175 Vec3d getHeliocentricEclipticPos() const;
00176 void setHeliocentricEclipticPos(const Vec3d &pos);
00177
00178
00179 double computeDistance(const Vec3d& obsHelioPos);
00180 double getDistance(void) const {return distance;}
00181
00182 void setRings(Ring* r) {rings = r;}
00183
00184 void setSphereScale(float s) {sphereScale = s;}
00185 float getSphereScale(void) const {return sphereScale;}
00186
00187 const QSharedPointer<Planet> getParent(void) const {return parent;}
00188
00189 static void setLabelColor(const Vec3f& lc) {labelColor = lc;}
00190 static const Vec3f& getLabelColor(void) {return labelColor;}
00191
00192 void update(int deltaTime);
00193
00194 void setFlagHints(bool b){hintFader = b;}
00195 bool getFlagHints(void) const {return hintFader;}
00196
00197 void setFlagLabels(bool b){flagLabels = b;}
00198 bool getFlagLabels(void) const {return flagLabels;}
00199
00201
00203
00204 void setFlagOrbits(bool b){orbitFader = b;}
00205 bool getFlagOrbits(void) const {return orbitFader;}
00206 LinearFader orbitFader;
00207
00208 void drawOrbit(const StelCore*);
00209 Vec3d orbit[ORBIT_SEGMENTS+1];
00210 double lastOrbitJD;
00211 double deltaJD;
00212 double deltaOrbitJD;
00213 bool orbitCached;
00214 bool closeOrbit;
00215
00216
00217
00218 static Vec3f orbitColor;
00219 static void setOrbitColor(const Vec3f& oc) {orbitColor = oc;}
00220 static const Vec3f& getOrbitColor() {return orbitColor;}
00221
00222 protected:
00223 static StelTextureSP texEarthShadow;
00224
00225
00226 void drawEarthShadow(StelCore* core, StelPainter* sPainter);
00227
00228
00229 QString getSkyLabel(const StelNavigator * nav) const;
00230
00231
00232 void draw3dModel(StelCore* core, const Mat4d& mat, float screenSz);
00233
00234
00235 void drawSphere(StelPainter* painter, float screenSz);
00236
00237
00238 void drawHints(const StelCore* core, const QFont& planetNameFont);
00239
00240 QString englishName;
00241 QString nameI18;
00242 QString texMapName;
00243 int flagLighting;
00244 RotationElements re;
00245 double radius;
00246 double oneMinusOblateness;
00247 Vec3d eclipticPos;
00248
00249 Vec3d screenPos;
00250 Vec3d previousScreenPos;
00251 Vec3f color;
00252 float albedo;
00253 Mat4d rotLocalToParent;
00254 float axisRotation;
00255 StelTextureSP texMap;
00256 Ring* rings;
00257 double distance;
00258
00259 float sphereScale;
00260 double lastJD;
00261
00262 posFuncType coordFunc;
00263 void* userDataPtr;
00264
00265 OsulatingFunctType *const osculatingFunc;
00266 QSharedPointer<Planet> parent;
00267 QList<QSharedPointer<Planet> > satellites;
00268 LinearFader hintFader;
00269 LinearFader labelsFader;
00270 bool flagLabels;
00271 bool hidden;
00272 bool atmosphere;
00273
00274 static Vec3f labelColor;
00275 static StelTextureSP hintCircleTex;
00276 };
00277
00278 #endif // _PLANET_HPP_
00279