Add mesh info overlay to viewport#191
Conversation
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (13)
📝 WalkthroughWalkthroughAdds a new MeshInfoOverlay UI component and integrates it into MainWindow, the MCPServer toolset, build/test configs, and unit/integration tests; provides a toggleable overlay showing mesh statistics for active viewports or selected entities. Changes
Sequence DiagramsequenceDiagram
participant User
participant UI as "MainWindow UI"
participant MCP as "MCPServer"
participant MW as "MainWindow"
participant Overlay as "MeshInfoOverlay"
participant OW as "OgreWidget"
User->>UI: Toggle "Show Mesh Info" action
UI->>MW: action toggled (setVisible)
UI->>MCP: (optional) POST toggle_mesh_info(show=true)
MCP->>MW: lookup / request overlay toggle
MW->>Overlay: setVisible(true/false)
MW->>Overlay: setActiveWidget(OW)
OW->>Overlay: focus / move / resize / selection events
Overlay->>Overlay: collectEntities() -> formatStats()
Overlay->>Overlay: ensureLabel() / repositionLabel()
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 12ce55f789
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| if (type == QEvent::Move || type == QEvent::Resize) { | ||
| if (mVisible && mLabel && mActiveWidget) | ||
| repositionLabel(); | ||
| } |
There was a problem hiding this comment.
Hide mesh info overlay when active viewport is destroyed
Handle viewport-destroy events in addition to move/resize here: when the active OgreWidget is closed, mActiveWidget is nulled by QPointer but refresh() is never triggered, so the floating QLabel can remain visible with stale stats (especially when closing the last viewport) until some unrelated selection/entity signal happens. This leaves an orphaned overlay window on screen and breaks the expected toggle behavior.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Actionable comments posted: 4
🧹 Nitpick comments (2)
ui_files/mainwindow.ui (1)
83-83: Avoid extending the legacy Widgets menu for new UI surface area.This adds a brand-new control to
ui_files/mainwindow.ui, but the repo guidance says new UI should go through QML instead of extending the existing Widgets-based surface. If this toggle needs to stay here for now, I’d at least document it as an exception and move it into the QML settings/debug UI in a follow-up.As per coding guidelines "UI: QML over Widgets. New UI should be built in QML (Qt Quick), not Qt Widgets. Existing Widget-based UI (
ui_files/) remains but should not be extended."Also applies to: 229-239
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@ui_files/mainwindow.ui` at line 83, The new Widgets action actionShow_Mesh_Info added to ui_files/mainwindow.ui violates the "UI: QML over Widgets" guideline; either remove this addaction and implement the toggle in QML (e.g., add it to the QML settings/debug UI), or if you must keep it temporarily, document it as an explicit exception in the commit message/PR and create a follow-up ticket to migrate actionShow_Mesh_Info (and the related controls around lines 229-239) into QML; update the UI change to match one of these two paths and avoid adding new Widget-based controls in ui_files.src/MCPServer_test.cpp (1)
2518-2532: Replace one of these error-path checks with a real success-path toggle test.These assertions only prove that
toggle_mesh_infois recognized and that the no-MainWindowpath returns some error text. They will not catch regressions in the actual behavior—e.g.findChild<MeshInfoOverlay*>()failing or theshowargument being ignored. A small fixture with a realMainWindow+MeshInfoOverlaywould cover the feature much better.As per coding guidelines, "Add Google Test unit tests for new functionality."
Also applies to: 2706-2723
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/MCPServer_test.cpp` around lines 2518 - 2532, Replace one of the error-path checks with a real success-path test that constructs a MainWindow containing a MeshInfoOverlay, then calls server->callTool("toggle_mesh_info", args) to toggle visibility and asserts the overlay was found and its visibility changed; specifically, in the TEST_F named ToggleMeshInfoIsRecognizedTool (or a new TEST_F), create a MainWindow instance, ensure findChild<MeshInfoOverlay*>() returns a valid pointer, call server->callTool("toggle_mesh_info", QJsonObject{{"show", true}}) and verify the returned result is not an error and the MeshInfoOverlay is visible, then call with {"show", false} and verify it becomes hidden, using server->callTool, MeshInfoOverlay, MainWindow, getResultText and isError to validate outcomes.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@src/mainwindow.cpp`:
- Around line 352-357: The menu QAction currently drives MeshInfoOverlay but not
vice versa, so make the QAction the single source of truth by additionally
connecting overlay visibility changes back to the action: after creating
m_meshInfoOverlay, connect its visibility/visibilityChanged signal (or add a
signal like void visibilityChanged(bool) to MeshInfoOverlay that is emitted
whenever setVisible is called or the widget visibility changes) to
ui->actionShow_Mesh_Info->setChecked, e.g. connect(m_meshInfoOverlay,
&MeshInfoOverlay::visibilityChanged, ui->actionShow_Mesh_Info,
&QAction::setChecked); keep the existing connect(ui->actionShow_Mesh_Info,
&QAction::toggled, m_meshInfoOverlay, &MeshInfoOverlay::setVisible) and the
focusOnWidget connections unchanged so programmatic toggles (from MCPServer)
update the QAction state as well.
In `@src/MCPServer.cpp`:
- Around line 1907-1919: The MCP toggle is directly calling
MeshInfoOverlay::setVisible which bypasses the MainWindow path that keeps the
menu action and overlay in sync; change MCPServer::toolToggleMeshInfo to call
the same MainWindow helper/slot used by the Options > Show Mesh Info action
(e.g. the slot method connected to the QAction or a helper like
MainWindow::setMeshInfoVisible / MainWindow::on_actionShowMeshInfo_triggered)
instead of touching MeshInfoOverlay directly so the menu checkable action is
updated; locate the MainWindow slot that the menu action uses and invoke that
with the desired show boolean rather than calling overlay->setVisible.
In `@src/MeshInfoOverlay.cpp`:
- Around line 85-123: In MeshInfoOverlay::formatStats, build a filtered list of
valid entities (e.g., validEntities) by skipping null pointers before computing
totals and use that list for the empty check and header logic instead of the raw
entities parameter; update the loop to iterate over validEntities, compute
totals (vertices, triangles, submeshes, bones, animations, materials) from it,
and then derive the header (single-mesh name, "Selected (N meshes)", "Scene (N
meshes)" or "No meshes") from validEntities.size() so null-only or mixed lists
report correct counts and "No meshes" when appropriate.
- Around line 33-40: The overlay can be left visible when the active viewport
goes away; update MeshInfoOverlay::eventFilter to also handle QEvent::Hide,
QEvent::Close and QEvent::Destroy (or QEvent::HideToParent as appropriate) and
when such an event is received for the current mActiveWidget, call
mLabel->hide(), set mVisible = false and clear mActiveWidget (mActiveWidget =
nullptr) so the floating label is removed immediately; alternatively (or
additionally) in setActiveWidget() connect the widget's destroyed(QObject*)
signal to a small slot/lambda that hides the label, clears mActiveWidget and
prevents repositionLabel() from being called on a dead QPointer.
---
Nitpick comments:
In `@src/MCPServer_test.cpp`:
- Around line 2518-2532: Replace one of the error-path checks with a real
success-path test that constructs a MainWindow containing a MeshInfoOverlay,
then calls server->callTool("toggle_mesh_info", args) to toggle visibility and
asserts the overlay was found and its visibility changed; specifically, in the
TEST_F named ToggleMeshInfoIsRecognizedTool (or a new TEST_F), create a
MainWindow instance, ensure findChild<MeshInfoOverlay*>() returns a valid
pointer, call server->callTool("toggle_mesh_info", QJsonObject{{"show", true}})
and verify the returned result is not an error and the MeshInfoOverlay is
visible, then call with {"show", false} and verify it becomes hidden, using
server->callTool, MeshInfoOverlay, MainWindow, getResultText and isError to
validate outcomes.
In `@ui_files/mainwindow.ui`:
- Line 83: The new Widgets action actionShow_Mesh_Info added to
ui_files/mainwindow.ui violates the "UI: QML over Widgets" guideline; either
remove this addaction and implement the toggle in QML (e.g., add it to the QML
settings/debug UI), or if you must keep it temporarily, document it as an
explicit exception in the commit message/PR and create a follow-up ticket to
migrate actionShow_Mesh_Info (and the related controls around lines 229-239)
into QML; update the UI change to match one of these two paths and avoid adding
new Widget-based controls in ui_files.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: fe7478e6-631b-42a6-8626-a2f0c79c9f72
📒 Files selected for processing (12)
CLAUDE.mdCMakeLists.txtsrc/CMakeLists.txtsrc/MCPServer.cppsrc/MCPServer.hsrc/MCPServer_test.cppsrc/MeshInfoOverlay.cppsrc/MeshInfoOverlay.hsrc/MeshInfoOverlay_test.cppsrc/mainwindow.cppsrc/mainwindow.hui_files/mainwindow.ui
| QJsonObject MCPServer::toolToggleMeshInfo(const QJsonObject &args) | ||
| { | ||
| if (!m_mainWindow) | ||
| return makeErrorResult("Error: MainWindow not available. Run with --with-mcp flag."); | ||
|
|
||
| MeshInfoOverlay* overlay = m_mainWindow->findChild<MeshInfoOverlay*>(); | ||
| if (!overlay) | ||
| return makeErrorResult("Error: MeshInfoOverlay not found"); | ||
|
|
||
| bool show = args.contains("show") ? args["show"].toBool() : !overlay->isVisible(); | ||
| overlay->setVisible(show); | ||
|
|
||
| return makeSuccessResult(QString("Mesh info overlay %1").arg(show ? "shown" : "hidden")); |
There was a problem hiding this comment.
Route this through the same MainWindow path as the menu action.
This flips MeshInfoOverlay directly, but the PR also adds a checkable Options > Show Mesh Info action. Since src/MeshInfoOverlay.h only exposes isVisible() / setVisible() and no visibility-change signal, that action never learns about this state change. After an MCP toggle, the overlay state and the menu checkmark can drift apart. Use the same MainWindow helper/slot that updates both pieces of UI.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@src/MCPServer.cpp` around lines 1907 - 1919, The MCP toggle is directly
calling MeshInfoOverlay::setVisible which bypasses the MainWindow path that
keeps the menu action and overlay in sync; change MCPServer::toolToggleMeshInfo
to call the same MainWindow helper/slot used by the Options > Show Mesh Info
action (e.g. the slot method connected to the QAction or a helper like
MainWindow::setMeshInfoVisible / MainWindow::on_actionShowMeshInfo_triggered)
instead of touching MeshInfoOverlay directly so the menu checkable action is
updated; locate the MainWindow slot that the menu action uses and invoke that
with the desired show boolean rather than calling overlay->setVisible.
There was a problem hiding this comment.
🧹 Nitpick comments (3)
tests/CMakeLists.txt (1)
58-59: Duplicate source file entry.
QMLMaterialHighlighter.cppappears twice inTEST_SRC_FILES(line 47 and line 59). While CMake typically handles duplicates gracefully, this should be cleaned up to avoid confusion.Remove duplicate entry
${CMAKE_CURRENT_SOURCE_DIR}/../src/MCPSettingsDialog.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../src/MeshInfoOverlay.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/../src/QMLMaterialHighlighter.cpp )🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@tests/CMakeLists.txt` around lines 58 - 59, The TEST_SRC_FILES list contains a duplicate entry for QMLMaterialHighlighter.cpp; open the CMakeLists.txt where TEST_SRC_FILES is defined and remove the redundant occurrence of QMLMaterialHighlighter.cpp so it appears only once in TEST_SRC_FILES (ensure other source filenames such as MeshInfoOverlay.cpp remain unchanged).src/MeshInfoOverlay.cpp (1)
108-112: Consider usingunsigned intfortotalBonesfor consistency.
totalBonesis declared asunsigned shortwhile other counters (totalVerts,totalTris,totalSubmeshes) useunsigned int. With multiple skeletal meshes, the sum could theoretically overflowunsigned short(max 65535). While unlikely in practice, usingunsigned intwould be consistent with the other counters.Suggested change
unsigned int totalVerts = 0; unsigned int totalTris = 0; unsigned int totalSubmeshes = 0; - unsigned short totalBones = 0; + unsigned int totalBones = 0; int totalAnims = 0;🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/MeshInfoOverlay.cpp` around lines 108 - 112, Change the type of the totalBones variable in MeshInfoOverlay.cpp from unsigned short to unsigned int to match the other counters (totalVerts, totalTris, totalSubmeshes) and avoid potential overflow when summing bones across multiple meshes; update any related uses of totalBones in functions or calculations in the same file (e.g., places referencing totalBones) to work with unsigned int.src/MeshInfoOverlay_test.cpp (1)
94-96: Test assertions for vertex/triangle counts are somewhat fragile.Checking
result.contains("3")andresult.contains("1")could match other numbers in the output (e.g., locale-formatted numbers or other stats). Consider using a more specific pattern or regex to match "Verts: 3" and "Tris: 1" directly.More specific assertions
- // 3 vertices, 1 triangle - EXPECT_TRUE(result.contains("3")) << "Result: " << result.toStdString(); - EXPECT_TRUE(result.contains("1")) << "Result: " << result.toStdString(); + // 3 vertices, 1 triangle - use more specific patterns + EXPECT_TRUE(result.contains("Verts: 3")) << "Result: " << result.toStdString(); + EXPECT_TRUE(result.contains("Tris: 1")) << "Result: " << result.toStdString();🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/MeshInfoOverlay_test.cpp` around lines 94 - 96, The assertions using result.contains("3") and result.contains("1") are too broad; update the test to assert against more specific text patterns like "Verts: 3" and "Tris: 1" (or use a QRegularExpression) instead of plain digit checks. Locate the EXPECT_TRUE lines that reference result and replace them with checks such as result.contains("Verts: 3") and result.contains("Tris: 1") or use QRegularExpression/QString::contains with explicit patterns (e.g., QRegularExpression(R"(Verts:\s*3)")) to avoid accidental matches.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@src/MeshInfoOverlay_test.cpp`:
- Around line 94-96: The assertions using result.contains("3") and
result.contains("1") are too broad; update the test to assert against more
specific text patterns like "Verts: 3" and "Tris: 1" (or use a
QRegularExpression) instead of plain digit checks. Locate the EXPECT_TRUE lines
that reference result and replace them with checks such as
result.contains("Verts: 3") and result.contains("Tris: 1") or use
QRegularExpression/QString::contains with explicit patterns (e.g.,
QRegularExpression(R"(Verts:\s*3)")) to avoid accidental matches.
In `@src/MeshInfoOverlay.cpp`:
- Around line 108-112: Change the type of the totalBones variable in
MeshInfoOverlay.cpp from unsigned short to unsigned int to match the other
counters (totalVerts, totalTris, totalSubmeshes) and avoid potential overflow
when summing bones across multiple meshes; update any related uses of totalBones
in functions or calculations in the same file (e.g., places referencing
totalBones) to work with unsigned int.
In `@tests/CMakeLists.txt`:
- Around line 58-59: The TEST_SRC_FILES list contains a duplicate entry for
QMLMaterialHighlighter.cpp; open the CMakeLists.txt where TEST_SRC_FILES is
defined and remove the redundant occurrence of QMLMaterialHighlighter.cpp so it
appears only once in TEST_SRC_FILES (ensure other source filenames such as
MeshInfoOverlay.cpp remain unchanged).
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 42d48508-1c07-4c90-a820-664e34c252d0
📒 Files selected for processing (5)
src/MeshInfoOverlay.cppsrc/MeshInfoOverlay.hsrc/MeshInfoOverlay_test.cppsrc/mainwindow.cpptests/CMakeLists.txt
🚧 Files skipped from review as they are similar to previous changes (2)
- src/mainwindow.cpp
- src/MeshInfoOverlay.h
There was a problem hiding this comment.
🧹 Nitpick comments (2)
src/MCPServer_test.cpp (1)
2727-2761: Success path test covers visibility toggling and automatic flip behavior.The test validates:
- Initial hidden state
- Toggle on with
show=true→ "shown" message, overlay visible- Toggle off with
show=false→ "hidden" message, overlay hidden- Toggle without
showarg → flips to visibleThe cleanup correctly resets the server's mainWindow and deletes the overlay. However, if an assertion fails mid-test, the overlay won't be deleted. This is acceptable for tests, but consider using a unique_ptr or RAII wrapper for cleaner exception safety.
🛡️ Optional: Use RAII for exception-safe cleanup
TEST_F(MCPServerTest, ToggleMeshInfo_SuccessPath) { // Create a fake MainWindow with a MeshInfoOverlay child so findChild works QMainWindow fakeWindow; - auto* overlay = new MeshInfoOverlay(reinterpret_cast<MainWindow*>(&fakeWindow)); + std::unique_ptr<MeshInfoOverlay> overlay( + new MeshInfoOverlay(reinterpret_cast<MainWindow*>(&fakeWindow))); server->setMainWindow(reinterpret_cast<MainWindow*>(&fakeWindow)); - EXPECT_FALSE(overlay->isVisible()); + EXPECT_FALSE(overlay->isVisible()); // Toggle on QJsonObject argsOn; argsOn["show"] = true; QJsonObject resultOn = server->callTool("toggle_mesh_info", argsOn); EXPECT_FALSE(isError(resultOn)) << getResultText(resultOn).toStdString(); EXPECT_TRUE(getResultText(resultOn).contains("shown")); EXPECT_TRUE(overlay->isVisible()); // ... rest of test ... // Clean up server->setMainWindow(nullptr); - delete overlay; + // overlay automatically deleted by unique_ptr }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/MCPServer_test.cpp` around lines 2727 - 2761, The test creates a raw MeshInfoOverlay* (overlay) attached to fakeWindow and manually deletes it at the end, which leaks if an assertion aborts mid-test; change the allocation to use RAII (e.g., std::unique_ptr<MeshInfoOverlay> or a scoped guard) and ensure server->setMainWindow is reset in a destructor or scope guard so that overlay is automatically deleted even on test failures; update references to overlay to use the smart pointer (overlay.get()) and keep server->setMainWindow(nullptr) in the RAII cleanup.src/MeshInfoOverlay_test.cpp (1)
54-60: Consider documenting thereinterpret_castusage more explicitly.The
fakeMainWindowhelper usesreinterpret_castto avoid constructing the heavyweight realMainWindow. The comment explains the rationale, but this is a somewhat fragile pattern.This approach works because
MeshInfoOverlayonly usesQObject/QWidgetmethods on theMainWindow*, but ifMainWindowever adds virtual methods or non-standard memory layout, this could cause subtle issues.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/MeshInfoOverlay_test.cpp` around lines 54 - 60, Document the reinterpret_cast in fakeMainWindow more explicitly: expand the comment in the fakeMainWindow function to state that we deliberately cast a QMainWindow* to MainWindow* because MeshInfoOverlay only calls QObject/QWidget methods (installEventFilter, findChildren, QLabel parent) and therefore no MainWindow-specific state or virtual dispatch is required, and add a clear TODO/FIXME warning that this is fragile — if MainWindow acquires virtual methods, non-trivial data, or changes inheritance, this cast becomes unsafe and callers should construct a real MainWindow instead; also mention MeshInfoOverlay by name so future editors see the dependency.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@src/MCPServer_test.cpp`:
- Around line 2727-2761: The test creates a raw MeshInfoOverlay* (overlay)
attached to fakeWindow and manually deletes it at the end, which leaks if an
assertion aborts mid-test; change the allocation to use RAII (e.g.,
std::unique_ptr<MeshInfoOverlay> or a scoped guard) and ensure
server->setMainWindow is reset in a destructor or scope guard so that overlay is
automatically deleted even on test failures; update references to overlay to use
the smart pointer (overlay.get()) and keep server->setMainWindow(nullptr) in the
RAII cleanup.
In `@src/MeshInfoOverlay_test.cpp`:
- Around line 54-60: Document the reinterpret_cast in fakeMainWindow more
explicitly: expand the comment in the fakeMainWindow function to state that we
deliberately cast a QMainWindow* to MainWindow* because MeshInfoOverlay only
calls QObject/QWidget methods (installEventFilter, findChildren, QLabel parent)
and therefore no MainWindow-specific state or virtual dispatch is required, and
add a clear TODO/FIXME warning that this is fragile — if MainWindow acquires
virtual methods, non-trivial data, or changes inheritance, this cast becomes
unsafe and callers should construct a real MainWindow instead; also mention
MeshInfoOverlay by name so future editors see the dependency.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: fb8247ef-62e1-4739-a010-eeba30127ee0
📒 Files selected for processing (2)
src/MCPServer_test.cppsrc/MeshInfoOverlay_test.cpp
Displays mesh statistics (vertices, triangles, submeshes, materials, bones, animations) on the active viewport. Shows stats for selected entities when a selection exists, otherwise shows aggregated scene stats. Toggled via Options > Show Mesh Info menu or MCP toggle_mesh_info tool. Implemented as a top-level Qt::Tool window to avoid ghost-text artifacts from Ogre's direct-to-native rendering (WA_PaintOnScreen). The overlay tracks the active viewport via OgreWidget::focusOnWidget and repositions via event filters on both MainWindow and the active OgreWidget. Bumps version to 2.12.0. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix CI: add MeshInfoOverlay.cpp/h to tests/CMakeLists.txt so MaterialEditorQML test targets can link MCPServer's toggle_mesh_info - Sync QAction with MCP toggles: add visibilityChanged signal to MeshInfoOverlay and connect it back to actionShow_Mesh_Info so programmatic toggles keep the menu checkmark in sync - Hide overlay on viewport destroy: handle Hide/Close/Destroy events in eventFilter to prevent orphaned floating label when active viewport is removed - Fix null entity counting: filter nulls before computing header and stats so null-only lists correctly report "No meshes" Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
MeshInfoOverlay calls CLIPipeline::extractMeshInfo(), so the MaterialEditorQML test targets need CLIPipeline.cpp linked in. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add 24 new MeshInfoOverlay tests covering lifecycle, event handling, visibility toggling, widget management, and entity collection. Add MCPServer toggle_mesh_info success-path test with fake MainWindow. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1d49683 to
c5c58a6
Compare
|



Summary
Closes #179
toggle_mesh_infotool for programmatic controlImplementation details
Qt::Toolframeless transparent window to avoid ghost-text artifacts from Ogre's direct-to-native rendering (WA_PaintOnScreenwith nullpaintEngine())OgreWidget::focusOnWidgetsignalgetMovableType() == "Entity"to avoidstatic_castcrashes from Lights/ManualObjectsCLIPipeline::extractMeshInfo()for data extractionFiles changed
src/MeshInfoOverlay.h/cppsrc/MeshInfoOverlay_test.cppsrc/MCPServer.h/cpptoggle_mesh_infotoolsrc/MCPServer_test.cppsrc/mainwindow.h/cppui_files/mainwindow.uiCMakeLists.txtCLAUDE.mdTest plan
toggle_mesh_infotests (no-MainWindow error, tool recognition, on/off states)toggle_mesh_infowith--with-mcpflag🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Tests