Skip to content

Commit 6f49513

Browse files
karnkaulRinzii
authored andcommitted
Only support dragging in orientation inspector
- Turn of input-box editing via double click / Ctrl + click. - A custom implementation of quaternion <=> Euler would be required to re-enable input-box editing.
1 parent 515b68a commit 6f49513

File tree

1 file changed

+28
-22
lines changed

1 file changed

+28
-22
lines changed

lib/engine/src/editor/inspector.cpp

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
namespace facade::editor {
99
namespace {
10-
bool eq(float const a, float const b, float const epsilon = 0.001f) { return std::abs(a - b) < epsilon; }
1110
constexpr glm::vec3 to_degree(glm::vec3 const& angles) { return {glm::degrees(angles.x), glm::degrees(angles.y), glm::degrees(angles.z)}; }
1211

1312
struct Modified {
@@ -18,36 +17,41 @@ struct Modified {
1817
return modified;
1918
}
2019
};
21-
} // namespace
2220

23-
bool Inspector::inspect(char const* label, glm::vec2& out_vec2, float speed, float lo, float hi) const {
24-
float arr[2] = {out_vec2.x, out_vec2.y};
25-
ImGui::DragFloat2(label, arr, speed, lo, hi);
26-
if (!eq(arr[0], out_vec2.x) || !eq(arr[1], out_vec2.y)) {
27-
out_vec2 = {arr[0], arr[1]};
21+
using DragFloatFunc = bool (*)(const char*, float* v, float, float, float, const char*, ImGuiSliderFlags);
22+
23+
constexpr DragFloatFunc drag_float_vtable[] = {
24+
nullptr, &ImGui::DragFloat, &ImGui::DragFloat2, &ImGui::DragFloat3, &ImGui::DragFloat4,
25+
};
26+
27+
template <std::size_t Dim>
28+
bool drag_float(char const* label, float (&data)[Dim], float speed, float lo, float hi, int flags = {}) {
29+
static_assert(Dim > 0 && Dim < std::size(drag_float_vtable));
30+
return drag_float_vtable[Dim](label, data, speed, lo, hi, "%.3f", flags);
31+
}
32+
33+
template <std::size_t Dim>
34+
bool inspect_vec(char const* label, glm::vec<static_cast<int>(Dim), float>& out_vec, float speed, float lo, float hi) {
35+
float data[Dim]{};
36+
std::memcpy(data, &out_vec, Dim * sizeof(float));
37+
if (drag_float(label, data, speed, lo, hi)) {
38+
std::memcpy(&out_vec, data, Dim * sizeof(float));
2839
return true;
2940
}
3041
return false;
3142
}
43+
} // namespace
44+
45+
bool Inspector::inspect(char const* label, glm::vec2& out_vec2, float speed, float lo, float hi) const {
46+
return inspect_vec<2>(label, out_vec2, speed, lo, hi);
47+
}
3248

3349
bool Inspector::inspect(char const* label, glm::vec3& out_vec3, float speed, float lo, float hi) const {
34-
float arr[3] = {out_vec3.x, out_vec3.y, out_vec3.z};
35-
ImGui::DragFloat3(label, arr, speed, lo, hi);
36-
if (!eq(arr[0], out_vec3.x) || !eq(arr[1], out_vec3.y) || !eq(arr[2], out_vec3.z)) {
37-
out_vec3 = {arr[0], arr[1], arr[2]};
38-
return true;
39-
}
40-
return false;
50+
return inspect_vec<3>(label, out_vec3, speed, lo, hi);
4151
}
4252

4353
bool Inspector::inspect(char const* label, glm::vec4& out_vec4, float speed, float lo, float hi) const {
44-
float arr[4] = {out_vec4.x, out_vec4.y, out_vec4.z, out_vec4.w};
45-
ImGui::DragFloat4(label, arr, speed, lo, hi);
46-
if (!eq(arr[0], out_vec4.x) || !eq(arr[1], out_vec4.y) || !eq(arr[2], out_vec4.z) || !eq(arr[3], out_vec4.w)) {
47-
out_vec4 = {arr[0], arr[1], arr[2], arr[3]};
48-
return true;
49-
}
50-
return false;
54+
return inspect_vec<4>(label, out_vec4, speed, lo, hi);
5155
}
5256

5357
bool Inspector::inspect(char const* label, nvec3& out_vec3, float speed) const {
@@ -61,8 +65,10 @@ bool Inspector::inspect(char const* label, nvec3& out_vec3, float speed) const {
6165

6266
bool Inspector::inspect(char const* label, glm::quat& out_quat) const {
6367
auto euler = to_degree(glm::eulerAngles(out_quat));
68+
float deg[3] = {euler.x, euler.y, euler.z};
6469
auto const org = euler;
65-
if (inspect(label, euler, 0.5f, -180.0f, 180.0f)) {
70+
if (drag_float(label, deg, 0.5f, -180.0f, 180.0f, ImGuiSliderFlags_NoInput)) {
71+
euler = {deg[0], deg[1], deg[2]};
6672
if (auto const diff = org.x - euler.x; std::abs(diff) > 0.0f) { out_quat = glm::rotate(out_quat, glm::radians(diff), right_v); }
6773
if (auto const diff = org.y - euler.y; std::abs(diff) > 0.0f) { out_quat = glm::rotate(out_quat, glm::radians(diff), up_v); }
6874
if (auto const diff = org.z - euler.z; std::abs(diff) > 0.0f) { out_quat = glm::rotate(out_quat, glm::radians(diff), front_v); }

0 commit comments

Comments
 (0)