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