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();
	}
Example #2
0
	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();
	}