From 6b00d4846e8c457068cfd1b9db69a0eb311e2809 Mon Sep 17 00:00:00 2001 From: TheNumbat <mjslater@andrew.cmu.edu> Date: Tue, 27 Apr 2021 11:32:10 -0700 Subject: [PATCH] some updates --- src/gui/manager.h | 2 +- src/gui/widgets.cpp | 60 +++++++++++++++++++++------------------------ 2 files changed, 29 insertions(+), 33 deletions(-) diff --git a/src/gui/manager.h b/src/gui/manager.h index 01180ac..bd2fdbb 100644 --- a/src/gui/manager.h +++ b/src/gui/manager.h @@ -36,7 +36,7 @@ struct Color { RGBv(red, 163, 66, 81); RGBv(green, 124, 172, 40); RGBv(blue, 64, 127, 193); - RGBv(yellow, 255, 223, 0); + RGBv(yellow, 238, 221, 79); RGBv(hoverg, 102, 204, 102); static Vec3 axis(Axis a); }; diff --git a/src/gui/widgets.cpp b/src/gui/widgets.cpp index e57a968..3da1332 100644 --- a/src/gui/widgets.cpp +++ b/src/gui/widgets.cpp @@ -41,7 +41,7 @@ Widgets::Widgets() : lines(1.0f) { y_scl = Scene_Object((Scene_ID)Widget_IDs::y_scl, {}, Util::scale_mesh()); z_scl = Scene_Object((Scene_ID)Widget_IDs::z_scl, Pose::rotated(Vec3{90.0f, 0.0f, 0.0f}), Util::scale_mesh()); - xyz_scl = Scene_Object((Scene_ID)Widget_IDs::xyz_scl, Pose::moved(Vec3{1.0f}), Util::cube_mesh(0.15f)); + xyz_scl = Scene_Object((Scene_ID)Widget_IDs::xyz_scl, {}, Util::cube_mesh(0.15f)); #define setcolor(o, c) o.material.opt.albedo = Spectrum((c).x, (c).y, (c).z); setcolor(x_mov, Color::red); @@ -73,9 +73,9 @@ void Widgets::generate_lines(Vec3 pos) { add_axis(((int)axis + 1) % 3); add_axis(((int)axis + 2) % 3); } else if(univ_scl) { - add_axis((int)axis); - add_axis(((int)axis)+1)%3); - add_axis(((int)axis)+2)%3); + add_axis(0); + add_axis(1); + add_axis(2); } else { add_axis((int)axis); } @@ -159,7 +159,7 @@ void Widgets::render(const Mat4& view, Vec3 pos, float scl) { z_scl.render(view, true); xyz_scl.pose.scale = scale; - xyz_scl.pose.pos = pos + Vec3(0.15f*scl, 0.15f*scl, 0.15f*scl); + xyz_scl.pose.pos = pos; xyz_scl.render(view, true); } } @@ -234,36 +234,30 @@ bool Widgets::to_axis(Vec3 obj_pos, Vec3 cam_pos, Vec3 dir, Vec3& hit) { bool Widgets::to_axis3(Vec3 obj_pos, Vec3 cam_pos, Vec3 dir, Vec3& hit) { - Vec3 axis1; - axis1[(int)axis] = 1.0f; - Vec3 axis2; - axis2[((int)axis + 1) % 3] = 1.0f; - Vec3 axis3; - axis3[((int)axis + 2) % 3] = 1.0f; + Vec3 axis1{1.0f, 0.0f, 0.0f}; + Vec3 axis2{0.0f, 1.0f, 0.0f}; + Vec3 axis3{0.0f, 0.0f, 1.0f}; Line select(cam_pos, dir); Line target(obj_pos, axis1); + + Plane k(obj_pos, axis1); Plane l(obj_pos, axis2); Plane r(obj_pos, axis3); - Plane k(obj_pos, axis); Vec3 hit1, hit2, hit3; - bool hl = l.hit(select, hit1); - bool hr = r.hit(select, hit2); - bool hk = k.hit(select, hit3); - if(!hl && !hr && !hk) - return false; - else if(!hl && !hk) - hit = hit2; - else if(!hr && !hk) - hit = hit1; - else if(!hl && !hr) - hit = hit3; - else { - Vec3 temp = (hit1 - cam_pos).norm() > (hit2 - cam_pos).norm() ? hit2 : hit1; - hit = (temp - cam_pos).norm() > (hit3 - cam_pos).norm() ? hit3 : temp; - } - hit = target.closest(hit); + bool hk = k.hit(select, hit1); + bool hl = l.hit(select, hit2); + bool hr = r.hit(select, hit3); + + if(!hl && !hr && !hk) return false; + + Vec3 close{FLT_MAX}; + if(hk && (hit1 - cam_pos).norm() < (close - cam_pos).norm()) close = hit1; + if(hl && (hit2 - cam_pos).norm() < (close - cam_pos).norm()) close = hit2; + if(hr && (hit3 - cam_pos).norm() < (close - cam_pos).norm()) close = hit3; + + hit = close; return hit.valid(); } @@ -306,15 +300,14 @@ void Widgets::start_drag(Vec3 pos, Vec3 cam, Vec2 spos, Vec3 dir) { good = to_plane(pos, cam, dir, norm, hit); else if(univ_scl) good = to_axis3(pos, cam, dir, hit); - else + else good = to_axis(pos, cam, dir, hit); if(!good) return; if(active == Widget_Type::bevel) { bevel_start = bevel_end = spos; - } - if(active == Widget_Type::move) { + } else if(active == Widget_Type::move) { drag_start = drag_end = hit; } else { drag_start = hit; @@ -359,6 +352,8 @@ void Widgets::drag_to(Vec3 pos, Vec3 cam, Vec2 spos, Vec3 dir, bool scale_invert if(drag_plane) good = to_plane(pos, cam, dir, norm, hit); + else if(univ_scl) + good = to_axis3(pos, cam, dir, hit); else good = to_axis(pos, cam, dir, hit); @@ -367,7 +362,8 @@ void Widgets::drag_to(Vec3 pos, Vec3 cam, Vec2 spos, Vec3 dir, bool scale_invert if(active == Widget_Type::move) { drag_end = hit; } else if(univ_scl && active == Widget_Type::scale) { - drag_end = Vec3((hit - pos).norm()); + float f = (hit - pos).norm() / (drag_start - pos).norm(); + drag_end = Vec3(std::sqrt(f)); } else if(active == Widget_Type::scale) { drag_end = Vec3{1.0f}; drag_end[(int)axis] = (hit - pos).norm() / (drag_start - pos).norm(); -- GitLab