add orbit camera support to FRED2 and qtFRED#7310
add orbit camera support to FRED2 and qtFRED#7310Goober5000 wants to merge 1 commit intoscp-fs2open:masterfrom
Conversation
Implement a spherical-coordinate orbit camera for both the MFC (FRED2) and Qt (qtFRED) editors, providing intuitive 3D viewport navigation similar to other 3D editing tools. Controls: - Middle mouse drag: orbit rotate around pivot point - Shift + middle mouse drag: pan the pivot point - Right mouse drag: orbit rotate (alternative to middle mouse) - Shift + right mouse drag: pan (alternative to shift + middle mouse) - Mouse wheel: zoom in/out - Right click without drag: context menu (preserving existing feature) Camera pivot selection: - If an object is selected, orbit around that object - Otherwise, intersect the camera forward ray with the current grid plane to find a natural pivot point - Falls back to grid center if the camera is parallel to the grid Grid-plane awareness: - Orbit axes are derived from The_grid->gmatrix using vm_vec_rotate and vm_vec_unrotate, so the camera orbits correctly on all three grid planes (XZ, XY, YZ), not just the default XZ plane - The look-at matrix uses the grid's up vector (uvec) rather than a hardcoded world-up direction Robust zoom/pan scaling: - Zoom uses an exponential formula (powf) so the distance multiplier is always positive regardless of physics_speed setting (1-500) - Pan uses a clamped speed factor to avoid excessive movement at high physics_speed values State management: - Keyboard camera movement (process_controls) invalidates orbit state, so the next mouse drag re-initializes from the current view - Orbit state is per-viewport in qtFRED (EditorViewport members) and global in FRED2 (matching existing conventions in each codebase) Implementation: - FRED2: orbit math in fredrender.cpp, mouse handlers in fredview.cpp - qtFRED: orbit math in EditorViewport.cpp, mouse/wheel handlers in renderwidget.cpp; RenderWindow::event() updated to forward middle button and wheel events to RenderWidget Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
9399519 to
85ae3b1
Compare
There was a problem hiding this comment.
I have not done a proper review of the code. I warned Goober that I was working on cleaning up the QtFRED camera code have asked him to wait with this PR until QtFRED is ready but I've mostly been ignored on that so I want to make sure I communicate clearly to the whole SCP team. The QtFRED part of this PR will need to wait until 7408 is merged which is designed to handle camera control upgrades such as the features added by this PR. Once 7408 is merged, this will need to be redone to move most of its code into the new camera class.
|
None of that was clear previously. You indicated you were upset with this PR, but you refused to explain why. Now that I know you want 7408 to go in first, I'm content to wait for that and treat it as a prerequisite. |
Implement a spherical-coordinate orbit camera for both the MFC (FRED2) and Qt (qtFRED) editors, providing intuitive 3D viewport navigation similar to other 3D editing tools.
Controls:
Camera pivot selection:
Grid-plane awareness:
Robust zoom/pan scaling:
State management:
Implementation: