diff --git a/include/Selection.hpp b/include/Selection.hpp index 9a5cff8..cef0913 100644 --- a/include/Selection.hpp +++ b/include/Selection.hpp @@ -38,6 +38,8 @@ namespace sel { glm::vec3 point; + bool pointJustAdded; + std::map selectedPoints; Selector(); @@ -50,6 +52,8 @@ namespace sel { int add(glm::vec3 pointToAdd, std::map &points, float skScale); + int remove(glm::vec3 pointToRemove, std::map &points, float skScale); + bool existingPoint(glm::vec3 point); void setFlags(); diff --git a/include/Sketcher.hpp b/include/Sketcher.hpp index 95c9ab8..4b49486 100644 --- a/include/Sketcher.hpp +++ b/include/Sketcher.hpp @@ -8,6 +8,7 @@ namespace CADERA_APP_NAMESPACE { namespace sketch { enum SketchToolFlags { + skt_active, // Cadera is in sketch mode skt_tool_active, // Used to toggle adding of point to sketch in the callbacks skt_point_tool, // Activate the point tool skt_note_tool, // Activate the note tool diff --git a/include/callbacks.hpp b/include/callbacks.hpp index 36d6cca..dc56358 100644 --- a/include/callbacks.hpp +++ b/include/callbacks.hpp @@ -9,4 +9,5 @@ void framebuffer_resize_callback(GLFWwindow* window, int width, int height); void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods); -void cursor_position_callback(GLFWwindow* window, double xpos, double ypos); \ No newline at end of file +void cursor_position_callback(GLFWwindow* window, double xpos, double ypos); + diff --git a/src/CADRender.cpp b/src/CADRender.cpp index 33ebc74..7d6db16 100644 --- a/src/CADRender.cpp +++ b/src/CADRender.cpp @@ -111,7 +111,6 @@ namespace CADERA_APP_NAMESPACE { void CADRender::createSurface() { - vk::SurfaceKHR tempSurface; if (glfwCreateWindowSurface(mInstance, mMainWindow, nullptr, reinterpret_cast(&mSurface)) != VK_SUCCESS) { throw std::runtime_error("failed to create window surface!"); diff --git a/src/Selection.cpp b/src/Selection.cpp index 0e01a7e..4856f4f 100644 --- a/src/Selection.cpp +++ b/src/Selection.cpp @@ -111,6 +111,8 @@ namespace sel { void Selector::select(glm::vec3 mouseRay, glm::vec3 origin, glm::vec3 normal, glm::vec3 pos, glm::vec3 cross, bool isOrtho) { + + if (isOrtho) { glm::vec3 up = glm::cross(cross, normal); @@ -156,6 +158,8 @@ namespace sel { setFlags(); } + pointJustAdded = false; + int selectedPointId = selectPoint(pointToAdd, points, skScale); // If a point is selected @@ -166,18 +170,13 @@ namespace sel { selectedPoints[selectedPointId] = points[selectedPointId]; setFlags(); - - return selectedPointId; - - } - else { - selectedPoints.erase(selectedPointId); - setFlags(); + pointJustAdded = true; return selectedPointId; } + } // If not CTRL and selectedPointId < 0 @@ -192,7 +191,31 @@ namespace sel { } - bool Selector::existingPoint(glm::vec3 point) { + int Selector::remove(glm::vec3 pointToRemove, std::map &points, float skScale) + { + if(!flags.test(select_isCTRL)) + return -1; + + if (pointJustAdded) + return -1; + + int selectedPointId = selectPoint(pointToRemove, points, skScale); + + + if (selectedPointId >= 0) { + + selectedPoints.erase(selectedPointId); + setFlags(); + + return selectedPointId; + + } + + + return -1; + } + + bool Selector::existingPoint(glm::vec3 point) { if (pActiveSketch == nullptr) throw std::runtime_error("Selection.existingPoint(): pActiveSketch is not set!"); diff --git a/src/Sketch.cpp b/src/Sketch.cpp index ce4c10f..8abf9ac 100644 --- a/src/Sketch.cpp +++ b/src/Sketch.cpp @@ -47,7 +47,10 @@ namespace sketch { void Sketch::deactivateTools() { - flags.reset(); + flags.reset(skt_point_tool); + flags.reset(skt_note_tool); + flags.reset(skt_tool_active); + } void Sketch::add(glm::vec3 point) { @@ -167,10 +170,10 @@ namespace sketch { txt::Text T; T.cursorPos = point; - T.cursorDirX = { 0.0f, 0.0f, 1.0f }; + T.cursorDirX = { 1.0f, 0.0f, 0.0f }; T.cursorDirY = { 0.0f, 1.0f, 0.0f }; T.backgroundColor = { 0.1f, 0.1f, 0.1f }; - T.textColor = { 1.0f, 1.0f, 1.0f }; + T.textColor = { 1.0f, 0.0f, 0.0f }; T.text = noteText; Notes[featureCounter] = T; diff --git a/src/callbacks.cpp b/src/callbacks.cpp index 63f8a62..225fbe4 100644 --- a/src/callbacks.cpp +++ b/src/callbacks.cpp @@ -1,7 +1,16 @@ #include "pch.hpp" #include "callbacks.hpp" #include "Cadera.hpp" -//#include "Selection.hpp" + +void sketch_mode_callbacks(cad::Cadera *app, int &button, int &action, int &mods); + +void sketch_select_addPoint(cad::Cadera *app); + +void sketch_select_removePoint(cad::Cadera *app); + +void sketch_add_point(cad::Cadera *app); + +void sketch_move_point(cad::Cadera *app); void mouse_button_callback(GLFWwindow* window, int button, int action, int mods) { @@ -13,34 +22,14 @@ void mouse_button_callback(GLFWwindow* window, int button, int action, int mods) // (2) ONLY forward mouse data to your underlying app/game. if (!io.WantCaptureMouse) { - if (button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS) { - if (!ImGui::IsWindowHovered(ImGuiHoveredFlags_::ImGuiHoveredFlags_AnyWindow) && - app->Sketch.flags.test(CADERA_APP_NAMESPACE::sketch::skt_tool_active)) { - - app->Render.Sel.select(app->Render.Cam.mouseRay, glm::vec3(0.0f, 0.0f, 0.0f), - app->Render.Cam.cameraVec, app->Render.Cam.pos, app->Render.Cam.cross, - app->Render.Cam.flags.test(cad::cam::ortho)); - - if (!app->Render.Sel.existingPoint(app->Render.Sel.point)) - app->Sketch.add(app->Render.Sel.point); - - app->Render.flags.set(CADERA_APP_NAMESPACE::render_update_sketch); + + if (app->Sketch.flags.test(CADERA_APP_NAMESPACE::sketch::skt_active)) { - } - else if (!ImGui::IsWindowHovered(ImGuiHoveredFlags_::ImGuiHoveredFlags_AnyWindow)) { + sketch_mode_callbacks(app, button, action, mods); - app->Render.Sel.select(app->Render.Cam.mouseRay, glm::vec3(0.0f, 0.0f, 0.0f), - app->Render.Cam.cameraVec, app->Render.Cam.pos, app->Render.Cam.cross, - app->Render.Cam.flags.test(cad::cam::ortho)); - - int id = app->Render.Sel.add(app->Render.Sel.point, app->Sketch.Points, app->Render.Cam.camDistance); - - if (id >= 0 || app->Render.Sel.selectedPoints.empty()) { - app->Render.flags.set(cad::render_update_sketch); - } - - } } + + } @@ -112,3 +101,70 @@ void cursor_position_callback(GLFWwindow* window, double xpos, double ypos) { } + +void sketch_mode_callbacks(cad::Cadera *app, int &button, int &action, int &mods) { + + if (button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS) { + if (app->Sketch.flags.test(CADERA_APP_NAMESPACE::sketch::skt_tool_active)) + sketch_add_point(app); + else { + sketch_select_addPoint(app); + sketch_move_point(app); + } + + } else if (button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_RELEASE) { + if (!app->Sketch.flags.test(CADERA_APP_NAMESPACE::sketch::skt_tool_active)) + sketch_select_removePoint(app); + } +} + +void sketch_select_addPoint(cad::Cadera *app) { + + app->Render.Sel.select(app->Render.Cam.mouseRay, glm::vec3(0.0f, 0.0f, 0.0f), + app->Render.Cam.cameraVec, app->Render.Cam.pos, app->Render.Cam.cross, + app->Render.Cam.flags.test(cad::cam::ortho)); + + int id = app->Render.Sel.add(app->Render.Sel.point, app->Sketch.Points, app->Render.Cam.camDistance); + + if (id >= 0 || app->Render.Sel.selectedPoints.empty()) { + app->Render.flags.set(cad::render_update_sketch); + } +} + +void sketch_select_removePoint(cad::Cadera *app) { + + app->Render.Sel.select(app->Render.Cam.mouseRay, glm::vec3(0.0f, 0.0f, 0.0f), + app->Render.Cam.cameraVec, app->Render.Cam.pos, + app->Render.Cam.cross, + app->Render.Cam.flags.test(cad::cam::ortho)); + + int id = app->Render.Sel.remove(app->Render.Sel.point, app->Sketch.Points, + app->Render.Cam.camDistance); + + + if (id >= 0 || app->Render.Sel.selectedPoints.empty()) { + app->Render.flags.set(cad::render_update_sketch); + } + +} + + + +void sketch_add_point(cad::Cadera *app) { + + app->Render.Sel.select(app->Render.Cam.mouseRay, glm::vec3(0.0f, 0.0f, 0.0f), + app->Render.Cam.cameraVec, app->Render.Cam.pos, app->Render.Cam.cross, + app->Render.Cam.flags.test(cad::cam::ortho)); + + if (!app->Render.Sel.existingPoint(app->Render.Sel.point)) + app->Sketch.add(app->Render.Sel.point); + + app->Render.flags.set(CADERA_APP_NAMESPACE::render_update_sketch); + +} + +void sketch_move_point(cad::Cadera *app) { + + app->Render.Sel.selectedPoints; + +} diff --git a/src/gui.cpp b/src/gui.cpp index ed8410d..2fe3152 100644 --- a/src/gui.cpp +++ b/src/gui.cpp @@ -94,7 +94,7 @@ namespace gui { Sketch.mGrid.setGridOrientation(Render.Cam.cameraVec, Render.Cam.up, Render.Cam.cross); } - + Sketch.flags.set(sketch::skt_active); Sketch.setType(cad_sketch); Sketch.setCameraDistance(&Render.Cam.camDistance); Sel.setActiveSketch(&Sketch); @@ -336,6 +336,7 @@ namespace gui { if (ImGui::CollapsingHeader("Sketch", ImGuiTreeNodeFlags_DefaultOpen)) { ImGui::Text("Sketch Tools:"); + ImGui::Text("Sketch Active: %d", Sketch.flags.test(sketch::skt_active)); ImGui::Text("Tool Active: %d", Sketch.flags.test(sketch::skt_tool_active)); ImGui::Text("Point Tool Active: %d", Sketch.flags.test(sketch::skt_point_tool)); ImGui::Text("Note Tool Active: %d", Sketch.flags.test(sketch::skt_note_tool));