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 "Sun.h"
00023 #include "SkyLight.h"
00024
00025 namespace caelum {
00026
00027
00028
00029
00030
00031 const Ogre::String SphereSun::SUN_MATERIAL_NAME = "CaelumSphereSun";
00032
00033 SphereSun::SphereSun (Ogre::SceneManager *sceneMgr, Ogre::SceneNode *caelumRootNode, const Ogre::String &meshName) : BaseSkyLight(sceneMgr, caelumRootNode) {
00034 mSunMaterial = Ogre::MaterialManager::getSingletonPtr()->getByName(SUN_MATERIAL_NAME);
00035 mSunMaterial = mSunMaterial->clone(SUN_MATERIAL_NAME + Ogre::StringConverter::toString((size_t)this));
00036 mSunMaterial->load();
00037 mSunEntity = sceneMgr->createEntity ("CaelumSun", meshName);
00038 mSunEntity->setMaterialName (mSunMaterial->getName());
00039 mSunEntity->setCastShadows (false);
00040 mSunEntity->setRenderQueueGroup (CAELUM_RENDER_QUEUE_SUN);
00041 mNode->attachObject (mSunEntity);
00042 }
00043
00044 SphereSun::~SphereSun () {
00045 if (mNode) {
00046 mNode->detachObject (mSunEntity);
00047 }
00048 if (mSunEntity) {
00049 mSunEntity->_getManager ()->destroyEntity (mSunEntity);
00050 mSunEntity = 0;
00051 }
00052 Ogre::MaterialManager::getSingletonPtr()->remove(mSunMaterial->getHandle());
00053 }
00054
00055 void SphereSun::setBodyColour (const Ogre::ColourValue &colour) {
00056 BaseSkyLight::setBodyColour(colour);
00057
00058
00059 mSunMaterial->setSelfIllumination (colour);
00060 }
00061
00062 void SphereSun::notifyCameraChanged (Ogre::Camera *cam) {
00063
00064 CameraBoundElement::notifyCameraChanged(cam);
00065
00066
00067 Ogre::Real sunDistance = mRadius - mRadius * Ogre::Math::Tan (Ogre::Degree (0.01));
00068 mNode->setPosition(-mDirection * sunDistance);
00069
00070
00071 float factor = 2 - mBodyColour.b / 3;
00072 float scale = factor * sunDistance * Ogre::Math::Tan (Ogre::Degree (0.01));
00073 mNode->setScale (Ogre::Vector3::UNIT_SCALE * scale);
00074 }
00075
00076
00077
00078
00079
00080 const Ogre::String SpriteSun::SUN_MATERIAL_NAME = "CaelumSpriteSun";
00081
00082 SpriteSun::SpriteSun ( Ogre::SceneManager *sceneMgr,
00083 Ogre::SceneNode *caelumRootNode,
00084 const Ogre::String &sunTextureName,
00085 const Ogre::Degree& sunTextureAngularSize)
00086 : BaseSkyLight(sceneMgr, caelumRootNode)
00087 , mSunTextureAngularSize(sunTextureAngularSize)
00088 {
00089 mSunMaterial = Ogre::MaterialManager::getSingletonPtr()->getByName(SUN_MATERIAL_NAME);
00090 mSunMaterial = mSunMaterial->clone(SUN_MATERIAL_NAME + Ogre::StringConverter::toString((size_t)this));
00091 mSunMaterial->load();
00092 assert(!mSunMaterial.isNull());
00093 setSunTexture(sunTextureName);
00094
00095 mSunBillboardSet = sceneMgr->createBillboardSet("CaelumSpriteSun", 2);
00096 mSunBillboardSet->setMaterialName (mSunMaterial->getName());
00097 mSunBillboardSet->setCastShadows (false);
00098 mSunBillboardSet->setRenderQueueGroup (CAELUM_RENDER_QUEUE_SUN);
00099 mSunBillboardSet->setDefaultDimensions(1.0f, 1.0f);
00100 mSunBillboardSet->createBillboard(Ogre::Vector3::ZERO);
00101
00102 mNode->attachObject (mSunBillboardSet);
00103 }
00104
00105 SpriteSun::~SpriteSun () {
00106 if (mNode) {
00107 mNode->detachObject (mSunBillboardSet);
00108 }
00109 if (mSunBillboardSet) {
00110 mSunBillboardSet->_getManager ()->destroyBillboardSet (mSunBillboardSet);
00111 mSunBillboardSet = 0;
00112 }
00113 Ogre::MaterialManager::getSingletonPtr()->remove(mSunMaterial->getHandle());
00114 }
00115
00116 void SpriteSun::setBodyColour (const Ogre::ColourValue &colour) {
00117 BaseSkyLight::setBodyColour(colour);
00118
00119
00120 mSunBillboardSet->getBillboard(0)->setColour(colour);
00121 }
00122
00123 void SpriteSun::setSunTexture (const Ogre::String &textureName) {
00124
00125 assert(mSunMaterial->getBestTechnique ());
00126 assert(mSunMaterial->getBestTechnique ()->getPass (0));
00127 assert(mSunMaterial->getBestTechnique ()->getPass (0)->getTextureUnitState (0));
00128 mSunMaterial->getBestTechnique ()->getPass (0)->getTextureUnitState (0)->setTextureName (textureName);
00129 }
00130
00131 void SpriteSun::setSunTextureAngularSize(const Ogre::Degree& sunTextureAngularSize){
00132 mSunTextureAngularSize = sunTextureAngularSize;
00133 }
00134
00135 void SpriteSun::notifyCameraChanged (Ogre::Camera *cam) {
00136
00137 BaseSkyLight::notifyCameraChanged(cam);
00138
00139
00140 Ogre::Real sunDistance = mRadius - mRadius * Ogre::Math::Tan(mSunTextureAngularSize);
00141 mNode->setPosition(-mDirection * sunDistance);
00142
00143
00144 float factor = 1.2f - mBodyColour.b * 0.2f;
00145 float scale = factor * sunDistance * Ogre::Math::Tan(mSunTextureAngularSize);
00146 mNode->setScale (Ogre::Vector3::UNIT_SCALE * scale);
00147 }
00148
00149 }