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 "SkyDome.h"
00023 #include "GeometryFactory.h"
00024 #include "CaelumExceptions.h"
00025
00026 namespace Caelum
00027 {
00028 const Ogre::String SkyDome::SPHERIC_DOME_NAME = "CaelumSphericDome";
00029 const Ogre::String SkyDome::SKY_DOME_MATERIAL_NAME = "CaelumSkyDomeMaterial";
00030
00031 SkyDome::SkyDome (Ogre::SceneManager *sceneMgr, Ogre::SceneNode *caelumRootNode):
00032 mNode(NULL)
00033 {
00034 String uniquePrefix = "Caelum/SkyDome/" + Ogre::StringConverter::toString((size_t)this) + "/";
00035
00036
00037 mMaterial = Ogre::MaterialManager::getSingleton().getByName(SKY_DOME_MATERIAL_NAME);
00038 mMaterial = mMaterial->clone(uniquePrefix + SKY_DOME_MATERIAL_NAME);
00039 mMaterial->load ();
00040
00041
00042 mShadersEnabled = mMaterial->getBestTechnique()->getPass(0)->isProgrammable();
00043
00044
00045 mHazeEnabled = true;
00046 setHazeEnabled(false);
00047
00048 sceneMgr->getRenderQueue()->getQueueGroup(CAELUM_RENDER_QUEUE_SKYDOME)->setShadowsEnabled(false);
00049
00050
00051 GeometryFactory::generateSphericDome (SPHERIC_DOME_NAME, 32);
00052 mEntity = sceneMgr->createEntity (uniquePrefix + "Dome", SPHERIC_DOME_NAME);
00053 mEntity->setMaterialName (mMaterial->getName());
00054 mEntity->setRenderQueueGroup (CAELUM_RENDER_QUEUE_SKYDOME);
00055 mEntity->setCastShadows (false);
00056
00057 mNode = caelumRootNode->createChildSceneNode (uniquePrefix + "DomeNode");
00058 mNode->attachObject (mEntity);
00059 }
00060
00061 SkyDome::~SkyDome () {
00062 if (mNode) {
00063
00064 mNode->detachObject (mEntity);
00065 mEntity->_getManager ()->destroyEntity (mEntity);
00066
00067
00068 static_cast<Ogre::SceneNode *>(mNode->getParent ())->removeAndDestroyChild (mNode->getName ());
00069 mNode = 0;
00070
00071 Ogre::MaterialManager::getSingletonPtr()->remove(mMaterial->getHandle());
00072 }
00073 }
00074
00075 void SkyDome::notifyCameraChanged (Ogre::Camera *cam) {
00076 CameraBoundElement::notifyCameraChanged (cam);
00077 }
00078
00079 void SkyDome::setFarRadius (Ogre::Real radius) {
00080 CameraBoundElement::setFarRadius(radius);
00081 mNode->setScale (Ogre::Vector3::UNIT_SCALE * radius);
00082 }
00083
00084 void SkyDome::setSunDirection (const Ogre::Vector3& sunDir) {
00085 float elevation = sunDir.dotProduct (Ogre::Vector3::UNIT_Y);
00086 elevation = elevation * 0.5 + 0.5;
00087 Ogre::Pass* pass = mMaterial->getBestTechnique()->getPass(0);
00088 if (mShadersEnabled) {
00089 Ogre::GpuProgramParametersSharedPtr vpParams = pass->getVertexProgramParameters();
00090 Ogre::GpuProgramParametersSharedPtr fpParams = pass->getFragmentProgramParameters();
00091 vpParams->setNamedConstant ("sunDirection", sunDir);
00092 fpParams->setNamedConstant ("offset", elevation);
00093 } else {
00094 Ogre::TextureUnitState* gradientsTus = pass->getTextureUnitState(0);
00095 gradientsTus->setTextureUScroll (elevation);
00096 }
00097 }
00098
00099 void SkyDome::setHazeColour (const Ogre::ColourValue& hazeColour) {
00100 if (mShadersEnabled && mHazeEnabled) {
00101 Ogre::GpuProgramParametersSharedPtr fpParams = mMaterial->getBestTechnique()->getPass(0)->getFragmentProgramParameters();
00102 fpParams->setNamedConstant ("hazeColour", hazeColour);
00103 }
00104 }
00105
00106 void SkyDome::setSkyGradientsImage (const Ogre::String& gradients)
00107 {
00108 Ogre::TextureUnitState* gradientsTus =
00109 mMaterial->getTechnique (0)->getPass (0)->getTextureUnitState(0);
00110
00111 gradientsTus->setTextureAddressingMode (Ogre::TextureUnitState::TAM_CLAMP);
00112
00113
00114 #if OGRE_VERSION < ((1 << 16) | (3 << 8))
00115 gradientsTus->setTextureName (gradients, Ogre::TEX_TYPE_2D, -1, true);
00116 #else
00117 gradientsTus->setTextureName (gradients, Ogre::TEX_TYPE_2D);
00118 gradientsTus->setIsAlpha (true);
00119 #endif
00120 }
00121
00122 void SkyDome::setAtmosphereDepthImage (const Ogre::String& atmosphereDepth)
00123 {
00124 if (!mShadersEnabled) {
00125 return;
00126 }
00127
00128 Ogre::TextureUnitState* atmosphereTus =
00129 mMaterial->getTechnique (0)->getPass (0)->getTextureUnitState(1);
00130
00131 atmosphereTus->setTextureName (atmosphereDepth, Ogre::TEX_TYPE_1D);
00132 atmosphereTus->setTextureAddressingMode (Ogre::TextureUnitState::TAM_CLAMP, Ogre::TextureUnitState::TAM_WRAP, Ogre::TextureUnitState::TAM_WRAP);
00133 }
00134
00135 bool SkyDome::getHazeEnabled () const {
00136 return mHazeEnabled;
00137 }
00138
00139 void SkyDome::setHazeEnabled (bool value)
00140 {
00141 if (mHazeEnabled == value) {
00142 return;
00143 }
00144 mHazeEnabled = value;
00145
00146 if (!mShadersEnabled) {
00147 return;
00148 }
00149
00150 Ogre::Pass *pass = mMaterial->getTechnique (0)->getPass (0);
00151 if (value) {
00152 pass->setFragmentProgram("CaelumSkyDomeFP");
00153 } else {
00154 pass->setFragmentProgram("CaelumSkyDomeFP_NoHaze");
00155 }
00156 Ogre::GpuProgramParametersSharedPtr params = pass->getFragmentProgramParameters();
00157 params->setIgnoreMissingParams(true);
00158 }
00159 }