V-Gears 0
Free Final Fantasy VII engine.
OgreBase.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2022 The V-Gears Team
3 *
4 * This file is part of V-Gears
5 *
6 * V-Gears is free software: you can redistribute it and/or modify it under
7 * terms of the GNU General Public License as published by the Free Software
8 * Foundation, version 3.0 (GPLv3) of the License.
9 *
10 * V-Gears is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 */
15
16#pragma once
17
18#include <Ogre.h>
19#include <OgreTextAreaOverlayElement.h>
20#include <OgreOverlay.h>
21#include <OgreOverlayManager.h>
22#include <Bites/OgreWindowEventUtilities.h>
23#include <OIS/OIS.h>
24#include "common/FileSystem.h"
26
30extern Ogre::Root* root;
31
35extern Ogre::RenderWindow* window;
36
40extern std::vector<Ogre::Entity*> entities;
41
45extern Ogre::Camera* camera;
46
48
53
61 public Ogre::FrameListener, public Ogre::WindowEventListener,
62 public OIS::KeyListener, public OIS::MouseListener
63{
64
65 public:
66 // Constructor takes a RenderWindow because it uses that to determine input context
67
73 DisplayFrameListener(Ogre::RenderWindow* win):
74 window_(win), input_manager_(0), keyboard_(0),
75 mouse_(0), mouse_rotate_(false), exit_(false)
76 {
77
78 using namespace OIS;
79 Ogre::LogManager::getSingletonPtr()->logMessage("[OIS] Initializing...");
80 ParamList pl;
81 size_t window_hnd = 0; // TODO What does HND stand for?
82 std::ostringstream window_hnd_str;
83 win->getCustomAttribute("WINDOW", &window_hnd);
84 window_hnd_str << window_hnd;
85 pl.insert(std::make_pair(std::string("WINDOW"), window_hnd_str.str()));
86 input_manager_ = InputManager::createInputSystem(pl);
87 keyboard_ = static_cast<Keyboard*>(
88 input_manager_->createInputObject(OIS::OISKeyboard, true)
89 );
90 keyboard_->setEventCallback(this);
91 mouse_ = static_cast<OIS::Mouse*>(
92 input_manager_->createInputObject(OIS::OISMouse, true)
93 );
94 mouse_->setEventCallback(this);
95 //Register as a Window listener.
96 Ogre::WindowEventUtilities::addWindowEventListener(window_, this);
97 // Debug info.
98 info_text = new Ogre::TextAreaOverlayElement("DebugText");
99 info_text->setCaption("");
100 info_text->setMetricsMode(Ogre::GMM_PIXELS);
101 info_text->setPosition(5, 5);
102 // info_text->setFontName("BlueHighway");
103 info_text->setCharHeight(18);
104 info_overlay = Ogre::OverlayManager::getSingleton().create("DebugOverlay");
105 info_overlay->setZOrder(1);
106 info_overlay->add2D((Ogre::OverlayContainer*) info_text);
107 info_overlay->show();
108 }
109
111 input_manager_->destroyInputObject(keyboard_);
112 OIS::InputManager::destroyInputSystem(input_manager_);
113 //Remove self as a Window listener.
114 Ogre::WindowEventUtilities::removeWindowEventListener(window_, this);
116 }
117
123 virtual void windowClosed(Ogre::RenderWindow* rw){exit_ = true;}
124
135 bool frameStarted(const Ogre::FrameEvent& evt){
136
137 // TODO: Move implementation to cpp file.
138
139 if (exit_ == true) return false;
140 if (keyboard_) keyboard_->capture();
141 if (mouse_) mouse_->capture();
142
143 for (unsigned int i = 0; i < entities.size(); ++ i){
144 if (entities[i]->isVisible() == true){
145 Ogre::AnimationStateIterator animations
146 = entities[i]->getAllAnimationStates()->getAnimationStateIterator();
147 while (animations.hasMoreElements() == true){
148 Ogre::AnimationState* state = animations.getNext();
149 if (state->getEnabled() == true){
150 state->addTime(evt.timeSinceLastFrame);
151 info_text->setCaption(
152 entities[i]->getName() + ": " + state->getAnimationName()
153 );
154 }
155 }
156 break;
157 }
158 }
159 if (keyboard_->isKeyDown(OIS::KC_A)){
160 assert(camera_);
161 camera_->getParentSceneNode()->translate(
162 Ogre::Vector3(-0.005f, 0.0f, 0.0f), Ogre::Node::TS_LOCAL
163 );
164 }
165 if (keyboard_->isKeyDown(OIS::KC_D)){
166 assert(camera_);
167 camera_->getParentSceneNode()->translate(
168 Ogre::Vector3(0.005f, 0.0f, 0.0f), Ogre::Node::TS_LOCAL
169 );
170 }
171 if (keyboard_->isKeyDown(OIS::KC_W)){
172 assert(camera_);
173 camera_->getParentSceneNode()->translate(
174 Ogre::Vector3(0.0f, 0.0f, -0.005f), Ogre::Node::TS_LOCAL
175 );
176 }
177 if (keyboard_->isKeyDown(OIS::KC_S)){
178 assert(camera_);
179 camera_->getParentSceneNode()->translate(
180 Ogre::Vector3(0.0f, 0.0f, 0.005f), Ogre::Node::TS_LOCAL
181 );
182 }
183 if (mouse_rotate_ == true){
184 assert(camera_);
185 camera_->getParentSceneNode()->yaw(Ogre::Degree(-mouse_move_x_ * 0.13f));
186 camera_->getParentSceneNode()->pitch(Ogre::Degree(-mouse_move_y_ * 0.13f));
187 mouse_move_x_ = 0;
188 mouse_move_y_ = 0;
189 }
190 return true;
191 }
192
201 bool keyPressed(const OIS::KeyEvent& e){
202 switch(e.key){
203 case OIS::KC_RIGHT:
204 {
205 bool change = false;
206 for (unsigned int i = 0; i < entities.size(); ++ i){
207 if (change == true){
208 entities[i]->setVisible(true);
209 break;
210 }
211 if (entities[i]->isVisible() == true && (i != entities.size() - 1)){
212 entities[i]->setVisible(false);
213 change = true;
214 }
215 }
216 }
217 break;
218 case OIS::KC_LEFT:
219 {
220 bool change = false;
221 for(int i = entities.size() - 1; i >= 0; -- i){
222 if (change == true){
223 entities[i]->setVisible(true);
224 break;
225 }
226 if (entities[i]->isVisible() == true && i != 0){
227 entities[i]->setVisible(false);
228 change = true;
229 }
230 }
231 }
232 break;
233 case OIS::KC_UP:
234 {
235 bool change = false;
236 for (unsigned int i = 0; i < entities.size(); ++ i){
237 if (entities[i]->isVisible() == true){
238 Ogre::AnimationStateIterator animations
239 = entities[i]->getAllAnimationStates()
240 ->getAnimationStateIterator();
241 Ogre::AnimationState* old_state;
242 Ogre::AnimationState* new_state = animations.getNext();
243 while (animations.hasMoreElements() == true){
244 old_state = new_state;
245 new_state = animations.getNext();
246 if (new_state->getEnabled() == true){
247 new_state->setEnabled(false);
248 new_state->setLoop(false);
249 old_state->setEnabled(true);
250 old_state->setLoop(true);
251 }
252 }
253 break;
254 }
255 }
256 }
257 break;
258 case OIS::KC_DOWN:{
259 bool change = false;
260 for (unsigned int i = 0; i < entities.size(); ++ i){
261 if (entities[i]->isVisible() == true){
262 Ogre::AnimationStateIterator animations
263 = entities[i]->getAllAnimationStates()->getAnimationStateIterator();
264 while (animations.hasMoreElements() == true){
265 Ogre::AnimationState* state = animations.getNext();
266 if (change == true){
267 state->setEnabled(true);
268 state->setLoop(true);
269 break;
270 }
271 if (
272 state->getEnabled() == true
273 && animations.hasMoreElements() != false
274 ){
275 state->setEnabled(false);
276 state->setLoop(false);
277 change = true;
278 }
279 }
280 break;
281 }
282 }
283 }
284 break;
285 }
286 return true;
287 }
288
297 bool keyReleased(const OIS::KeyEvent& e){return true;}
298
305 bool mouseMoved(const OIS::MouseEvent& e){
306 mouse_move_x_ = float(e.state.X.rel);
307 mouse_move_y_ = float(e.state.Y.rel);
308 return true;
309 }
310
318 bool mousePressed(const OIS::MouseEvent& e, OIS::MouseButtonID id){
319 if (id == OIS::MB_Right) mouse_rotate_ = true;
320 return true;
321 }
322
330 bool mouseReleased(const OIS::MouseEvent& e, OIS::MouseButtonID id){
331 if (id == OIS::MB_Right) mouse_rotate_ = false;
332 return true;
333 }
334
338 Ogre::TextAreaOverlayElement* info_text;
339
343 Ogre::Overlay* info_overlay;
344
348 virtual void setCamera(Ogre::Camera *camera){camera_ = camera;}
349
350 private:
351
355 Ogre::RenderWindow* window_;
356
360 OIS::InputManager* input_manager_;
361
365 OIS::Keyboard* keyboard_;
366
370 OIS::Mouse* mouse_;
371
375 Ogre::Camera *camera_;
376
381
386
391
395 bool exit_;
396};
397
403void InitializeOgreBase(const Ogre::String& name);
404
DisplayFrameListener * frame_listener
The display frame listener.
Definition: OgreBase.cpp:30
Ogre::Root * root
The Ogre system root component.
Definition: OgreBase.cpp:22
std::vector< Ogre::Entity * > entities
List of Ogre entities.
Definition: OgreBase.cpp:26
void DeinitializeOgreBase()
Destructs the Ogre system.
Definition: OgreBase.cpp:123
void InitializeOgreBase(const Ogre::String &name)
Initializes the Ogre system.
Definition: OgreBase.cpp:32
Ogre::RenderWindow * window
The Ogre render window.
Definition: OgreBase.cpp:24
Ogre::Camera * camera
The Ogre camera.
Definition: OgreBase.cpp:28
The display frame listener.
Definition: OgreBase.h:63
float mouse_move_y_
Mouse vertical movement.
Definition: OgreBase.h:385
bool mouseReleased(const OIS::MouseEvent &e, OIS::MouseButtonID id)
Handles mouse button-up events.
Definition: OgreBase.h:330
OIS::Keyboard * keyboard_
The OIS keyboard.
Definition: OgreBase.h:365
DisplayFrameListener(Ogre::RenderWindow *win)
Constructor.
Definition: OgreBase.h:73
bool mouseMoved(const OIS::MouseEvent &e)
Handles mouse movement events.
Definition: OgreBase.h:305
bool frameStarted(const Ogre::FrameEvent &evt)
Called when a frame is about to begin rendering.
Definition: OgreBase.h:135
bool keyReleased(const OIS::KeyEvent &e)
Handles key releasing events.
Definition: OgreBase.h:297
float mouse_move_x_
Mouse horizontal movement.
Definition: OgreBase.h:380
Ogre::TextAreaOverlayElement * info_text
The information text.
Definition: OgreBase.h:338
OIS::InputManager * input_manager_
The OIS input manager.
Definition: OgreBase.h:360
virtual void setCamera(Ogre::Camera *camera)
Sets the viewport camera.
Definition: OgreBase.h:348
bool exit_
Flag for application exit.
Definition: OgreBase.h:395
Ogre::Camera * camera_
The camera.
Definition: OgreBase.h:375
bool mouse_rotate_
Indicates if the mouse is being rotated.
Definition: OgreBase.h:390
bool keyPressed(const OIS::KeyEvent &e)
The key listener.
Definition: OgreBase.h:201
Ogre::RenderWindow * window_
The render window.
Definition: OgreBase.h:355
OIS::Mouse * mouse_
The OIS mouse.
Definition: OgreBase.h:370
Ogre::Overlay * info_overlay
The information overlay.
Definition: OgreBase.h:343
bool mousePressed(const OIS::MouseEvent &e, OIS::MouseButtonID id)
Handles mouse button-down events.
Definition: OgreBase.h:318
virtual void windowClosed(Ogre::RenderWindow *rw)
Called on window closing.
Definition: OgreBase.h:123
virtual ~DisplayFrameListener()
Definition: OgreBase.h:110
Ogre::String String
Definition: TypeDefine.h:37