void MoonManager::create() { if (mCreated) { return; } mMoonSceneNode = mSkyX->getSceneManager()->getRootSceneNode()->createChildSceneNode(); mMoonBillboard = mSkyX->getSceneManager()->createBillboardSet("SkyXMoonBillboardSet", 1); mMoonBillboard->setMaterialName(mSkyX->getGPUManager()->getMoonMaterialName()); mMoonBillboard->setBillboardType(Ogre::BBT_ORIENTED_COMMON); mMoonBillboard->setRenderQueueGroup(Ogre::RENDER_QUEUE_SKIES_EARLY+1); mMoonBillboard->setCastShadows(false); mMoonBillboard->createBillboard(Ogre::Vector3(0,0,0)); mMoonSceneNode->attachObject(mMoonBillboard); mMoonSceneNode->setPosition(mSkyX->getCamera()->getDerivedPosition()); mCreated = true; _updateMoonBounds(); update(); }
void MoonManager::updateGeometry(Ogre::Camera* c) { if (!mCreated) { return; } float radius = mSkyX->getMeshManager()->getSkydomeRadius(c)*0.95f, size = radius*mMoonSize; mMoonBillboard->setCommonDirection((mSkyX->getController()->getMoonDirection()).normalisedCopy().perpendicular()); Ogre::Vector3 moonRelativePos = mSkyX->getController()->getMoonDirection()* Ogre::Math::Cos(Ogre::Math::ASin((size/2)/radius))*radius; mMoonSceneNode->setPosition(c->getDerivedPosition() + moonRelativePos); if (moonRelativePos.y < -size/2) { mMoonSceneNode->setVisible(false); } else { mMoonSceneNode->setVisible(mSkyX->isVisible()); mMoonMaterial->getTechnique(0)->getPass(0) ->getVertexProgramParameters()->setNamedConstant("uSkydomeCenter", c->getDerivedPosition()); } if (mMoonBillboard->getBoundingBox().getMaximum().x != size) { _updateMoonBounds(c); } }
void MoonManager::setMoonSize(const Ogre::Real& MoonSize) { mMoonSize = MoonSize; if (!mCreated) { return; } _updateMoonBounds(); }