Stellarium 0.13.3
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 
299 public slots:
301  void setCurrentProjectionType(ProjectionType type);
302  ProjectionType getCurrentProjectionType() const;
303 
305  QString getCurrentProjectionTypeKey(void) const;
307  void setCurrentProjectionTypeKey(QString type);
308 
310  QStringList getAllProjectionTypeKeys() const;
311 
313  void setCurrentDeltaTAlgorithm(DeltaTAlgorithm algorithm) { currentDeltaTAlgorithm=algorithm; }
315  DeltaTAlgorithm getCurrentDeltaTAlgorithm() const { return currentDeltaTAlgorithm; }
317  QString getCurrentDeltaTAlgorithmDescription(void) const;
319  QString getCurrentDeltaTAlgorithmKey(void) const;
321  void setCurrentDeltaTAlgorithmKey(QString type);
322 
325 
328  void setFlagGravityLabels(bool gravity);
330  void setDefautAngleForGravityText(float a);
333  void setFlipHorz(bool flip);
336  void setFlipVert(bool flip);
339  bool getFlipHorz(void) const;
342  bool getFlipVert(void) const;
343 
345  QString getDefaultLocationID() const;
347  void setDefaultLocationID(const QString& id);
351  void returnToHome();
352 
354  void setJDay(double JD);
356  double getJDay() const;
357 
359  void setMJDay(double MJD);
361  double getMJDay() const;
362 
364  double getPresetSkyTime() const;
366  void setPresetSkyTime(double d);
367 
369  void setTimeRate(double ts);
371  double getTimeRate() const;
372 
374  void increaseTimeSpeed();
376  void decreaseTimeSpeed();
378  void increaseTimeSpeedLess();
380  void decreaseTimeSpeedLess();
381 
383  void setZeroTimeSpeed();
385  void setRealTimeSpeed();
387  void toggleRealTimeSpeed();
389  bool getRealTimeSpeed() const;
390 
392  void setTimeNow();
394  void setTodayTime(const QTime& target);
396  bool getIsTimeNow() const;
397 
399  QTime getInitTodayTime(void);
401  void setInitTodayTime(const QTime& t);
403  void setPresetSkyTime(QDateTime dt);
404 
406  void addHour();
408  void addDay();
410  void addWeek();
411 
414  void addSiderealDay();
417  void addSiderealWeek();
421  void addSiderealMonth();
425  void addSiderealYear();
429  void addSiderealCentury();
430 
432  void subtractHour();
434  void subtractDay();
436  void subtractWeek();
437 
440  void subtractSiderealDay();
443  void subtractSiderealWeek();
447  void subtractSiderealMonth();
451  void subtractSiderealYear();
456 
458  void addSynodicMonth();
459 
461  void addDraconicYear();
463  void addDraconicMonth();
464 
466  void addAnomalisticMonth();
467 
469  void addTropicalMonth();
471  void addTropicalYear();
473  void addTropicalCentury();
474 
476  void subtractSynodicMonth();
477 
479  void subtractDraconicYear();
481  void subtractDraconicMonth();
482 
485 
487  void subtractTropicalMonth();
489  void subtractTropicalYear();
492 
495  void addSolarDays(double d);
499  void addSiderealDays(double d);
500 
503  void moveObserverToSelected();
504 
507  void setDeltaTCustomYear(float y) { deltaTCustomYear=y; }
510  void setDeltaTCustomNDot(float v) { deltaTCustomNDot=v; }
513  void setDeltaTCustomEquationCoefficients(Vec3f c) { deltaTCustomEquationCoeff=c; }
514 
516  float getDeltaTCustomYear() const { return deltaTCustomYear; }
518  float getDeltaTCustomNDot() const { return deltaTCustomNDot; }
520  Vec3f getDeltaTCustomEquationCoefficients() const { return deltaTCustomEquationCoeff; }
521 
522 signals:
526  void timeRateChanged(double rate);
527 
528 private:
529  StelToneReproducer* toneConverter; // Tones conversion between stellarium world and display device
530  StelSkyDrawer* skyDrawer;
531  StelMovementMgr* movementMgr; // Manage vision movements
532 
533  // Manage geodesic grid
534  mutable StelGeodesicGrid* geodesicGrid;
535 
536  // The currently used projection type
537  ProjectionType currentProjectionType;
538 
539  // The currentrly used time correction (DeltaT)
540  DeltaTAlgorithm currentDeltaTAlgorithm;
541 
542  // Parameters to use when creating new instances of StelProjector
543  StelProjector::StelProjectorParams currentProjectorParams;
544 
545  void updateTransformMatrices();
546  void updateTime(double deltaTime);
547  void resetSync();
548 
549  // Matrices used for every coordinate transfo
550  Mat4d matHeliocentricEclipticToAltAz; // Transform from heliocentric ecliptic (Vsop87) to observer-centric altazimuthal coordinate
551  Mat4d matAltAzToHeliocentricEcliptic; // Transform from observer-centric altazimuthal coordinate to heliocentric ecliptic (Vsop87)
552  Mat4d matAltAzToEquinoxEqu; // Transform from observer-centric altazimuthal coordinate to Earth Equatorial
553  Mat4d matEquinoxEquToAltAz; // Transform from observer-centric altazimuthal coordinate to Earth Equatorial
554  Mat4d matHeliocentricEclipticToEquinoxEqu; // Transform from heliocentric ecliptic (Vsop87) to earth equatorial coordinate
555  Mat4d matEquinoxEquToJ2000;
556  Mat4d matJ2000ToEquinoxEqu;
557  Mat4d matJ2000ToAltAz;
558 
559  Mat4d matAltAzModelView; // Modelview matrix for observer-centric altazimuthal drawing
560  Mat4d invertMatAltAzModelView; // Inverted modelview matrix for observer-centric altazimuthal drawing
561 
562  // Position variables
563  StelObserver* position;
564  // The ID of the default startup location
565  QString defaultLocationID;
566 
567  // Time variables
568  double timeSpeed; // Positive : forward, Negative : Backward, 1 = 1sec/sec
569  double JDay; // Curent time in Julian day
570  double presetSkyTime;
571  QTime initTodayTime;
572  QString startupTimeMode;
573  double secondsOfLastJDayUpdate; // Time in seconds when the time rate or time last changed
574  double JDayOfLastJDayUpdate; // JDay when the time rate or time last changed
575 
576  // Variables for custom equation of Delta-T
577  Vec3f deltaTCustomEquationCoeff;
578  float deltaTCustomNDot;
579  float deltaTCustomYear;
580 
581 };
582 
583 #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:315
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:520
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:313
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:518
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:516
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:513
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:507
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:510
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.