mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-20 04:04:00 +00:00
ifcviewer: draw 3D pivot indicator during navigation
A small RGB axis cross is rendered at camera_target_ while the user is orbiting, panning, or has just zoomed. Visibility toggles on middle-mouse press/release; the wheel arms a single-shot QTimer that hides it 750 ms after the last notch. Drawn in two passes: GL_GREATER at 30% alpha for the occluded portion (X-ray cue) and GL_LEQUAL at full alpha for the visible portion. Arm length is computed from camera_distance_, fovy, and viewport height so the cross stays ~30 px on screen across zoom levels. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -28,6 +28,10 @@
|
||||
#include <QVector3D>
|
||||
#include <QSet>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QTimer;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#include <vector>
|
||||
#include <unordered_map>
|
||||
#include <cstdint>
|
||||
@@ -231,9 +235,16 @@ private:
|
||||
void render();
|
||||
void renderPickPass();
|
||||
void renderAxisGizmo();
|
||||
void renderPivotIndicator();
|
||||
void updateCamera();
|
||||
void buildShaders();
|
||||
void buildAxisGizmo();
|
||||
void buildPivotIndicator();
|
||||
// Show/hide the orbit-pivot marker. hide_after_ms > 0 starts a single-shot
|
||||
// timer that auto-hides — used by the wheel handler to give the marker a
|
||||
// short afterglow after zoom. Drag-based callers pass 0 and toggle
|
||||
// visibility manually on press/release.
|
||||
void setPivotIndicatorVisible(bool visible, int hide_after_ms = 0);
|
||||
void setupVaoLayout(GLuint vao, GLuint vbo, GLuint ebo);
|
||||
|
||||
// Resolve the default framebuffer's MSAA depth into a single-sample
|
||||
@@ -315,6 +326,14 @@ private:
|
||||
GLuint axis_vao_ = 0;
|
||||
GLuint axis_vbo_ = 0;
|
||||
|
||||
// Orbit-pivot indicator: 1 center vertex + (N+1) rim vertices on the unit
|
||||
// circle (last == first to close the triangle fan). Rendered as a screen-
|
||||
// space disc at camera_target_, visible only while the user is navigating.
|
||||
GLuint pivot_program_ = 0;
|
||||
GLuint pivot_vao_ = 0;
|
||||
GLuint pivot_vbo_ = 0;
|
||||
int pivot_rim_count_ = 0;
|
||||
|
||||
// Per-model GPU data
|
||||
std::unordered_map<uint32_t, ModelGpuData> models_gpu_;
|
||||
|
||||
@@ -411,6 +430,11 @@ private:
|
||||
Qt::MouseButton active_button_ = Qt::NoButton;
|
||||
QPoint last_mouse_pos_;
|
||||
|
||||
// Pivot indicator visibility — true while drag-navigating, or briefly
|
||||
// after a wheel notch (the timer auto-clears it).
|
||||
bool pivot_indicator_visible_ = false;
|
||||
QTimer* pivot_indicator_hide_timer_ = nullptr;
|
||||
|
||||
// FPS/fly mode state. fps_keys_held_ tracks WASD/QE/Shift between
|
||||
// press+release; fps_last_tick_ gates dt inside render().
|
||||
// fps_ignore_next_mouse_move_ swallows the synthetic MouseMove that
|
||||
|
||||
Reference in New Issue
Block a user