SHOW:
|
|
- or go back to the newest paste.
1 | #include <OgreRoot.h> | |
2 | #include <OgreCamera.h> | |
3 | #include <OgreViewport.h> | |
4 | #include <OgreSceneManager.h> | |
5 | #include <OgreRenderWindow.h> | |
6 | #include <OgreEntity.h> | |
7 | #include <OgreWindowEventUtilities.h> | |
8 | #include <OgreMeshManager.h> | |
9 | #include <OgreMesh.h> | |
10 | #include <OgreSubMesh.h> | |
11 | #include <OgreTechnique.h> | |
12 | #include <OgreMaterialManager.h> | |
13 | #include <OgreMaterial.h> | |
14 | #include <OgreQuaternion.h> | |
15 | #include <OgreManualObject.h> | |
16 | #include <OgreFrameListener.h> | |
17 | #include <OIS/OIS.h> | |
18 | ||
19 | ||
20 | ||
21 | #ifdef OGRE20 | |
22 | ||
23 | #include <Compositor/OgreTextureDefinition.h> | |
24 | #include <Compositor/OgreCompositorManager2.h> | |
25 | #include <Compositor/OgreCompositorCommon.h> | |
26 | #include <Compositor/OgreCompositorWorkspaceDef.h> | |
27 | #include <Compositor/OgreCompositorWorkspace.h> | |
28 | #include <Compositor/OgreCompositorNodeDef.h> | |
29 | #include <Compositor/Pass/PassClear/OgreCompositorPassClear.h> | |
30 | #include <Compositor/Pass/PassScene/OgreCompositorPassScene.h> | |
31 | ||
32 | #endif //ogre 20 | |
33 | ||
34 | ||
35 | #include <cegui\CEGUI.h> | |
36 | #include <cegui\RendererModules/Ogre\Renderer.h> | |
37 | #include <cegui\RendererModules/Ogre\WindowTarget.h> | |
38 | #include <CEGUI\RendererModules\Ogre\ResourceProvider.h> | |
39 | #include <CEGUI\RendererModules\Ogre\ImageCodec.h> | |
40 | ||
41 | #include <sstream> | |
42 | ||
43 | #include <string> | |
44 | #include <fstream> | |
45 | ||
46 | struct CEGUIOgreInterface : public Ogre::FrameListener, public OIS::KeyListener, public OIS::MouseListener | |
47 | { | |
48 | public: | |
49 | CEGUIOgreInterface(Ogre::RenderWindow *window) | |
50 | { | |
51 | this->window = window; | |
52 | ceguiOgreRenderer = &CEGUI::OgreRenderer::create(*window); | |
53 | //ceguiOgreRenderer->setDefaultRootRenderTarget(*window); | |
54 | if(!CEGUI::System::getSingletonPtr()) | |
55 | { | |
56 | CEGUI::System *system = &CEGUI::System::create(*ceguiOgreRenderer, new CEGUI::OgreResourceProvider(), 0, new CEGUI::OgreImageCodec()); | |
57 | Ogre::ResourceGroupManager::getSingleton().createResourceGroup("Imagesets"); | |
58 | Ogre::ResourceGroupManager::getSingleton().addResourceLocation("../data/CeguiData/imagesets", "FileSystem", "Imagesets"); | |
59 | Ogre::ResourceGroupManager::getSingleton().createResourceGroup("Fonts"); | |
60 | Ogre::ResourceGroupManager::getSingleton().addResourceLocation("../data/CeguiData/fonts", "FileSystem", "Fonts"); | |
61 | Ogre::ResourceGroupManager::getSingleton().createResourceGroup("Schemes"); | |
62 | Ogre::ResourceGroupManager::getSingleton().addResourceLocation("../data/CeguiData/schemes", "FileSystem", "Schemes"); | |
63 | Ogre::ResourceGroupManager::getSingleton().createResourceGroup("LookNFeel"); | |
64 | Ogre::ResourceGroupManager::getSingleton().addResourceLocation("../data/CeguiData/looknfeel", "FileSystem", "LookNFeel"); | |
65 | Ogre::ResourceGroupManager::getSingleton().createResourceGroup("Layouts"); | |
66 | Ogre::ResourceGroupManager::getSingleton().addResourceLocation("../data/CeguiData/layouts", "FileSystem", "Layouts"); | |
67 | Ogre::ResourceGroupManager::getSingleton().addResourceLocation("../data", "FileSystem", "Layouts"); | |
68 | ||
69 | CEGUI::ImageManager::setImagesetDefaultResourceGroup("Imagesets"); | |
70 | CEGUI::Font::setDefaultResourceGroup("Fonts"); | |
71 | CEGUI::Scheme::setDefaultResourceGroup("Schemes"); | |
72 | CEGUI::WidgetLookManager::setDefaultResourceGroup("LookNFeel"); | |
73 | CEGUI::WindowManager::setDefaultResourceGroup("Layouts"); | |
74 | ||
75 | CEGUI::SchemeManager::getSingleton().createFromFile("AlfiskoSkin.scheme"); | |
76 | CEGUI::SchemeManager::getSingleton().createFromFile("TaharezLook.scheme"); | |
77 | CEGUI::SchemeManager::getSingleton().createFromFile("OgreTray.scheme"); | |
78 | CEGUI::SchemeManager::getSingleton().createFromFile("VanillaSkin.scheme"); | |
79 | CEGUI::SchemeManager::getSingleton().createFromFile("Generic.scheme"); | |
80 | } | |
81 | /*for( | |
82 | CEGUI::ImageManager::ImageIterator it = CEGUI::ImageManager::getSingleton().getIterator(); | |
83 | !it.isAtEnd(); | |
84 | it++) | |
85 | { | |
86 | printf("Img: %s\n", it.getCurrentValue().first->getName().c_str()); | |
87 | }*/ | |
88 | ||
89 | renderTarget = new CEGUI::OgreWindowTarget(*ceguiOgreRenderer, *Ogre::Root::getSingleton().getRenderSystem(), *window); | |
90 | guiContext = &CEGUI::System::getSingleton().createGUIContext(*renderTarget); | |
91 | //guiContext->getCursor().setDefaultImage("OgreTrayImages/MouseArrow"); | |
92 | Ogre::Root::getSingleton().addFrameListener(this); | |
93 | ||
94 | ceguiOgreRenderer->setRenderingEnabled(false); | |
95 | InitInput(); | |
96 | } | |
97 | ||
98 | ||
99 | bool frameStarted(const Ogre::FrameEvent& evt) | |
100 | { | |
101 | return true; | |
102 | } | |
103 | bool frameEnded(const Ogre::FrameEvent& evt) | |
104 | { | |
105 | return true; | |
106 | } | |
107 | ||
108 | virtual bool keyPressed(const OIS::KeyEvent& keyEvent) | |
109 | { | |
110 | inputReceiver->injectKeyDown((CEGUI::Key::Scan)keyEvent.key); | |
111 | inputReceiver->injectChar((CEGUI::Key::Scan)keyEvent.text); | |
112 | return true; | |
113 | } | |
114 | ||
115 | virtual bool keyReleased(const OIS::KeyEvent& keyEvent) | |
116 | { | |
117 | inputReceiver->injectKeyUp((CEGUI::Key::Scan)keyEvent.key); | |
118 | return true; | |
119 | } | |
120 | ||
121 | virtual bool mousePressed(const OIS::MouseEvent& mouseEvent, OIS::MouseButtonID buttonId) | |
122 | { | |
123 | inputReceiver->injectMouseButtonDown((CEGUI::MouseButton)buttonId); | |
124 | return true; | |
125 | } | |
126 | ||
127 | virtual bool mouseReleased (const OIS::MouseEvent& mouseEvent, OIS::MouseButtonID buttonId) | |
128 | { | |
129 | inputReceiver->injectMouseButtonUp((CEGUI::MouseButton)buttonId); | |
130 | return true; | |
131 | } | |
132 | ||
133 | virtual bool mouseMoved(const OIS::MouseEvent& mouseEvent) | |
134 | { | |
135 | //we're not injecting mouse movement because it's broken with non-exclusive mouse | |
136 | //inputReceiver->injectMouseMove(mouseEvent.state.X.rel, mouseEvent.state.Y.rel); | |
137 | // Scroll wheel. | |
138 | if (mouseEvent.state.Z.rel) | |
139 | inputReceiver->injectMouseWheelChange(mouseEvent.state.Z.rel / 120.0f); | |
140 | return true; | |
141 | } | |
142 | ||
143 | ||
144 | ||
145 | bool frameRenderingQueued(const Ogre::FrameEvent& args) | |
146 | { | |
147 | if(window->isClosed()) | |
148 | return true; | |
149 | ||
150 | const OIS::MouseState state = mouseInput->getMouseState(); | |
151 | inputReceiver->injectMousePosition(state.X.abs,state.Y.abs); | |
152 | ||
153 | ceguiOgreRenderer->updateWorkspaceRenderTarget(*window); | |
154 | ||
155 | ||
156 | CEGUI::System& guiSystem(CEGUI::System::getSingleton()); | |
157 | ||
158 | float dt = 1e-2f; | |
159 | keyboardInput->capture(); | |
160 | mouseInput->capture(); | |
161 | ||
162 | unsigned int w, h, d; | |
163 | int left, top; | |
164 | window->getMetrics(w, h, d, left, top); | |
165 | const OIS::MouseState &ms = mouseInput->getMouseState(); | |
166 | ms.width = w; | |
167 | ms.height = h; | |
168 | ||
169 | ceguiOgreRenderer->initialiseRenderStateSettings(); //this line actually | |
170 | ||
171 | ceguiOgreRenderer->beginRendering(); | |
172 | CEGUI::System::getSingleton().injectTimePulse(1e-2f); | |
173 | guiContext->draw(); | |
174 | ceguiOgreRenderer->endRendering(); | |
175 | ||
176 | CEGUI::WindowManager::getSingleton().cleanDeadPool(); | |
177 | ||
178 | return true; | |
179 | } | |
180 | CEGUI::GUIContext *GetCeguiContext() | |
181 | { | |
182 | return guiContext; | |
183 | } | |
184 | private: | |
185 | void InitInput() | |
186 | { | |
187 | OIS::ParamList parameterList; | |
188 | size_t windowHnd = 0; | |
189 | std::ostringstream windowHndStr; | |
190 | ||
191 | window->getCustomAttribute("WINDOW", &windowHnd); | |
192 | windowHndStr << windowHnd; | |
193 | parameterList.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str())); | |
194 | parameterList.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_FOREGROUND" ))); | |
195 | parameterList.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_NONEXCLUSIVE"))); | |
196 | parameterList.insert(std::make_pair(std::string("w32_keyboard"), std::string("DISCL_FOREGROUND"))); | |
197 | parameterList.insert(std::make_pair(std::string("w32_keyboard"), std::string("DISCL_NONEXCLUSIVE"))); | |
198 | ||
199 | inputManager = OIS::InputManager::createInputSystem(parameterList); | |
200 | ||
201 | keyboardInput = static_cast<OIS::Keyboard*>(inputManager->createInputObject( OIS::OISKeyboard, true )); | |
202 | mouseInput = static_cast<OIS::Mouse*>(inputManager->createInputObject( OIS::OISMouse, true )); | |
203 | ||
204 | keyboardInput->setEventCallback(this); | |
205 | mouseInput->setEventCallback(this); | |
206 | ||
207 | #ifdef OGRE20 | |
208 | inputReceiver = new CEGUI::InputAggregator(guiContext); | |
209 | #else | |
210 | inputReceiver = guiContext; | |
211 | #endif | |
212 | ||
213 | //Register as a Window listener | |
214 | //Ogre::WindowEventUtilities::addWindowEventListener(window, this); | |
215 | ||
216 | Ogre::Root::getSingleton().addFrameListener(this); | |
217 | } | |
218 | CEGUI::OgreRenderer *ceguiOgreRenderer; | |
219 | CEGUI::RenderTarget *renderTarget; | |
220 | CEGUI::GUIContext *guiContext; | |
221 | Ogre::RenderWindow *window; | |
222 | OIS::InputManager *inputManager; | |
223 | OIS::Keyboard *keyboardInput; | |
224 | OIS::Mouse *mouseInput; | |
225 | #ifdef OGRE20 | |
226 | CEGUI::InputAggregator *inputReceiver; | |
227 | #else | |
228 | CEGUI::GUIContext *inputReceiver; | |
229 | #endif | |
230 | ||
231 | }; | |
232 | ||
233 | int main( int argc, char **argv ) | |
234 | { | |
235 | Ogre::String configSuffix = ""; | |
236 | #ifdef _DEBUG | |
237 | configSuffix = "_d"; | |
238 | #endif | |
239 | ||
240 | Ogre::String pluginsFileName = "OgrePlugins" + configSuffix + ".cfg"; | |
241 | Ogre::String configFileName = "OgreConfig" + configSuffix + ".cfg"; | |
242 | Ogre::String logFileName = "OgreLog" + configSuffix + ".log"; | |
243 | Ogre::Root *root = new Ogre::Root(pluginsFileName, configFileName, logFileName); | |
244 | ||
245 | //Ogre::RenderSystem *renderSystem = root->getRenderSystemByName("Direct3D11 Rendering Subsystem"); | |
246 | //Ogre::RenderSystem *renderSystem = root->getRenderSystemByName("Direct3D9 Rendering Subsystem"); | |
247 | Ogre::RenderSystem *renderSystem = root->getRenderSystemByName("OpenGL Rendering Subsystem"); | |
248 | root->setRenderSystem(renderSystem); | |
249 | renderSystem->setConfigOption("Full Screen", "No"); | |
250 | renderSystem->setConfigOption("Video Mode", "800 x 600 @ 32-bit colour"); | |
251 | ||
252 | root->initialise(false); | |
253 | ||
254 | ||
255 | ||
256 | //Ogre::RenderWindow *window = root->getAutoCreatedWindow(); | |
257 | Ogre::RenderWindow *window = root->createRenderWindow("Awesome window", 800, 600, false); | |
258 | Ogre::RenderWindow *window2 = root->createRenderWindow("Awesome window 2!", 800, 600, false); | |
259 | ||
260 | #ifdef OGRE20 | |
261 | Ogre::SceneManager* sceneManager = root->createSceneManager(Ogre::ST_EXTERIOR_CLOSE, /*"DefaultSceneManager", */8, Ogre::INSTANCING_CULLING_THREADED); | |
262 | Ogre::SceneManager* sceneManager2 = root->createSceneManager(Ogre::ST_EXTERIOR_CLOSE, /*"DefaultSceneManager", */8, Ogre::INSTANCING_CULLING_THREADED); | |
263 | #else //OGRE20 | |
264 | Ogre::SceneManager* sceneManager = root->createSceneManager(Ogre::ST_EXTERIOR_CLOSE, "SceneManager1"); | |
265 | Ogre::SceneManager* sceneManager2 = root->createSceneManager(Ogre::ST_EXTERIOR_CLOSE, "SceneManager2"); | |
266 | #endif //OGRE20 | |
267 | ||
268 | /* | |
269 | HWND hWnd = 0; // Get the hWnd of the application! | |
270 | NameValuePairList misc; | |
271 | misc["externalWindowHandle"] = StringConverter::toString((int)hWnd); | |
272 | Ogre::RenderWindow *window = root->createRenderWindow("Main RenderWindow", 800, 600, false, &misc);*/ | |
273 | ||
274 | Ogre::ResourceGroupManager::getSingleton().createResourceGroup("Manual meshes"); | |
275 | Ogre::ResourceGroupManager::getSingleton().addResourceLocation("data", "FileSystem"); | |
276 | Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); | |
277 | ||
278 | Ogre::Camera *camera = sceneManager->createCamera("Cool camera"); | |
279 | Ogre::Camera *camera2 = sceneManager->createCamera("Cool camera2"); | |
280 | ||
281 | camera->setPosition(Ogre::Vector3(0.0f, 1500.0f, 1500.0f)); | |
282 | camera->lookAt(Ogre::Vector3(0.0f, 0.0f, 0.0f)); | |
283 | camera->setNearClipDistance(5.0f); | |
284 | camera->setFarClipDistance(10000.0f); | |
285 | Ogre::Radian fov = camera->getFOVy(); | |
286 | ||
287 | #ifdef OGRE20 | |
288 | Ogre::CompositorManager2 *compositorManager = root->getCompositorManager2(); | |
289 | ||
290 | const Ogre::IdString workspaceName("Awesome workspace1"); | |
291 | compositorManager->createBasicWorkspaceDef( workspaceName, Ogre::ColourValue(0.5f, 0.5f, 0.5f, 0.5f), Ogre::IdString()); | |
292 | compositorManager->addWorkspace( sceneManager, window, camera, workspaceName, true ); | |
293 | ||
294 | Ogre::Viewport* viewport = window->getViewport(0); | |
295 | camera->setAspectRatio(Ogre::Real(viewport->getActualWidth()) / Ogre::Real(viewport->getActualHeight())); | |
296 | ||
297 | ||
298 | //experiments with not creating a workspace | |
299 | /*const Ogre::IdString workspaceName2("Awesome workspace2"); | |
300 | compositorManager->createBasicWorkspaceDef( workspaceName2, Ogre::ColourValue(0.5f, 0.5f, 0.5f, 0.5f), Ogre::IdString()); | |
301 | compositorManager->addWorkspace( sceneManager2, window2, camera2, workspaceName2, true ); | |
302 | ||
303 | Ogre::Viewport* viewport2 = window2->getViewport(0); | |
304 | camera2->setAspectRatio(Ogre::Real(viewport2->getActualWidth()) / Ogre::Real(viewport2->getActualHeight()));*/ | |
305 | #else //OGRE20 | |
306 | Ogre::Viewport* viewport = window->addViewport(camera); | |
307 | viewport->setBackgroundColour(Ogre::ColourValue(0.5f, 0.5f, 0.5f, 1.0f)); | |
308 | ||
309 | Ogre::Viewport* viewport2 = window2->addViewport(camera2); | |
310 | viewport2->setBackgroundColour(Ogre::ColourValue(0.5f, 0.5f, 0.5f, 1.0f)); | |
311 | #endif | |
312 | ||
313 | CEGUIOgreInterface ceguiInterface(window); | |
314 | CEGUI::GUIContext *guiContext = ceguiInterface.GetCeguiContext(); | |
315 | CEGUI::Window *testWindow = CEGUI::WindowManager::getSingleton().loadLayoutFromFile("test.layout", "Layouts"); | |
316 | guiContext->setRootWindow(testWindow); | |
317 | ||
318 | CEGUIOgreInterface ceguiInterface2(window2); | |
319 | CEGUI::GUIContext *guiContext2 = ceguiInterface2.GetCeguiContext(); | |
320 | CEGUI::Window *testWindow2 = CEGUI::WindowManager::getSingleton().loadLayoutFromFile("testAlfisko.layout", "Layouts"); | |
321 | guiContext2->setRootWindow(testWindow2); | |
322 | ||
323 | ||
324 | bool running = 1; | |
325 | float time = 0.0f; | |
326 | ||
327 | bool firstTime = 1; | |
328 | while(running) | |
329 | { | |
330 | float dt = 1e-2f; | |
331 | time += dt; //we don't need actual time, just a value increasing with time | |
332 | Ogre::WindowEventUtilities::messagePump(); | |
333 | ||
334 | CEGUI::System::getSingleton().injectTimePulse(dt); | |
335 | ||
336 | if(window->isClosed()) | |
337 | running = 0; | |
338 | root->renderOneFrame(); | |
339 | } | |
340 | } |