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 "OwnedPtr.h"
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
00059 class CAELUM_EXPORT PointStarfield:
00060 public CameraBoundElement
00061 {
00062 public:
00067 PointStarfield (
00068 Ogre::SceneManager *sceneMgr,
00069 Ogre::SceneNode *caelumRootNode,
00070 bool initWithCatalogue = true);
00071
00073 virtual ~PointStarfield ();
00074
00076 struct Star {
00077 Ogre::Degree RightAscension;
00078 Ogre::Degree Declination;
00079 Ogre::Real Magnitude;
00080 };
00081
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 OwnedMaterialPtr mMaterial;
00114
00116 SceneNodePtr mNode;
00117
00119 ManualObjectPtr mManualObj;
00120
00122 std::vector<Star> mStars;
00123
00124 Ogre::Real mMinPixelSize, mMaxPixelSize, mMag0PixelSize;
00125 Ogre::Real mMagnitudeScale;
00126
00127 Ogre::Degree mObserverLatitude, mObserverLongitude;
00128
00129 bool mValidGeometry;
00130 void invalidateGeometry();
00131 void ensureGeometry();
00132
00133 public:
00137 void _update (float time);
00138
00144 inline void setMagnitudeScale (Ogre::Real value) { mMagnitudeScale = value; }
00145 inline Ogre::Real getMagnitudeScale () const { return mMagnitudeScale; }
00146
00147 inline void setMag0PixelSize (Ogre::Real value) { mMag0PixelSize = value; }
00148 inline Ogre::Real getMag0PixelSize () const { return mMag0PixelSize; }
00149
00150 inline void setMinPixelSize (Ogre::Real value) { mMinPixelSize = value; }
00151 inline Ogre::Real getMinPixelSize () const { return mMinPixelSize; }
00152
00153 inline void setMaxPixelSize (Ogre::Real value) { mMaxPixelSize = value; }
00154 inline Ogre::Real getMaxPixelSize () const { return mMaxPixelSize; }
00155
00156 void setObserverLatitude (Ogre::Degree value);
00157 inline Ogre::Degree getObserverLatitude () const { return mObserverLatitude; }
00158
00159 void setObserverLongitude (Ogre::Degree value);
00160 inline Ogre::Degree getObserverLongitude () const { return mObserverLongitude; }
00161
00162 private:
00163 Ogre::Degree mObserverPositionRebuildDelta;
00164
00165 public:
00173 inline Ogre::Degree getObserverPositionRebuildDelta () const {
00174 return mObserverPositionRebuildDelta;
00175 }
00176 inline void setObserverPositionRebuildDelta (Ogre::Degree value) {
00177 mObserverPositionRebuildDelta = value;
00178 }
00179
00180 static const Ogre::Degree DEFAULT_OBSERVER_POSITION_REBUILD_DELTA;
00181
00183 static const Ogre::String BILLBOARD_MATERIAL_NAME;
00184
00186 virtual void notifyCameraChanged (Ogre::Camera *cam);
00187
00188 protected:
00190 virtual void setFarRadius (Ogre::Real radius);
00191
00192 public:
00193 void setQueryFlags (uint flags) { mManualObj->setQueryFlags (flags); }
00194 uint getQueryFlags () const { return mManualObj->getQueryFlags (); }
00195 void setVisibilityFlags (uint flags) { mManualObj->setVisibilityFlags (flags); }
00196 uint getVisibilityFlags () const { return mManualObj->getVisibilityFlags (); }
00197 };
00198 }
00199
00200 #endif // CAELUM__POINT_STARFIELD_H