From 999869da24b2937939850dcd575db9a894c0af35 Mon Sep 17 00:00:00 2001 From: Aesylwinn Date: Fri, 18 Mar 2016 14:02:24 -0400 Subject: [PATCH] Position camera above, near, and looking at the scene. --- apps/opencs/view/render/cameracontroller.cpp | 8 ++++++++ apps/opencs/view/render/cameracontroller.hpp | 4 ++++ apps/opencs/view/render/scenewidget.cpp | 19 ++++++++++++++++++- apps/opencs/view/render/scenewidget.hpp | 3 +++ 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/apps/opencs/view/render/cameracontroller.cpp b/apps/opencs/view/render/cameracontroller.cpp index 8fc9c4801..7f8f9013c 100644 --- a/apps/opencs/view/render/cameracontroller.cpp +++ b/apps/opencs/view/render/cameracontroller.cpp @@ -69,6 +69,14 @@ namespace CSVRender mMouseScalar = value; } + void CameraController::setSceneBounds(const osg::BoundingBox& bounds, const osg::Vec3d& up) + { + osg::Vec3d eye = osg::Vec3d(bounds.xMax(), bounds.yMax(), bounds.zMax()); + osg::Vec3d center = bounds.center(); + + getCamera()->setViewMatrixAsLookAt(eye, center, up); + } + void CameraController::setModified() { mModified = true; diff --git a/apps/opencs/view/render/cameracontroller.hpp b/apps/opencs/view/render/cameracontroller.hpp index 44e35069b..156b1cb56 100644 --- a/apps/opencs/view/render/cameracontroller.hpp +++ b/apps/opencs/view/render/cameracontroller.hpp @@ -3,6 +3,7 @@ #include +#include #include #include @@ -41,6 +42,9 @@ namespace CSVRender void setCamera(osg::Camera*); void setMouseScalar(double value); + // moves the camera to an intelligent position + void setSceneBounds(const osg::BoundingBox& bounds, const osg::Vec3d& up); + virtual bool handleKeyEvent(QKeyEvent* event, bool pressed) = 0; virtual bool handleMouseMoveEvent(std::string mode, int x, int y) = 0; diff --git a/apps/opencs/view/render/scenewidget.cpp b/apps/opencs/view/render/scenewidget.cpp index d7049c1b5..ea282ffcd 100644 --- a/apps/opencs/view/render/scenewidget.cpp +++ b/apps/opencs/view/render/scenewidget.cpp @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include #include @@ -164,6 +166,7 @@ SceneWidget::SceneWidget(boost::shared_ptr resourceSys , mFreeCamControl(new FreeCameraController()) , mOrbitCamControl(new OrbitCameraController()) , mCurrentCamControl(mFreeCamControl.get()) + , mCamPositionSet(false) { selectNavigationMode("free"); @@ -306,7 +309,21 @@ void SceneWidget::keyReleaseEvent (QKeyEvent *event) void SceneWidget::update(double dt) { - mCurrentCamControl->update(dt); + if (mCamPositionSet) + { + mCurrentCamControl->update(dt); + } + else + { + osg::ComputeBoundsVisitor boundsVisitor; + osg::BoundingBox &boundingBox(boundsVisitor.getBoundingBox()); + + mRootNode->accept(boundsVisitor); + + mCurrentCamControl->setSceneBounds(boundingBox, CameraController::WorldUp); + + mCamPositionSet = true; + } } void SceneWidget::settingChanged (const CSMPrefs::Setting *setting) diff --git a/apps/opencs/view/render/scenewidget.hpp b/apps/opencs/view/render/scenewidget.hpp index 7dcc74047..dfda1f96c 100644 --- a/apps/opencs/view/render/scenewidget.hpp +++ b/apps/opencs/view/render/scenewidget.hpp @@ -120,6 +120,9 @@ namespace CSVRender std::map, std::string> mButtonMapping; + private: + bool mCamPositionSet; + public slots: void update(double dt);