/* This file is part of Caelum. See http://www.ogre3d.org/wiki/index.php/Caelum Copyright (c) 2008 Caelum team. See Contributors.txt for details. Caelum is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Caelum is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Caelum. If not, see . */ #include "CaelumPrecompiled.h" #include "CaelumExceptions.h" #include "InternalUtilities.h" #include "Moon.h" #include namespace Caelum { const Ogre::String Moon::MOON_MATERIAL_NAME = "Caelum/PhaseMoon"; const Ogre::String Moon::MOON_BACKGROUND_MATERIAL_NAME = "Caelum/MoonBackground"; Moon::Moon ( Ogre::SceneManager *sceneMgr, Ogre::SceneNode *caelumRootNode, const Ogre::String& moonTextureName, Ogre::Degree angularSize ): BaseSkyLight(sceneMgr, caelumRootNode), mAngularSize(angularSize) { Ogre::String uniqueSuffix = "/" + InternalUtilities::pointerToString(this); // Clone materials mMoonMaterial.reset(InternalUtilities::checkLoadMaterialClone(MOON_MATERIAL_NAME, MOON_MATERIAL_NAME + uniqueSuffix)); mBackMaterial.reset(InternalUtilities::checkLoadMaterialClone(MOON_BACKGROUND_MATERIAL_NAME, MOON_BACKGROUND_MATERIAL_NAME + uniqueSuffix)); assert (!mMoonMaterial.isNull ()); assert (mMoonMaterial->getTechnique (0)); assert (mMoonMaterial->getTechnique (0)->getPass (0)); assert (mMoonMaterial->getTechnique (0)->getPass( 0)->hasFragmentProgram ()); mParams.setup(mMoonMaterial->getBestTechnique ()->getPass (0)->getFragmentProgramParameters ()); setMoonTexture(moonTextureName); mMoonBB.reset(sceneMgr->createBillboardSet("Caelum/Moon/MoonBB" + uniqueSuffix, 1)); mMoonBB->setMaterialName (mMoonMaterial->getName()); mMoonBB->setCastShadows (false); mMoonBB->setRenderQueueGroup (CAELUM_RENDER_QUEUE_MOON); mMoonBB->setDefaultDimensions (1.0f, 1.0f); mMoonBB->createBillboard (Ogre::Vector3::ZERO); mBackBB.reset(sceneMgr->createBillboardSet("Caelum/Moon/BackBB" + uniqueSuffix, 1)); mBackBB->setMaterialName (mBackMaterial->getName()); mBackBB->setCastShadows (false); mBackBB->setRenderQueueGroup (CAELUM_RENDER_QUEUE_MOON_BACKGROUND); mBackBB->setDefaultDimensions (1.0f, 1.0f); mBackBB->createBillboard (Ogre::Vector3::ZERO); mNode->attachObject (mMoonBB.get()); mNode->attachObject (mBackBB.get()); } Moon::~Moon () { } void Moon::setBodyColour (const Ogre::ColourValue &colour) { BaseSkyLight::setBodyColour(colour); // Set moon material colour. mMoonBB->getBillboard(0)->setColour(colour); } void Moon::setMoonTexture (const Ogre::String &textureName) { // Update the moon material assert(mMoonMaterial->getBestTechnique ()); assert(mMoonMaterial->getBestTechnique ()->getPass (0)); assert(mMoonMaterial->getBestTechnique ()->getPass (0)->getTextureUnitState (0)); mMoonMaterial->getBestTechnique ()->getPass (0)->getTextureUnitState (0)->setTextureName (textureName); mBackMaterial->getBestTechnique ()->getPass (0)->getTextureUnitState (0)->setTextureName (textureName); } void Moon::setMoonTextureAngularSize(const Ogre::Degree& moonTextureAngularSize){ mAngularSize = moonTextureAngularSize; } void Moon::notifyCameraChanged (Ogre::Camera *cam) { // This calls setFarRadius BaseSkyLight::notifyCameraChanged(cam); // Set moon position. Ogre::Real moonDistance = mRadius - mRadius * Ogre::Math::Tan(mAngularSize); mNode->setPosition(-mDirection * moonDistance); // Set moon scaling in [1.0 ~ 1.2] range float factor = 1.2f - mBodyColour.b * 0.2f; float scale = factor * moonDistance * Ogre::Math::Tan(mAngularSize); mNode->setScale (Ogre::Vector3::UNIT_SCALE * scale); } void Moon::Params::setup(Ogre::GpuProgramParametersSharedPtr fpParams) { this->fpParams = fpParams; this->phase.bind(fpParams, "phase"); } void Moon::setPhase (Ogre::Real phase) { mParams.phase.set(mParams.fpParams, phase); } void Moon::setQueryFlags (uint flags) { mMoonBB->setQueryFlags (flags); mBackBB->setQueryFlags (flags); } uint Moon::getQueryFlags () const { assert (mMoonBB->getQueryFlags () == mBackBB->getQueryFlags ()); return mMoonBB->getQueryFlags (); } void Moon::setVisibilityFlags (uint flags) { mMoonBB->setVisibilityFlags (flags); mBackBB->setVisibilityFlags (flags); } uint Moon::getVisibilityFlags () const { assert (mMoonBB->getVisibilityFlags () == mBackBB->getVisibilityFlags ()); return mMoonBB->getVisibilityFlags (); } }