Skip to content
This repository was archived by the owner on Jan 22, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions include/Selection.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ namespace sel {

glm::vec3 point;

bool pointJustAdded;

std::map<int, Point> selectedPoints;

Selector();
Expand All @@ -50,6 +52,8 @@ namespace sel {

int add(glm::vec3 pointToAdd, std::map<int, Point> &points, float skScale);

int remove(glm::vec3 pointToRemove, std::map<int, Point> &points, float skScale);

bool existingPoint(glm::vec3 point);

void setFlags();
Expand Down
1 change: 1 addition & 0 deletions include/Sketcher.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion include/callbacks.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
void cursor_position_callback(GLFWwindow* window, double xpos, double ypos);

1 change: 0 additions & 1 deletion src/CADRender.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,6 @@ namespace CADERA_APP_NAMESPACE {

void CADRender::createSurface() {

vk::SurfaceKHR tempSurface;

if (glfwCreateWindowSurface(mInstance, mMainWindow, nullptr, reinterpret_cast<VkSurfaceKHR*>(&mSurface)) != VK_SUCCESS) {
throw std::runtime_error("failed to create window surface!");
Expand Down
39 changes: 31 additions & 8 deletions src/Selection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -156,6 +158,8 @@ namespace sel {
setFlags();
}

pointJustAdded = false;

int selectedPointId = selectPoint(pointToAdd, points, skScale);

// If a point is selected
Expand All @@ -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
Expand All @@ -192,7 +191,31 @@ namespace sel {

}

bool Selector::existingPoint(glm::vec3 point) {
int Selector::remove(glm::vec3 pointToRemove, std::map<int, Point> &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!");
Expand Down
9 changes: 6 additions & 3 deletions src/Sketch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
Expand Down
108 changes: 82 additions & 26 deletions src/callbacks.cpp
Original file line number Diff line number Diff line change
@@ -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) {

Expand All @@ -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);
}

}
}


}


Expand Down Expand Up @@ -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;

}
3 changes: 2 additions & 1 deletion src/gui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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));
Expand Down