Stellarium 0.13.1
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  Custom
126  };
127 
128  StelCore();
129  virtual ~StelCore();
130 
132  void init();
133 
136  void update(double deltaTime);
137 
139  void windowHasBeenResized(float x, float y, float width, float height);
140 
142  void preDraw();
143 
145  void postDraw();
146 
149  StelProjectorP getProjection2d() const;
150 
153  StelProjectorP getProjection(FrameType frameType, RefractionMode refractionMode=RefractionAuto) const;
154 
157  StelProjectorP getProjection(StelProjector::ModelViewTranformP modelViewTransform, ProjectionType projType=(ProjectionType)1000) const;
158 
160  StelToneReproducer* getToneReproducer();
162  const StelToneReproducer* getToneReproducer() const;
163 
165  StelSkyDrawer* getSkyDrawer();
167  const StelSkyDrawer* getSkyDrawer() const;
168 
170  const StelGeodesicGrid* getGeodesicGrid(int maxLevel) const;
171 
173  StelMovementMgr* getMovementMgr();
175  const StelMovementMgr* getMovementMgr() const;
176 
178  void setClippingPlanes(double znear, double zfar);
180  void getClippingPlanes(double* zn, double* zf) const;
181 
183  QString projectionTypeKeyToNameI18n(const QString& key) const;
184 
186  QString projectionNameI18nToTypeKey(const QString& nameI18n) const;
187 
189  StelProjector::StelProjectorParams getCurrentStelProjectorParams() const;
191  void setCurrentStelProjectorParams(const StelProjector::StelProjectorParams& newParams);
192 
194  void lookAtJ2000(const Vec3d& pos, const Vec3d& up);
195 
196  Vec3d altAzToEquinoxEqu(const Vec3d& v, RefractionMode refMode=RefractionAuto) const;
197  Vec3d equinoxEquToAltAz(const Vec3d& v, RefractionMode refMode=RefractionAuto) const;
198  Vec3d altAzToJ2000(const Vec3d& v, RefractionMode refMode=RefractionAuto) const;
199  Vec3d j2000ToAltAz(const Vec3d& v, RefractionMode refMode=RefractionAuto) const;
200  void j2000ToAltAzInPlaceNoRefraction(Vec3f* v) const {v->transfo4d(matJ2000ToAltAz);}
201  Vec3d galacticToJ2000(const Vec3d& v) const;
202  Vec3d equinoxEquToJ2000(const Vec3d& v) const;
203  Vec3d j2000ToEquinoxEqu(const Vec3d& v) const;
204  Vec3d j2000ToGalactic(const Vec3d& v) const;
205 
207  Vec3d heliocentricEclipticToAltAz(const Vec3d& v, RefractionMode refMode=RefractionAuto) const;
208 
210  Vec3d heliocentricEclipticToEquinoxEqu(const Vec3d& v) const;
213  Vec3d heliocentricEclipticToEarthPosEquinoxEqu(const Vec3d& v) const;
214 
216  StelProjector::ModelViewTranformP getHeliocentricEclipticModelViewTransform(RefractionMode refMode=RefractionAuto) const;
217 
219  StelProjector::ModelViewTranformP getObservercentricEclipticModelViewTransform(RefractionMode refMode=RefractionAuto) const;
220 
222  StelProjector::ModelViewTranformP getEquinoxEquModelViewTransform(RefractionMode refMode=RefractionAuto) const;
223 
225  StelProjector::ModelViewTranformP getAltAzModelViewTransform(RefractionMode refMode=RefractionAuto) const;
226 
228  StelProjector::ModelViewTranformP getJ2000ModelViewTransform(RefractionMode refMode=RefractionAuto) const;
229 
231  StelProjector::ModelViewTranformP getGalacticModelViewTransform(RefractionMode refMode=RefractionAuto) const;
232 
234  static const Mat4d matJ2000ToVsop87;
236  static const Mat4d matVsop87ToJ2000;
238  static const Mat4d matJ2000ToGalactic;
240  static const Mat4d matGalacticToJ2000;
241 
243  Vec3d getObserverHeliocentricEclipticPos() const;
244 
246  const StelLocation& getCurrentLocation() const;
247 
248  const QSharedPointer<class Planet> getCurrentPlanet() const;
249 
250  SphericalCap getVisibleSkyArea() const;
251 
257  void moveObserverTo(const StelLocation& target, double duration=1., double durationIfPlanetChange=1.);
258 
259  // Conversion in standar Julian time format
260  static const double JD_SECOND;
261  static const double JD_MINUTE;
262  static const double JD_HOUR;
263  static const double JD_DAY;
264  static const double ONE_OVER_JD_SECOND;
265 
268  double getLocalSiderealTime() const;
269 
271  double getLocalSiderealDayLength() const;
272 
274  double getLocalSiderealYearLength() const;
275 
277  QString getStartupTimeMode();
278  void setStartupTimeMode(const QString& s);
279 
284  double getDeltaT(double jDay) const;
285 
290  QString getCurrentDeltaTAlgorithmValidRange(double jDay, QString* marker) const;
291 
292  bool isDay() const;
293 
294 public slots:
296  void setCurrentProjectionType(ProjectionType type);
297  ProjectionType getCurrentProjectionType() const;
298 
300  QString getCurrentProjectionTypeKey(void) const;
302  void setCurrentProjectionTypeKey(QString type);
303 
305  QStringList getAllProjectionTypeKeys() const;
306 
308  void setCurrentDeltaTAlgorithm(DeltaTAlgorithm algorithm) { currentDeltaTAlgorithm=algorithm; }
310  DeltaTAlgorithm getCurrentDeltaTAlgorithm() const { return currentDeltaTAlgorithm; }
312  QString getCurrentDeltaTAlgorithmDescription(void) const;
314  QString getCurrentDeltaTAlgorithmKey(void) const;
316  void setCurrentDeltaTAlgorithmKey(QString type);
317 
320 
323  void setFlagGravityLabels(bool gravity);
325  void setDefautAngleForGravityText(float a);
328  void setFlipHorz(bool flip);
331  void setFlipVert(bool flip);
334  bool getFlipHorz(void) const;
337  bool getFlipVert(void) const;
338 
340  QString getDefaultLocationID() const;
342  void setDefaultLocationID(const QString& id);
346  void returnToHome();
347 
349  void setJDay(double JD);
351  double getJDay() const;
352 
354  void setMJDay(double MJD);
356  double getMJDay() const;
357 
359  double getPresetSkyTime() const;
361  void setPresetSkyTime(double d);
362 
364  void setTimeRate(double ts);
366  double getTimeRate() const;
367 
369  void increaseTimeSpeed();
371  void decreaseTimeSpeed();
373  void increaseTimeSpeedLess();
375  void decreaseTimeSpeedLess();
376 
378  void setZeroTimeSpeed();
380  void setRealTimeSpeed();
382  void toggleRealTimeSpeed();
384  bool getRealTimeSpeed() const;
385 
387  void setTimeNow();
389  void setTodayTime(const QTime& target);
391  bool getIsTimeNow() const;
392 
394  QTime getInitTodayTime(void);
396  void setInitTodayTime(const QTime& t);
398  void setPresetSkyTime(QDateTime dt);
399 
401  void addHour();
403  void addDay();
405  void addWeek();
406 
409  void addSiderealDay();
412  void addSiderealWeek();
416  void addSiderealMonth();
420  void addSiderealYear();
424  void addSiderealCentury();
425 
427  void subtractHour();
429  void subtractDay();
431  void subtractWeek();
432 
435  void subtractSiderealDay();
438  void subtractSiderealWeek();
442  void subtractSiderealMonth();
446  void subtractSiderealYear();
451 
453  void addSynodicMonth();
454 
456  void addDraconicYear();
458  void addDraconicMonth();
459 
461  void addAnomalisticMonth();
462 
464  void addTropicalMonth();
466  void addTropicalYear();
468  void addTropicalCentury();
469 
471  void subtractSynodicMonth();
472 
474  void subtractDraconicYear();
476  void subtractDraconicMonth();
477 
480 
482  void subtractTropicalMonth();
484  void subtractTropicalYear();
487 
490  void addSolarDays(double d);
494  void addSiderealDays(double d);
495 
498  void moveObserverToSelected();
499 
502  void setDeltaTCustomYear(float y) { deltaTCustomYear=y; }
505  void setDeltaTCustomNDot(float v) { deltaTCustomNDot=v; }
508  void setDeltaTCustomEquationCoefficients(Vec3f c) { deltaTCustomEquationCoeff=c; }
509 
511  float getDeltaTCustomYear() const { return deltaTCustomYear; }
513  float getDeltaTCustomNDot() const { return deltaTCustomNDot; }
515  Vec3f getDeltaTCustomEquationCoefficients() const { return deltaTCustomEquationCoeff; }
516 
517 signals:
521  void timeRateChanged(double rate);
522 
523 private:
524  StelToneReproducer* toneConverter; // Tones conversion between stellarium world and display device
525  StelSkyDrawer* skyDrawer;
526  StelMovementMgr* movementMgr; // Manage vision movements
527 
528  // Manage geodesic grid
529  mutable StelGeodesicGrid* geodesicGrid;
530 
531  // The currently used projection type
532  ProjectionType currentProjectionType;
533 
534  // The currentrly used time correction (DeltaT)
535  DeltaTAlgorithm currentDeltaTAlgorithm;
536 
537  // Parameters to use when creating new instances of StelProjector
538  StelProjector::StelProjectorParams currentProjectorParams;
539 
540  void updateTransformMatrices();
541  void updateTime(double deltaTime);
542  void resetSync();
543 
544  // Matrices used for every coordinate transfo
545  Mat4d matHeliocentricEclipticToAltAz; // Transform from heliocentric ecliptic (Vsop87) to observer-centric altazimuthal coordinate
546  Mat4d matAltAzToHeliocentricEcliptic; // Transform from observer-centric altazimuthal coordinate to heliocentric ecliptic (Vsop87)
547  Mat4d matAltAzToEquinoxEqu; // Transform from observer-centric altazimuthal coordinate to Earth Equatorial
548  Mat4d matEquinoxEquToAltAz; // Transform from observer-centric altazimuthal coordinate to Earth Equatorial
549  Mat4d matHeliocentricEclipticToEquinoxEqu; // Transform from heliocentric ecliptic (Vsop87) to earth equatorial coordinate
550  Mat4d matEquinoxEquToJ2000;
551  Mat4d matJ2000ToEquinoxEqu;
552  Mat4d matJ2000ToAltAz;
553 
554  Mat4d matAltAzModelView; // Modelview matrix for observer-centric altazimuthal drawing
555  Mat4d invertMatAltAzModelView; // Inverted modelview matrix for observer-centric altazimuthal drawing
556 
557  // Position variables
558  StelObserver* position;
559  // The ID of the default startup location
560  QString defaultLocationID;
561 
562  // Time variables
563  double timeSpeed; // Positive : forward, Negative : Backward, 1 = 1sec/sec
564  double JDay; // Curent time in Julian day
565  double presetSkyTime;
566  QTime initTodayTime;
567  QString startupTimeMode;
568  double secondsOfLastJDayUpdate; // Time in seconds when the time rate or time last changed
569  double JDayOfLastJDayUpdate; // JDay when the time rate or time last changed
570 
571  // Variables for custom equation of Delta-T
572  Vec3f deltaTCustomEquationCoeff;
573  float deltaTCustomNDot;
574  float deltaTCustomYear;
575 
576 };
577 
578 #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:310
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:515
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:308
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:513
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:511
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:508
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:502
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:505
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.