| [6636] | 1 | /*********************************************************************** | 
|---|
 | 2 |     filename:   CEGuiSample.cpp | 
|---|
 | 3 |     created:    24/9/2004 | 
|---|
 | 4 |     author:     Paul D Turner | 
|---|
 | 5 | *************************************************************************/ | 
|---|
 | 6 | /*************************************************************************** | 
|---|
 | 7 |  *   Copyright (C) 2004 - 2008 Paul D Turner & The CEGUI Development Team | 
|---|
 | 8 |  * | 
|---|
 | 9 |  *   Permission is hereby granted, free of charge, to any person obtaining | 
|---|
 | 10 |  *   a copy of this software and associated documentation files (the | 
|---|
 | 11 |  *   "Software"), to deal in the Software without restriction, including | 
|---|
 | 12 |  *   without limitation the rights to use, copy, modify, merge, publish, | 
|---|
 | 13 |  *   distribute, sublicense, and/or sell copies of the Software, and to | 
|---|
 | 14 |  *   permit persons to whom the Software is furnished to do so, subject to | 
|---|
 | 15 |  *   the following conditions: | 
|---|
 | 16 |  * | 
|---|
 | 17 |  *   The above copyright notice and this permission notice shall be | 
|---|
 | 18 |  *   included in all copies or substantial portions of the Software. | 
|---|
 | 19 |  * | 
|---|
 | 20 |  *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | 
|---|
 | 21 |  *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | 
|---|
 | 22 |  *   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | 
|---|
 | 23 |  *   IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR | 
|---|
 | 24 |  *   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | 
|---|
 | 25 |  *   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | 
|---|
 | 26 |  *   OTHER DEALINGS IN THE SOFTWARE. | 
|---|
 | 27 |  ***************************************************************************/ | 
|---|
 | 28 | #include "CEGuiSample.h" | 
|---|
 | 29 |  | 
|---|
 | 30 | #ifdef HAVE_CONFIG_H | 
|---|
 | 31 | #   include "config.h" | 
|---|
 | 32 | #endif | 
|---|
 | 33 | #include "CEGUISamplesConfig.h" | 
|---|
 | 34 |  | 
|---|
 | 35 | // includes for renderer selector classes | 
|---|
 | 36 | #if defined( __WIN32__ ) || defined( _WIN32 ) | 
|---|
 | 37 | #   include "Win32CEGuiRendererSelector.h" | 
|---|
 | 38 | #elif defined(__linux__) | 
|---|
 | 39 | #   ifdef CEGUI_SAMPLES_USE_GTK2 | 
|---|
 | 40 | #       include "GTK2CEGuiRendererSelector.h" | 
|---|
 | 41 | #   else | 
|---|
 | 42 | #       include "CLICEGuiRendererSelector.h" | 
|---|
 | 43 | #   endif | 
|---|
 | 44 | #elif defined(__APPLE__) | 
|---|
 | 45 | #   include "MacCEGuiRendererSelector.h" | 
|---|
 | 46 | #endif | 
|---|
 | 47 |  | 
|---|
 | 48 | // includes for application types | 
|---|
 | 49 | #ifdef CEGUI_SAMPLES_USE_OGRE | 
|---|
 | 50 | #   include "CEGuiOgreBaseApplication.h" | 
|---|
 | 51 | #endif | 
|---|
 | 52 | #ifdef CEGUI_SAMPLES_USE_OPENGL | 
|---|
 | 53 | #   include "CEGuiOpenGLBaseApplication.h" | 
|---|
 | 54 | #endif | 
|---|
 | 55 | #ifdef CEGUI_SAMPLES_USE_IRRLICHT | 
|---|
 | 56 | #   include "CEGuiIrrlichtBaseApplication.h" | 
|---|
 | 57 | #endif | 
|---|
 | 58 | #ifdef CEGUI_SAMPLES_USE_DIRECTFB | 
|---|
 | 59 | #   include "CEGuiDirectFBBaseApplication.h" | 
|---|
 | 60 | #endif | 
|---|
 | 61 | #if defined( __WIN32__ ) || defined( _WIN32 ) | 
|---|
 | 62 | #   ifdef CEGUI_SAMPLES_USE_DIRECTX_8 | 
|---|
 | 63 | #       include "CEGuiD3D81BaseApplication.h" | 
|---|
 | 64 | #   endif | 
|---|
 | 65 | #   ifdef CEGUI_SAMPLES_USE_DIRECTX_9 | 
|---|
 | 66 | #       include "CEGuiD3D9BaseApplication.h" | 
|---|
 | 67 | #   endif | 
|---|
 | 68 | #   ifdef CEGUI_SAMPLES_USE_DIRECTX_10 | 
|---|
 | 69 | #       include "CEGuiD3D10BaseApplication.h" | 
|---|
 | 70 | #   endif | 
|---|
 | 71 | #endif | 
|---|
 | 72 | // now we include the base CEGuiBaseApplication just in case someone has managed to | 
|---|
 | 73 | // get this far without any of the renderers.  This ensures the framework will build, | 
|---|
 | 74 | // although there will be no renderers available for selection in the samples. | 
|---|
 | 75 | #include "CEGuiBaseApplication.h" | 
|---|
 | 76 |  | 
|---|
 | 77 | #include "CEGUI.h" | 
|---|
 | 78 |  | 
|---|
 | 79 | #ifdef CEGUI_WITH_XERCES | 
|---|
 | 80 | #   include "CEGUIXercesParser.h" | 
|---|
 | 81 | #endif | 
|---|
 | 82 |  | 
|---|
 | 83 | // Include iostream if not on windows. | 
|---|
 | 84 | #if defined( __WIN32__ ) || defined( _WIN32 ) | 
|---|
 | 85 | #else | 
|---|
 | 86 | #    include <iostream> | 
|---|
 | 87 | #endif | 
|---|
 | 88 |  | 
|---|
 | 89 |  | 
|---|
 | 90 | /************************************************************************* | 
|---|
 | 91 |     Constructor | 
|---|
 | 92 | *************************************************************************/ | 
|---|
 | 93 | CEGuiSample::CEGuiSample() : | 
|---|
 | 94 |         d_rendererSelector(0), | 
|---|
 | 95 |         d_sampleApp(0) | 
|---|
 | 96 | {} | 
|---|
 | 97 |  | 
|---|
 | 98 |  | 
|---|
 | 99 | /************************************************************************* | 
|---|
 | 100 |     Destructor | 
|---|
 | 101 | *************************************************************************/ | 
|---|
 | 102 | CEGuiSample::~CEGuiSample() | 
|---|
 | 103 | { | 
|---|
 | 104 |     if (d_sampleApp) | 
|---|
 | 105 |     { | 
|---|
 | 106 |         d_sampleApp->cleanup(); | 
|---|
 | 107 |         delete d_sampleApp; | 
|---|
 | 108 |     } | 
|---|
 | 109 |  | 
|---|
 | 110 |     if (d_rendererSelector) | 
|---|
 | 111 |     { | 
|---|
 | 112 |         delete d_rendererSelector; | 
|---|
 | 113 |     } | 
|---|
 | 114 |  | 
|---|
 | 115 | } | 
|---|
 | 116 |  | 
|---|
 | 117 |  | 
|---|
 | 118 | /************************************************************************* | 
|---|
 | 119 |     Application entry point | 
|---|
 | 120 | *************************************************************************/ | 
|---|
 | 121 | int CEGuiSample::run() | 
|---|
 | 122 | { | 
|---|
 | 123 |     try | 
|---|
 | 124 |     { | 
|---|
 | 125 |         if (initialise()) | 
|---|
 | 126 |             cleanup(); | 
|---|
 | 127 |     } | 
|---|
 | 128 |     catch (CEGUI::Exception& exc) | 
|---|
 | 129 |     { | 
|---|
 | 130 |         outputExceptionMessage(exc.getMessage().c_str()); | 
|---|
 | 131 |     } | 
|---|
 | 132 |     catch (std::exception& exc) | 
|---|
 | 133 |     { | 
|---|
 | 134 |         outputExceptionMessage(exc.what()); | 
|---|
 | 135 |     } | 
|---|
 | 136 |     catch(...) | 
|---|
 | 137 |     { | 
|---|
 | 138 |         outputExceptionMessage("Unknown exception was caught!"); | 
|---|
 | 139 |     } | 
|---|
 | 140 |  | 
|---|
 | 141 |     return 0; | 
|---|
 | 142 | } | 
|---|
 | 143 |  | 
|---|
 | 144 |  | 
|---|
 | 145 | /************************************************************************* | 
|---|
 | 146 |     Initialise the sample application | 
|---|
 | 147 | *************************************************************************/ | 
|---|
 | 148 | bool CEGuiSample::initialise() | 
|---|
 | 149 | { | 
|---|
 | 150 |     // Setup renderer selection dialog for Win32 | 
|---|
 | 151 | #if defined( __WIN32__ ) || defined( _WIN32 ) | 
|---|
 | 152 |     d_rendererSelector = new Win32CEGuiRendererSelector; | 
|---|
 | 153 |  | 
|---|
 | 154 |     // enable renderer types supported for Win32 | 
|---|
 | 155 | #ifdef CEGUI_SAMPLES_USE_DIRECTX_8 | 
|---|
 | 156 |     d_rendererSelector->setRendererAvailability(Direct3D81GuiRendererType); | 
|---|
 | 157 | #endif | 
|---|
 | 158 | #ifdef CEGUI_SAMPLES_USE_DIRECTX_9 | 
|---|
 | 159 |     d_rendererSelector->setRendererAvailability(Direct3D9GuiRendererType); | 
|---|
 | 160 | #endif | 
|---|
 | 161 | #ifdef CEGUI_SAMPLES_USE_DIRECTX_10 | 
|---|
 | 162 |     d_rendererSelector->setRendererAvailability(Direct3D10GuiRendererType); | 
|---|
 | 163 | #endif | 
|---|
 | 164 |  | 
|---|
 | 165 | #elif defined(__linux__) | 
|---|
 | 166 |     // decide which method to use for renderer selection | 
|---|
 | 167 | #   ifdef CEGUI_SAMPLES_USE_GTK2 | 
|---|
 | 168 |         d_rendererSelector = new GTK2CEGuiRendererSelector(); | 
|---|
 | 169 | #   else | 
|---|
 | 170 |         d_rendererSelector = new CLICEGuiRendererSelector(); | 
|---|
 | 171 | #   endif | 
|---|
 | 172 |  | 
|---|
 | 173 | #elif defined(__APPLE__) | 
|---|
 | 174 |      d_rendererSelector = new MacCEGuiRendererSelector(); | 
|---|
 | 175 | #endif | 
|---|
 | 176 |  | 
|---|
 | 177 |     // enable available renderer types | 
|---|
 | 178 | #ifdef CEGUI_SAMPLES_USE_OGRE | 
|---|
 | 179 |     d_rendererSelector->setRendererAvailability(OgreGuiRendererType); | 
|---|
 | 180 | #endif | 
|---|
 | 181 | #ifdef CEGUI_SAMPLES_USE_OPENGL | 
|---|
 | 182 |     d_rendererSelector->setRendererAvailability(OpenGLGuiRendererType); | 
|---|
 | 183 | #endif | 
|---|
 | 184 | #ifdef CEGUI_SAMPLES_USE_IRRLICHT | 
|---|
 | 185 |     d_rendererSelector->setRendererAvailability(IrrlichtGuiRendererType); | 
|---|
 | 186 | #endif | 
|---|
 | 187 | #ifdef CEGUI_SAMPLES_USE_DIRECTFB | 
|---|
 | 188 |     d_rendererSelector->setRendererAvailability(DirectFBGuiRendererType); | 
|---|
 | 189 | #endif | 
|---|
 | 190 |  | 
|---|
 | 191 |     // get selection from user | 
|---|
 | 192 |     if (d_rendererSelector->invokeDialog()) | 
|---|
 | 193 |     { | 
|---|
 | 194 |         // create appropriate application type based upon users selection | 
|---|
 | 195 |         switch(d_rendererSelector->getSelectedRendererType()) | 
|---|
 | 196 |         { | 
|---|
 | 197 | #ifdef CEGUI_SAMPLES_USE_OGRE | 
|---|
 | 198 |         case OgreGuiRendererType: | 
|---|
 | 199 |             d_sampleApp = new CEGuiOgreBaseApplication(); | 
|---|
 | 200 |             break; | 
|---|
 | 201 | #endif | 
|---|
 | 202 | #if defined( __WIN32__ ) || defined( _WIN32 ) | 
|---|
 | 203 | #ifdef CEGUI_SAMPLES_USE_DIRECTX_8 | 
|---|
 | 204 |         case Direct3D81GuiRendererType: | 
|---|
 | 205 |             d_sampleApp = new CEGuiD3D81BaseApplication(); | 
|---|
 | 206 |             break; | 
|---|
 | 207 | #endif | 
|---|
 | 208 | #ifdef CEGUI_SAMPLES_USE_DIRECTX_9 | 
|---|
 | 209 |         case Direct3D9GuiRendererType: | 
|---|
 | 210 |             d_sampleApp = new CEGuiD3D9BaseApplication(); | 
|---|
 | 211 |             break; | 
|---|
 | 212 | #endif // DX9 | 
|---|
 | 213 | #ifdef CEGUI_SAMPLES_USE_DIRECTX_10 | 
|---|
 | 214 |         case Direct3D10GuiRendererType: | 
|---|
 | 215 |             d_sampleApp = new CEGuiD3D10BaseApplication(); | 
|---|
 | 216 |             break; | 
|---|
 | 217 | #endif // DX10 | 
|---|
 | 218 | #endif // Win32 | 
|---|
 | 219 | #ifdef CEGUI_SAMPLES_USE_OPENGL | 
|---|
 | 220 |         case OpenGLGuiRendererType: | 
|---|
 | 221 |             d_sampleApp = new CEGuiOpenGLBaseApplication(); | 
|---|
 | 222 |             break; | 
|---|
 | 223 | #endif | 
|---|
 | 224 | #ifdef CEGUI_SAMPLES_USE_IRRLICHT | 
|---|
 | 225 |         case IrrlichtGuiRendererType: | 
|---|
 | 226 |             d_sampleApp = new CEGuiIrrlichtBaseApplication(); | 
|---|
 | 227 |             break; | 
|---|
 | 228 | #endif | 
|---|
 | 229 | #ifdef CEGUI_SAMPLES_USE_DIRECTFB | 
|---|
 | 230 |         case DirectFBGuiRendererType: | 
|---|
 | 231 |             d_sampleApp = new CEGuiDirectFBBaseApplication(); | 
|---|
 | 232 |             break; | 
|---|
 | 233 | #endif | 
|---|
 | 234 |  | 
|---|
 | 235 |         default: | 
|---|
 | 236 |             throw CEGUI::GenericException("No renderer was selected!"); | 
|---|
 | 237 |             break; | 
|---|
 | 238 |         } | 
|---|
 | 239 |  | 
|---|
 | 240 |         // set the default resource groups to be used | 
|---|
 | 241 |         CEGUI::Imageset::setDefaultResourceGroup("imagesets"); | 
|---|
 | 242 |         CEGUI::Font::setDefaultResourceGroup("fonts"); | 
|---|
 | 243 |         CEGUI::Scheme::setDefaultResourceGroup("schemes"); | 
|---|
 | 244 |         CEGUI::WidgetLookManager::setDefaultResourceGroup("looknfeels"); | 
|---|
 | 245 |         CEGUI::WindowManager::setDefaultResourceGroup("layouts"); | 
|---|
 | 246 |         CEGUI::ScriptModule::setDefaultResourceGroup("lua_scripts"); | 
|---|
 | 247 | #ifdef CEGUI_WITH_XERCES | 
|---|
 | 248 |         CEGUI::XercesParser::setSchemaDefaultResourceGroup("schemas"); | 
|---|
 | 249 | #endif | 
|---|
 | 250 |  | 
|---|
 | 251 |         // execute the base application (which sets up the demo via 'this' and runs it. | 
|---|
 | 252 |         if (d_sampleApp->execute(this)) | 
|---|
 | 253 |         { | 
|---|
 | 254 |             // signal that app initialised and ran | 
|---|
 | 255 |             return true; | 
|---|
 | 256 |         } | 
|---|
 | 257 |  | 
|---|
 | 258 |         // sample app did not initialise, delete the object. | 
|---|
 | 259 |         delete d_sampleApp; | 
|---|
 | 260 |         d_sampleApp = 0; | 
|---|
 | 261 |     } | 
|---|
 | 262 |  | 
|---|
 | 263 |     // delete renderer selector object | 
|---|
 | 264 |     delete d_rendererSelector; | 
|---|
 | 265 |     d_rendererSelector = 0; | 
|---|
 | 266 |  | 
|---|
 | 267 |     // signal app did not initialise and run. | 
|---|
 | 268 |     return false; | 
|---|
 | 269 | } | 
|---|
 | 270 |  | 
|---|
 | 271 |  | 
|---|
 | 272 | /************************************************************************* | 
|---|
 | 273 |     Cleanup the sample application. | 
|---|
 | 274 | *************************************************************************/ | 
|---|
 | 275 | void CEGuiSample::cleanup() | 
|---|
 | 276 | { | 
|---|
 | 277 |     if (d_sampleApp) | 
|---|
 | 278 |     { | 
|---|
 | 279 |         d_sampleApp->cleanup(); | 
|---|
 | 280 |         delete d_sampleApp; | 
|---|
 | 281 |         d_sampleApp = 0; | 
|---|
 | 282 |     } | 
|---|
 | 283 |  | 
|---|
 | 284 |     if (d_rendererSelector) | 
|---|
 | 285 |     { | 
|---|
 | 286 |         delete d_rendererSelector; | 
|---|
 | 287 |         d_rendererSelector = 0; | 
|---|
 | 288 |     } | 
|---|
 | 289 |  | 
|---|
 | 290 | } | 
|---|
 | 291 |  | 
|---|
 | 292 |  | 
|---|
 | 293 | /************************************************************************* | 
|---|
 | 294 |     Output a message to the user in some OS independant way. | 
|---|
 | 295 | *************************************************************************/ | 
|---|
 | 296 | void CEGuiSample::outputExceptionMessage(const char* message) const | 
|---|
 | 297 | { | 
|---|
 | 298 | #if defined(__WIN32__) || defined(_WIN32) | 
|---|
 | 299 |     MessageBoxA(0, message, "CEGUI - Exception", MB_OK|MB_ICONERROR); | 
|---|
 | 300 | #else | 
|---|
 | 301 |     std::cout << "An exception was thrown within the sample framework:" << std::endl; | 
|---|
 | 302 |     std::cout << message << std::endl; | 
|---|
 | 303 | #endif | 
|---|
 | 304 | } | 
|---|