Issue/2227 - Option to just specify a scene graph node in profile editor camera dialog (#2699)

* Add profile edit to start camera at a given scene graph node

* Restructure some navigation code to allow computing camera pose from node

* Delay computation of camera pose for node spec as well... And give NodeInfo a more extensive name (The objects may move during the frame, making the computed pose invalid)

* Update to make scene graph node first option in editor

* Add some description to each tab in the camera dialog

* Add operator== for CameraGoToNode struct to make the unit tests compile

* Add version handling for new profile version

* Add option to specify an optional height

* Update current version constant, for old test cases to go through successfully

* Add some test files

Note that apparently, the profile loading does not check the values of the individual fields, just existence, and type. So added two test cases that are not currently checked.

---------

Co-authored-by: Alexander Bock <mail@alexanderbock.eu>
This commit is contained in:
Emma Broman
2023-05-24 11:22:41 +02:00
committed by GitHub
parent 24f9acf903
commit c949a9892c
21 changed files with 695 additions and 269 deletions

View File

@@ -53,6 +53,7 @@ namespace openspace::interaction {
struct JoystickInputStates;
struct NavigationState;
struct NodeCameraStateSpec;
struct WebsocketInputStates;
class KeyframeNavigator;
class OrbitalNavigator;
@@ -146,7 +147,23 @@ public:
void loadNavigationState(const std::string& filepath);
void setNavigationStateNextFrame(NavigationState state);
/**
* Set camera state from a provided navigation state next frame. The actual position
* will computed from the scene in the same frame as it is set.
*
* \param state the navigation state to compute a camera positon from
*/
void setNavigationStateNextFrame(const NavigationState& state);
/**
* Set camera state from a provided node based camera specification structure, next
* frame. The camera position will be computed to look at the node provided in the
* node info. The actual position will computed from the scene in the same frame as
* it is set.
*
* \param spec the node specification from which to compute the resulting camera pose
*/
void setCameraFromNodeSpecNextFrame(NodeCameraStateSpec spec);
/**
* \return The Lua library that contains all Lua functions available to affect the
@@ -155,7 +172,7 @@ public:
static scripting::LuaLibrary luaLibrary();
private:
void applyNavigationState(const NavigationState& ns);
void applyPendingState();
void updateCameraTransitions();
void clearGlobalJoystickStates();
@@ -172,7 +189,7 @@ private:
KeyframeNavigator _keyframeNavigator;
PathNavigator _pathNavigator;
std::optional<NavigationState> _pendingNavigationState;
std::optional<std::variant<NodeCameraStateSpec, NavigationState>> _pendingState;
properties::BoolProperty _disableKeybindings;
properties::BoolProperty _disableMouseInputs;

View File

@@ -27,6 +27,7 @@
#include <openspace/camera/camerapose.h>
#include <ghoul/glm.h>
#include <optional>
#include <string>
namespace openspace { class SceneGraphNode; }
@@ -51,10 +52,42 @@ public:
private:
CameraPose _pose;
std::string _nodeIdentifier;
// to be able to handle nodes with faulty bounding spheres
// To be able to handle nodes with faulty bounding spheres
double _validBoundingSphere = 0.0;
};
/**
* Compute a waypoint from the current camera position.
*
* \return the computed WayPoint
*/
Waypoint waypointFromCamera();
struct NodeCameraStateSpec {
std::string identifier;
std::optional<glm::dvec3> position;
std::optional<double> height;
bool useTargetUpDirection = false;
};
// @TODO (2023-05-16, emmbr) Allow different light sources, not only the 'Sun'
/**
* Compute a waypoint from information about a scene graph node and a previous waypoint,
* where the camera will be facing the given node. If there is a 'Sun' node in the scene,
* it will possibly be used to compute a position on the lit side of the object.
*
* \param spec details about the node and state to create the waypoint from. Minimal
* information is the identifier of the node, but a position or height
* above the bounding sphere may also be given.
* \param startPoint an optional previous waypoint. If not specified, the current camera
* position will be used.
* \param userLinear if true, the new waypoint will be computed along a straight line
* from the start waypoint to the scene graph node or position.
* \return the computed WayPoint
*/
Waypoint computeWaypointFromNodeInfo(const NodeCameraStateSpec& spec,
std::optional<Waypoint> startPoint = std::nullopt, bool useLinear = false);
} // namespace openspace::interaction
#endif // __OPENSPACE_CORE___WAYPOINT___H__

View File

@@ -106,6 +106,13 @@ public:
bool startPaused = false;
};
struct CameraGoToNode {
static constexpr std::string_view Type = "goToNode";
std::string anchor;
std::optional<double> height;
};
struct CameraNavState {
static constexpr std::string_view Type = "setNavigationState";
@@ -127,7 +134,7 @@ public:
std::optional<double> altitude;
};
using CameraType = std::variant<CameraNavState, CameraGoToGeo>;
using CameraType = std::variant<CameraGoToNode, CameraNavState, CameraGoToGeo>;
Profile() = default;
explicit Profile(const std::string& content);
@@ -147,7 +154,7 @@ public:
/// Removes an asset unless the `ignoreUpdates` member is set to `true`
void removeAsset(const std::string& path);
static constexpr Version CurrentVersion = Version{ 1, 2 };
static constexpr Version CurrentVersion = Version{ 1, 3 };
Version version = CurrentVersion;
std::vector<Module> modules;