diff --git a/extern/glow-extras b/extern/glow-extras index 4b01559cc666838552b11990693b9150bdcbdda8..c1cffa010f80ab1327996c2bbe6f8bb748fae438 160000 --- a/extern/glow-extras +++ b/extern/glow-extras @@ -1 +1 @@ -Subproject commit 4b01559cc666838552b11990693b9150bdcbdda8 +Subproject commit c1cffa010f80ab1327996c2bbe6f8bb748fae438 diff --git a/samples/basic/viewer/main.cc b/samples/basic/viewer/main.cc index a93b2e5f08ff4c4e92bf5c2a882e39f2669d217f..957e5865548ffcb41397cc95f467cf94aa4fdebc 100644 --- a/samples/basic/viewer/main.cc +++ b/samples/basic/viewer/main.cc @@ -31,16 +31,16 @@ void simple_picking(pm::Mesh& m, pm::vertex_attribute<tg::pos3>& pos, pm::face_a { { // In this case a Picker is defined for the Renderable (Picking Texture filled) but no callback will be executed. - gv::view(pos, col, gv::pick(), "Picker defined without callback"); + gv::view(pos, col, gv::Picker::pick(), "Picker defined without callback"); } { // Only on_left_click callback defined - gv::view(pos, col, gv::pick().on_left_click([&](pick_id face_id, tg::pos3 world_pos, tg::vec3 normal) -> picking_result { + gv::view(pos, col, gv::Picker::pick().onLeftClick([&](pm::face_index face_id, tg::pos3 world_pos, tg::vec3 normal) -> picking_result { std::cout << "Something has been picked! ON_LEFT_CLICK" - << "ID: " << face_id.id << std::endl; - std::cout << "World_Position" << world_pos << std::endl; - std::cout << "Normal" << normal << std::endl; + << "ID: " << (int)face_id << std::endl; + std::cout << "World_Position " << world_pos << std::endl; + std::cout << "Normal " << normal << std::endl; picking_result res; res.picking_color = tg::color3::cyan; return res; @@ -50,9 +50,9 @@ void simple_picking(pm::Mesh& m, pm::vertex_attribute<tg::pos3>& pos, pm::face_a { // Only on_left_click callback defined - LineRenderable - uncolored - gv::view(gv::lines(pos), gv::pick().on_left_click([&](pick_id face_id, tg::pos3 world_pos, tg::vec3 normal) { + gv::view(gv::lines(pos), gv::Picker::pick().onLeftClick([&](pm::face_index face_id, tg::pos3 world_pos, tg::vec3 normal) { std::cout << "Something has been picked! ON_LEFT_CLICK" - << "ID: " << face_id.id << std::endl; + << "ID: " << int(face_id) << std::endl; std::cout << "World_Position" << world_pos << std::endl; std::cout << "Normal" << normal << std::endl; }), @@ -73,13 +73,13 @@ void simple_picking(pm::Mesh& m, pm::vertex_attribute<tg::pos3>& pos, pm::face_a pos2.copy_from(pos); gv::interactive([&](auto) { - gv::view(pos2, col, gv::pick().on_left_click([&](pick_id face_id, tg::pos3 world_pos, tg::vec3 normal) { + gv::view(pos2, col, gv::Picker::pick().onLeftClick([&](pm::face_index face_id, tg::pos3 world_pos, tg::vec3 normal) { std::cout << "Something has been picked! ON_LEFT_CLICK" - << "ID: " << int(face_id.f_id) << std::endl; + << "ID: " << int(face_id) << std::endl; std::cout << "World_Position" << world_pos << std::endl; std::cout << "Normal" << normal << std::endl; - face_index_i = face_id.f_id; + face_index_i = face_id; world_pos_i = world_pos; normal_i = normal; }), @@ -110,7 +110,6 @@ void simple_picking(pm::Mesh& m, pm::vertex_attribute<tg::pos3>& pos, pm::face_a { /* Picking in interactive mode with ImGui example. Does only work for MeshRenderable in the given configuration because face_indices are not included in Point- or LineRenderables.*/ - pm::vertex_index vertex_index_i; uint32_t vertex_id_i; tg::pos3 world_pos_i; @@ -127,18 +126,19 @@ void simple_picking(pm::Mesh& m, pm::vertex_attribute<tg::pos3>& pos, pm::face_a // auto pos2 = copy._Get_rest()._Myfirst._Val; gv::interactive([&](auto) { - gv::view(gv::points(pos2), gv::pick().on_left_click([&vertex_index_i, &world_pos_i, &normal_i](pick_id vertex_id, tg::pos3 world_pos, tg::vec3 normal) { - std::cout << "Something has been picked! ON_LEFT_CLICK" - << "ID: " << int(vertex_id.v_id) << std::endl; - std::cout << "World_Position" << world_pos << std::endl; - std::cout << "Normal" << normal << std::endl; + gv::view(gv::points(pos2), + gv::Picker::pick().onLeftClick([&vertex_index_i, &world_pos_i, &normal_i](pm::vertex_index vertex_id, tg::pos3 world_pos, tg::vec3 normal) { + std::cout << "Something has been picked! ON_LEFT_CLICK" + << "ID: " << int(vertex_id) << std::endl; + std::cout << "World_Position" << world_pos << std::endl; + std::cout << "Normal" << normal << std::endl; - vertex_index_i = vertex_id.v_id; - world_pos_i = world_pos; - normal_i = normal; + vertex_index_i = vertex_id; + world_pos_i = world_pos; + normal_i = normal; - return; - }), + return; + }), "picking interactive mode - PointRenderable"); ImGui::Begin("Picking"); @@ -166,9 +166,9 @@ void simple_picking(pm::Mesh& m, pm::vertex_attribute<tg::pos3>& pos, pm::face_a { // Only on_left_click callback defined - PointRenderable - uncolored - gv::view(gv::points(pos), gv::pick().on_left_click([&](pick_id face_id, tg::pos3 world_pos, tg::vec3 normal) { + gv::view(gv::points(pos), gv::Picker::pick().onLeftClick([&](pm::vertex_index vertex_id, tg::pos3 world_pos, tg::vec3 normal) { std::cout << "Something has been picked! ON_LEFT_CLICK" - << "ID: " << face_id.id << std::endl; + << "ID: " << int(vertex_id) << std::endl; std::cout << "World_Position" << world_pos << std::endl; std::cout << "Normal" << normal << std::endl; return; @@ -179,9 +179,9 @@ void simple_picking(pm::Mesh& m, pm::vertex_attribute<tg::pos3>& pos, pm::face_a { // Only on_left_click callback defined - PointRenderable - uncolored - square billboards - NOT WORKING APPROPRIATELY gv::view(gv::points(pos).point_size_world(0.03f).camera_facing().square(), - gv::pick().on_left_click([&](pick_id face_id, tg::pos3 world_pos, tg::vec3 normal) { + gv::Picker::pick().onLeftClick([&](pm::vertex_index vertex_id, tg::pos3 world_pos, tg::vec3 normal) { std::cout << "Something has been picked! ON_LEFT_CLICK" - << "ID: " << face_id.id << std::endl; + << "ID: " << int(vertex_id) << std::endl; std::cout << "World_Position" << world_pos << std::endl; std::cout << "Normal" << normal << std::endl; return; @@ -191,9 +191,9 @@ void simple_picking(pm::Mesh& m, pm::vertex_attribute<tg::pos3>& pos, pm::face_a { // Only on_right_click callback defined - gv::view(pos, col, gv::pick().on_right_click([&](pick_id face_id, tg::pos3 world_pos, tg::vec3 normal) { + gv::view(pos, col, gv::Picker::pick().onRightClick([&](pm::face_index face_id, tg::pos3 world_pos, tg::vec3 normal) { std::cout << "Something has been picked! ON_RIGHT_CLICK" - << "ID: " << face_id.id << std::endl; + << "ID: " << int(face_id) << std::endl; return; }), "picking MeshRenderable - callback on right click"); @@ -201,9 +201,9 @@ void simple_picking(pm::Mesh& m, pm::vertex_attribute<tg::pos3>& pos, pm::face_a { // Only on_hover callback defined - gv::view(pos, col, gv::pick().on_hover([&](pick_id face_id, tg::pos3 world_pos, tg::vec3 normal) { + gv::view(pos, col, gv::Picker::pick().onHover([&](pm::face_index face_id, tg::pos3 world_pos, tg::vec3 normal) { std::cout << "Something has been picked! ON_HOVER" - << "ID: " << face_id.id << std::endl; + << "ID: " << (int)face_id << std::endl; return; }), "picking MeshRenderable - callback on hover"); @@ -212,20 +212,20 @@ void simple_picking(pm::Mesh& m, pm::vertex_attribute<tg::pos3>& pos, pm::face_a { // On_hover, on_right_click, and on_left_click callbacks defined simultaneously gv::view(pos, col, - gv::pick() - .on_left_click([&](pick_id face_id, tg::pos3 world_pos, tg::vec3 normal) { + gv::Picker::pick() + .onLeftClick([&](pm::face_index face_id, tg::pos3 world_pos, tg::vec3 normal) { std::cout << "Something has been picked! ON_LEFT_CLICK" - << "ID: " << face_id.id << std::endl; + << "ID: " << int(face_id) << std::endl; return; }) - .on_right_click([&](pick_id face_id, tg::pos3 world_pos, tg::vec3 normal) { + .onRightClick([&](pm::face_index face_id, tg::pos3 world_pos, tg::vec3 normal) { std::cout << "Something has been picked! ON_RIGHT_CLICK" - << "ID: " << face_id.id << std::endl; + << "ID: " << int(face_id) << std::endl; return; }) - .on_hover([&](pick_id face_id, tg::pos3 world_pos, tg::vec3 normal) { + .onHover([&](pm::face_index face_id, tg::pos3 world_pos, tg::vec3 normal) { std::cout << "Something has been picked! ON_HOVER" - << "ID: " << face_id.id << std::endl; + << "ID: " << int(face_id) << std::endl; return; }), "picking MeshRenderable - multiple callbacks: on left click, on right click, on hover" @@ -234,25 +234,60 @@ void simple_picking(pm::Mesh& m, pm::vertex_attribute<tg::pos3>& pos, pm::face_a } { - // User defined IDs check - auto id_f = pm::face_attribute<int>(pos.mesh()); - int32_t id = 0; - std::vector<pick_id> ids; - - for (auto f : pos.mesh().faces()) + // User-defined Picking IDs - MeshRenderable + pm::face_attribute<int32_t> fa = pm::face_attribute<int32_t>(m); + int i = 0; + for (auto f : m.faces()) { - pick_id pid; - pid.id = id; - ids.push_back(pid); - id++; + fa[f] = 1000 + i; + i++; } - - gv::view(pos, col, ids, gv::pick().on_left_click([&](pick_id face_id, tg::pos3 world_pos, tg::vec3 normal) { + gv::view(pos, col, gv::Picker::pick(fa).onLeftClick([&](pm::face_index face_id, tg::pos3 world_pos, tg::vec3 normal) -> picking_result { std::cout << "Something has been picked! ON_LEFT_CLICK" - << "ID: " << face_id.id << std::endl; - return; + << "ID: " << (int)face_id << std::endl; + std::cout << "World_Position" << world_pos << std::endl; + std::cout << "Normal" << normal << std::endl; + picking_result res; + res.picking_color = tg::color3::cyan; + return res; }), - "picking MeshRenderable - user defined primitive IDs"); + "simple picking: callback on left click - user-defined IDs"); + } + + { + auto v = gv::view(pos, "Multiple renderables"); + + // Check multiple Renderables. + gv::view(pos, gv::Picker::pick().onLeftClick([&](pm::face_index face_id, tg::pos3 world_pos, tg::vec3 normal) -> picking_result { + std::cout << "Something has been picked! PICKER 1 " + << "ID: " << (int)face_id << std::endl; + std::cout << "World_Position" << world_pos << std::endl; + std::cout << "Normal" << normal << std::endl; + picking_result res; + res.picking_color = tg::color3::cyan; + return res; + })); + + pm::Mesh m2; + m2.copy_from(m); + + pm::vertex_attribute<tg::pos3> pos2(m2); + pos2.copy_from(pos); + + for (auto p : m2.vertices()) + { + pos2[p] = pos2[p] + tg::vec3(2, 2, 2); + } + + gv::view(pos2, gv::Picker::pick().onLeftClick([&](pm::face_index face_id, tg::pos3 world_pos, tg::vec3 normal) -> picking_result { + std::cout << "Something has been picked! PICKER 2 " + << "ID: " << (int)face_id << std::endl; + std::cout << "World_Position" << world_pos << std::endl; + std::cout << "Normal" << normal << std::endl; + picking_result res; + res.picking_color = tg::color3::cyan; + return res; + })); } }