From c1fd52b0dbb2ada8ef85afb89d3a9cd4643e9793 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Lemaire?= Date: Thu, 14 Nov 2013 21:05:12 +0100 Subject: [PATCH] Ensure camera is above ground and water --- src/editing/dialogexplorer.cpp | 2 +- src/editing/dialogexplorer.h | 4 +--- src/render/opengl/WidgetExplorer.cpp | 6 +++--- src/render/opengl/WidgetExplorer.h | 13 +++++-------- src/render/opengl/opengl_global.h | 2 ++ src/rendering/Scenery.cpp | 17 ++++++++++++++++- src/rendering/Scenery.h | 2 ++ 7 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/editing/dialogexplorer.cpp b/src/editing/dialogexplorer.cpp index 602d9d1..938c363 100644 --- a/src/editing/dialogexplorer.cpp +++ b/src/editing/dialogexplorer.cpp @@ -8,7 +8,7 @@ #include "CameraDefinition.h" #include "renderer.h" -DialogExplorer::DialogExplorer(QWidget* parent, CameraDefinition* camera, bool camera_validable, Renderer* renderer) : QDialog(parent) +DialogExplorer::DialogExplorer(QWidget* parent, CameraDefinition* camera, bool camera_validable, SoftwareRenderer* renderer) : QDialog(parent) { QWidget* panel; QPushButton* button; diff --git a/src/editing/dialogexplorer.h b/src/editing/dialogexplorer.h index f6ca0d3..363ee64 100644 --- a/src/editing/dialogexplorer.h +++ b/src/editing/dialogexplorer.h @@ -5,13 +5,11 @@ #include -class Renderer; - class DialogExplorer : public QDialog { Q_OBJECT public: - explicit DialogExplorer(QWidget *parent, CameraDefinition* camera, bool camera_validable=false, Renderer* renderer=0); + explicit DialogExplorer(QWidget *parent, CameraDefinition* camera, bool camera_validable=false, SoftwareRenderer* renderer=0); ~DialogExplorer(); protected slots: diff --git a/src/render/opengl/WidgetExplorer.cpp b/src/render/opengl/WidgetExplorer.cpp index f1b44a7..80464db 100644 --- a/src/render/opengl/WidgetExplorer.cpp +++ b/src/render/opengl/WidgetExplorer.cpp @@ -73,7 +73,7 @@ static AtmosphereResult _applyAerialPerspective(Renderer*, Vector3, Color base) return result; } -WidgetExplorer::WidgetExplorer(QWidget *parent, CameraDefinition* camera, Renderer* renderer) : +WidgetExplorer::WidgetExplorer(QWidget *parent, CameraDefinition* camera, SoftwareRenderer* renderer) : QGLWidget(parent) { setMinimumSize(400, 300); @@ -405,8 +405,8 @@ void WidgetExplorer::paintGL() double frame_time; WaterDefinition* water = _renderer->water->definition; - _current_camera->copy(_renderer->render_camera); - // TODO Keep camera above ground + // Don't do this at each frame, only on camera change + _renderer->getScenery()->setCamera(_current_camera); start_time = QTime::currentTime(); diff --git a/src/render/opengl/WidgetExplorer.h b/src/render/opengl/WidgetExplorer.h index aa98603..e68a258 100644 --- a/src/render/opengl/WidgetExplorer.h +++ b/src/render/opengl/WidgetExplorer.h @@ -2,22 +2,19 @@ #define WIDGETEXPLORER_H #include "opengl_global.h" -#include -#include -class Renderer; +#include + +#include namespace paysages { namespace opengl { -class OpenGLRenderer; -class BaseExplorerChunk; - class OPENGLSHARED_EXPORT WidgetExplorer : public QGLWidget { Q_OBJECT public: - WidgetExplorer(QWidget* parent, CameraDefinition* camera, Renderer* renderer=0); + WidgetExplorer(QWidget* parent, CameraDefinition* camera, SoftwareRenderer* renderer=0); ~WidgetExplorer(); void performChunksMaintenance(); @@ -45,7 +42,7 @@ private: CameraDefinition* _base_camera; OpenGLRenderer* _opengl_renderer; - Renderer* _renderer; + SoftwareRenderer* _renderer; bool _renderer_created; bool _inited; bool _updated; diff --git a/src/render/opengl/opengl_global.h b/src/render/opengl/opengl_global.h index aedbb9b..19fa590 100644 --- a/src/render/opengl/opengl_global.h +++ b/src/render/opengl/opengl_global.h @@ -14,6 +14,8 @@ namespace paysages { namespace opengl { class WidgetExplorer; + class OpenGLRenderer; + class BaseExplorerChunk; } } using namespace paysages::opengl; diff --git a/src/rendering/Scenery.cpp b/src/rendering/Scenery.cpp index 749481e..ee38f56 100644 --- a/src/rendering/Scenery.cpp +++ b/src/rendering/Scenery.cpp @@ -92,7 +92,9 @@ void Scenery::load(PackStream* stream) void Scenery::validate() { - // TODO Ensure camera is above ground and water + BaseDefinition::validate(); + + checkCameraAboveGround(); } void Scenery::autoPreset(int seed) @@ -128,6 +130,7 @@ void Scenery::getAtmosphere(AtmosphereDefinition* atmosphere) void Scenery::setCamera(CameraDefinition* camera) { camera->copy(this->camera); + checkCameraAboveGround(); } void Scenery::getCamera(CameraDefinition* camera) @@ -218,6 +221,18 @@ void Scenery::bindToRenderer(Renderer* renderer) WaterRendererClass.bind(renderer, water); } +void Scenery::checkCameraAboveGround() +{ + Vector3 camera_location = camera->getLocation(); + double terrain_height = terrainGetInterpolatedHeight(terrain, camera_location.x, camera_location.z, 1, 1) + 0.5; + double water_height = terrainGetWaterHeight(terrain) + 0.5; + if (camera_location.y < water_height || camera_location.y < terrain_height) + { + double diff = ((water_height > terrain_height) ? water_height : terrain_height) - camera_location.y; + camera->setLocation(camera_location.add(Vector3(0.0, diff, 0.0))); + } +} + // Transitional C-API void sceneryRenderFirstPass(Renderer* renderer) diff --git a/src/rendering/Scenery.h b/src/rendering/Scenery.h index fe0fb64..41d2704 100644 --- a/src/rendering/Scenery.h +++ b/src/rendering/Scenery.h @@ -61,6 +61,8 @@ public: void bindToRenderer(Renderer* renderer); + void checkCameraAboveGround(); + private: AtmosphereDefinition* atmosphere; CameraDefinition* camera;