Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/presentation2/src/orxonox/graphics/Camera.cc @ 6191

Last change on this file since 6191 was 6191, checked in by rgrieder, 14 years ago

Moved sound listener to the active camera and fixed the ambient distance trigger (now acts on cameras and we only have one in a Scene so far).

  • Property svn:eol-style set to native
File size: 5.9 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Fabian 'x3n' Landau
24 *   Co-authors:
25 *      Benjamin Knecht
26 *
27 */
28
29#include "Camera.h"
30
31#include <algorithm>
32#include <OgreCamera.h>
33#include <OgreSceneManager.h>
34#include <OgreSceneNode.h>
35
36#include "util/Exception.h"
37#include "util/StringUtils.h"
38#include "core/CoreIncludes.h"
39#include "core/ConfigValueIncludes.h"
40#include "core/GameMode.h"
41#include "core/GUIManager.h"
42#include "Scene.h"
43#include "CameraManager.h"
44#include "sound/SoundManager.h"
45
46namespace orxonox
47{
48    CreateFactory(Camera);
49
50    Camera::Camera(BaseObject* creator) : StaticEntity(creator)
51    {
52        RegisterObject(Camera);
53
54        if (!GameMode::showsGraphics())
55            ThrowException(AbortLoading, "Can't create Camera, no graphics.");
56        if (!this->getScene())
57            ThrowException(AbortLoading, "Can't create Camera, no scene.");
58        if (!this->getScene()->getSceneManager())
59            ThrowException(AbortLoading, "Can't create Camera, no scene-manager given.");
60        if (!this->getScene()->getRootSceneNode())
61            ThrowException(AbortLoading, "Can't create Camera, no root-scene-node given.");
62
63        this->camera_ = this->getScene()->getSceneManager()->createCamera(getUniqueNumberString());
64        this->camera_->setUserObject(this);
65        this->cameraNode_ = this->getScene()->getRootSceneNode()->createChildSceneNode();
66        this->attachNode(this->cameraNode_);
67        this->cameraNode_->attachObject(this->camera_);
68
69        this->bHasFocus_ = false;
70        this->bDrag_ = false;
71        this->nearClipDistance_ = 1;
72        this->lastDtLagged_ = false;
73
74        this->setSyncMode(0x0);
75
76        this->setConfigValues();
77        this->configvaluecallback_changedNearClipDistance();
78    }
79
80    Camera::~Camera()
81    {
82        if (this->isInitialized())
83        {
84            if (GUIManager::getInstance().getCamera() == this->camera_)
85                GUIManager::getInstance().setCamera(NULL);
86            this->releaseFocus();
87
88            this->cameraNode_->detachAllObjects();
89            this->getScene()->getSceneManager()->destroyCamera(this->camera_);
90
91            if (this->bDrag_)
92                this->detachNode(this->cameraNode_);
93
94            if (this->getScene()->getSceneManager())
95                this->getScene()->getSceneManager()->destroySceneNode(this->cameraNode_->getName());
96        }
97    }
98
99    void Camera::setConfigValues()
100    {
101        SetConfigValue(nearClipDistance_, 1.0f).callback(this, &Camera::configvaluecallback_changedNearClipDistance);
102    }
103
104    void Camera::configvaluecallback_changedNearClipDistance()
105    {
106        this->camera_->setNearClipDistance(this->nearClipDistance_);
107    }
108
109    void Camera::tick(float dt)
110    {
111        SUPER(Camera, tick, dt);
112
113        if (this->bDrag_)
114        {
115            // this stuff here may need some adjustments
116            float coeff = 15.0f * dt / this->getTimeFactor();
117            // Only clamp if fps rate is actually falling. Occasional high dts should
118            // not be clamped to reducing lagging effects.
119            if (coeff > 1.0f)
120            {
121                if (this->lastDtLagged_)
122                    coeff = 1.0f;
123                else
124                    this->lastDtLagged_ = true;
125            }
126            else
127                this->lastDtLagged_ = false;
128
129            Vector3 offset = this->getWorldPosition() - this->cameraNode_->_getDerivedPosition();
130            this->cameraNode_->translate(coeff * offset);
131
132            this->cameraNode_->setOrientation(Quaternion::Slerp(coeff, this->cameraNode_->_getDerivedOrientation(), this->getWorldOrientation(), true));
133        }
134
135        // Update sound listener transformation
136        if (GameMode::playsSound() && this->bHasFocus_)
137        {
138            SoundManager::getInstance().setListenerPosition(this->getWorldPosition());
139            SoundManager::getInstance().setListenerOrientation(this->getWorldOrientation());
140        }
141    }
142
143    void Camera::requestFocus()
144    {
145        CameraManager::getInstance().requestFocus(this);
146    }
147
148    void Camera::releaseFocus()
149    {
150        CameraManager::getInstance().releaseFocus(this);
151    }
152
153    /**
154        what to do when camera loses focus (do not request focus in this function!!)
155        this is called by the CameraManager singleton class to notify the camera
156    */
157    void Camera::removeFocus()
158    {
159        this->bHasFocus_ = false;
160    }
161
162    void Camera::setFocus()
163    {
164        this->bHasFocus_ = true;
165        CameraManager::getInstance().useCamera(this->camera_);
166    }
167
168    void Camera::setDrag(bool bDrag)
169    {
170        if (bDrag != this->bDrag_)
171        {
172            this->bDrag_ = bDrag;
173
174            if (!bDrag)
175            {
176                this->attachNode(this->cameraNode_);
177                this->cameraNode_->setPosition(Vector3::ZERO);
178                this->cameraNode_->setOrientation(Quaternion::IDENTITY);
179            }
180            else
181            {
182                this->detachNode(this->cameraNode_);
183                this->cameraNode_->setPosition(this->getWorldPosition());
184                this->cameraNode_->setOrientation(this->getWorldOrientation());
185            }
186        }
187    }
188}
Note: See TracBrowser for help on using the repository browser.