Hi...
Thanks mustill for your answer...
I really don't close Ogre because this code is only for 1 game state... so, this code segment is ejecuted after to exit of the state...
I clean up cameras, viewport and CEGUI support for the state... Ogre runs the next state (new cameras and viewports but no CEGUI).
This error is generated when i exit Ogre (method CEGUIState::exit())...
Full class code:
Code: Select all
#include <Ogre.h>
#include <OgreKeyEvent.h>
#include "CEGUIState.h"
#include "IntroState.h"
using namespace Ogre;
CEGUIState CEGUIState::mCEGUIState;
void CEGUIState::enter()
{ mInputDevice = InputManager::getSingletonPtr()->getInputDevice();
mRoot = Root::getSingletonPtr();
//inicializa Ogre
mSceneMgr = mRoot->createSceneManager(ST_GENERIC);
mCamera = mSceneMgr->createCamera("CEGUICamera");
mViewport = mRoot->getAutoCreatedWindow()->addViewport(mCamera);
mViewport->setBackgroundColour(ColourValue(1.0, 1.0, 1.0));
//skydome
mSceneMgr->setSkyDome(true, "Examples/MenuSky", 10, 8, 1500);
//sombra por defecto
mSceneMgr->setShadowTechnique(SHADOWTYPE_TEXTURE_MODULATIVE);
CEGUIState::iniciarCEGUI();
//para que el cursor sea visible
CEGUI::System::getSingleton().injectMouseMove(mInputDevice->getMouseRelativeX(), mInputDevice->getMouseRelativeY());
//**********elementos GUI de la escena************
//boton de salida. Nombre: SALIR
CEGUIState::crearBoton(&salir, CEGUI::Point(0.65, 0.75), CEGUI::Size(0.2, 0.05), "SALIR", true);
salir->setTooltipText("Salir del Juego");
//boton de opciones de juego. Nombre: OPCIONES
CEGUIState::crearBoton(&opciones, CEGUI::Point(0.65, 0.65), CEGUI::Size(0.2, 0.05), "OPCIONES", true);
opciones->setTooltipText("Opciones de Video");
//boton de cargar juego. Nombre: CARGAR JUEGO
CEGUIState::crearBoton(&cargar, CEGUI::Point(0.65, 0.55), CEGUI::Size(0.2, 0.05), "CARGAR JUEGO", true);
cargar->setTooltipText("Cargar Juego Anterior");
//boton de iniciar juego. Nombre: INICIAR JUEGO
CEGUIState::crearBoton(&jugar, CEGUI::Point(0.65, 0.45), CEGUI::Size(0.2, 0.05), "INICIAR JUEGO", true);
jugar->setTooltipText("Iniciar Nuevo Juego");
//boton de iniciar aceptar configuracion. Nombre: ACEPTAR
CEGUIState::crearBoton(&aceptar, CEGUI::Point(0.40, 0.70), CEGUI::Size(0.2, 0.05), "ACEPTAR", false);
aceptar->setTooltipText("Aceptar Configuracion");
//radioButtons
//boton de sombra texturizada. Nombre: SIN SOMBRAS
CEGUIState::crearRadioBoton(&sombra0, CEGUI::UVector2(CEGUI::UDim(0.35, 0.01), CEGUI::UDim(0.3, 0.01)), CEGUI::Size(0.25, 0.075), "SIN SOMBRAS", false, false, 1, 101);
//boton de sombra texturizada. Nombre: SOMBRAS TEXTURIZADAS
CEGUIState::crearRadioBoton(&sombra1, CEGUI::UVector2(CEGUI::UDim(0.35, 0.01), CEGUI::UDim(0.35, 0.01)), CEGUI::Size(0.25, 0.075), "SOMBRAS TEXTURIZADAS", false, true, 1, 102);
//boton de sombra real. Nombre: SOMBRAS REALES
CEGUIState::crearRadioBoton(&sombra2, CEGUI::UVector2(CEGUI::UDim(0.35, 0.01), CEGUI::UDim(0.40, 0.01)), CEGUI::Size(0.25, 0.075), "SOMBRAS REALES", false, false, 1, 103);
//textos estaticos
//texto para configuracion de sombras. Nombre: sombra.
CEGUIState::crearTexto(&texto1, CEGUI::UVector2(CEGUI::UDim(0.21, 0.01), CEGUI::UDim(0.05, 0.01)), CEGUI::UVector2(CEGUI::UDim(0.45, 0.01), CEGUI::UDim(0.5, 0.01)), "CONFIGURACION DE SOMBRAS", false, "sombra");
//control de eventos sobre la GUI
CEGUIState::setupEventos();
mExitGame = false;
}
void CEGUIState::exit()
{ mSceneMgr->clearScene();
mSceneMgr->destroyAllCameras();
mRoot->getAutoCreatedWindow()->removeAllViewports();
if(mEditorGuiSheet)
{ CEGUI::WindowManager::getSingleton().destroyWindow(mEditorGuiSheet);
}
if(mGUISystem)
{ delete mGUISystem;
mGUISystem = 0;
}
if(mGUIRenderer)
{ delete mGUIRenderer;
mGUIRenderer = 0;
}
}
void CEGUIState::pause()
{
}
void CEGUIState::resume()
{
}
void CEGUIState::keyClicked(KeyEvent* e)
{
}
void CEGUIState::keyPressed(KeyEvent* e)
{ if (e->getKey() == KC_SPACE)
{
changeState(IntroState::getInstance());
}
if (e->getKey() == KC_ESCAPE)
{
mExitGame = true;
}
e->consume();
}
void CEGUIState::keyReleased(KeyEvent* e)
{ //evento de key up
CEGUI::System::getSingleton().injectKeyUp(e->getKey());
e->consume();
}
//soporte para mouse
void CEGUIState::mouseMoved(Ogre::MouseEvent* e)
{ CEGUI::System::getSingleton().injectMouseMove(e->getRelX() * mGUIRenderer->getWidth(), e->getRelY() * mGUIRenderer->getHeight());
e->consume();
}
void CEGUIState::mouseDragged(Ogre::MouseEvent* e)
{ CEGUIState::mouseMoved(e);
}
void CEGUIState::mouseClicked(Ogre::MouseEvent* e)
{
}
void CEGUIState::mouseEntered(Ogre::MouseEvent* e)
{
}
void CEGUIState::mouseExited(Ogre::MouseEvent* e)
{
}
void CEGUIState::mousePressed(Ogre::MouseEvent* e)
{ //evento de mouse down
CEGUI::System::getSingleton().injectMouseButtonDown(CEGUIState::convertirOgreButtonACegui(e->getButtonID()));
e->consume();
}
void CEGUIState::mouseReleased(Ogre::MouseEvent* e)
{ //evento de mouse up
CEGUI::System::getSingleton().injectMouseButtonUp(CEGUIState::convertirOgreButtonACegui(e->getButtonID()));
e->consume();
}
//soporte para mouse
bool CEGUIState::frameStarted(const FrameEvent& evt)
{ return true;
}
bool CEGUIState::frameEnded(const FrameEvent& evt)
{ if (mExitGame)
return false;
return true;
}
void CEGUIState::setupEventos()
{ //manager de ventana
CEGUI::WindowManager& wmgr = CEGUI::WindowManager::getSingleton();
//evento de push button para el boton salir
wmgr.getWindow((CEGUI::utf8*)"SALIR")->subscribeEvent(CEGUI::PushButton::EventClicked, CEGUI::Event::Subscriber(&CEGUIState::eventoSalir, this));
//evento de push button para el boton opciones
wmgr.getWindow((CEGUI::utf8*)"OPCIONES")->subscribeEvent(CEGUI::PushButton::EventClicked, CEGUI::Event::Subscriber(&CEGUIState::eventoOpciones, this));
//evento de push button para el boton cargar
wmgr.getWindow((CEGUI::utf8*)"CARGAR JUEGO")->subscribeEvent(CEGUI::PushButton::EventClicked, CEGUI::Event::Subscriber(&CEGUIState::eventoCargar, this));
//evento de push button para el boton jugar
wmgr.getWindow((CEGUI::utf8*)"INICIAR JUEGO")->subscribeEvent(CEGUI::PushButton::EventClicked, CEGUI::Event::Subscriber(&CEGUIState::eventoJugar, this));
//evento de push button para el boton aceptar
wmgr.getWindow((CEGUI::utf8*)"ACEPTAR")->subscribeEvent(CEGUI::PushButton::EventClicked, CEGUI::Event::Subscriber(&CEGUIState::eventoAceptar, this));
//evento de radio button para boton sombra0
wmgr.getWindow((CEGUI::utf8*)"SIN SOMBRAS")->subscribeEvent(CEGUI::RadioButton::EventSelectStateChanged, CEGUI::Event::Subscriber(&CEGUIState::eventoSombras, this));
//evento de radio button para boton sombra0
wmgr.getWindow((CEGUI::utf8*)"SOMBRAS TEXTURIZADAS")->subscribeEvent(CEGUI::RadioButton::EventSelectStateChanged, CEGUI::Event::Subscriber(&CEGUIState::eventoSombras, this));
//evento de radio button para boton sombra0
wmgr.getWindow((CEGUI::utf8*)"SOMBRAS REALES")->subscribeEvent(CEGUI::RadioButton::EventSelectStateChanged, CEGUI::Event::Subscriber(&CEGUIState::eventoSombras, this));
}
void CEGUIState::crearTexto(CEGUI::StaticText** id, CEGUI::UVector2 P, CEGUI::UVector2 S, CEGUI::String texto, bool EN, CEGUI::String TextoID)
{ *id = (CEGUI::StaticText*)CEGUI::WindowManager::getSingleton().createWindow("TaharezLook/StaticText", TextoID);
mEditorGuiSheet->addChildWindow(*id);
(*id)->setWindowPosition(P);
(*id)->setWindowSize(S);
(*id)->setText(texto);
(*id)->setProperty("FrameEnabled", "false");
(*id)->setProperty("BackgroundEnabled", "false");
(*id)->setProperty("HorzFormatting", "WordWrapCentred");
(*id)->setVisible(EN);
}
void CEGUIState::crearRadioBoton(CEGUI::RadioButton** id, CEGUI::UVector2 P, CEGUI::Size S, CEGUI::String texto, bool EN, bool seleccion, int Grupo, int ID)
{ //creacion de objeto Radio boton
*id = (CEGUI::RadioButton*)CEGUI::WindowManager::getSingleton().createWindow("TaharezLook/RadioButton", texto);
//se agrega el boton a la ventana padre de CEGUI
mEditorGuiSheet->addChildWindow(*id);
//posicion de boton
(*id)->setWindowPosition(P);
//tamaño de boton
(*id)->setSize(S);
//texto en boton
(*id)->setText(texto);
//id de grupo
(*id)->setGroupID(Grupo);
//id de boton en el grupo
(*id)->setID(ID);
//seleccion inicial
(*id)->setSelected(seleccion);
//visibilidad
(*id)->setVisible(EN);
}
void CEGUIState::crearBoton(CEGUI::PushButton** id, CEGUI::Point P, CEGUI::Size S, CEGUI::String texto, bool EN)
{ //creacion de objeto boton
*id = (CEGUI::PushButton*)CEGUI::WindowManager::getSingleton().createWindow("TaharezLook/Button", texto);
//se agrega el boton a la ventana padre de CEGUI
mEditorGuiSheet->addChildWindow(*id);
//posicion de boton
(*id)->setPosition(P);
//tamaño de boton
(*id)->setSize(S);
//texto en boton
(*id)->setText(texto);
//visibilidad
(*id)->setVisible(EN);
}
void CEGUIState::iniciarCEGUI()
{ //iniciliza la venta de CEGUI
mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mRoot->getAutoCreatedWindow(), Ogre::RENDER_QUEUE_OVERLAY, false, 3000, mSceneMgr);
//inicializa el renderer
mGUISystem = new CEGUI::System(mGUIRenderer);
//inicializa el log de CEGUI (puede ser tambien Standard, Errors, o Insane)
CEGUI::Logger::getSingleton().setLoggingLevel(CEGUI::Informative);
//cargar el esquema, setup de mouse y fuente
CEGUI::SchemeManager::getSingleton().loadScheme( (CEGUI::utf8*)"TaharezLookSkin.scheme");
mGUISystem->setDefaultMouseCursor((CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MouseArrow");
CEGUI::MouseCursor::getSingleton().setImage("TaharezLook", "MouseMoveCursor");
mGUISystem->setDefaultFont((CEGUI::utf8*)"BlueHighway-12");
//crea un objeto ventana de CEGUI
mEditorGuiSheet= CEGUI::WindowManager::getSingleton().createWindow((CEGUI::utf8*)"DefaultWindow", (CEGUI::utf8*)"Sheet");
//adiciona la ventana al renderer de CEGUI
mGUISystem->setGUISheet(mEditorGuiSheet);
//inicializacion de tooltips
mGUISystem->setTooltip("TaharezLook/Tooltip");
}
//metodo para salir
bool CEGUIState::eventoSalir(const CEGUI::EventArgs& e)
{ mExitGame = true;
return true;
}
//metodo para opciones
bool CEGUIState::eventoOpciones(const CEGUI::EventArgs& e)
{ jugar->setVisible(false);
cargar->setVisible(false);
opciones->setVisible(false);
salir->setVisible(false);
aceptar->setVisible(true);
sombra0->setVisible(true);
sombra1->setVisible(true);
sombra2->setVisible(true);
texto1->setVisible(true);
return true;
}
//metodo para cargar
bool CEGUIState::eventoCargar(const CEGUI::EventArgs& e)
{ return true;
}
//metodo para jugar
bool CEGUIState::eventoJugar(const CEGUI::EventArgs& e)
{ return true;
}
//metodo para aceptar
bool CEGUIState::eventoAceptar(const CEGUI::EventArgs& e)
{ jugar->setVisible(true);
cargar->setVisible(true);
opciones->setVisible(true);
salir->setVisible(true);
aceptar->setVisible(false);
sombra0->setVisible(false);
sombra1->setVisible(false);
sombra2->setVisible(false);
texto1->setVisible(false);
return true;
}
//metodo para seleccion de sombras
bool CEGUIState::eventoSombras(const CEGUI::EventArgs& e)
{ //obtencion del ID del boton seleccionado
CEGUI::uint id = static_cast<CEGUI::RadioButton*>(static_cast<const CEGUI::WindowEventArgs&>(e).window)->getSelectedButtonInGroup()->getID();
switch(id)
{ case 101: //sin sombra
mSceneMgr->setShadowTechnique(SHADOWTYPE_NONE);
break;
case 102: //sombra texturizada
mSceneMgr->setShadowTechnique(SHADOWTYPE_TEXTURE_MODULATIVE);
break;
case 103: //sombra real aditiva
mSceneMgr->setShadowTechnique(SHADOWTYPE_STENCIL_ADDITIVE);
break;
}
return true;
}
Thanks to everyone...