From 41a3956bbdd8371a9cef96847e186dd546900999 Mon Sep 17 00:00:00 2001
From: Nicolas Pope <nwpope@utu.fi>
Date: Sat, 16 May 2020 19:54:39 +0300
Subject: [PATCH] Allow a pose shape to be used for v cam

---
 applications/gui/src/camera.cpp               | 42 ++++++++----
 applications/gui/src/camera.hpp               |  1 +
 .../operators/include/ftl/operators/poser.hpp |  5 ++
 components/operators/src/poser.cpp            | 66 ++++++++++++-------
 4 files changed, 75 insertions(+), 39 deletions(-)

diff --git a/applications/gui/src/camera.cpp b/applications/gui/src/camera.cpp
index 03306b423..c207073c7 100644
--- a/applications/gui/src/camera.cpp
+++ b/applications/gui/src/camera.cpp
@@ -14,6 +14,7 @@
 #include <ftl/render/colouriser.hpp>
 #include <ftl/cuda/transform.hpp>
 #include <ftl/operators/gt_analysis.hpp>
+#include <ftl/operators/poser.hpp>
 #include <ftl/cuda/colour_cuda.hpp>
 
 #include <ftl/render/overlay.hpp>
@@ -99,6 +100,12 @@ ftl::gui::Camera::Camera(ftl::gui::Screen *screen, int fsmask, int fid, ftl::cod
 			fsmask_ = renderer_->value("fsmask", fsmask_);
 		});
 
+		// Allow Pose origin to be changed
+		pose_source_ = renderer_->value("pose_source", pose_source_);
+		renderer_->on("pose_source", [this](const ftl::config::Event &e) {
+			pose_source_ = renderer_->value("pose_source", pose_source_);
+		});
+
 		intrinsics_ = ftl::create<ftl::Configurable>(renderer_, "intrinsics");
 
 		state_.getLeft() = ftl::rgbd::Camera::from(intrinsics_);
@@ -758,25 +765,32 @@ const void ftl::gui::Camera::captureFrame() {
 			}
 			#endif
 		} else {
-			// Use mouse to move camera
+			if (pose_source_.size() == 0) {
+				// Use mouse to move camera
 
-			float rrx = ((float)ry_ * 0.2f * delta_);
-			float rry = (float)rx_ * 0.2f * delta_;
-			float rrz = 0.0;
+				float rrx = ((float)ry_ * 0.2f * delta_);
+				float rry = (float)rx_ * 0.2f * delta_;
+				float rrz = 0.0;
 
-			Eigen::Affine3d r = create_rotation_matrix(rrx, -rry, rrz);
-			rotmat_ = rotmat_ * r.matrix();
+				Eigen::Affine3d r = create_rotation_matrix(rrx, -rry, rrz);
+				rotmat_ = rotmat_ * r.matrix();
 
-			rx_ = 0;
-			ry_ = 0;
+				rx_ = 0;
+				ry_ = 0;
 
-			eye_[0] += (neye_[0] - eye_[0]) * lerpSpeed_ * delta_;
-			eye_[1] += (neye_[1] - eye_[1]) * lerpSpeed_ * delta_;
-			eye_[2] += (neye_[2] - eye_[2]) * lerpSpeed_ * delta_;
+				eye_[0] += (neye_[0] - eye_[0]) * lerpSpeed_ * delta_;
+				eye_[1] += (neye_[1] - eye_[1]) * lerpSpeed_ * delta_;
+				eye_[2] += (neye_[2] - eye_[2]) * lerpSpeed_ * delta_;
 
-			Eigen::Translation3d trans(eye_);
-			Eigen::Affine3d t(trans);
-			viewPose = t.matrix() * rotmat_;
+				Eigen::Translation3d trans(eye_);
+				Eigen::Affine3d t(trans);
+				viewPose = t.matrix() * rotmat_;
+			} else {
+				// Use some other pose source.
+				if (!ftl::operators::Poser::get(pose_source_, viewPose)) {
+					LOG(ERROR) << "Missing pose: " << pose_source_;
+				}
+			}
 		}
 
 		{
diff --git a/applications/gui/src/camera.hpp b/applications/gui/src/camera.hpp
index a14be6294..cb34ff0f7 100644
--- a/applications/gui/src/camera.hpp
+++ b/applications/gui/src/camera.hpp
@@ -148,6 +148,7 @@ class Camera {
 	bool sdepth_;
 	bool pause_;
 	bool do_snapshot_ = false;
+	std::string pose_source_;
 	std::string snapshot_filename_;
 	ftl::codecs::Channel channel_;
 	ftl::codecs::Channels<0> channels_;
diff --git a/components/operators/include/ftl/operators/poser.hpp b/components/operators/include/ftl/operators/poser.hpp
index 2b11bf9a9..96e6b1926 100644
--- a/components/operators/include/ftl/operators/poser.hpp
+++ b/components/operators/include/ftl/operators/poser.hpp
@@ -3,6 +3,7 @@
 
 #include <ftl/operators/operator.hpp>
 #include <ftl/cuda_common.hpp>
+#include <ftl/codecs/shapes.hpp>
 
 #include <unordered_map>
 
@@ -21,6 +22,8 @@ class Poser : public ftl::operators::Operator {
 
 	bool apply(ftl::rgbd::FrameSet &in, ftl::rgbd::FrameSet &out, cudaStream_t stream) override;
 
+	static bool get(const std::string &name, Eigen::Matrix4d &pose);
+
     private:
 	struct PoseState {
 		Eigen::Matrix4d pose;
@@ -29,6 +32,8 @@ class Poser : public ftl::operators::Operator {
 
     static std::unordered_map<std::string,PoseState> pose_db__;
 
+	void add(const ftl::codecs::Shape3D &t, int frameset, int frame);
+
 };
 
 }
diff --git a/components/operators/src/poser.cpp b/components/operators/src/poser.cpp
index 3d136e1c9..d03ef35fe 100644
--- a/components/operators/src/poser.cpp
+++ b/components/operators/src/poser.cpp
@@ -1,5 +1,4 @@
 #include <ftl/operators/poser.hpp>
-#include <ftl/codecs/shapes.hpp>
 
 #define LOGURU_REPLACE_GLOG 1
 #include <loguru.hpp>
@@ -19,6 +18,43 @@ Poser::~Poser() {
 
 }
 
+void Poser::add(const ftl::codecs::Shape3D &t, int frameset, int frame) {
+	std::string idstr;
+	switch(t.type) {
+	case Shape3DType::ARUCO         : idstr = "aruco-"; break;
+	case Shape3DType::CAMERA		: idstr = "camera-"; break;
+	default                         : idstr = "unk-"; break;
+	}
+
+	idstr += std::to_string(frameset) + string("-") + std::to_string(frame) + string("-") + std::to_string(t.id);
+
+	auto pose = t.pose.cast<double>();  // f.getPose() * 
+
+	auto p = pose_db__.find(idstr);
+	if (p == pose_db__.end()) {
+		ftl::operators::Poser::PoseState ps;
+		ps.pose = pose;
+		ps.locked = false;
+		pose_db__.emplace(std::make_pair(idstr,ps));
+		LOG(INFO) << "POSE ID: " << idstr;
+	} else {
+		// TODO: Merge poses
+		if (!(*p).second.locked) (*p).second.pose = pose;
+		//LOG(INFO) << "POSE ID: " << idstr;
+	}
+}
+
+bool Poser::get(const std::string &name, Eigen::Matrix4d &pose) {
+	auto p = pose_db__.find(name);
+	if (p != pose_db__.end()) {
+		pose = (*p).second.pose;
+		return true;
+	} else {
+		LOG(WARNING) << "Pose not found: " << name;
+		return false;
+	}
+}
+
 bool Poser::apply(ftl::rgbd::FrameSet &in, ftl::rgbd::FrameSet &out, cudaStream_t stream) {
     if (in.hasChannel(Channel::Shapes3D)) {
         std::vector<ftl::codecs::Shape3D> transforms;
@@ -26,9 +62,10 @@ bool Poser::apply(ftl::rgbd::FrameSet &in, ftl::rgbd::FrameSet &out, cudaStream_
 
 		//LOG(INFO) << "Found shapes 3D global: " << (int)transforms.size();
 
-        //for (auto &t : transforms) {
+        for (auto &t : transforms) {
         //    LOG(INFO) << "Have FS transform: " << t.label;
-        //}
+			add(t, in.id, 255);
+        }
     }
 
 	for (size_t i=0; i<in.frames.size(); ++i) {
@@ -42,28 +79,7 @@ bool Poser::apply(ftl::rgbd::FrameSet &in, ftl::rgbd::FrameSet &out, cudaStream_
 				//LOG(INFO) << "Found shapes 3D: " << (int)transforms.size();
 
                 for (auto &t : transforms) {
-                    std::string idstr;
-                    switch(t.type) {
-                    case Shape3DType::ARUCO         : idstr = "aruco-"; break;
-                    default                         : idstr = "unk-"; break;
-                    }
-
-                    idstr += std::to_string(in.id) + string("-") + std::to_string(i) + string("-") + std::to_string(t.id);
-
-                    auto pose = t.pose.cast<double>();  // f.getPose() * 
-
-                    auto p = pose_db__.find(idstr);
-                    if (p == pose_db__.end()) {
-						ftl::operators::Poser::PoseState ps;
-						ps.pose = pose;
-						ps.locked = false;
-						pose_db__.emplace(std::make_pair(idstr,ps));
-                        LOG(INFO) << "POSE ID: " << idstr;
-                    } else {
-                        // TODO: Merge poses
-                        if (!(*p).second.locked) (*p).second.pose = pose;
-						//LOG(INFO) << "POSE ID: " << idstr;
-                    }
+                    add(t, in.id, i);
                 }
             }
         }
-- 
GitLab