Skip to content
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
Binary file modified assets/file.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/folder.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/full_folder.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions assets/lang/english.json
Original file line number Diff line number Diff line change
Expand Up @@ -102,8 +102,8 @@
"segments_loaded": "Segments: %d (N/A for loaded models)",
"polygon_create": "Polygon Create",
"polygon_none": "Polygon None",
"vertices": "Vertices",
"triangles": "Triangles",
"vertices": "Vertices: %d",
"triangles": "Triangles: %d",

"vertex_gizmo": "Vertex Gizmo",

Expand Down
24 changes: 24 additions & 0 deletions src/editor/editor_components_ui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,30 @@ void ComponentUIHelper::draw_mesh_component(Editor& editor, Entity& entity, Mesh

ImGui::Text(lang.word("vertices"), (int)mesh->editable_mesh.vertices.size());
ImGui::Text(lang.word("triangles"), (int)mesh->editable_mesh.triangles.size());

if (!g_selected_vertices.empty()) {
EditableVertex& selected_vertex = mesh->editable_mesh.vertices[g_selected_vertices[0]];
float vertex_pos[3] = { selected_vertex.position.x, selected_vertex.position.y, selected_vertex.position.z };

ImGui::Separator();

if (ImGui::DragFloat3("##vertex_position", vertex_pos, 0.1f)) {
editor.save_state();

selected_vertex.position = {
vertex_pos[0],
vertex_pos[1],
vertex_pos[2]
};

rebuild_mesh_from_editable(mesh->model, mesh->editable_mesh);

mark_entity_bounds_dirty(&entity);
mark_entity_uv_dirty(&entity);
}

ImGui::Text(lang.word("vertex_position"));
}
}
}

Expand Down
23 changes: 14 additions & 9 deletions src/editor/editor_ui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ static const char* language_codes[] = {
"czech",
"danish",
"dutch",
"english",
"en_us",
"esperanto",
"estonian",
"finnish",
Expand Down Expand Up @@ -126,7 +126,7 @@ static const char* language_codes[] = {
};

PolygonEditMode g_poly_mode = POLY_NONE;
static std::vector<int> g_selected_vertices;
std::vector<int> g_selected_vertices;
static int g_drag_vertex = -1;

int find_index(const char* value) {
Expand Down Expand Up @@ -705,7 +705,6 @@ void draw_polygon_editor(Editor& editor, Camera3D camera) {
draw->AddCircle({screen.x,screen.y}, radius, IM_COL32(20,20,20,255), 0, 2.0f);
}

// Gizmo for selected vertex
if (g_selected_vertices.size() == 1 && g_poly_mode != POLY_CREATE) {
int sel = g_selected_vertices[0];
if (sel >= 0 && sel < (int)e_mesh.vertices.size()) {
Expand Down Expand Up @@ -753,8 +752,6 @@ void draw_polygon_editor(Editor& editor, Camera3D camera) {
}

if (!g_is_scene_hovered) return;
// KEY FIX: only block clicks when gizmo is actively being USED (dragged),
// not just hovered — IsOver() was preventing vertex selection clicks
if (ImGuizmo::IsUsing()) return;

const Vector2 mouse = GetMousePosition();
Expand All @@ -776,11 +773,14 @@ void draw_polygon_editor(Editor& editor, Camera3D camera) {
auto it = std::find(g_selected_vertices.begin(), g_selected_vertices.end(), best_vert);
if (it != g_selected_vertices.end()) g_selected_vertices.erase(it);
else g_selected_vertices.push_back(best_vert);
} else {
}

else {
g_selected_vertices = {best_vert};
}
} else {
// Clicked empty space — try triangle face pick
}

else {
Ray ray = scene_screen_to_world_ray(mouse, camera);
float best_hit_dist = FLT_MAX;
int picked_triangle = -1;
Expand All @@ -806,18 +806,23 @@ void draw_polygon_editor(Editor& editor, Camera3D camera) {
Vector3Distance(hit.point, vb),
Vector3Distance(hit.point, vc)
};

picked_corner = (cd[0]<cd[1]) ? (cd[0]<cd[2]?0:2) : (cd[1]<cd[2]?1:2);
}

if (picked_triangle >= 0) {
const auto& tri = e_mesh.triangles[picked_triangle];
int verts[3] = {tri.a, tri.b, tri.c};
bool ctrl = IsKeyDown(KEY_LEFT_CONTROL) || IsKeyDown(KEY_RIGHT_CONTROL);

if (!ctrl) g_selected_vertices.clear();
int pick = verts[picked_corner];
if (std::find(g_selected_vertices.begin(), g_selected_vertices.end(), pick) == g_selected_vertices.end())
g_selected_vertices.push_back(pick);
} else if (!IsKeyDown(KEY_LEFT_CONTROL) && !IsKeyDown(KEY_RIGHT_CONTROL)) {

}

else if (!IsKeyDown(KEY_LEFT_CONTROL) && !IsKeyDown(KEY_RIGHT_CONTROL)) {
g_selected_vertices.clear();
}
}
Expand Down
1 change: 1 addition & 0 deletions src/editor/editor_ui.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ enum PolygonEditMode {

extern MeshEditState g_mesh_edit_state;
extern PolygonEditMode g_poly_mode;
extern std::vector<int> g_selected_vertices;

void draw_ui(Editor& editor, Shader shader, FlyCamera camera);

Expand Down
Loading