Skip to content

Commit

Permalink
NWN: Rotate the compass according to the camera orientation
Browse files Browse the repository at this point in the history
  • Loading branch information
DrMcCoy committed Mar 21, 2014
1 parent 53d18a1 commit e309d5b
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 10 deletions.
24 changes: 14 additions & 10 deletions src/engines/nwn/gui/ingame/compass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,10 @@
* The NWN ingame compass.
*/

#include <OgreSceneNode.h>

#include "common/util.h"
#include "common/maths.h"

#include "graphics/graphics.h"
#include "graphics/cameraman.h"
Expand All @@ -44,6 +47,8 @@ namespace NWN {

CompassWidget::CompassWidget(::Engines::GUI &gui, const Common::UString &tag) :
ModelWidget(gui, tag, "ctl_compass") {

_model->setBaseScale(100.0, 100.0, 100.0);
}

CompassWidget::~CompassWidget() {
Expand All @@ -52,12 +57,11 @@ CompassWidget::~CompassWidget() {
// TODO: The disk rotation should feel more "natural", i.e. it should
// be more sluggish.
void CompassWidget::setRotation(float x, float y, float z) {
/*
_model->setRotation(-x, 0.0, 0.0);
Graphics::Aurora::ModelNode *pointer = _model->getNode("cmp_pointer");
_model->setOrientation(Common::deg2rad(-90.0) - y, 1.0, 0.0, 0.0);

Ogre::SceneNode *pointer = _model->getNode("cmp_pointer");
if (pointer)
pointer->setRotation(0.0, 0.0, y);
*/
pointer->setOrientation(Ogre::Quaternion(Ogre::Radian(z), Ogre::Vector3(0.0, 0.0, 1.0)));
}


Expand All @@ -78,7 +82,7 @@ Compass::Compass(float position) {

_compass = new CompassWidget(*this, "Compass");

_compass->setPosition(floor(- (panelWidth / 2.0)), floor(position + (panelHeight / 2.0)), 10.0);
_compass->setPosition(floor(- (panelWidth / 2.0)), floor(position + (panelHeight / 2.0)), 50.0);

addWidget(_compass);

Expand All @@ -97,11 +101,11 @@ void Compass::notifyResized(int oldWidth, int oldHeight, int newWidth, int newHe
}

void Compass::notifyCameraMoved() {
/*
const float *orientation = CameraMan.getOrientation();
float roll, pitch, yaw, x, y, z;
CameraMan.getOrientation(roll, pitch, yaw);
CameraMan.getDirection(x, y, z);

_compass->setRotation(orientation[0] + 90.0, orientation[1], orientation[2]);
*/
_compass->setRotation(x, y, yaw);
}

} // End of namespace NWN
Expand Down
28 changes: 28 additions & 0 deletions src/graphics/cameraman.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@
#include "graphics/cameraman.h"
#include "graphics/util.h"

#include "events/notifications.h"

DECLARE_SINGLETON(Graphics::CameraManager)

namespace Graphics {
Expand Down Expand Up @@ -125,44 +127,70 @@ void CameraManager::getOrientation(float &radian, float &x, float &y, float &z)
z = axis.z;
}

void CameraManager::getOrientation(float &cRoll, float &cPitch, float &cYaw) const {
cRoll = _camera->getOrientation().getRoll().valueRadians();
cPitch = _camera->getOrientation().getPitch().valueRadians();
cYaw = _camera->getOrientation().getYaw().valueRadians();
}

void CameraManager::setPosition(float x, float y, float z) {
_camera->setPosition(x, y, z);

NotificationMan.cameraMoved();
}

void CameraManager::setDirection(float x, float y, float z) {
_camera->setDirection(x, y, z);

NotificationMan.cameraMoved();
}

void CameraManager::lookAt(float x, float y, float z) {
_camera->lookAt(x, y, z);

NotificationMan.cameraMoved();
}

void CameraManager::setOrientation(float radian, float x, float y, float z) {
_camera->setOrientation(Ogre::Quaternion(Ogre::Radian(radian), Ogre::Vector3(x, y, z)));

NotificationMan.cameraMoved();
}

void CameraManager::move(float x, float y, float z) {
_camera->move(Ogre::Vector3(x, y, z));

NotificationMan.cameraMoved();
}

void CameraManager::moveRelative(float x, float y, float z) {
_camera->moveRelative(Ogre::Vector3(x, y, z));

NotificationMan.cameraMoved();
}

void CameraManager::rotate(float radian, float x, float y, float z) {
_camera->rotate(Ogre::Quaternion(Ogre::Radian(radian), Ogre::Vector3(x, y, z)));

NotificationMan.cameraMoved();
}

void CameraManager::roll(float radian) {
_camera->roll(Ogre::Radian(radian));

NotificationMan.cameraMoved();
}

void CameraManager::yaw(float radian) {
_camera->yaw(Ogre::Radian(radian));

NotificationMan.cameraMoved();
}

void CameraManager::pitch(float radian) {
_camera->pitch(Ogre::Radian(radian));

NotificationMan.cameraMoved();
}

Ogre::Ray CameraManager::castRay(int x, int y) const {
Expand Down
1 change: 1 addition & 0 deletions src/graphics/cameraman.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ class CameraManager : public Common::Singleton<CameraManager> {
void getPosition(float &x, float &y, float &z) const;
void getDirection(float &x, float &y, float &z) const;
void getOrientation(float &radian, float &x, float &y, float &z) const;
void getOrientation(float &cRoll, float &cPitch, float &cYaw) const;

void setPosition(float x, float y, float z);
void setDirection(float x, float y, float z);
Expand Down

0 comments on commit e309d5b

Please sign in to comment.