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 "StelProjector.hpp"
00027 #include "VecMath.hpp"
00028 #include "StelFader.hpp"
00029 #include "renderer/GenericVertexTypes.hpp"
00030 #include "renderer/StelIndexBuffer.hpp"
00031 #include "renderer/StelVertexBuffer.hpp"
00032 #include "StelProjectorType.hpp"
00033
00034
00035
00036 typedef void (*posFuncType)(double, double*, void*);
00037
00038 typedef void (OsculatingFunctType)(double jd0,double jd,double xyz[3]);
00039
00040
00041 #define J2000 2451545.0
00042 #define ORBIT_SEGMENTS 360
00043
00044 class StelFont;
00045 class StelTranslator;
00046
00047 struct TrailPoint
00048 {
00049 Vec3d point;
00050 double date;
00051 };
00052
00053
00054 struct ShadowPlanetShaderInfo
00055 {
00056 int info;
00057 int current;
00058 int infoCount;
00059 float infoSize;
00060 };
00061
00062
00063 class RotationElements
00064 {
00065 public:
00066 RotationElements(void) : period(1.), offset(0.), epoch(J2000), obliquity(0.), ascendingNode(0.), precessionRate(0.) {}
00067 float period;
00068 float offset;
00069 double epoch;
00070 float obliquity;
00071 float ascendingNode;
00072 float precessionRate;
00073 double siderealPeriod;
00074 };
00075
00076
00077 class Ring
00078 {
00079 friend class Planet;
00080 public:
00081 Ring(double radiusMin,double radiusMax,const QString &texname);
00082 ~Ring(void);
00083
00096 void draw(StelProjectorP projector, class StelRenderer* renderer, StelProjector::ModelViewTranformP transform, class StelGLSLShader *shader, double screenSz, ShadowPlanetShaderInfo *info);
00097
00098 double getSize(void) const {return radiusMax;}
00099 private:
00100 const double radiusMin;
00101 const double radiusMax;
00102
00103 const QString texName;
00104 class StelTextureNew* texture;
00105
00107 class StelGeometryRing* ring;
00108 };
00109
00110 class Planet : public StelObject
00111 {
00112 protected:
00115 struct SharedPlanetGraphics
00116 {
00118 class StelTextureNew* texEarthShadow;
00120 class StelTextureNew* texHintCircle;
00122 class StelGLSLShader* simplePlanetShader;
00124 class StelGLSLShader* shadowPlanetShader;
00125
00127 class StelGLSLShader* planetShader;
00128
00130 bool initialized;
00131
00133 ShadowPlanetShaderInfo info;
00134
00136 SharedPlanetGraphics(): initialized(false){}
00138 ~SharedPlanetGraphics();
00140 void lazyInit(class StelRenderer* renderer);
00142 bool loadPlanetShaders(StelRenderer *renderer);
00143 };
00144
00145 public:
00146 friend class SolarSystem;
00147 Planet(const QString& englishName,
00148 int flagLighting,
00149 double radius,
00150 double oblateness,
00151 Vec3f color,
00152 float albedo,
00153 const QString& texMapName,
00154 posFuncType _coordFunc,
00155 void* userDataPtr,
00156 OsculatingFunctType *osculatingFunc,
00157 bool closeOrbit,
00158 bool hidden,
00159 bool hasAtmosphere,
00160 const QString &pType);
00161
00162 ~Planet();
00163
00165
00180 virtual QString getInfoString(const StelCore *core, const InfoStringGroup& flags) const;
00181 virtual double getCloseViewFov(const StelCore* core) const;
00182 virtual double getSatellitesFov(const StelCore* core) const;
00183 virtual double getParentSatellitesFov(const StelCore* core) const;
00184 virtual float getVMagnitude(const StelCore* core, bool withExtinction=false) const;
00185 virtual float getSelectPriority(const StelCore* core) const;
00186 virtual Vec3f getInfoColor(void) const;
00187 virtual QString getType(void) const {return "Planet";}
00188 virtual Vec3d getJ2000EquatorialPos(const StelCore *core) const;
00189 virtual QString getEnglishName(void) const {return englishName;}
00190 virtual QString getNameI18n(void) const {return nameI18;}
00191 virtual double getAngularSize(const StelCore* core) const;
00192 virtual bool hasAtmosphere(void) {return atmosphere;}
00193
00195
00197 virtual void translateName(StelTranslator& trans);
00198
00206 void draw(StelCore* core, class StelRenderer* renderer, float maxMagLabels,
00207 const QFont& planetNameFont, SharedPlanetGraphics& planetGraphics);
00208
00210
00213 double getRadius(void) const {return radius;}
00214 double getSiderealDay(void) const {return re.period;}
00215 double getSiderealPeriod(void) const { return re.siderealPeriod; }
00216
00217 const QString& getTextMapName() const {return texMapName;}
00218
00219
00220 double getSiderealTime(double jd) const;
00221 Mat4d getRotEquatorialToVsop87(void) const;
00222 void setRotEquatorialToVsop87(const Mat4d &m);
00223
00224 const RotationElements &getRotationElements(void) const {return re;}
00225
00226
00227 void computePositionWithoutOrbits(const double date);
00228 void computePosition(const double date);
00229
00230
00231 void computeTransMatrix(double date);
00232
00233
00234 void computeModelMatrix(Mat4d& result) const;
00235
00236
00237 double getPhaseAngle(const Vec3d& obsPos) const;
00238
00239 double getElongation(const Vec3d& obsPos) const;
00240
00241 double getSpheroidAngularSize(const StelCore* core) const;
00242
00243 float getPhase(const Vec3d& obsPos) const;
00244
00245
00246 void setRotationElements(float _period, float _offset, double _epoch,
00247 float _obliquity, float _ascendingNode,
00248 float _precessionRate, double _siderealPeriod);
00249 double getRotAscendingnode(void) const {return re.ascendingNode;}
00250 double getRotObliquity(void) const {return re.obliquity;}
00251
00253 Vec3d getEclipticPos() const;
00254
00255
00256 Vec3d getHeliocentricEclipticPos() const;
00257
00258
00259 Vec3d getHeliocentricPos(Vec3d) const;
00260 void setHeliocentricEclipticPos(const Vec3d &pos);
00261
00262
00263 double computeDistance(const Vec3d& obsHelioPos);
00264 double getDistance(void) const {return distance;}
00265
00266 void setRings(Ring* r) {rings = r;}
00267
00268 void setSphereScale(float s);
00269
00270 float getSphereScale(void) const {return sphereScale;}
00271
00272 const QSharedPointer<Planet> getParent(void) const {return parent;}
00273
00274 static void setLabelColor(const Vec3f& lc) {labelColor = lc;}
00275 static const Vec3f& getLabelColor(void) {return labelColor;}
00276
00277 void update(int deltaTime);
00278
00279 void setFlagHints(bool b){hintFader = b;}
00280 bool getFlagHints(void) const {return hintFader;}
00281
00282 void setFlagLabels(bool b){flagLabels = b;}
00283 bool getFlagLabels(void) const {return flagLabels;}
00284
00286
00288
00289 void setFlagOrbits(bool b){orbitFader = b;}
00290 bool getFlagOrbits(void) const {return orbitFader;}
00291
00293 struct Vertex2D
00294 {
00295 Vec2f position;
00296 Vertex2D(const float x, const float y) : position(x, y){}
00297 VERTEX_ATTRIBUTES(Vec2f Position);
00298 };
00299
00301 StelVertexBuffer<Vertex2D>* orbitVertices;
00302
00303 LinearFader orbitFader;
00304
00305 void drawOrbit(const StelCore* core, class StelRenderer* renderer);
00306 Vec3d orbit[ORBIT_SEGMENTS+1];
00307 Vec3d orbitP[ORBIT_SEGMENTS+1];
00308 double lastOrbitJD;
00309 double deltaJD;
00310 double deltaOrbitJD;
00311 bool orbitCached;
00312 bool closeOrbit;
00313
00314
00315
00316 static Vec3f orbitColor;
00317 static void setOrbitColor(const Vec3f& oc) {orbitColor = oc;}
00318 static const Vec3f& getOrbitColor() {return orbitColor;}
00319
00320 protected:
00321
00322 void drawEarthShadow(StelCore* core, class StelRenderer* renderer,
00323 SharedPlanetGraphics& planetGraphics);
00324
00325
00326 QString getSkyLabel(const StelCore* core) const;
00327
00335 void draw3dModel(StelCore* core, class StelRenderer* renderer,
00336 SharedPlanetGraphics& planetGraphics,
00337 StelProjector::ModelViewTranformP transfo, float screenSz);
00338
00347 void drawUnlitSphere(class StelRenderer* renderer, StelProjectorP projector);
00348
00359 void drawSphere(class StelRenderer* renderer, StelProjectorP projector,
00360 const struct StelLight* light, SharedPlanetGraphics &planetGraphics, float screenSz);
00361
00362
00363 void drawHints(const StelCore* core, class StelRenderer* renderer,
00364 const QFont& planetNameFont, SharedPlanetGraphics& planetGraphics);
00365
00366 QString englishName;
00367 QString nameI18;
00368 QString texMapName;
00369 RotationElements re;
00370
00371
00372
00373
00374 const int flagLighting;
00375 const double radius;
00376 const double oneMinusOblateness;
00377 Vec3d eclipticPos;
00378
00379 Vec3d screenPos;
00380 Vec3d previousScreenPos;
00381 Vec3f color;
00382
00383 float albedo;
00384 Mat4d rotLocalToParent;
00385 float axisRotation;
00386
00387 class StelTextureNew* texture;
00388
00389 Ring* rings;
00390 double distance;
00391
00392 float sphereScale;
00393 double lastJD;
00394
00395 posFuncType coordFunc;
00396 void* userDataPtr;
00397
00398 OsculatingFunctType *const osculatingFunc;
00399 QSharedPointer<Planet> parent;
00400 QList<QSharedPointer<Planet> > satellites;
00401 LinearFader hintFader;
00402 LinearFader labelsFader;
00403 bool flagLabels;
00404 bool hidden;
00405 bool atmosphere;
00406 QString pType;
00407
00409 class StelGeometrySphere* unlitSphere;
00411 class StelGeometrySphere* litSphere;
00412
00413 static Vec3f labelColor;
00414 };
00415
00416 #endif // _PLANET_HPP_
00417