#include #include "windows.h" //#include #include #include # define MAX(A,B) ((A)>(B)?(A):(B)) /* Definición macro de Max */ # define MIN(A,B) ((A)>(B)?(B):(A)) /* Definición macro de Min */ class LightComposite { protected: std::vector mLightList; bool mShadowMapOverlayEnabled; Overlay* mShadowMapOverlay; Overlay* mLightingInfo; Light *mCurrentLight; unsigned int idCurrentLight; bool mShadowsEnabled; SceneManager *mSceneMgr; Real exposure; Camera *mCamera; ColourValue mDayLight; ColourValue mNightLight; ColourValue mFactorLight; ColourValue mRangeLight; public: ColourValue getDayLight() { return mDayLight; } ColourValue getNightLight() { return mNightLight; } void init(SceneManager *sceneMgr, Camera *camera) { mShadowMapOverlay = OverlayManager::getSingleton().getByName("shadowMapMain"); mLightingInfo = OverlayManager::getSingleton().getByName("lightOptions"); mCurrentLight = 0; mShadowMapOverlayEnabled = true; Ogre::String shadowsEnabled; Ogre::ConfigFile config; config.load("configScene.cfg"); Ogre::String sShadowsEnabled = config.getSetting("ShadowsEnabled"); mShadowsEnabled = Ogre::StringConverter::parseBool(sShadowsEnabled); idCurrentLight = 0; exposure = 4.5; mSceneMgr = sceneMgr; if (mShadowsEnabled) { mSceneMgr->setShadowTechnique(SHADOWTYPE_TEXTURE_MODULATIVE); mSceneMgr->setShadowDirectionalLightExtrusionDistance(10000.0); mSceneMgr->setShadowFarDistance(2000); mSceneMgr->setShadowTextureFadeStart(0.8); mSceneMgr->setShadowTextureFadeEnd(0.9); { Camera* pTextureCam = mSceneMgr->getCamera("Ogre/ShadowTextureCam0"); pTextureCam->setNearClipDistance(5.0); pTextureCam->setFarClipDistance(12000); } } mCamera = camera; mFactorLight = (mDayLight - mNightLight) / 1000.0; mCamera->getViewport()->setBackgroundColour(mSceneMgr->getAmbientLight() * mDayLight); mRangeLight = mDayLight - mNightLight; } ColourValue getRangeLight() { return mRangeLight; } void showDebugShadowMap(int idShadowMap) { TexturePtr tex = TextureManager::getSingleton().getByName("Ogre/ShadowTexture" + StringConverter::toString(idShadowMap)); HardwarePixelBufferSharedPtr hpb = tex->getBuffer(0,0); LogManager::getSingleton().logMessage(" -- WIDTH = " + StringConverter::toString(hpb->getWidth())); LogManager::getSingleton().logMessage(" -- HEIGHT = " + StringConverter::toString(hpb->getHeight())); LogManager::getSingleton().logMessage(" -- DEPTH = " + StringConverter::toString(hpb->getDepth())); LogManager::getSingleton().logMessage(" -- FORMAT = " + StringConverter::toString(hpb->getFormat())); LogManager::getSingleton().logMessage(" -- SIZE = " + StringConverter::toString(hpb->getSizeInBytes())); float *tex01 = new float[tex->getHeight()*tex->getWidth()*4]; PixelBox pBox(tex->getWidth(),tex->getHeight(),tex->getDepth(),PF_FLOAT32_RGBA,tex01); LogManager::getSingleton().logMessage(" --PBOX WIDTH = " + StringConverter::toString(pBox.getWidth())); LogManager::getSingleton().logMessage(" --PBOX HEIGHT = " + StringConverter::toString(pBox.getHeight())); hpb->blitToMemory(pBox); //imdebug("rgba w=%d h=%d %p b=32f",pBox.getWidth(),pBox.getHeight(),pBox.data); delete tex01; } void setDayLight(ColourValue dayLight) { mDayLight = dayLight; } void setNightLight(ColourValue nightLight) { mNightLight = nightLight; } void setAmbientColour(ColourValue colour) { mSceneMgr->setAmbientLight(colour); MaterialPtr materialSky = MaterialManager::getSingleton().getByName("Examples/SpaceSkyPlaneNight"); if (!materialSky.isNull()) { if (materialSky->getTechnique(0)->getPass(0)->isProgrammable()) { GpuProgramParametersSharedPtr fragParams = materialSky->getTechnique(0)->getPass(0)->getFragmentProgramParameters(); ColourValue ambientColour = mSceneMgr->getAmbientLight(); fragParams->setNamedConstant("ambientlight",Vector4(ambientColour.val[0],ambientColour.val[1],ambientColour.val[2],ambientColour.val[3])); } } mCamera->getViewport()->setBackgroundColour(mSceneMgr->getAmbientLight() * ColourValue(0.85,0.88,0.96)); } void setCurrentLight(unsigned int idLight) { mCurrentLight = mLightList[idLight]; } void update(InputReader *input) { /* if (input->isKeyDown(KC_RETURN)) { if (!mShadowsEnabled) { mSceneMgr->setShadowTechnique(SHADOWTYPE_TEXTURE_MODULATIVE); mShadowsEnabled = true; } else { mSceneMgr->setShadowTechnique(SHADOWTYPE_NONE); mShadowsEnabled = false; } } if (input->isKeyDown(KC_SPACE)) { idCurrentLight++; if (idCurrentLight == mLightList.size()) { idCurrentLight = 0; } } if (input->isKeyDown(KC_Q)) { exposure = MIN(exposure+0.05,10.0); OverlayElement *oInfo = OverlayManager::getSingleton().getOverlayElement("ObscuranceExposure"); oInfo->setCaption("Obscurance Exposure: " + StringConverter::toString(exposure)); } if (input->isKeyDown(KC_E)) { exposure = MAX(exposure-0.05,-10.0); OverlayElement *oInfo = OverlayManager::getSingleton().getOverlayElement("ObscuranceExposure"); oInfo->setCaption("Obscurance Exposure: " + StringConverter::toString(exposure)); } if (input->isKeyDown(KC_F1)) { mCurrentLight->setDiffuseColour(MIN(mCurrentLight->getDiffuseColour().r+0.05,1.0),MIN(mCurrentLight->getDiffuseColour().g,1.0),MIN(mCurrentLight->getDiffuseColour().b,1.0)); OverlayElement *dInfo = OverlayManager::getSingleton().getOverlayElement("LightDiffuseColour"); dInfo->setCaption("Diffuse Col.: " + StringConverter::toString(mCurrentLight->getDiffuseColour())); } if (input->isKeyDown(KC_F2)) { mCurrentLight->setDiffuseColour(MIN(mCurrentLight->getDiffuseColour().r,1.0),MIN(mCurrentLight->getDiffuseColour().g+0.05,1.0),MIN(mCurrentLight->getDiffuseColour().b,1.0)); OverlayElement *dInfo = OverlayManager::getSingleton().getOverlayElement("LightDiffuseColour"); dInfo->setCaption("Diffuse Col.: " + StringConverter::toString(mCurrentLight->getDiffuseColour())); } if (input->isKeyDown(KC_F3)) { mCurrentLight->setDiffuseColour(MIN(mCurrentLight->getDiffuseColour().r,1.0),MIN(mCurrentLight->getDiffuseColour().g,1.0),MIN(mCurrentLight->getDiffuseColour().b+0.05,1.0)); OverlayElement *dInfo = OverlayManager::getSingleton().getOverlayElement("LightDiffuseColour"); dInfo->setCaption("Diffuse Col.: " + StringConverter::toString(mCurrentLight->getDiffuseColour())); } if (input->isKeyDown(KC_F4)) { mCurrentLight->setDiffuseColour(MAX(mCurrentLight->getDiffuseColour().r-0.05,0.0),MAX(mCurrentLight->getDiffuseColour().g,0.0),MAX(mCurrentLight->getDiffuseColour().b,0.0)); OverlayElement *dInfo = OverlayManager::getSingleton().getOverlayElement("LightDiffuseColour"); dInfo->setCaption("Diffuse Col.: " + StringConverter::toString(mCurrentLight->getDiffuseColour())); } if (input->isKeyDown(KC_F5)) { mCurrentLight->setDiffuseColour(MAX(mCurrentLight->getDiffuseColour().r,0.0),MAX(mCurrentLight->getDiffuseColour().g-0.05,0.0),MAX(mCurrentLight->getDiffuseColour().b,0.0)); OverlayElement *dInfo = OverlayManager::getSingleton().getOverlayElement("LightDiffuseColour"); dInfo->setCaption("Diffuse Col.: " + StringConverter::toString(mCurrentLight->getDiffuseColour())); } if (input->isKeyDown(KC_F6)) { mCurrentLight->setDiffuseColour(MAX(mCurrentLight->getDiffuseColour().r,0.0),MAX(mCurrentLight->getDiffuseColour().g,0.0),MAX(mCurrentLight->getDiffuseColour().b-0.05,0.0)); OverlayElement *dInfo = OverlayManager::getSingleton().getOverlayElement("LightDiffuseColour"); dInfo->setCaption("Diffuse Col.: " + StringConverter::toString(mCurrentLight->getDiffuseColour())); } if (input->isKeyDown(KC_F7)) { mSceneMgr->setShadowColour(ColourValue(MIN(mSceneMgr->getShadowColour().r+0.05,1.0),MIN(mSceneMgr->getShadowColour().g,1.0),MIN(mSceneMgr->getShadowColour().b,1.0))); OverlayElement *sInfo = OverlayManager::getSingleton().getOverlayElement("LightShadowColour"); sInfo->setCaption("Shadow Col.: " + StringConverter::toString(mSceneMgr->getShadowColour())); } if (input->isKeyDown(KC_F8)) { mSceneMgr->setShadowColour(ColourValue(MIN(mSceneMgr->getShadowColour().r,1.0),MIN(mSceneMgr->getShadowColour().g+0.05,1.0),MIN(mSceneMgr->getShadowColour().b,1.0))); OverlayElement *sInfo = OverlayManager::getSingleton().getOverlayElement("LightShadowColour"); sInfo->setCaption("Shadow Col.: " + StringConverter::toString(mSceneMgr->getShadowColour())); } if (input->isKeyDown(KC_F9)) { mSceneMgr->setShadowColour(ColourValue(MIN(mSceneMgr->getShadowColour().r,1.0),MIN(mSceneMgr->getShadowColour().g,1.0),MIN(mSceneMgr->getShadowColour().b+0.05,1.0))); OverlayElement *sInfo = OverlayManager::getSingleton().getOverlayElement("LightShadowColour"); sInfo->setCaption("Shadow Col.: " + StringConverter::toString(mSceneMgr->getShadowColour())); } if (input->isKeyDown(KC_F10)) { mSceneMgr->setShadowColour(ColourValue(MAX(mSceneMgr->getShadowColour().r-0.05,0.0),MAX(mSceneMgr->getShadowColour().g,0.0),MAX(mSceneMgr->getShadowColour().b,0.0))); OverlayElement *sInfo = OverlayManager::getSingleton().getOverlayElement("LightShadowColour"); sInfo->setCaption("Shadow Col.: " + StringConverter::toString(mSceneMgr->getShadowColour())); } if (input->isKeyDown(KC_F11)) { mSceneMgr->setShadowColour(ColourValue(MAX(mSceneMgr->getShadowColour().r,0.0),MAX(mSceneMgr->getShadowColour().g-0.05,0.0),MAX(mSceneMgr->getShadowColour().b,0.0))); OverlayElement *sInfo = OverlayManager::getSingleton().getOverlayElement("LightShadowColour"); sInfo->setCaption("Shadow Col.: " + StringConverter::toString(mSceneMgr->getShadowColour())); } if (input->isKeyDown(KC_F12)) { mSceneMgr->setShadowColour(ColourValue(MAX(mSceneMgr->getShadowColour().r,0.0),MAX(mSceneMgr->getShadowColour().g,0.0),MAX(mSceneMgr->getShadowColour().b-0.05,0.0))); OverlayElement *sInfo = OverlayManager::getSingleton().getOverlayElement("LightShadowColour"); sInfo->setCaption("Shadow Col.: " + StringConverter::toString(mSceneMgr->getShadowColour())); } if (input->isKeyDown(KC_1)) { mCurrentLight->setSpecularColour(MIN(mCurrentLight->getSpecularColour().r+0.05,1.0),MIN(mCurrentLight->getSpecularColour().g,1.0),MIN(mCurrentLight->getSpecularColour().b,1.0)); OverlayElement *sInfo = OverlayManager::getSingleton().getOverlayElement("LightSpecularColour"); sInfo->setCaption("Specular Col.: " + StringConverter::toString(mCurrentLight->getSpecularColour())); } if (input->isKeyDown(KC_2)) { mCurrentLight->setSpecularColour(MIN(mCurrentLight->getSpecularColour().r,1.0),MIN(mCurrentLight->getSpecularColour().g+0.05,1.0),MIN(mCurrentLight->getSpecularColour().b,1.0)); OverlayElement *sInfo = OverlayManager::getSingleton().getOverlayElement("LightSpecularColour"); sInfo->setCaption("Specular Col.: " + StringConverter::toString(mCurrentLight->getSpecularColour())); } if (input->isKeyDown(KC_3)) { mCurrentLight->setSpecularColour(MIN(mCurrentLight->getSpecularColour().r,1.0),MIN(mCurrentLight->getSpecularColour().g,1.0),MIN(mCurrentLight->getSpecularColour().b+0.05,1.0)); OverlayElement *sInfo = OverlayManager::getSingleton().getOverlayElement("LightSpecularColour"); sInfo->setCaption("Specular Col.: " + StringConverter::toString(mCurrentLight->getSpecularColour())); } if (input->isKeyDown(KC_4)) { mCurrentLight->setSpecularColour(MAX(mCurrentLight->getSpecularColour().r-0.05,0.0),MAX(mCurrentLight->getSpecularColour().g,0.0),MAX(mCurrentLight->getSpecularColour().b,0.0)); OverlayElement *sInfo = OverlayManager::getSingleton().getOverlayElement("LightSpecularColour"); sInfo->setCaption("Specular Col.: " + StringConverter::toString(mCurrentLight->getSpecularColour())); } if (input->isKeyDown(KC_5)) { mCurrentLight->setSpecularColour(MAX(mCurrentLight->getSpecularColour().r,0.0),MAX(mCurrentLight->getSpecularColour().g-0.05,0.0),MAX(mCurrentLight->getSpecularColour().b,0.0)); OverlayElement *sInfo = OverlayManager::getSingleton().getOverlayElement("LightSpecularColour"); sInfo->setCaption("Specular Col.: " + StringConverter::toString(mCurrentLight->getSpecularColour())); } if (input->isKeyDown(KC_6)) { mCurrentLight->setSpecularColour(MAX(mCurrentLight->getSpecularColour().r,0.0),MAX(mCurrentLight->getSpecularColour().g,0.0),MAX(mCurrentLight->getSpecularColour().b-0.05,0.0)); OverlayElement *sInfo = OverlayManager::getSingleton().getOverlayElement("LightSpecularColour"); sInfo->setCaption("Specular Col.: " + StringConverter::toString(mCurrentLight->getSpecularColour())); } if (input->isKeyDown(KC_Z)) { mSceneMgr->setAmbientLight(ColourValue(MIN(mSceneMgr->getAmbientLight().r+0.05,1.0),MIN(mSceneMgr->getAmbientLight().g,1.0),MIN(mSceneMgr->getAmbientLight().b,1.0))); mCamera->getViewport()->setBackgroundColour(mSceneMgr->getAmbientLight() * mDayLight); OverlayElement *sInfo = OverlayManager::getSingleton().getOverlayElement("AmbientLight"); sInfo->setCaption("Ambient Col.: " + StringConverter::toString(mSceneMgr->getAmbientLight())); MaterialPtr materialSky = MaterialManager::getSingleton().getByName("Examples/SpaceSkyPlaneNight"); if (!materialSky.isNull()) { if (materialSky->getTechnique(0)->getPass(0)->isProgrammable()) { GpuProgramParametersSharedPtr fragParams = materialSky->getTechnique(0)->getPass(0)->getFragmentProgramParameters(); ColourValue ambientColour = mSceneMgr->getAmbientLight(); fragParams->setNamedConstant("ambientlight",Vector4(ambientColour.val[0],ambientColour.val[1],ambientColour.val[2],ambientColour.val[3])); } } } if (input->isKeyDown(KC_X)) { mSceneMgr->setAmbientLight(ColourValue(MIN(mSceneMgr->getAmbientLight().r,1.0),MIN(mSceneMgr->getAmbientLight().g+0.05,1.0),MIN(mSceneMgr->getAmbientLight().b,1.0))); mCamera->getViewport()->setBackgroundColour(mSceneMgr->getAmbientLight() * mDayLight); OverlayElement *sInfo = OverlayManager::getSingleton().getOverlayElement("AmbientLight"); sInfo->setCaption("Ambient Col.: " + StringConverter::toString(mSceneMgr->getAmbientLight())); MaterialPtr materialSky = MaterialManager::getSingleton().getByName("Examples/SpaceSkyPlaneNight"); if (!materialSky.isNull()) { if (materialSky->getTechnique(0)->getPass(0)->isProgrammable()) { GpuProgramParametersSharedPtr fragParams = materialSky->getTechnique(0)->getPass(0)->getFragmentProgramParameters(); ColourValue ambientColour = mSceneMgr->getAmbientLight(); fragParams->setNamedConstant("ambientlight",Vector4(ambientColour.val[0],ambientColour.val[1],ambientColour.val[2],ambientColour.val[3])); } } } if (input->isKeyDown(KC_C)) { mSceneMgr->setAmbientLight(ColourValue(MIN(mSceneMgr->getAmbientLight().r,1.0),MIN(mSceneMgr->getAmbientLight().g,1.0),MIN(mSceneMgr->getAmbientLight().b+0.05,1.0))); mCamera->getViewport()->setBackgroundColour(mSceneMgr->getAmbientLight() * mDayLight); OverlayElement *sInfo = OverlayManager::getSingleton().getOverlayElement("AmbientLight"); sInfo->setCaption("Ambient Col.: " + StringConverter::toString(mSceneMgr->getAmbientLight())); MaterialPtr materialSky = MaterialManager::getSingleton().getByName("Examples/SpaceSkyPlaneNight"); if (!materialSky.isNull()) { if (materialSky->getTechnique(0)->getPass(0)->isProgrammable()) { GpuProgramParametersSharedPtr fragParams = materialSky->getTechnique(0)->getPass(0)->getFragmentProgramParameters(); ColourValue ambientColour = mSceneMgr->getAmbientLight(); fragParams->setNamedConstant("ambientlight",Vector4(ambientColour.val[0],ambientColour.val[1],ambientColour.val[2],ambientColour.val[3])); } } } if (input->isKeyDown(KC_V)) { mSceneMgr->setAmbientLight(ColourValue(MAX(mSceneMgr->getAmbientLight().r-0.05,0.0),MAX(mSceneMgr->getAmbientLight().g,0.0),MAX(mSceneMgr->getAmbientLight().b,0.0))); mCamera->getViewport()->setBackgroundColour(mSceneMgr->getAmbientLight() * mDayLight); OverlayElement *sInfo = OverlayManager::getSingleton().getOverlayElement("AmbientLight"); sInfo->setCaption("Ambient Col.: " + StringConverter::toString(mSceneMgr->getAmbientLight())); MaterialPtr materialSky = MaterialManager::getSingleton().getByName("Examples/SpaceSkyPlaneNight"); if (!materialSky.isNull()) { if (materialSky->getTechnique(0)->getPass(0)->isProgrammable()) { GpuProgramParametersSharedPtr fragParams = materialSky->getTechnique(0)->getPass(0)->getFragmentProgramParameters(); ColourValue ambientColour = mSceneMgr->getAmbientLight(); fragParams->setNamedConstant("ambientlight",Vector4(ambientColour.val[0],ambientColour.val[1],ambientColour.val[2],ambientColour.val[3])); } } } if (input->isKeyDown(KC_B)) { mSceneMgr->setAmbientLight(ColourValue(MAX(mSceneMgr->getAmbientLight().r,0.0),MAX(mSceneMgr->getAmbientLight().g-0.05,0.0),MAX(mSceneMgr->getAmbientLight().b,0.0))); mCamera->getViewport()->setBackgroundColour(mSceneMgr->getAmbientLight() * mDayLight); OverlayElement *sInfo = OverlayManager::getSingleton().getOverlayElement("AmbientLight"); sInfo->setCaption("Ambient Col.: " + StringConverter::toString(mSceneMgr->getAmbientLight())); MaterialPtr materialSky = MaterialManager::getSingleton().getByName("Examples/SpaceSkyPlaneNight"); if (!materialSky.isNull()) { if (materialSky->getTechnique(0)->getPass(0)->isProgrammable()) { GpuProgramParametersSharedPtr fragParams = materialSky->getTechnique(0)->getPass(0)->getFragmentProgramParameters(); ColourValue ambientColour = mSceneMgr->getAmbientLight(); fragParams->setNamedConstant("ambientlight",Vector4(ambientColour.val[0],ambientColour.val[1],ambientColour.val[2],ambientColour.val[3])); } } } if (input->isKeyDown(KC_N)) { mSceneMgr->setAmbientLight(ColourValue(MAX(mSceneMgr->getAmbientLight().r,0.0),MAX(mSceneMgr->getAmbientLight().g,0.0),MAX(mSceneMgr->getAmbientLight().b-0.05,0.0))); mCamera->getViewport()->setBackgroundColour(mSceneMgr->getAmbientLight() * mDayLight); OverlayElement *sInfo = OverlayManager::getSingleton().getOverlayElement("AmbientLight"); sInfo->setCaption("Ambient Col.: " + StringConverter::toString(mSceneMgr->getAmbientLight())); MaterialPtr materialSky = MaterialManager::getSingleton().getByName("Examples/SpaceSkyPlaneNight"); if (!materialSky.isNull()) { if (materialSky->getTechnique(0)->getPass(0)->isProgrammable()) { GpuProgramParametersSharedPtr fragParams = materialSky->getTechnique(0)->getPass(0)->getFragmentProgramParameters(); ColourValue ambientColour = mSceneMgr->getAmbientLight(); fragParams->setNamedConstant("ambientlight",Vector4(ambientColour.val[0],ambientColour.val[1],ambientColour.val[2],ambientColour.val[3])); } } } */ } void createShadowMapOverlay(unsigned int idShadowMap) { MaterialPtr matShadowImage = MaterialManager::getSingleton().getByName("shadoMapImage"); matShadowImage->getTechnique(0)->getPass(0)->removeAllTextureUnitStates(); matShadowImage->getTechnique(0)->getPass(0)->createTextureUnitState("Ogre/ShadowTexture" + StringConverter::toString(idShadowMap)); } void showShadowMapOverlay(bool show) { if (show) { mShadowMapOverlay->show(); mLightingInfo->show(); mShadowMapOverlayEnabled = true; } else { mShadowMapOverlay->hide(); mLightingInfo->hide(); mShadowMapOverlayEnabled = false; } } void addLight(Light *light) { mLightList.push_back(light); if (mShadowsEnabled) { mSceneMgr->setShadowTextureCount(mLightList.size()); } } void setShadowTexturePixelFormat(PixelFormat fmt) { mSceneMgr->setShadowTexturePixelFormat(fmt); } void setShadowColour(ColourValue colour) { mSceneMgr->setShadowColour(colour); } ColourValue getShadowColour() { return mSceneMgr->getShadowColour(); } void setShadowTextureSize(ushort size) { mSceneMgr->setShadowTextureSize(size); } Light* getLight(int idLight) { return mLightList[idLight]; } };