Stellarium 0.15.2
Landscape.hpp
1 /*
2  * Stellarium
3  * Copyright (C) 2003 Fabien Chereau
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 _LANDSCAPE_HPP_
21 #define _LANDSCAPE_HPP_
22 
23 #include "VecMath.hpp"
24 #include "StelToneReproducer.hpp"
25 #include "StelProjector.hpp"
26 
27 #include "StelFader.hpp"
28 #include "StelUtils.hpp"
29 #include "StelTextureTypes.hpp"
30 #include "StelLocation.hpp"
31 
32 #include <QMap>
33 #include <QImage>
34 #include <QList>
35 #include <QFont>
36 
37 class QSettings;
38 class StelLocation;
39 class StelCore;
40 class StelPainter;
41 
62 class Landscape
63 {
64 public:
65  typedef struct
66  {
67  QString name;
68  Vec3d featurePoint; // start of the line: mountain peak, building, ...
69  Vec3d labelPoint; // end of the line, where the centered label best fits.
71 
72  Landscape(float _radius = 2.f);
73  virtual ~Landscape();
77  virtual void load(const QSettings& landscapeIni, const QString& landscapeId) = 0;
78 
83  virtual unsigned int getMemorySize() const {return sizeof(Landscape);}
84 
85  virtual void draw(StelCore* core) = 0;
86  void update(double deltaTime)
87  {
88  landFader.update((int)(deltaTime*1000));
89  fogFader.update((int)(deltaTime*1000));
90  illumFader.update((int)(deltaTime*1000));
91  labelFader.update((int)(deltaTime*1000));
92  }
93 
96  void setBrightness(const float b, const float pollutionBrightness=0.0f) {landscapeBrightness = b; lightScapeBrightness=pollutionBrightness; }
97 
99  float getBrightness() const { return landscapeBrightness; }
105  float getEffectiveLightscapeBrightness() const { return lightScapeBrightness * illumFader.getInterstate(); }
106 
108  void setFlagShow(const bool b) {landFader=b;}
110  bool getFlagShow() const {return (bool)landFader;}
112  float getEffectiveLandFadeValue() { return landFader.getInterstate(); }
114  void setFlagShowFog(const bool b) {fogFader=b;}
116  bool getFlagShowFog() const {return (bool)fogFader;}
118  void setFlagShowIllumination(const bool b) {illumFader=b;}
120  bool getFlagShowIllumination() const {return (bool)illumFader;}
122  void setFlagShowLabels(const bool b) {labelFader=b;}
124  bool getFlagShowLabels() const {return (bool)labelFader;}
126  void setLabelFontSize(const int size){fontSize=size;}
127 
129  QString getName() const {return name;}
131  QString getAuthorName() const {return author;}
133  QString getDescription() const {return description;}
135  QString getId() const {return id;}
136 
138  const StelLocation& getLocation() const {return location;}
140  bool hasLocation() const {return (!(location.planetName.isEmpty()));}
155 
162  void setZRotation(float d) {angleRotateZOffset = d * M_PI/180.0f;}
163 
165  bool getIsFullyVisible() const {return landFader.getInterstate() >= 0.999f;}
168 
172  // TBD: Maybe change this to azalt[2]<sinMinAltitudeLimit ? (But never called in practice, reimplemented by the subclasses...)
173  virtual float getOpacity(Vec3d azalt) const { Q_ASSERT(0); return (azalt[2]<0 ? 1.0f : 0.0f); }
176  azDeg_altDeg = 0,
182  };
183 
185  void loadLabels(const QString& landscapeId);
186 
187 protected:
191  void loadCommon(const QSettings& landscapeIni, const QString& landscapeId);
192 
194  void drawLabels(StelCore *core, StelPainter *painter);
195 
196 
203  void createPolygonalHorizon(const QString& lineFileName, const float polyAngleRotateZ=0.0f, const QString &listMode="azDeg_altDeg", const bool polygonInverted=false);
204 
209  const QString getTexturePath(const QString& basename, const QString& landscapeId) const;
210  float radius;
211  QString name;
212  QString author;
213  QString description;
214  QString id;
215 
224  int rows;
225  int cols;
226  float angleRotateZ;
228 
231 
238 
239  // Optional elements which, if present, describe a horizon polygon. They can be used to render a line or a filled region, esp. in LandscapePolygonal
244  // Optional element: labels for landscape features.
246  QList<LandscapeLabel> landscapeLabels;
247  int fontSize;
249 };
250 
267 {
268 public:
269  LandscapeOldStyle(float radius = 2.f);
270  virtual ~LandscapeOldStyle();
271  virtual void load(const QSettings& landscapeIni, const QString& landscapeId);
272  virtual unsigned int getMemorySize() const {return memorySize;}
273  virtual void draw(StelCore* core);
274  //void create(bool _fullpath, QMap<QString, QString> param); // still not implemented
275  virtual float getOpacity(Vec3d azalt) const;
276 protected:
277  typedef struct
278  {
279  StelTextureSP tex;
280  StelTextureSP tex_illum; // optional light texture.
281  float texCoords[4];
283 
284 private:
285  void drawFog(StelCore* core, StelPainter&) const;
286  // drawLight==true for illumination layer, it then selects only the self-illuminating panels.
287  void drawDecor(StelCore* core, StelPainter&, const bool drawLight=false) const;
288  void drawGround(StelCore* core, StelPainter&) const;
289  QVector<double> groundVertexArr;
290  QVector<float> groundTexCoordArr;
291  StelTextureSP* sideTexs;
292  int nbSideTexs;
293  int nbSide;
294  landscapeTexCoord* sides;
295  StelTextureSP fogTex;
296  StelTextureSP groundTex;
297  QVector<QImage*> sidesImages; // Required for opacity lookup
298  int nbDecorRepeat;
299  float fogAltAngle;
300  float fogAngleShift;
301  float decorAltAngle; // vertical extent of the side panels
302  float decorAngleShift;
303  float groundAngleShift;
304  float groundAngleRotateZ;
305  int drawGroundFirst;
306  bool tanMode; // Whether the angles should be converted using tan instead of sin, i.e., for a cylindrical pano
307  bool calibrated; // if true, the documented altitudes are indeed correct (the original code is buggy!)
308  struct LOSSide
309  {
310  StelVertexArray arr;
311  StelTextureSP tex;
312  bool light; // GZ NEW: true if texture is self-lighting.
313  };
314 
315  QList<LOSSide> precomputedSides;
316  unsigned int memorySize;
317 };
318 
329 {
330 public:
331  LandscapePolygonal(float radius = 1.f);
332  virtual ~LandscapePolygonal();
333  virtual void load(const QSettings& landscapeIni, const QString& landscapeId);
334  virtual unsigned int getMemorySize() const {return sizeof(LandscapePolygonal);}
335  virtual void draw(StelCore* core);
336  virtual float getOpacity(Vec3d azalt) const;
337 private:
338  // we have inherited: horizonFileName, horizonPolygon, horizonPolygonLineColor
339  Vec3f groundColor;
340 };
341 
349 {
350 public:
351  LandscapeFisheye(float radius = 1.f);
352  virtual ~LandscapeFisheye();
353  virtual void load(const QSettings& landscapeIni, const QString& landscapeId);
354  virtual unsigned int getMemorySize() const {return memorySize;}
355  virtual void draw(StelCore* core);
358  virtual float getOpacity(Vec3d azalt) const;
365  void create(const QString name, const QString& maptex, float texturefov, float angleRotateZ);
366  void create(const QString name, float texturefov, const QString& maptex, const QString &_maptexFog="", const QString& _maptexIllum="", const float angleRotateZ=0.0f);
367 private:
368 
369  StelTextureSP mapTex;
370  StelTextureSP mapTexFog;
371  StelTextureSP mapTexIllum;
373  QImage *mapImage;
375 
376  float texFov;
377  unsigned int memorySize;
378 };
379 
391 {
392 public:
393  LandscapeSpherical(float radius = 1.f);
394  virtual ~LandscapeSpherical();
395  virtual void load(const QSettings& landscapeIni, const QString& landscapeId);
396  virtual unsigned int getMemorySize() const {return memorySize;}
397  virtual void draw(StelCore* core);
401  virtual float getOpacity(Vec3d azalt) const;
413  void create(const QString name, const QString& maptex, const QString &_maptexFog="", const QString& _maptexIllum="", const float _angleRotateZ=0.0f,
414  const float _mapTexTop=90.0f, const float _mapTexBottom=-90.0f,
415  const float _fogTexTop=90.0f, const float _fogTexBottom=-90.0f,
416  const float _illumTexTop=90.0f, const float _illumTexBottom=-90.0f);
417 private:
418 
419  StelTextureSP mapTex;
420  StelTextureSP mapTexFog;
421  StelTextureSP mapTexIllum;
423  // These vars are here to conserve texture memory. They must be allowed to be different: a landscape may have its highest elevations at 15°, fog may reach from -25 to +15°,
425  // light pollution may cover -5° (street lamps slightly below) plus parts of or even the whole sky. All have default values to simplify life.
426  float mapTexTop;
427  float mapTexBottom;
428  float fogTexTop;
429  float fogTexBottom;
430  float illumTexTop;
431  float illumTexBottom;
432  QImage *mapImage;
433  unsigned int memorySize;
434 };
435 
436 #endif // _LANDSCAPE_HPP_
float getDefaultAtmosphericExtinction() const
Return default atmosperic extinction [mag/airmass], or -1 (no change)
Definition: Landscape.hpp:146
int rows
Used to slowly fade in/out landscape feature labels.
Definition: Landscape.hpp:224
bool getFlagShow() const
Get whether landscape is displayed (does not concern fog)
Definition: Landscape.hpp:110
Store the informations for a location on a planet.
int defaultBortleIndex
OPTIONAL. If present, can be used to set location.
Definition: Landscape.hpp:233
float minBrightness
Set during load. Required for consistent caching.
Definition: Landscape.hpp:216
Store and manages the displaying of the Landscape.
Definition: Landscape.hpp:62
QString getId() const
Get landscape id. This is the landscape directory name, used for cache handling.
Definition: Landscape.hpp:135
int defaultFogSetting
May be given in landscape.ini:[location]light_pollution. Default: -1 (no change). ...
Definition: Landscape.hpp:234
Implementation of StelFader which implements a linear transition.
Definition: StelFader.hpp:77
virtual unsigned int getMemorySize() const
Return approximate memory footprint in bytes (required for cache cost estimate in LandscapeMgr) The r...
Definition: Landscape.hpp:272
int getDefaultBortleIndex() const
Return default Bortle index (light pollution value) or -1 (unknown/no change)
Definition: Landscape.hpp:142
virtual unsigned int getMemorySize() const
Return approximate memory footprint in bytes (required for cache cost estimate in LandscapeMgr) The r...
Definition: Landscape.hpp:334
float defaultExtinctionCoefficient
May be given in landscape.ini:[location]display_fog: -1(no change), 0(off), 1(on). Default: -1.
Definition: Landscape.hpp:235
QString description
Read from landscape.ini:[landscape]author.
Definition: Landscape.hpp:213
A shared pointer on a SphericalRegion.
Define the StelTextureSP type.
float getLightscapeBrightness() const
Returns the lightscape brightness.
Definition: Landscape.hpp:101
QString id
Read from landscape.ini:[landscape]description.
Definition: Landscape.hpp:214
void setFlagShow(const bool b)
Set whether landscape is displayed (does not concern fog)
Definition: Landscape.hpp:108
This was the original landscape, introduced for decorative purposes.
Definition: Landscape.hpp:266
This uses a single image in fisheye projection.
Definition: Landscape.hpp:348
float sinMinAltitudeLimit
[radians] This is a rotation changeable at runtime via setZRotation (called by LandscapeMgr::setZRota...
Definition: Landscape.hpp:230
virtual unsigned int getMemorySize() const
Return approximate memory footprint in bytes (required for cache cost estimate in LandscapeMgr) The r...
Definition: Landscape.hpp:396
int cols
horizontal rows. May be given in landscape.ini:[landscape]tesselate_rows. More indicates higher accur...
Definition: Landscape.hpp:225
float getTargetLightscapeBrightness() const
Returns the lightscape brighness modulated with the fader&#39;s target state (i.e. binary on/off) ...
Definition: Landscape.hpp:103
QString author
Read from landscape.ini:[landscape]name.
Definition: Landscape.hpp:212
Vec3f labelColor
Used for landscape labels (optionally indicating landscape features)
Definition: Landscape.hpp:248
azimuth[degrees] altitude[degrees]
Definition: Landscape.hpp:177
Main class for Stellarium core processing.
Definition: StelCore.hpp:48
bool getFlagShowLabels() const
Get whether labels are displayed.
Definition: Landscape.hpp:124
QList< LandscapeLabel > landscapeLabels
for all horizon types, the horizonPolygon line, if specified, will be drawn in this color ...
Definition: Landscape.hpp:246
void loadCommon(const QSettings &landscapeIni, const QString &landscapeId)
Load attributes common to all landscapes.
Vec3f horizonPolygonLineColor
Optional element describing the horizon line.
Definition: Landscape.hpp:243
void drawLabels(StelCore *core, StelPainter *painter)
Draw optional labels on the landscape.
azimuth[radians] altitude[radians]
Definition: Landscape.hpp:179
QString getDescription() const
Get landscape description.
Definition: Landscape.hpp:133
float defaultTemperature
May be given in landscape.ini:[location]atmospheric_extinction_coefficient. Default -1 (no change)...
Definition: Landscape.hpp:236
LinearFader fogFader
Used to slowly fade in/out landscape painting.
Definition: Landscape.hpp:221
float getDefaultAtmosphericTemperature() const
Return configured atmospheric temperature [degrees Celsius], for refraction computation, or -1000 for "unknown/no change".
Definition: Landscape.hpp:148
float landscapeBrightness
Read from landscape.ini:[landscape]minimal_brightness. Allows minimum visibility that cannot be under...
Definition: Landscape.hpp:217
float getBrightness() const
Returns the current brightness level.
Definition: Landscape.hpp:99
bool hasLocation() const
Return if the location is valid (a valid location has a valid planetName!)
Definition: Landscape.hpp:140
LinearFader labelFader
Used to slowly fade in/out illumination painting.
Definition: Landscape.hpp:223
QString planetName
English planet name.
bool getIsFullyVisible() const
Get whether the landscape is currently fully visible (i.e. opaque).
Definition: Landscape.hpp:165
float getEffectiveLightscapeBrightness() const
Gets the currently effective lightscape brightness (modulated by the fader)
Definition: Landscape.hpp:105
bool getFlagShowIllumination() const
Get whether illumination is displayed.
Definition: Landscape.hpp:120
float lightScapeBrightness
brightness [0..1] to draw the landscape. Computed by the LandscapeMgr.
Definition: Landscape.hpp:218
This uses a single panorama image in spherical (equirectangular) projection.
Definition: Landscape.hpp:390
Provides functions for performing openGL drawing operations.
Definition: StelPainter.hpp:40
void setFlagShowLabels(const bool b)
Set whether labels are displayed.
Definition: Landscape.hpp:122
float getSinMinAltitudeLimit() const
Get the sine of the limiting altitude (can be used to short-cut drawing below horizon, like star fields). There is no set here, value is only from landscape.ini.
Definition: Landscape.hpp:167
virtual void load(const QSettings &landscapeIni, const QString &landscapeId)=0
Load landscape.
virtual unsigned int getMemorySize() const
Return approximate memory footprint in bytes (required for cache cost estimate in LandscapeMgr) The r...
Definition: Landscape.hpp:83
float getLandscapeMinimalBrightness() const
Return minimal brightness for landscape returns -1 to signal "standard conditions" (use default value...
Definition: Landscape.hpp:154
float angleRotateZOffset
[radians] if pano does not have its left border in the east, rotate in azimuth. Configured in landsca...
Definition: Landscape.hpp:227
QString getName() const
Get landscape name.
Definition: Landscape.hpp:129
LinearFader landFader
was a landscape loaded properly?
Definition: Landscape.hpp:220
int getDefaultFogSetting() const
Return default fog setting (0/1) or -1 (no change)
Definition: Landscape.hpp:144
LinearFader illumFader
Used to slowly fade in/out fog painting.
Definition: Landscape.hpp:222
SphericalRegionP horizonPolygon
[mbar] May be given in landscape.ini:[location]atmospheric_pressure. Default -1.0 (compute from [loca...
Definition: Landscape.hpp:240
azimuth[degrees] zenithDistance[degrees]
Definition: Landscape.hpp:178
This uses the list of (usually measured) horizon altitudes to define the horizon. ...
Definition: Landscape.hpp:328
void loadLabels(const QString &landscapeId)
Load descriptive labels from optional file gazetteer.LANG.utf8.
void setLabelFontSize(const int size)
change font and fontsize for landscape labels
Definition: Landscape.hpp:126
azimuth[new_degrees] altitude[new_degrees] (may be found on theodolites)
Definition: Landscape.hpp:181
float defaultPressure
[Celsius] May be given in landscape.ini:[location]atmospheric_temperature. default: -1000...
Definition: Landscape.hpp:237
void createPolygonalHorizon(const QString &lineFileName, const float polyAngleRotateZ=0.0f, const QString &listMode="azDeg_altDeg", const bool polygonInverted=false)
Create a StelSphericalPolygon that describes a measured horizon line.
azimuth[radians] zenithDistance[radians]
Definition: Landscape.hpp:180
virtual float getOpacity(Vec3d azalt) const
Find opacity in a certain direction.
Definition: Landscape.hpp:173
bool getFlagShowFog() const
Get whether fog is displayed.
Definition: Landscape.hpp:116
void setFlagShowFog(const bool b)
Set whether fog is displayed.
Definition: Landscape.hpp:114
const QString getTexturePath(const QString &basename, const QString &landscapeId) const
search for a texture in landscape directory, else global textures directory
virtual unsigned int getMemorySize() const
Return approximate memory footprint in bytes (required for cache cost estimate in LandscapeMgr) The r...
Definition: Landscape.hpp:354
void setFlagShowIllumination(const bool b)
Set whether illumination is displayed.
Definition: Landscape.hpp:118
void setZRotation(float d)
Set an additional z-axis (azimuth) rotation after landscape has been loaded.
Definition: Landscape.hpp:162
QSharedPointer< StelTexture > StelTextureSP
Use shared pointer to simplify memory managment.
float getDefaultAtmosphericPressure() const
Return configured atmospheric pressure [mbar], for refraction computation.
Definition: Landscape.hpp:151
void setBrightness(const float b, const float pollutionBrightness=0.0f)
Set the brightness of the landscape plus brightness of optional add-on night lightscape.
Definition: Landscape.hpp:96
const StelLocation & getLocation() const
Return the associated location (may be empty!)
Definition: Landscape.hpp:138
StelLocation location
Minimal altitude of landscape cover. Can be used to construct bounding caps, so that e...
Definition: Landscape.hpp:232
bool validLandscape
can be used to draw nightscape texture (e.g. city light pollution), if available. Computed by the Lan...
Definition: Landscape.hpp:219
QString getAuthorName() const
Get landscape author name.
Definition: Landscape.hpp:131
float angleRotateZ
vertical columns. May be given in landscape.ini:[landscape]tesselate_cols. More indicates higher accu...
Definition: Landscape.hpp:226
horizonListMode
The list of azimuths (counted from True North towards East) and altitudes can come in various formats...
Definition: Landscape.hpp:175
float getEffectiveLandFadeValue()
Returns the currently effective land fade value.
Definition: Landscape.hpp:112