From 5807919ac74e23dcae18686e2e2640a1350e3d52 Mon Sep 17 00:00:00 2001 From: Kalle Bladin Date: Wed, 29 Jun 2016 10:45:26 -0400 Subject: [PATCH] Start changing camera write and restore functions. --- .../interaction/interactionhandler.h | 1 + include/openspace/util/camera.h | 6 ++-- src/interaction/interactionhandler.cpp | 27 +++++++++++++++++ src/util/camera.cpp | 29 +++++++++++++++++++ 4 files changed, 61 insertions(+), 2 deletions(-) diff --git a/include/openspace/interaction/interactionhandler.h b/include/openspace/interaction/interactionhandler.h index 2a14f3f678..2b5ef59d9b 100644 --- a/include/openspace/interaction/interactionhandler.h +++ b/include/openspace/interaction/interactionhandler.h @@ -196,6 +196,7 @@ public: void saveCameraPosition(const std::string& filepath = ""); void restoreCameraPosition(const std::string& filepath = ""); + void setCameraState(const ghoul::Dictionary& cameraDict); private: void setInteractionMode(std::shared_ptr interactionMode); diff --git a/include/openspace/util/camera.h b/include/openspace/util/camera.h index 426d4a5586..2f448dec8f 100644 --- a/include/openspace/util/camera.h +++ b/include/openspace/util/camera.h @@ -123,10 +123,12 @@ namespace openspace { void preSynchronization(); void serialize(SyncBuffer* syncBuffer); void deserialize(SyncBuffer* syncBuffer); - + void serialize(std::ostream& os) const; void deserialize(std::istream& is); - + + void setStateFromDictionary(const ghoul::Dictionary& cameraDict); + ghoul::Dictionary getStateDictionary(); /** Handles SGCT's internal matrices. Also caches a calculated viewProjection matrix. This is the data that is different for different cameras within diff --git a/src/interaction/interactionhandler.cpp b/src/interaction/interactionhandler.cpp index abececd0f5..170e94cd94 100644 --- a/src/interaction/interactionhandler.cpp +++ b/src/interaction/interactionhandler.cpp @@ -738,16 +738,35 @@ void InteractionHandler::keyboardCallback(Key key, KeyModifier modifier, KeyActi } void InteractionHandler::saveCameraPosition(const std::string& filepath) { + + if (!filepath.empty()) { auto fullpath = absPath(filepath); LDEBUG("Saving camera position: " << fullpath); + + ghoul::Dictionary cameraDict = _camera->getStateDictionary(); + auto file = ghoul::filesystem::File(fullpath.c_str()); + std::ofstream ofs(fullpath.c_str()); _camera->serialize(ofs); ofs.close(); } + } void InteractionHandler::restoreCameraPosition(const std::string& filepath) { + + /* + if (!FileSys.fileExists(filepath)) + throw ghoul::FileNotFoundError(filepath, "CameraFilePath"); + + ghoul::Dictionary cameraDict = _camera->getStateDictionary(); + ghoul::lua::loadDictionaryFromFile(filepath, cameraDict); + + _camera->setStateFromDictionary(cameraDict); + */ + + if (!filepath.empty()) { auto fullpath = absPath(filepath); LDEBUG("Reading camera position: " << fullpath); @@ -767,6 +786,14 @@ void InteractionHandler::restoreCameraPosition(const std::string& filepath) { _camera->setRotation(r); _cameraUpdatedFromScript = true; } + +} + +void InteractionHandler::setCameraState(const ghoul::Dictionary& cameraDict) { + glm::dvec3 cameraPosition; + glm::dvec4 cameraRotation; + cameraDict.getValue("CameraPosition", cameraPosition); + cameraDict.getValue("CameraRotation", cameraRotation); } void InteractionHandler::resetKeyBindings() { diff --git a/src/util/camera.cpp b/src/util/camera.cpp index 8e4ab907dc..0d0c913a89 100644 --- a/src/util/camera.cpp +++ b/src/util/camera.cpp @@ -197,6 +197,7 @@ namespace openspace { _cachedLookupVector.isDirty = true; } + void Camera::serialize(std::ostream& os) const { Vec3 p = positionVec3(); Quat q = rotationQuaternion(); @@ -212,6 +213,34 @@ namespace openspace { setPositionVec3(p); setRotation(q); } + + + void Camera::setStateFromDictionary(const ghoul::Dictionary& cameraDict) { + glm::dvec3 cameraPosition; + glm::dvec4 cameraRotation; + cameraDict.getValue("CameraPosition", cameraPosition); + cameraDict.getValue("CameraRotation", cameraRotation); + + setPositionVec3(cameraPosition); + setRotation(glm::dquat( + cameraRotation.x, cameraRotation.y, cameraRotation.z, cameraRotation.w)); + } + + ghoul::Dictionary Camera::getStateDictionary() { + glm::dvec3 cameraPosition; + glm::dquat quat; + glm::dvec4 cameraRotation; + + cameraPosition = positionVec3(); + quat = rotationQuaternion(); + cameraRotation = glm::dvec4(quat.x, quat.y, quat.z, quat.w); + + ghoul::Dictionary cameraDict; + cameraDict.setValue("CameraPosition", cameraPosition); + cameraDict.setValue("CameraRotation", cameraRotation); + + return cameraDict; + } void Camera::preSynchronization() { std::lock_guard _lock(_mutex);