-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathRTSCamera.cpp
More file actions
102 lines (87 loc) · 3.12 KB
/
RTSCamera.cpp
File metadata and controls
102 lines (87 loc) · 3.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/*
* RTSCamera.cpp
* Prototyp
*
* Created by Christian Pehle on 07.09.09.
* Copyright 2009 Orbifold. All rights reserved.
*
*/
#include <Ogre/OgreSceneManager.h>
#include <Ogre/OgreRenderSystem.h>
#include "RTSCamera.h"
#include "Game.h"
class RTSCamera;
namespace Orbifold {
RTSCamera::RTSCamera(const Ogre::String& name, Ogre::SceneManager* sm) :
mSceneManager(0),
mCamera(0)
{
mSceneManager = sm;
mCamera = sm->createCamera(name);
}
RTSCamera::~RTSCamera() {}
void RTSCamera::initialise() {
InputHandler* input = InputHandler::getSingleton();
input->addKeyListener(this, "RTSCam");
input->addMouseListener(this, "RTSCam");
mVelocity = Ogre::Vector3(0,0,0);
Ogre::Camera* cam = mCamera;
if (Ogre::Root::getSingletonPtr()->getRenderSystem()->getCapabilities()->hasCapability(Ogre::RSC_INFINITE_FAR_PLANE)) {
cam->setFarClipDistance(0);
}
cam->setNearClipDistance(1);
cam->setPosition(707,2500,528);
cam->setOrientation(Ogre::Quaternion(-0.3486, 0.0122, 0.9365, 0.0329));
mRaySceneQuery = mSceneManager->createRayQuery(Ogre::Ray(cam->getPosition(), -Ogre::Vector3::UNIT_Y));
static Ogre::Ray updateRay;
updateRay.setOrigin(cam->getPosition());
updateRay.setDirection(-Ogre::Vector3::UNIT_Y);
mRaySceneQuery->setRay(updateRay);
Ogre::RaySceneQueryResult& qryResult = mRaySceneQuery->execute();
Ogre::RaySceneQueryResult::iterator i = qryResult.begin();
if (i != qryResult.end() && i->worldFragment) {
Ogre::Vector3 campos = cam->getPosition();
Ogre::Vector3 inter = i->worldFragment->singleIntersection;
cam->setPosition(cam->getPosition().x,
inter.y +10,
cam->getPosition().z);
}
}
void RTSCamera::save() {
if (mCamera) {
mSavedDirection = mCamera->getRealDirection();
mSavedOrientation = mCamera->getRealOrientation();
mSavedPosition = mCamera->getRealPosition();
}
}
void RTSCamera::restore() {
if(mCamera) {
mCamera->setPosition(mSavedPosition);
mCamera->setDirection(mSavedDirection);
mCamera->setOrientation(mSavedOrientation);
}
}
void RTSCamera::update(unsigned long tslu) {
// Movement should be adapted / restricted
mCamera->moveRelative(tslu*this->mVelocity);
//mCamera->roll(tslu*this->mRollVel);
// Basic collision detection
static Ogre::Ray updateRay;
updateRay.setOrigin(mCamera->getPosition());
updateRay.setDirection(-Ogre::Vector3::UNIT_Y);
mRaySceneQuery->setRay(updateRay);
Ogre::RaySceneQueryResult& qryResult = mRaySceneQuery->execute();
Ogre::RaySceneQueryResult::iterator i = qryResult.begin();
if (i != qryResult.end() && i->worldFragment) {
Ogre::Vector3 campos = mCamera->getPosition();
Ogre::Vector3 inter = i->worldFragment->singleIntersection;
if (campos.y < inter.y + 10) {
mCamera->setPosition(mCamera->getPosition().x,
inter.y + 10,
mCamera->getPosition().z);
} else {
mCamera->setPosition(campos);
}
}
}
}