Stellarium 0.14.0
StelCore.hpp
1 /*
2  * Copyright (C) 2003 Fabien Chereau
3  * Copyright (C) 2012 Matthew Gates
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  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
18  */
19 
20 #ifndef _STELCORE_HPP_
21 #define _STELCORE_HPP_
22 
23 #include "StelProjector.hpp"
24 #include "StelProjectorType.hpp"
25 #include "StelLocation.hpp"
26 #include "StelSkyDrawer.hpp"
27 #include <QString>
28 #include <QStringList>
29 #include <QTime>
30 
31 class StelToneReproducer;
32 class StelSkyDrawer;
33 class StelGeodesicGrid;
34 class StelMovementMgr;
35 class StelObserver;
36 
46 class StelCore : public QObject
47 {
48  Q_OBJECT
49  Q_ENUMS(ProjectionType)
50  Q_ENUMS(DeltaTAlgorithm)
51  Q_PROPERTY(bool flipHorz READ getFlipHorz WRITE setFlipHorz)
52  Q_PROPERTY(bool flipVert READ getFlipVert WRITE setFlipVert)
53 
54 public:
57  enum FrameType
58  {
59  FrameUninitialized,
60  FrameAltAz,
61  FrameHeliocentricEcliptic,
62  FrameObservercentricEcliptic,
63  FrameEquinoxEqu,
64  FrameJ2000,
66  FrameGalactic
68  };
69 
72  enum ProjectionType
73  {
74  ProjectionPerspective,
75  ProjectionEqualArea,
76  ProjectionStereographic,
77  ProjectionFisheye,
78  ProjectionHammer,
79  ProjectionCylinder,
80  ProjectionMercator,
81  ProjectionOrthographic
82  };
83 
86  enum RefractionMode
87  {
88  RefractionAuto,
89  RefractionOn,
90  RefractionOff
91  };
92 
95  enum DeltaTAlgorithm
96  {
97  WithoutCorrection,
98  Schoch,
99  Clemence,
100  IAU,
101  AstronomicalEphemeris,
102  TuckermanGoldstine,
103  MullerStephenson,
104  Stephenson1978,
105  SchmadelZech1979,
106  MorrisonStephenson1982,
107  StephensonMorrison1984,
108  StephensonHoulden,
109  Espenak,
110  Borkowski,
111  SchmadelZech1988,
112  ChaprontTouze,
113  StephensonMorrison1995,
114  Stephenson1997,
115  ChaprontMeeus,
116  JPLHorizons,
117  MeeusSimons,
118  MontenbruckPfleger,
119  ReingoldDershowitz,
120  MorrisonStephenson2004,
121  Reijs,
122  EspenakMeeus,
123  Banjevic,
124  IslamSadiqQureshi,
125  KhalidSultanaZaidi,
126  Custom
127  };
128 
129  StelCore();
130  virtual ~StelCore();
131 
133  void init();
134 
137  void update(double deltaTime);
138 
140  void windowHasBeenResized(float x, float y, float width, float height);
141 
143  void preDraw();
144 
146  void postDraw();
147 
150  StelProjectorP getProjection2d() const;
151 
154  StelProjectorP getProjection(FrameType frameType, RefractionMode refractionMode=RefractionAuto) const;
155 
158  StelProjectorP getProjection(StelProjector::ModelViewTranformP modelViewTransform, ProjectionType projType=(ProjectionType)1000) const;
159 
161  StelToneReproducer* getToneReproducer();
163  const StelToneReproducer* getToneReproducer() const;
164 
166  StelSkyDrawer* getSkyDrawer();
168  const StelSkyDrawer* getSkyDrawer() const;
169 
171  const StelGeodesicGrid* getGeodesicGrid(int maxLevel) const;
172 
174  StelMovementMgr* getMovementMgr();
176  const StelMovementMgr* getMovementMgr() const;
177 
179  void setClippingPlanes(double znear, double zfar);
181  void getClippingPlanes(double* zn, double* zf) const;
182 
184  QString projectionTypeKeyToNameI18n(const QString& key) const;
185 
187  QString projectionNameI18nToTypeKey(const QString& nameI18n) const;
188 
190  StelProjector::StelProjectorParams getCurrentStelProjectorParams() const;
192  void setCurrentStelProjectorParams(const StelProjector::StelProjectorParams& newParams);
193 
195  void lookAtJ2000(const Vec3d& pos, const Vec3d& up);
196 
197  Vec3d altAzToEquinoxEqu(const Vec3d& v, RefractionMode refMode=RefractionAuto) const;
198  Vec3d equinoxEquToAltAz(const Vec3d& v, RefractionMode refMode=RefractionAuto) const;
199  Vec3d altAzToJ2000(const Vec3d& v, RefractionMode refMode=RefractionAuto) const;
200  Vec3d j2000ToAltAz(const Vec3d& v, RefractionMode refMode=RefractionAuto) const;
201  void j2000ToAltAzInPlaceNoRefraction(Vec3f* v) const {v->transfo4d(matJ2000ToAltAz);}
202  Vec3d galacticToJ2000(const Vec3d& v) const;
203  Vec3d equinoxEquToJ2000(const Vec3d& v) const;
204  Vec3d j2000ToEquinoxEqu(const Vec3d& v) const;
205  Vec3d j2000ToGalactic(const Vec3d& v) const;
206 
208  Vec3d heliocentricEclipticToAltAz(const Vec3d& v, RefractionMode refMode=RefractionAuto) const;
209 
211  Vec3d heliocentricEclipticToEquinoxEqu(const Vec3d& v) const;
214  Vec3d heliocentricEclipticToEarthPosEquinoxEqu(const Vec3d& v) const;
215 
217  StelProjector::ModelViewTranformP getHeliocentricEclipticModelViewTransform(RefractionMode refMode=RefractionAuto) const;
218 
220  StelProjector::ModelViewTranformP getObservercentricEclipticModelViewTransform(RefractionMode refMode=RefractionAuto) const;
221 
223  StelProjector::ModelViewTranformP getEquinoxEquModelViewTransform(RefractionMode refMode=RefractionAuto) const;
224 
226  StelProjector::ModelViewTranformP getAltAzModelViewTransform(RefractionMode refMode=RefractionAuto) const;
227 
229  StelProjector::ModelViewTranformP getJ2000ModelViewTransform(RefractionMode refMode=RefractionAuto) const;
230 
232  StelProjector::ModelViewTranformP getGalacticModelViewTransform(RefractionMode refMode=RefractionAuto) const;
233 
235  static const Mat4d matJ2000ToVsop87;
237  static const Mat4d matVsop87ToJ2000;
239  static const Mat4d matJ2000ToGalactic;
241  static const Mat4d matGalacticToJ2000;
242 
244  Vec3d getObserverHeliocentricEclipticPos() const;
245 
247  const StelLocation& getCurrentLocation() const;
248 
249  const QSharedPointer<class Planet> getCurrentPlanet() const;
250 
251  SphericalCap getVisibleSkyArea() const;
252 
258  void moveObserverTo(const StelLocation& target, double duration=1., double durationIfPlanetChange=1.);
259 
260  // Conversion in standar Julian time format
261  static const double JD_SECOND;
262  static const double JD_MINUTE;
263  static const double JD_HOUR;
264  static const double JD_DAY;
265  static const double ONE_OVER_JD_SECOND;
266 
269  double getLocalSiderealTime() const;
270 
272  double getLocalSiderealDayLength() const;
273 
275  double getLocalSiderealYearLength() const;
276 
278  QString getStartupTimeMode();
279  void setStartupTimeMode(const QString& s);
280 
285  double getDeltaT(double jDay) const;
286 
291  QString getCurrentDeltaTAlgorithmValidRange(double jDay, QString* marker) const;
292 
294  bool isDay() const;
295 
297  double getCurrentEpoch() const;
298 
300  QString getDefaultProjectionTypeKey(void) const;
301 
302 public slots:
304  void setCurrentProjectionType(ProjectionType type);
305  ProjectionType getCurrentProjectionType() const;
306 
308  QString getCurrentProjectionTypeKey(void) const;
310  void setCurrentProjectionTypeKey(QString type);
311 
313  QStringList getAllProjectionTypeKeys() const;
314 
316  void setCurrentDeltaTAlgorithm(DeltaTAlgorithm algorithm) { currentDeltaTAlgorithm=algorithm; }
318  DeltaTAlgorithm getCurrentDeltaTAlgorithm() const { return currentDeltaTAlgorithm; }
320  QString getCurrentDeltaTAlgorithmDescription(void) const;
322  QString getCurrentDeltaTAlgorithmKey(void) const;
324  void setCurrentDeltaTAlgorithmKey(QString type);
325 
328 
331  void setFlagGravityLabels(bool gravity);
333  void setDefautAngleForGravityText(float a);
336  void setFlipHorz(bool flip);
339  void setFlipVert(bool flip);
342  bool getFlipHorz(void) const;
345  bool getFlipVert(void) const;
346 
348  QString getDefaultLocationID() const;
350  void setDefaultLocationID(const QString& id);
354  void returnToHome();
355 
357  void setJDay(double JD);
359  double getJDay() const;
360 
362  void setMJDay(double MJD);
364  double getMJDay() const;
365 
367  double getPresetSkyTime() const;
369  void setPresetSkyTime(double d);
370 
372  void setTimeRate(double ts);
374  double getTimeRate() const;
375 
377  void increaseTimeSpeed();
379  void decreaseTimeSpeed();
381  void increaseTimeSpeedLess();
383  void decreaseTimeSpeedLess();
384 
386  void setZeroTimeSpeed();
388  void setRealTimeSpeed();
390  void toggleRealTimeSpeed();
392  bool getRealTimeSpeed() const;
393 
395  void setTimeNow();
397  void setTodayTime(const QTime& target);
399  bool getIsTimeNow() const;
400 
402  QTime getInitTodayTime(void);
404  void setInitTodayTime(const QTime& t);
406  void setPresetSkyTime(QDateTime dt);
407 
409  void addHour();
411  void addDay();
413  void addWeek();
414 
417  void addSiderealDay();
420  void addSiderealWeek();
424  void addSiderealMonth();
428  void addSiderealYear();
432  void addSiderealCentury();
433 
435  void subtractHour();
437  void subtractDay();
439  void subtractWeek();
440 
443  void subtractSiderealDay();
446  void subtractSiderealWeek();
450  void subtractSiderealMonth();
454  void subtractSiderealYear();
459 
461  void addSynodicMonth();
462 
464  void addDraconicYear();
466  void addDraconicMonth();
467 
469  void addAnomalisticMonth();
470 
472  void addTropicalMonth();
474  void addTropicalYear();
476  void addTropicalCentury();
477 
479  void subtractSynodicMonth();
480 
482  void subtractDraconicYear();
484  void subtractDraconicMonth();
485 
488 
490  void subtractTropicalMonth();
492  void subtractTropicalYear();
495 
498  void addSolarDays(double d);
502  void addSiderealDays(double d);
503 
506  void moveObserverToSelected();
507 
510  void setDeltaTCustomYear(float y) { deltaTCustomYear=y; }
513  void setDeltaTCustomNDot(float v) { deltaTCustomNDot=v; }
516  void setDeltaTCustomEquationCoefficients(Vec3f c) { deltaTCustomEquationCoeff=c; }
517 
519  float getDeltaTCustomYear() const { return deltaTCustomYear; }
521  float getDeltaTCustomNDot() const { return deltaTCustomNDot; }
523  Vec3f getDeltaTCustomEquationCoefficients() const { return deltaTCustomEquationCoeff; }
524 
525 signals:
529  void timeRateChanged(double rate);
530 
531 private:
532  StelToneReproducer* toneConverter; // Tones conversion between stellarium world and display device
533  StelSkyDrawer* skyDrawer;
534  StelMovementMgr* movementMgr; // Manage vision movements
535 
536  // Manage geodesic grid
537  mutable StelGeodesicGrid* geodesicGrid;
538 
539  // The currently used projection type
540  ProjectionType currentProjectionType;
541 
542  // The currentrly used time correction (DeltaT)
543  DeltaTAlgorithm currentDeltaTAlgorithm;
544 
545  // Parameters to use when creating new instances of StelProjector
546  StelProjector::StelProjectorParams currentProjectorParams;
547 
548  void updateTransformMatrices();
549  void updateTime(double deltaTime);
550  void resetSync();
551 
552  // Matrices used for every coordinate transfo
553  Mat4d matHeliocentricEclipticToAltAz; // Transform from heliocentric ecliptic (Vsop87) to observer-centric altazimuthal coordinate
554  Mat4d matAltAzToHeliocentricEcliptic; // Transform from observer-centric altazimuthal coordinate to heliocentric ecliptic (Vsop87)
555  Mat4d matAltAzToEquinoxEqu; // Transform from observer-centric altazimuthal coordinate to Earth Equatorial
556  Mat4d matEquinoxEquToAltAz; // Transform from observer-centric altazimuthal coordinate to Earth Equatorial
557  Mat4d matHeliocentricEclipticToEquinoxEqu; // Transform from heliocentric ecliptic (Vsop87) to earth equatorial coordinate
558  Mat4d matEquinoxEquToJ2000;
559  Mat4d matJ2000ToEquinoxEqu;
560  Mat4d matJ2000ToAltAz;
561 
562  Mat4d matAltAzModelView; // Modelview matrix for observer-centric altazimuthal drawing
563  Mat4d invertMatAltAzModelView; // Inverted modelview matrix for observer-centric altazimuthal drawing
564 
565  // Position variables
566  StelObserver* position;
567  // The ID of the default startup location
568  QString defaultLocationID;
569 
570  // Time variables
571  double timeSpeed; // Positive : forward, Negative : Backward, 1 = 1sec/sec
572  double JDay; // Curent time in Julian day
573  double presetSkyTime;
574  QTime initTodayTime;
575  QString startupTimeMode;
576  double secondsOfLastJDayUpdate; // Time in seconds when the time rate or time last changed
577  double JDayOfLastJDayUpdate; // JDay when the time rate or time last changed
578 
579  // Variables for custom equation of Delta-T
580  Vec3f deltaTCustomEquationCoeff;
581  float deltaTCustomNDot;
582  float deltaTCustomYear;
583 
584 };
585 
586 #endif // _STELCORE_HPP_
void setTimeRate(double ts)
Set time speed in JDay/sec.
Store the informations for a location on a planet.
void setPresetSkyTime(double d)
Set the preset sky time from a JD.
void subtractSiderealYear()
Subtract one sidereal year to the simulation time.
void setCurrentProjectionType(ProjectionType type)
Set the current ProjectionType to use.
double getJDay() const
Get the current date in Julian Day.
void subtractTropicalYear()
Subtract one mean tropical year to the simulation time.
void timeRateChanged(double rate)
This signal is emitted when the time rate has changed.
void addWeek()
Add one [Earth, solar] week to the current simulation time.
DeltaTAlgorithm getCurrentDeltaTAlgorithm() const
Get the current algorithm for time correction (DeltaT)
Definition: StelCore.hpp:318
Provide a set of methods used to draw sky objects taking into account eyes adaptation, zoom level, instrument model and artificially set magnitude limits.
void addSiderealDay()
Add one sidereal day to the simulation time.
QStringList getAllProjectionTypeKeys() const
Get the list of all the available projections.
void returnToDefaultLocation()
Return to the default location.
StelProjectorMaskType
Define viewport mask types.
void setInitTodayTime(const QTime &t)
set the initial "today time" from the config file
bool getFlipHorz(void) const
Get the state of the horizontal flip.
Vec3f getDeltaTCustomEquationCoefficients() const
Get coefficients for custom equation for calculation of Delta-T.
Definition: StelCore.hpp:523
void decreaseTimeSpeed()
Decrease the time speed.
void addSiderealWeek()
Add one sidereal week (7 sidereal days) to the simulation time.
void subtractDraconicMonth()
Subtract one draconic month to the simulation time.
void subtractDay()
Subtract one [Earth, solar] day to the current simulation time.
double getMJDay() const
Get the current date in Modified Julian Day.
void setFlipVert(bool flip)
Set the vertical flip status.
void subtractTropicalCentury()
Subtract one mean tropical century to the simulation time.
A SphericalCap is defined by a direction and an aperture.
void subtractSiderealMonth()
Subtract one sidereal month (1/12 of sidereal year) to the simulation time.
QString getCurrentDeltaTAlgorithmDescription(void) const
Get description of the current algorithm for time correction.
void addDay()
Add one [Earth, solar] day to the current simulation time.
void setCurrentDeltaTAlgorithmKey(QString type)
Set the current algorithm to use from its key.
void addTropicalCentury()
Add one mean tropical century to the simulation time.
void setCurrentDeltaTAlgorithm(DeltaTAlgorithm algorithm)
Set the current algorithm for time correction (DeltaT)
Definition: StelCore.hpp:316
void setRealTimeSpeed()
Set real time speed, i.e. 1 sec/sec.
Main class for Stellarium core processing.
Definition: StelCore.hpp:46
void setDefautAngleForGravityText(float a)
Set the offset rotation angle in degree to apply to gravity text (only if gravityLabels is set to fal...
void addSynodicMonth()
Add one synodic month to the simulation time.
Grid of triangles (zones) on the sphere with radius 1, generated by subdividing the icosahedron...
void addHour()
Add one [Earth, solar] hour to the current simulation time.
float getDeltaTCustomNDot() const
Get n-dot for custom equation for calculation of Delta-T.
Definition: StelCore.hpp:521
void addTropicalYear()
Add one mean tropical year to the simulation time.
QSharedPointer< StelProjector > StelProjectorP
Shared pointer on a StelProjector instance (implement reference counting)
void setFlagGravityLabels(bool gravity)
Set the flag with decides whether to arrage labels so that they are aligned with the bottom of a 2d s...
void subtractSynodicMonth()
Subtract one synodic month to the simulation time.
QString getCurrentDeltaTAlgorithmKey(void) const
Get the current algorithm used by the DeltaT.
Manages the head movements and zoom operations.
Converts tones in function of the eye adaptation to luminance.
void addSiderealYear()
Add one sidereal year to the simulation time.
void decreaseTimeSpeedLess()
Decrease the time speed but not as much as with decreaseTimeSpeed()
float getDeltaTCustomYear() const
Get year for custom equation for calculation of Delta-T.
Definition: StelCore.hpp:519
void addDraconicYear()
Add one draconic year to the simulation time.
void toggleRealTimeSpeed()
Set real time speed or pause simulation if we are already in realtime speed.
void setTodayTime(const QTime &target)
Set the time to some value, leaving the day the same.
Should be renamed as PlanetBasedObserver and derive from a more generical StelObserver class...
bool getFlipVert(void) const
Get the state of the vertical flip.
void returnToHome()
Return to the default location and set default landscape with atmosphere and fog effects.
void subtractWeek()
Subtract one [Earth, solar] week to the current simulation time.
void moveObserverToSelected()
Move the observer to the selected object.
double getPresetSkyTime() const
Return the preset sky time in JD.
void setFlipHorz(bool flip)
Set the horizontal flip status.
void setMaskType(StelProjector::StelProjectorMaskType m)
Set the mask type.
void setJDay(double JD)
Set the current date in Julian Day.
void addSiderealDays(double d)
Add a number of sidereal days to the current simulation time, based on the observer body's rotational...
void setZeroTimeSpeed()
Set time speed to 0, i.e. freeze the passage of simulation time.
bool getIsTimeNow() const
Get whether the current stellarium time is the real world time.
void setTimeNow()
Set stellarium time to current real world time.
void addAnomalisticMonth()
Add one anomalistic month to the simulation time.
void subtractSiderealWeek()
Subtract one sidereal week (7 sidereal days) to the simulation time.
void addTropicalMonth()
Add one mean tropical month to the simulation time.
void subtractAnomalisticMonth()
Subtract one anomalistic month to the simulation time.
void setDeltaTCustomEquationCoefficients(Vec3f c)
Set coefficients for custom equation for calculation of Delta-T.
Definition: StelCore.hpp:516
QSharedPointer< ModelViewTranform > ModelViewTranformP
Shared pointer on a ModelViewTranform instance (implement reference counting)
QTime getInitTodayTime(void)
get the initial "today time" from the config file
void addDraconicMonth()
Add one draconic month to the simulation time.
void addSiderealCentury()
Add one sidereal century (100 sidereal years) to the simulation time.
void subtractTropicalMonth()
Subtract one mean tropical month to the simulation time.
void addSiderealMonth()
Add one sidereal month (1/12 of sidereal year) to the simulation time.
void subtractDraconicYear()
Subtract one draconic year to the simulation time.
void setDeltaTCustomYear(float y)
Set year for custom equation for calculation of Delta-T.
Definition: StelCore.hpp:510
double getTimeRate() const
Get time speed in JDay/sec.
Define the StelProjectorP type.
Contains all the param needed to initialize a StelProjector.
QString getCurrentProjectionTypeKey(void) const
Get the current Mapping used by the Projection.
void subtractSiderealCentury()
Subtract one sidereal century (100 sidereal years) to the simulation time.
void increaseTimeSpeed()
Increase the time speed.
void addSolarDays(double d)
Add a number of Earth Solar days to the current simulation time.
void setCurrentProjectionTypeKey(QString type)
Set the current ProjectionType to use from its key.
void setDefaultLocationID(const QString &id)
Set the location to use by default at startup.
void setMJDay(double MJD)
Set the current date in Modified Julian Day.
void setDeltaTCustomNDot(float v)
Set n-dot for custom equation for calculation of Delta-T.
Definition: StelCore.hpp:513
void increaseTimeSpeedLess()
Increase the time speed, but not as much as with increaseTimeSpeed()
void subtractSiderealDay()
Subtract one sidereal day to the simulation time.
void locationChanged(StelLocation)
This signal is emitted when the observer location has changed.
void subtractHour()
Subtract one [Earth, solar] hour to the current simulation time.
bool getRealTimeSpeed() const
Get whether it is real time speed, i.e. 1 sec/sec.
QString getDefaultLocationID() const
Get the location used by default at startup.