From eb795b0f83e3d8121dbe1dafe7e7006bd6896b25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Lemaire?= Date: Mon, 30 Dec 2013 14:59:42 +0100 Subject: [PATCH] Added camera FOV control (and better initial fov) --- src/definition/CameraDefinition.cpp | 13 ++++++++++++- src/definition/CameraDefinition.h | 1 + src/interface/desktop/dialogexplorer.cpp | 17 +++++++++++++++++ src/interface/desktop/dialogexplorer.h | 1 + src/render/opengl/WidgetExplorer.cpp | 6 ++++++ src/render/opengl/WidgetExplorer.h | 2 ++ 6 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/definition/CameraDefinition.cpp b/src/definition/CameraDefinition.cpp index b48a3e5..f350676 100644 --- a/src/definition/CameraDefinition.cpp +++ b/src/definition/CameraDefinition.cpp @@ -17,7 +17,7 @@ CameraDefinition::CameraDefinition(): width = 1.0; height = 1.0; - perspective.yfov = 1.57; + perspective.yfov = 1.0; perspective.xratio = 1.0; perspective.znear = 1.0; perspective.zfar = 1000.0; @@ -32,6 +32,7 @@ void CameraDefinition::save(PackStream* stream) const stream->write(&direction.phi); stream->write(&direction.theta); stream->write(&roll); + stream->write(&perspective.yfov); } void CameraDefinition::load(PackStream* stream) @@ -41,6 +42,7 @@ void CameraDefinition::load(PackStream* stream) stream->read(&direction.phi); stream->read(&direction.theta); stream->read(&roll); + stream->read(&perspective.yfov); validate(); } @@ -53,6 +55,8 @@ void CameraDefinition::copy(BaseDefinition* _destination) const destination->direction = direction; destination->roll = roll; + destination->perspective = perspective; + destination->validate(); } @@ -143,6 +147,13 @@ void CameraDefinition::setZoomToTarget(double zoom) validate(); } +void CameraDefinition::setFov(double fov) +{ + perspective.yfov = fov; + + validate(); +} + void CameraDefinition::strafeForward(double value) { location = location.add(forward.scale(value)); diff --git a/src/definition/CameraDefinition.h b/src/definition/CameraDefinition.h index 162e38a..6d4b6b2 100644 --- a/src/definition/CameraDefinition.h +++ b/src/definition/CameraDefinition.h @@ -48,6 +48,7 @@ public: void setTargetCoords(double x, double y, double z); void setRoll(double angle); void setZoomToTarget(double zoom); + void setFov(double fov); void strafeForward(double value); void strafeRight(double value); diff --git a/src/interface/desktop/dialogexplorer.cpp b/src/interface/desktop/dialogexplorer.cpp index 870d588..535ed28 100644 --- a/src/interface/desktop/dialogexplorer.cpp +++ b/src/interface/desktop/dialogexplorer.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include "WidgetExplorer.h" #include "DesktopScenery.h" #include "CameraDefinition.h" @@ -12,6 +13,7 @@ DialogExplorer::DialogExplorer(QWidget* parent, CameraDefinition* camera, bool c { QWidget* panel; QPushButton* button; + QLabel* label; setModal(true); setWindowTitle(tr("Paysages 3D - Explore")); @@ -29,6 +31,16 @@ DialogExplorer::DialogExplorer(QWidget* parent, CameraDefinition* camera, bool c panel->setLayout(new QVBoxLayout()); panel->setMaximumWidth(230); + label = new QLabel(tr("Field of vision"), panel); + label->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); + panel->layout()->addWidget(label); + QSlider* slider = new QSlider(Qt::Horizontal, panel); + slider->setRange(0, 1000); + slider->setValue((int)(1000.0 * (camera->getPerspective().yfov - 0.7) / 1.0)); + slider->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); + connect(slider, SIGNAL(valueChanged(int)), this, SLOT(fovChanged(int))); + panel->layout()->addWidget(slider); + panel->layout()->addWidget(new QLabel(tr("COMMANDS\n\nLeft click : Look around\nRight click : Pan (adjust framing)\nWheel : Move forward/backward\nHold SHIFT : Faster\nHold CTRL : Slower"), panel)); button = new QPushButton(tr("Reset camera"), panel); @@ -61,3 +73,8 @@ void DialogExplorer::validateCamera() accept(); } +void DialogExplorer::fovChanged(int value) +{ + _wanderer->setCameraFov(0.7 + 1.0 * ((double)value) / 1000.0); +} + diff --git a/src/interface/desktop/dialogexplorer.h b/src/interface/desktop/dialogexplorer.h index 420b4ec..5295b5f 100644 --- a/src/interface/desktop/dialogexplorer.h +++ b/src/interface/desktop/dialogexplorer.h @@ -14,6 +14,7 @@ public: protected slots: void validateCamera(); + void fovChanged(int value); private: WidgetExplorer* _wanderer; diff --git a/src/render/opengl/WidgetExplorer.cpp b/src/render/opengl/WidgetExplorer.cpp index 0569964..2e35fb5 100644 --- a/src/render/opengl/WidgetExplorer.cpp +++ b/src/render/opengl/WidgetExplorer.cpp @@ -43,6 +43,12 @@ WidgetExplorer::~WidgetExplorer() delete _renderer; } +void WidgetExplorer::setCameraFov(double fov) +{ + _current_camera->setFov(fov); + updateGL(); +} + void WidgetExplorer::resetCamera() { _base_camera->copy(_current_camera); diff --git a/src/render/opengl/WidgetExplorer.h b/src/render/opengl/WidgetExplorer.h index 6da061f..bd806fd 100644 --- a/src/render/opengl/WidgetExplorer.h +++ b/src/render/opengl/WidgetExplorer.h @@ -15,6 +15,8 @@ public: WidgetExplorer(QWidget* parent, CameraDefinition* camera, Scenery* scenery); ~WidgetExplorer(); + void setCameraFov(double fov); + public slots: void resetCamera(); void validateCamera();