21 #include "CaelumPrecompiled.h" 22 #include "PointStarfield.h" 23 #include "CaelumExceptions.h" 24 #include "Astronomy.h" 25 #include "InternalUtilities.h" 31 const Ogre::String PointStarfield::STARFIELD_MATERIAL_NAME =
"Caelum/StarPoint";
32 const Ogre::Degree PointStarfield::DEFAULT_OBSERVER_POSITION_REBUILD_DELTA = Ogre::Degree(0.1);
34 PointStarfield::PointStarfield (
35 Ogre::SceneManager *sceneMgr,
36 Ogre::SceneNode *caelumRootNode,
37 bool initWithCatalogue)
42 mMagnitudeScale = Math::Pow(100, 0.2);
43 mObserverLatitude = 45;
44 mObserverLongitude = 0;
45 mObserverPositionRebuildDelta = DEFAULT_OBSERVER_POSITION_REBUILD_DELTA;
47 String uniqueSuffix =
"/" + InternalUtilities::pointerToString(
this);
50 mMaterial.reset(InternalUtilities::checkLoadMaterialClone(
51 STARFIELD_MATERIAL_NAME,
52 STARFIELD_MATERIAL_NAME + uniqueSuffix));
54 mParams.setup(mMaterial->getTechnique(0)->getPass(0)->getVertexProgramParameters());
57 Ogre::String objName =
"Caelum/PointStarfield" + uniqueSuffix;
58 mManualObj.reset (sceneMgr->createManualObject (objName));
59 mManualObj->setDynamic(
false);
60 mManualObj->setRenderQueueGroup (CAELUM_RENDER_QUEUE_STARFIELD);
61 sceneMgr->getRenderQueue()->getQueueGroup(CAELUM_RENDER_QUEUE_STARFIELD)->setShadowsEnabled (
false);
62 mManualObj->setCastShadows(
false);
64 mNode.reset (caelumRootNode->createChildSceneNode ());
65 mNode->attachObject (mManualObj.getPointer ());
67 if (initWithCatalogue) {
68 addBrightStarCatalogue ();
72 PointStarfield::~PointStarfield ()
76 void PointStarfield::notifyStarVectorChanged () {
77 invalidateGeometry ();
80 void PointStarfield::clearAllStars () {
82 notifyStarVectorChanged ();
86 return rand() /
static_cast<float>(RAND_MAX);
89 Real randReal (Real min, Real max) {
91 return min * (1 - f) + max * f;
94 void PointStarfield::addRandomStars (
int count)
96 for (
int i = 0; i < count; ++i) {
100 pos.x = randReal(-1, 1);
101 pos.y = randReal(-1, 1);
102 pos.z = randReal(-1, 1);
103 }
while (pos.squaredLength () >= 1);
106 LongReal rasc, decl, dist;
107 Astronomy::convertRectangularToSpherical(
112 s.RightAscension = Ogre::Degree (rasc);
113 s.Declination = Ogre::Degree (decl);
115 s.Magnitude = 6 * pos.squaredLength () + 1.5;
118 notifyStarVectorChanged ();
123 s.RightAscension = Ogre::Degree(360 / 24.0f * (
124 Math::Abs(entry.rasc_hour) +
125 entry.rasc_min / 60.0f +
126 entry.rasc_sec / 3600.0f));
127 s.Declination = Ogre::Degree(Math::Sign(entry.decl_deg) * (
128 Math::Abs(entry.decl_deg) +
129 entry.decl_min / 60.0f +
130 entry.decl_sec / 3600.0f));
131 s.Magnitude = entry.magn;
134 notifyStarVectorChanged ();
137 void PointStarfield::addBrightStarCatalogue (
int count) {
142 std::vector<std::pair<Real, int> > vec;
147 sort(vec.begin(), vec.end());
148 for (
int i = 0; i < count; ++i) {
157 notifyStarVectorChanged ();
160 void PointStarfield::invalidateGeometry () {
161 mValidGeometry =
false;
164 void PointStarfield::ensureGeometry ()
166 if (mValidGeometry) {
172 size_t starCount = mStars.size();
175 mManualObj->estimateVertexCount(6 * starCount);
176 mManualObj->begin(mMaterial->getName (), Ogre::RenderOperation::OT_TRIANGLE_LIST);
177 for (uint i = 0; i < starCount; ++i)
179 const Star& star = mStars[i];
183 Astronomy::convertEquatorialToHorizontal(
185 mObserverLatitude.valueDegrees(),
186 mObserverLongitude.valueDegrees(),
187 star.RightAscension.valueDegrees(), star.Declination.valueDegrees(),
191 pos.z = -Math::Cos (Ogre::Degree(azm)) * Math::Cos (Ogre::Degree(alt));
192 pos.x = Math::Sin (Ogre::Degree(azm)) * Math::Cos (Ogre::Degree(alt));
193 pos.y = -Math::Sin (Ogre::Degree(alt));
196 mManualObj->position (pos);
197 mManualObj->textureCoord (+1, -1, star.Magnitude);
198 mManualObj->position (pos);
199 mManualObj->textureCoord (+1, +1, star.Magnitude);
200 mManualObj->position (pos);
201 mManualObj->textureCoord (-1, -1, star.Magnitude);
203 mManualObj->position (pos);
204 mManualObj->textureCoord (-1, -1, star.Magnitude);
205 mManualObj->position (pos);
206 mManualObj->textureCoord (+1, +1, star.Magnitude);
207 mManualObj->position (pos);
208 mManualObj->textureCoord (-1, +1, star.Magnitude);
213 AxisAlignedBox box(Ogre::AxisAlignedBox::EXTENT_FINITE);
214 mManualObj->setBoundingBox (box);
216 mValidGeometry =
true;
219 void PointStarfield::Params::setup(Ogre::GpuProgramParametersSharedPtr vpParams)
221 this->vpParams = vpParams;
222 this->mag_scale.bind(vpParams,
"mag_scale");
223 this->mag0_size.bind(vpParams,
"mag0_size");
224 this->min_size.bind(vpParams,
"min_size");
225 this->max_size.bind(vpParams,
"max_size");
226 this->aspect_ratio.bind(vpParams,
"aspect_ratio");
229 void PointStarfield::notifyCameraChanged (Ogre::Camera *cam) {
230 CameraBoundElement::notifyCameraChanged (cam);
233 Pass* pass = mMaterial->getBestTechnique ()->getPass (0);
234 GpuProgramParametersSharedPtr fpParams = pass->getFragmentProgramParameters ();
235 GpuProgramParametersSharedPtr vpParams = pass->getVertexProgramParameters ();
237 int height = cam->getViewport ()-> getActualHeight ();
238 int width = cam->getViewport ()-> getActualWidth ();
239 Real pixFactor = 1.0f / width;
240 Real magScale = -Math::Log (mMagnitudeScale) / 2;
241 Real mag0Size = mMag0PixelSize * pixFactor;
242 Real minSize = mMinPixelSize * pixFactor;
243 Real maxSize = mMaxPixelSize * pixFactor;
244 Real aspectRatio =
static_cast<Real
>(width) / height;
247 mParams.mag_scale.set(mParams.vpParams, magScale);
248 mParams.mag0_size.set(mParams.vpParams, mag0Size);
249 mParams.min_size.set(mParams.vpParams, minSize);
250 mParams.max_size.set(mParams.vpParams, maxSize);
251 mParams.aspect_ratio.set(mParams.vpParams, aspectRatio);
254 void PointStarfield::setFarRadius (Ogre::Real radius) {
255 CameraBoundElement::setFarRadius(radius);
256 mNode->setScale (Ogre::Vector3::UNIT_SCALE * radius);
259 void PointStarfield::_update (
const float time) {
261 Ogre::Quaternion orientation = Ogre::Quaternion::IDENTITY;
262 orientation = orientation * Ogre::Quaternion (Ogre::Radian (-mObserverLatitude + Ogre::Degree (90)), Ogre::Vector3::UNIT_X);
263 orientation = orientation * Ogre::Quaternion (Ogre::Radian (-time * 2 * Ogre::Math::PI), Ogre::Vector3::UNIT_Y);
264 mNode->setOrientation (orientation);
268 void PointStarfield::setObserverLatitude (Ogre::Degree value)
270 if (!Math::RealEqual (
271 mObserverLatitude.valueDegrees (),
272 value.valueDegrees (),
273 this->getObserverPositionRebuildDelta ().valueDegrees ()))
275 mObserverLatitude = value;
276 invalidateGeometry ();
280 void PointStarfield::setObserverLongitude (Ogre::Degree value)
282 if (!Math::RealEqual (
283 mObserverLongitude.valueDegrees (),
284 value.valueDegrees (),
285 this->getObserverPositionRebuildDelta ().valueDegrees ()))
287 mObserverLongitude = value;
288 invalidateGeometry ();
const int BrightStarCatalogueSize
There are exactly 9110 stars in our version of the BSC.
const BrightStarCatalogueEntry BrightStarCatalogue[BrightStarCatalogueSize]
Hardcoded bright star catalogue (BrightStarCatalogue.cpp)
Struct representing one star inside PointStarfield.
POD for bright star catalogue entries.