diff options
author | quou <quou@disroot.org> | 2025-01-27 22:08:52 +1100 |
---|---|---|
committer | quou <quou@disroot.org> | 2025-01-27 22:08:52 +1100 |
commit | 2e8c011f07fd75449edbb02ee9ed5bd191097fd9 (patch) | |
tree | 25b2d0b47c1094c7ad8cd85524c8cea83b180c9b | |
parent | 78c3bac3c690d48e9e751890c38769c785fadf50 (diff) |
translation gizmo (still buggy tho)
-rw-r--r-- | c2.cpp | 37 | ||||
-rw-r--r-- | editor.cpp | 111 | ||||
-rw-r--r-- | editor.hpp | 1 |
3 files changed, 132 insertions, 17 deletions
@@ -752,6 +752,23 @@ struct C2 : public App { transf.mat = m4f::identity(); rbf.init(floor_col, v3f(0.0f), quat::identity(), 0.0f); } + world->get<Transform>(monkey).mat = m4f::translate( + m4f::identity(), + v3f(0.0f, 0.0f, 0.0f) + ); + world->get<Transform>(monkey2).mat = m4f::translate( + m4f::identity(), + v3f(2.0f, 0.0f, 2.0f) + ) * m4f::rotate( + m4f::identity(), + 0.5f, + v3f(1.0f, 0.0f, 0.0f) + ); + { + auto& es = editor_settings(); + es.debug_physics = true; + es.pause_physics = true; + } } void on_update() override { @@ -760,6 +777,8 @@ struct C2 : public App { Arena frame_arena; init_arena(&frame_arena, per_frame, per_frame_memory_size); + editor_update(*this, camera); + if (es.pause_physics) phys_dt = 0.0f; physics_update(*world, &frame_arena, phys_dt); @@ -846,22 +865,6 @@ struct C2 : public App { ctx.debug_pop(); Texture& bb = dev->get_texture(hdr_target); - world->get<Transform>(monkey).mat = m4f::translate( - m4f::identity(), - v3f(0.0f, 0.0f, 0.0f) - ) * m4f::rotate( - m4f::identity(), - rot, - raxis - ); - world->get<Transform>(monkey2).mat = m4f::translate( - m4f::identity(), - v3f(2.0f, 0.0f, 2.0f) - ) * m4f::rotate( - m4f::identity(), - rot * 2.0f, - v3f(1.0f, 0.0f, 0.0f) - ); camera.asp = (float)bb.w / (float)bb.h; camera.update_orbit(*this); camera.update(); @@ -958,7 +961,7 @@ struct C2 : public App { ctx.debug_push("debug"); pb.begin_rp(); pb.rp_target(dev->get_backbuffer(), Clear_Mode::restore); - pb.rp_depth_target(dev->get_depth_target(), Clear_Mode::restore); +// pb.rp_depth_target(dev->get_depth_target(), Clear_Mode::restore); lr.flush(camera, dev, &frame_arena, pb.build_rp()); ctx.debug_pop(); @@ -1,3 +1,4 @@ +#include "camera.hpp" #include "debugdraw.hpp" #include "editor.hpp" #include "model.hpp" @@ -7,6 +8,7 @@ extern "C" { #include "memory.h" +#include "plat.h" } static struct { @@ -24,6 +26,10 @@ static struct { Entity_Id selected; Model_Instance* selected_inst; int selected_mesh; + int hovered_axis; + int dragging_gizmo; + v3f drag_axis, drag_off; + v3f gf, gu, gr; } editor; static int mat_win_handler(UI::Element* e, const UI::Message& m) { @@ -235,6 +241,7 @@ void init_editor(UI* ui, World* world) { editor.ent_win = 0; editor.phy_win = 0; editor.world = world; + editor.dragging_gizmo = 0; zero(&editor.settings, sizeof editor.settings); } @@ -267,6 +274,110 @@ void editor_draw(Line_Renderer& lr) { editor.selected_inst->bounds[editor.selected_mesh] ); } + if (editor.selected) { + Entity_Id e = editor.selected; + World& w = *editor.world; + if (w.has<Transform>(e)) { + Transform& t = w.get<Transform>(e); + m4f& m = t.mat; + v3f p = v3f(m.m[3][0], m.m[3][1], m.m[3][2]); + v3f& f = editor.gf; + v3f& u = editor.gu; + v3f& r = editor.gr; + if (editor.hovered_axis == 1) + lr.colour(v3f(1.0f, 1.0f, 1.0f)); + else + lr.colour(v3f(1.0f, 0.0f, 0.0f)); + lr.add_arrow(p, p + f); + if (editor.hovered_axis == 2) + lr.colour(v3f(1.0f, 1.0f, 1.0f)); + else + lr.colour(v3f(0.0f, 1.0f, 0.0f)); + lr.add_arrow(p, p + u); + if (editor.hovered_axis == 3) + lr.colour(v3f(1.0f, 1.0f, 1.0f)); + else + lr.colour(v3f(0.0f, 0.0f, 1.0f)); + lr.add_arrow(p, p + r); + } + } +} + +v3f gizmo_pos(const v3f& p, const App& app, const Camera& cam) { + v2f uv = (2.0f * v2f(app.mx, app.my) - v2f(app.w, app.h)) / (float)app.h; + v4f e = + cam.get_proj().inverse() * + v4f(uv.x, uv.y, -1.0f, 1.0f); + e.z = -1.0f; e.w = 0.0f; + v4f d4 = cam.get_view().inverse() * e; + v3f d = v3f::normalised(v3f(d4.x, d4.y, d4.z)); + v3f n = v3f::perp(editor.drag_axis); + float denom = v3f::dot(n, d); + v3f o = cam.position + cam.near * cam.forward; + float t = v3f::dot(p - o, n) / denom; + return (o + t * d) * editor.drag_axis; +} + +void editor_update(const App& app, const Camera& cam) { + Entity_Id e = editor.selected; + World& w = *editor.world; + if (!e || !w.has<Transform>(e)) + return; + Transform& t = w.get<Transform>(e); + m4f& m = t.mat; + v3f p = v3f(m.m[3][0], m.m[3][1], m.m[3][2]); + auto vp = cam.get_proj() * cam.get_view(); + if (editor.dragging_gizmo) { + auto gp = gizmo_pos(p, app, cam) + editor.drag_off; + m.m[3][0] += (gp.x - m.m[3][0]) * editor.drag_axis.x; + m.m[3][1] += (gp.y - m.m[3][1]) * editor.drag_axis.y; + m.m[3][2] += (gp.z - m.m[3][2]) * editor.drag_axis.z; + if (app.mjr(mbtn_left)) + editor.dragging_gizmo = 0; + return; + } + editor.hovered_axis = 0; + editor.gf = v3f::normalised((m * v4f(0.0f, 0.0f, 1.0f, 0.0f)).xyz()); + editor.gu = v3f::normalised((m * v4f(0.0f, 1.0f, 0.0f, 0.0f)).xyz()); + editor.gr = v3f::normalised((m * v4f(1.0f, 0.0f, 0.0f, 0.0f)).xyz()); + auto do_axis = [&](const v3f& axis) { + v4f sss4 = vp * v4f(p, 1.0f); + v4f sse4 = vp * v4f(p + axis, 1.0f); + if (sss4.w < 0.0f || sse4.w < 0.0f) return false; + float mx = app.mx; + float my = app.my; + v3f sss = sss4.xyz() / sss4.w; + v3f sse = sse4.xyz() / sse4.w; + v3f s = v3f(app.w, app.h, 1.0f); + sss = (sss * 0.5f + 0.5f) * s; + sse = (sse * 0.5f + 0.5f) * s; + float d = fabsf((sse.y - sss.y) * mx - (sse.x - sss.x) * my + sse.x * sss.y - sse.y * sss.x); + d /= v2f::mag(sse.xy() - sss.xy()); + if (d < 8.0f) { + v2f mini( INFINITY, INFINITY); + v2f maxi(-INFINITY, -INFINITY); + if (sss.x < mini.x) mini.x = sss.x; + if (sss.y < mini.y) mini.y = sss.y; + if (sse.x < mini.x) mini.x = sse.x; + if (sse.y < mini.y) mini.y = sse.y; + if (sss.x > maxi.x) maxi.x = sss.x; + if (sss.y > maxi.y) maxi.y = sss.y; + if (sse.x > maxi.x) maxi.x = sse.x; + if (sse.y > maxi.y) maxi.y = sse.y; + if (mx > mini.x && my > mini.y && mx < maxi.x && my < maxi.y) { + if (app.mjp(mbtn_left)) { + editor.drag_axis = axis; + editor.drag_off = p - gizmo_pos(p, app, cam); + editor.dragging_gizmo = 1; + } + return true; + } + } + return false; + }; + if (do_axis(editor.gf)) { editor.hovered_axis = 1; return; } + if (do_axis(editor.gu)) { editor.hovered_axis = 2; return; } + if (do_axis(editor.gr)) { editor.hovered_axis = 3; return; } } Editor_Settings& editor_settings() { @@ -15,6 +15,7 @@ struct Editor_Settings { void init_editor(UI* ui, World* w); void deinit_editor(); void editor_on_select(Entity_Id e, int m); +void editor_update(const App& app, const Camera& cam); void editor_draw(Line_Renderer& lr); Editor_Settings& editor_settings(); |