00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef CAELUM__POINT_STARFIELD_H
00022 #define CAELUM__POINT_STARFIELD_H
00023
00024 #include "CaelumPrerequisites.h"
00025 #include "CameraBoundElement.h"
00026 #include <vector>
00027
00028 namespace caelum
00029 {
00033 struct BrightStarCatalogueEntry {
00034 signed char rasc_hour;
00035 signed char rasc_min;
00036 float rasc_sec;
00037 signed char decl_deg;
00038 signed char decl_min;
00039 float decl_sec;
00040 float magn;
00041 };
00042
00044 const int BrightStarCatalogueSize = 9110;
00045
00047 extern const BrightStarCatalogueEntry BrightStarCatalogue[BrightStarCatalogueSize];
00048
00061 class CAELUM_EXPORT PointStarfield : public CameraBoundElement
00062 {
00063 public:
00068 PointStarfield (
00069 Ogre::SceneManager *sceneMgr,
00070 Ogre::SceneNode *caelumRootNode,
00071 bool initWithCatalogue = true);
00072
00074 virtual ~PointStarfield ();
00075
00077 struct Star {
00078 Ogre::Degree RightAscension;
00079 Ogre::Degree Declination;
00080 Ogre::Real Magnitude;
00081 };
00082
00083 typedef std::vector<Star> StarVector;
00084
00088 inline StarVector& getStarVector () { return mStars; }
00089
00092 void notifyStarVectorChanged ();
00093
00095 void clearAllStars ();
00096
00099 void addRandomStars (int count);
00100
00103 void addStar (const BrightStarCatalogueEntry &entry);
00104
00108 void addBrightStarCatalogue (int count = BrightStarCatalogueSize);
00109
00110
00111 private:
00113 Ogre::SceneNode *mNode;
00114
00115 Ogre::ManualObject *mManualObj;
00116
00118 Ogre::MaterialPtr mMaterial;
00119
00121 std::vector<Star> mStars;
00122
00123 Ogre::Real mMinPixelSize, mMaxPixelSize, mMag0PixelSize;
00124 Ogre::Real mMagnitudeScale;
00125
00126 Ogre::Degree mObserverLatitude, mObserverLongitude;
00127
00128 bool mValidGeometry;
00129 void invalidateGeometry();
00130 void ensureGeometry();
00131
00132 public:
00136 void _update (float time);
00137
00143 inline void setMagnitudeScale (Ogre::Real value) { mMagnitudeScale = value; }
00144 inline Ogre::Real getMagnitudeScale () { return mMagnitudeScale; }
00145
00146 inline void setMag0PixelSize (Ogre::Real value) { mMag0PixelSize = value; }
00147 inline Ogre::Real getMag0PixelSize () { return mMag0PixelSize; }
00148
00149 inline void setMinPixelSize (Ogre::Real value) { mMinPixelSize = value; }
00150 inline Ogre::Real getMinPixelSize () { return mMinPixelSize; }
00151
00152 inline void setMaxPixelSize (Ogre::Real value) { mMaxPixelSize = value; }
00153 inline Ogre::Real getMaxPixelSize () { return mMaxPixelSize; }
00154
00155 void setObserverLatitude (Ogre::Degree value);
00156 inline Ogre::Degree getObserverLatitude () { return mObserverLatitude; }
00157
00158 void setObserverLongitude (Ogre::Degree value);
00159 inline Ogre::Degree getObserverLongitude () { return mObserverLongitude; }
00160
00162 static const Ogre::String BILLBOARD_MATERIAL_NAME;
00163
00165 virtual void notifyCameraChanged (Ogre::Camera *cam);
00166
00167 protected:
00169 virtual void setFarRadius (Ogre::Real radius);
00170 };
00171 }
00172
00173 #endif // CAELUM__POINT_STARFIELD_H
00174