00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "CaelumPrecompiled.h"
00022 #include "CaelumExceptions.h"
00023 #include "Moon.h"
00024
00025 namespace caelum
00026 {
00027 const Ogre::String Moon::MOON_MATERIAL_NAME = "Caelum/PhaseMoon";
00028
00029 const Ogre::String Moon::MOON_BACKROUND_MATERIAL_NAME = "Caelum/MoonBackground";
00030
00031 Moon::Moon (
00032 Ogre::SceneManager *sceneMgr,
00033 Ogre::SceneNode *caelumRootNode,
00034 const Ogre::String& moonTextureName,
00035 Ogre::Degree angularSize
00036 ):
00037 BaseSkyLight(sceneMgr, caelumRootNode),
00038 mAngularSize(angularSize)
00039 {
00040
00041 mMoonMaterial = Ogre::MaterialManager::getSingletonPtr()->getByName(MOON_MATERIAL_NAME);
00042 if (mMoonMaterial.isNull()) {
00043 CAELUM_THROW_UNSUPPORED_EXCEPTION("Can't find moon material", "Moon");
00044 }
00045 mMoonMaterial = mMoonMaterial->clone(mMoonMaterial->getName() + Ogre::StringConverter::toString((size_t)this));
00046 mMoonMaterial->load();
00047 if (mMoonMaterial->getBestTechnique() == NULL) {
00048 CAELUM_THROW_UNSUPPORED_EXCEPTION("Moon material not supported", "Moon");
00049 }
00050
00051
00052 mBackMaterial = Ogre::MaterialManager::getSingletonPtr()->getByName(MOON_BACKROUND_MATERIAL_NAME);
00053 if (mBackMaterial.isNull()) {
00054 CAELUM_THROW_UNSUPPORED_EXCEPTION("Can't find moon background material", "Moon");
00055 }
00056 mBackMaterial = mBackMaterial->clone(mBackMaterial->getName() + Ogre::StringConverter::toString((size_t)this));
00057 mBackMaterial->load();
00058 if (mBackMaterial->getBestTechnique() == NULL) {
00059 CAELUM_THROW_UNSUPPORED_EXCEPTION("Moon background material not supported", "Moon");
00060 }
00061
00062 getFpParams()->setIgnoreMissingParams(true);
00063 setMoonTexture(moonTextureName);
00064
00065 mMoonBB = sceneMgr->createBillboardSet(
00066 "Caelum/Moon/MoonBB/" + Ogre::StringConverter::toString((size_t)this), 1);
00067 mMoonBB->setMaterialName (mMoonMaterial->getName());
00068 mMoonBB->setCastShadows (false);
00069 mMoonBB->setRenderQueueGroup (CAELUM_RENDER_QUEUE_MOON);
00070 mMoonBB->setDefaultDimensions (1.0f, 1.0f);
00071 mMoonBB->createBillboard (Ogre::Vector3::ZERO);
00072
00073 mBackBB = sceneMgr->createBillboardSet(
00074 "Caelum/Moon/BackBB/" + Ogre::StringConverter::toString((size_t)this), 1);
00075 mBackBB->setMaterialName (mBackMaterial->getName());
00076 mBackBB->setCastShadows (false);
00077 mBackBB->setRenderQueueGroup (CAELUM_RENDER_QUEUE_MOON_BACKGROUND);
00078 mBackBB->setDefaultDimensions (1.0f, 1.0f);
00079 mBackBB->createBillboard (Ogre::Vector3::ZERO);
00080
00081 mNode->attachObject (mMoonBB);
00082 mNode->attachObject (mBackBB);
00083 }
00084
00085 Moon::~Moon () {
00086 if (mMoonBB) {
00087 mMoonBB->_getManager ()->destroyBillboardSet (mMoonBB);
00088 mMoonBB = 0;
00089 }
00090 if (mBackBB) {
00091 mBackBB->_getManager ()->destroyBillboardSet (mBackBB);
00092 mBackBB = 0;
00093 }
00094 Ogre::MaterialManager::getSingletonPtr()->remove(mMoonMaterial->getHandle());
00095 Ogre::MaterialManager::getSingletonPtr()->remove(mBackMaterial->getHandle());
00096 }
00097
00098 void Moon::setBodyColour (const Ogre::ColourValue &colour) {
00099 BaseSkyLight::setBodyColour(colour);
00100
00101
00102 mMoonBB->getBillboard(0)->setColour(colour);
00103 }
00104
00105 void Moon::setMoonTexture (const Ogre::String &textureName)
00106 {
00107
00108 assert(mMoonMaterial->getBestTechnique ());
00109 assert(mMoonMaterial->getBestTechnique ()->getPass (0));
00110 assert(mMoonMaterial->getBestTechnique ()->getPass (0)->getTextureUnitState (0));
00111 mMoonMaterial->getBestTechnique ()->getPass (0)->getTextureUnitState (0)->setTextureName (textureName);
00112 mBackMaterial->getBestTechnique ()->getPass (0)->getTextureUnitState (0)->setTextureName (textureName);
00113 }
00114
00115 void Moon::setMoonTextureAngularSize(const Ogre::Degree& moonTextureAngularSize){
00116 mAngularSize = moonTextureAngularSize;
00117 }
00118
00119 void Moon::notifyCameraChanged (Ogre::Camera *cam) {
00120
00121 BaseSkyLight::notifyCameraChanged(cam);
00122
00123
00124 Ogre::Real moonDistance = mRadius - mRadius * Ogre::Math::Tan(mAngularSize);
00125 mNode->setPosition(-mDirection * moonDistance);
00126
00127
00128 float factor = 1.2f - mBodyColour.b * 0.2f;
00129 float scale = factor * moonDistance * Ogre::Math::Tan(mAngularSize);
00130 mNode->setScale (Ogre::Vector3::UNIT_SCALE * scale);
00131 }
00132
00133 Ogre::GpuProgramParametersSharedPtr Moon::getFpParams () {
00134 assert (!mMoonMaterial.isNull ());
00135 assert (mMoonMaterial->getBestTechnique ());
00136 assert (mMoonMaterial->getBestTechnique ()->getPass (0));
00137 assert (mMoonMaterial->getBestTechnique ()->getPass( 0)->hasFragmentProgram ());
00138 return mMoonMaterial->getBestTechnique ()->getPass (0)->getFragmentProgramParameters ();
00139 }
00140
00141 void Moon::setPhase (Ogre::Real phase) {
00142 getFpParams ()->setNamedConstant ("phase", phase);
00143 }
00144 }