diff --git a/assets/file.png b/assets/file.png index 32838d9..bb3d401 100644 Binary files a/assets/file.png and b/assets/file.png differ diff --git a/assets/folder.png b/assets/folder.png index f6107dd..fb22b95 100644 Binary files a/assets/folder.png and b/assets/folder.png differ diff --git a/assets/full_folder.png b/assets/full_folder.png index 5b3ac0c..742cd2d 100644 Binary files a/assets/full_folder.png and b/assets/full_folder.png differ diff --git a/assets/lang/english.json b/assets/lang/english.json index 0794ca2..e3d6604 100644 --- a/assets/lang/english.json +++ b/assets/lang/english.json @@ -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", diff --git a/src/editor/editor_components_ui.cpp b/src/editor/editor_components_ui.cpp index 164552b..d138970 100644 --- a/src/editor/editor_components_ui.cpp +++ b/src/editor/editor_components_ui.cpp @@ -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")); + } } } diff --git a/src/editor/editor_ui.cpp b/src/editor/editor_ui.cpp index 31192d0..7cb3b65 100644 --- a/src/editor/editor_ui.cpp +++ b/src/editor/editor_ui.cpp @@ -93,7 +93,7 @@ static const char* language_codes[] = { "czech", "danish", "dutch", - "english", + "en_us", "esperanto", "estonian", "finnish", @@ -126,7 +126,7 @@ static const char* language_codes[] = { }; PolygonEditMode g_poly_mode = POLY_NONE; -static std::vector g_selected_vertices; +std::vector g_selected_vertices; static int g_drag_vertex = -1; int find_index(const char* value) { @@ -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()) { @@ -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(); @@ -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; @@ -806,6 +806,7 @@ void draw_polygon_editor(Editor& editor, Camera3D camera) { Vector3Distance(hit.point, vb), Vector3Distance(hit.point, vc) }; + picked_corner = (cd[0] g_selected_vertices; void draw_ui(Editor& editor, Shader shader, FlyCamera camera);