From 9b71a236415fe5a92c5f6c8b05b56e65b08be7bf Mon Sep 17 00:00:00 2001
From: Sebastian Pape <Sebastian.Pape@rwth-aachen.de>
Date: Mon, 3 Sep 2018 14:24:03 +0200
Subject: [PATCH] Added highlighting of grips for the two helpers

---
 demos/optical_bench/src/rotation_helper.cpp   |  63 +++++++++-
 demos/optical_bench/src/rotation_helper.hpp   |   7 ++
 .../optical_bench/src/translation_helper.cpp  | 118 +++++++++++++++---
 .../optical_bench/src/translation_helper.hpp  |  11 ++
 4 files changed, 179 insertions(+), 20 deletions(-)

diff --git a/demos/optical_bench/src/rotation_helper.cpp b/demos/optical_bench/src/rotation_helper.cpp
index 5a3bfe0d..040b29ed 100644
--- a/demos/optical_bench/src/rotation_helper.cpp
+++ b/demos/optical_bench/src/rotation_helper.cpp
@@ -101,7 +101,7 @@ RotationHelper::RotationHelper(phx::Scene* scene) {
     static char deg[] = "000�";
     float degr = -glm::degrees(angle_horizontal_);
     if (degr < 0) degr += 360.0f;
-    snprintf(deg, sizeof(deg), "%.0f�", glm::round(degr));
+    snprintf(deg, sizeof(deg), "%d�", ((int)glm::round(degr) % 360));
     text_node_h->SetText(std::string(deg));
   });
   text_node_h->SetBillboard(true);
@@ -116,7 +116,7 @@ RotationHelper::RotationHelper(phx::Scene* scene) {
     static char deg[] = "000�";
     float degr = glm::degrees(angle_vertical_);
     if (degr < 0) degr += 360.0f;
-    snprintf(deg, sizeof(deg), "%.0f�", glm::round(degr));
+    snprintf(deg, sizeof(deg), "%d�", ((int)glm::round(degr) % 360));
     text_node_v->SetText(std::string(deg));
   });
   text_node_v->SetBillboard(true);
@@ -195,6 +195,65 @@ RotationHelper::RotationHelper(phx::Scene* scene) {
 
     text_node_v->ManualUpdate();
   });
+
+  // highlight stuff
+  vertical_rod_ball_color_ =
+      vertical_rod_ball_->GetFirstComponent<phx::MaterialHandle>()
+          ->GetMaterial()
+          ->GetAmbientColor();
+  select_v->SetHover([this](glm::mat4, std::chrono::milliseconds) {
+    vertical_rod_ball_hovered_ = true;
+    if (vertical_rod_ball_grabbed_) return;
+    vertical_rod_ball_->GetFirstComponent<phx::MaterialHandle>()
+        ->GetMaterial()
+        ->SetAmbientColor(
+            glm::mix(vertical_rod_ball_color_, glm::vec3(1), 0.3f));
+  });
+  select_v->SetUnhover([this]() {
+    vertical_rod_ball_hovered_ = false;
+    if (vertical_rod_ball_grabbed_) return;
+    vertical_rod_ball_->GetFirstComponent<phx::MaterialHandle>()
+        ->GetMaterial()
+        ->SetAmbientColor(vertical_rod_ball_color_);
+  });
+  select_v->SetGrab([this, select_v](phx::Transform*, glm::mat4 r) {
+    if (!vertical_rod_ball_hovered_)
+      select_v->Hover(r, std::chrono::milliseconds());
+    vertical_rod_ball_grabbed_ = true;
+  });
+  select_v->SetRelease([this, select_v]() {
+    vertical_rod_ball_grabbed_ = false;
+    if (!vertical_rod_ball_hovered_) select_v->Unhover();
+  });
+
+  horizontal_rod_ball_color_ =
+      horizontal_rod_ball_->GetFirstComponent<phx::MaterialHandle>()
+          ->GetMaterial()
+          ->GetAmbientColor();
+  select_h->SetHover([this](glm::mat4, std::chrono::milliseconds) {
+    horizontal_rod_ball_hovered_ = true;
+    if (horizontal_rod_ball_grabbed_) return;
+    horizontal_rod_ball_->GetFirstComponent<phx::MaterialHandle>()
+        ->GetMaterial()
+        ->SetAmbientColor(
+            glm::mix(horizontal_rod_ball_color_, glm::vec3(1), 0.3f));
+  });
+  select_h->SetUnhover([this]() {
+    horizontal_rod_ball_hovered_ = false;
+    if (horizontal_rod_ball_grabbed_) return;
+    horizontal_rod_ball_->GetFirstComponent<phx::MaterialHandle>()
+        ->GetMaterial()
+        ->SetAmbientColor(horizontal_rod_ball_color_);
+  });
+  select_h->SetGrab([this, select_h](phx::Transform*, glm::mat4 r) {
+    if (!horizontal_rod_ball_hovered_)
+      select_h->Hover(r, std::chrono::milliseconds());
+    horizontal_rod_ball_grabbed_ = true;
+  });
+  select_h->SetRelease([this, select_h]() {
+    horizontal_rod_ball_grabbed_ = false;
+    if (!horizontal_rod_ball_hovered_) select_h->Unhover();
+  });
 }
 
 RotationHelper::~RotationHelper() {}
diff --git a/demos/optical_bench/src/rotation_helper.hpp b/demos/optical_bench/src/rotation_helper.hpp
index b96936bf..01603912 100644
--- a/demos/optical_bench/src/rotation_helper.hpp
+++ b/demos/optical_bench/src/rotation_helper.hpp
@@ -61,6 +61,13 @@ class RotationHelper {
   phx::Entity* root_;
   phx::Transform* parent_;
 
+  glm::vec3 vertical_rod_ball_color_;
+  glm::vec3 horizontal_rod_ball_color_;
+  bool vertical_rod_ball_grabbed_ = false;
+  bool vertical_rod_ball_hovered_ = false;
+  bool horizontal_rod_ball_grabbed_ = false;
+  bool horizontal_rod_ball_hovered_ = false;
+
   float angle_horizontal_ = 0;
   float angle_vertical_ = 0;
 
diff --git a/demos/optical_bench/src/translation_helper.cpp b/demos/optical_bench/src/translation_helper.cpp
index d1f9951d..cfedb177 100644
--- a/demos/optical_bench/src/translation_helper.cpp
+++ b/demos/optical_bench/src/translation_helper.cpp
@@ -126,11 +126,27 @@ TranslationHelper::TranslationHelper(phx::Scene* scene, phx::Engine* engine) {
   text_trans->SetParent(x_rod_grip_->GetFirstComponent<phx::Transform>(),
                         false);
 
-  selector_x->SetGrab([this, text_trans](phx::Transform*, glm::mat4) {
-    x_grip_start_ = parent_->GetGlobalTranslation().x;
-    text_trans->SetParent(x_rod_grip_->GetFirstComponent<phx::Transform>(),
-                          false);
-  });
+  // store colors
+  x_rod_grip_color_ = x_rod_grip_->GetFirstComponent<phx::MaterialHandle>()
+                          ->GetMaterial()
+                          ->GetAmbientColor();
+  y_rod_grip_color_ = y_rod_grip_->GetFirstComponent<phx::MaterialHandle>()
+                          ->GetMaterial()
+                          ->GetAmbientColor();
+  z_rod_grip_color_ = z_rod_grip_->GetFirstComponent<phx::MaterialHandle>()
+                          ->GetMaterial()
+                          ->GetAmbientColor();
+
+  selector_x->SetGrab(
+      [this, text_trans, selector_x](phx::Transform*, glm::mat4 r) {
+        x_grip_start_ = parent_->GetGlobalTranslation().x;
+        text_trans->SetParent(x_rod_grip_->GetFirstComponent<phx::Transform>(),
+                              false);
+
+        if (!x_rod_grip_hovered_)
+          selector_x->Hover(r, std::chrono::milliseconds());
+        x_rod_grip_grabbed_ = true;
+      });
   selector_x->SetMove([this, text_node](phx::Transform* t, glm::mat4 r) {
     auto pos = glm::vec3(1, 0, 0) * (glm::vec3((t->GetGlobalMatrix() * r)[3]));
 
@@ -152,18 +168,26 @@ TranslationHelper::TranslationHelper(phx::Scene* scene, phx::Engine* engine) {
 
     text_node->ManualUpdate();
   });
-  selector_x->SetRelease([this]() {
+  selector_x->SetRelease([this, selector_x]() {
     x_rod_grip_->GetFirstComponent<phx::Transform>()->SetLocalTranslation(
         glm::vec3(kGripOffset_, 0, 0));
     x_rod_->GetFirstComponent<phx::Transform>()->SetLocalScale(
         glm::vec3(kGripOffset_, 1, 1));
-  });
 
-  selector_y->SetGrab([this, text_trans](phx::Transform*, glm::mat4) {
-    y_grip_start_ = parent_->GetGlobalTranslation().y;
-    text_trans->SetParent(y_rod_grip_->GetFirstComponent<phx::Transform>(),
-                          false);
+    x_rod_grip_grabbed_ = false;
+    if (!x_rod_grip_hovered_) selector_x->Unhover();
   });
+
+  selector_y->SetGrab(
+      [this, text_trans, selector_y](phx::Transform*, glm::mat4 r) {
+        y_grip_start_ = parent_->GetGlobalTranslation().y;
+        text_trans->SetParent(y_rod_grip_->GetFirstComponent<phx::Transform>(),
+                              false);
+
+        if (!y_rod_grip_hovered_)
+          selector_y->Hover(r, std::chrono::milliseconds());
+        y_rod_grip_grabbed_ = true;
+      });
   selector_y->SetMove([this, text_node](phx::Transform* t, glm::mat4 r) {
     auto pos = glm::vec3(0, 1, 0) * (glm::vec3((t->GetGlobalMatrix() * r)[3]));
 
@@ -187,18 +211,26 @@ TranslationHelper::TranslationHelper(phx::Scene* scene, phx::Engine* engine) {
 
     text_node->ManualUpdate();
   });
-  selector_y->SetRelease([this]() {
+  selector_y->SetRelease([this, selector_y]() {
     y_rod_grip_->GetFirstComponent<phx::Transform>()->SetLocalTranslation(
         glm::vec3(0, kGripOffset_, 0));
     y_rod_->GetFirstComponent<phx::Transform>()->SetLocalScale(
         glm::vec3(1, kGripOffset_, 1));
-  });
 
-  selector_z->SetGrab([this, text_trans](phx::Transform*, glm::mat4) {
-    z_grip_start_ = parent_->GetGlobalTranslation().z;
-    text_trans->SetParent(z_rod_grip_->GetFirstComponent<phx::Transform>(),
-                          false);
+    y_rod_grip_grabbed_ = false;
+    if (!y_rod_grip_hovered_) selector_y->Unhover();
   });
+
+  selector_z->SetGrab(
+      [this, text_trans, selector_z](phx::Transform*, glm::mat4 r) {
+        z_grip_start_ = parent_->GetGlobalTranslation().z;
+        text_trans->SetParent(z_rod_grip_->GetFirstComponent<phx::Transform>(),
+                              false);
+
+        if (!z_rod_grip_hovered_)
+          selector_z->Hover(r, std::chrono::milliseconds());
+        z_rod_grip_grabbed_ = true;
+      });
   selector_z->SetMove([this, text_node](phx::Transform* t, glm::mat4 r) {
     auto pos = glm::vec3(0, 0, 1) * (glm::vec3((t->GetGlobalMatrix() * r)[3]));
 
@@ -220,11 +252,61 @@ TranslationHelper::TranslationHelper(phx::Scene* scene, phx::Engine* engine) {
 
     text_node->ManualUpdate();
   });
-  selector_z->SetRelease([this]() {
+  selector_z->SetRelease([this, selector_z]() {
     z_rod_grip_->GetFirstComponent<phx::Transform>()->SetLocalTranslation(
         glm::vec3(0, 0, kGripOffset_));
     z_rod_->GetFirstComponent<phx::Transform>()->SetLocalScale(
         glm::vec3(1, 1, kGripOffset_));
+
+    z_rod_grip_grabbed_ = false;
+    if (!z_rod_grip_hovered_) selector_z->Unhover();
+  });
+
+  // highlight stuff
+
+  selector_x->SetHover([this](glm::mat4, std::chrono::milliseconds) {
+    x_rod_grip_hovered_ = true;
+    if (x_rod_grip_grabbed_) return;
+    x_rod_grip_->GetFirstComponent<phx::MaterialHandle>()
+        ->GetMaterial()
+        ->SetAmbientColor(glm::mix(x_rod_grip_color_, glm::vec3(1), 0.3f));
+  });
+  selector_x->SetUnhover([this]() {
+    x_rod_grip_hovered_ = false;
+    if (x_rod_grip_grabbed_) return;
+    x_rod_grip_->GetFirstComponent<phx::MaterialHandle>()
+        ->GetMaterial()
+        ->SetAmbientColor(x_rod_grip_color_);
+  });
+
+  selector_y->SetHover([this](glm::mat4, std::chrono::milliseconds) {
+    y_rod_grip_hovered_ = true;
+    if (y_rod_grip_grabbed_) return;
+    y_rod_grip_->GetFirstComponent<phx::MaterialHandle>()
+        ->GetMaterial()
+        ->SetAmbientColor(glm::mix(y_rod_grip_color_, glm::vec3(1), 0.3f));
+  });
+  selector_y->SetUnhover([this]() {
+    y_rod_grip_hovered_ = false;
+    if (y_rod_grip_grabbed_) return;
+    y_rod_grip_->GetFirstComponent<phx::MaterialHandle>()
+        ->GetMaterial()
+        ->SetAmbientColor(y_rod_grip_color_);
+  });
+
+  selector_z->SetHover([this](glm::mat4, std::chrono::milliseconds) {
+    z_rod_grip_hovered_ = true;
+    if (z_rod_grip_grabbed_) return;
+    z_rod_grip_->GetFirstComponent<phx::MaterialHandle>()
+        ->GetMaterial()
+        ->SetAmbientColor(glm::mix(z_rod_grip_color_, glm::vec3(1), 0.3f));
+  });
+  selector_z->SetUnhover([this]() {
+    z_rod_grip_hovered_ = false;
+    if (z_rod_grip_grabbed_) return;
+    z_rod_grip_->GetFirstComponent<phx::MaterialHandle>()
+        ->GetMaterial()
+        ->SetAmbientColor(z_rod_grip_color_);
   });
 }
 
diff --git a/demos/optical_bench/src/translation_helper.hpp b/demos/optical_bench/src/translation_helper.hpp
index 491176db..03e46044 100644
--- a/demos/optical_bench/src/translation_helper.hpp
+++ b/demos/optical_bench/src/translation_helper.hpp
@@ -73,6 +73,17 @@ class TranslationHelper {
   float y_grip_start_ = 0;
   float z_grip_start_ = 0;
 
+  // for highlights
+  glm::vec3 x_rod_grip_color_;
+  glm::vec3 y_rod_grip_color_;
+  glm::vec3 z_rod_grip_color_;
+  bool x_rod_grip_hovered_ = false;
+  bool y_rod_grip_hovered_ = false;
+  bool z_rod_grip_hovered_ = false;
+  bool x_rod_grip_grabbed_ = false;
+  bool y_rod_grip_grabbed_ = false;
+  bool z_rod_grip_grabbed_ = false;
+
   phx::Entity* LoadAndInsertMesh(phx::Scene* scene, std::string file,
                                  std::string name);
 };
-- 
GitLab