fix(editor): terrain raycast on rough terrain, keyboard shortcuts, context menu

- Raycast AABB now uses actual min/max vertex heights per chunk
  instead of fixed ±200 padding (fixes misses on sculpted terrain)
- Right-click context menu opens correctly (deferred popup via flag
  since ImGui::OpenPopup must be called within ImGui frame)
- Keyboard shortcuts: G=Move, R=Rotate, T=Scale, X/Y=axis lock,
  Escape=deselect, Delete works in any mode for objects/NPCs
- Delete key now removes selected NPC in NPC mode too
This commit is contained in:
Kelsi 2026-05-05 03:55:53 -07:00
parent f38884856f
commit ace6173401
4 changed files with 40 additions and 7 deletions

View file

@ -189,9 +189,27 @@ void EditorApp::processEvents() {
if (event.type == SDL_KEYDOWN) {
auto sc = event.key.keysym.scancode;
if (sc == SDL_SCANCODE_F3) setWireframe(!isWireframe());
if (sc == SDL_SCANCODE_DELETE && mode_ == EditorMode::PlaceObject) {
objectPlacer_.deleteSelected();
objectsDirty_ = true;
// Transform shortcuts (Blender-style)
if (objectPlacer_.getSelected()) {
if (sc == SDL_SCANCODE_G) startGizmoMode(TransformMode::Move);
if (sc == SDL_SCANCODE_R) startGizmoMode(TransformMode::Rotate);
if (sc == SDL_SCANCODE_T) startGizmoMode(TransformMode::Scale);
if (sc == SDL_SCANCODE_X) setGizmoAxis(TransformAxis::X);
if (sc == SDL_SCANCODE_Y) setGizmoAxis(TransformAxis::Y);
if (sc == SDL_SCANCODE_ESCAPE) {
viewport_.getGizmo().endDrag();
viewport_.getGizmo().setMode(TransformMode::None);
objectPlacer_.clearSelection();
}
}
if (sc == SDL_SCANCODE_DELETE) {
if (objectPlacer_.getSelected()) {
objectPlacer_.deleteSelected();
objectsDirty_ = true;
} else if (npcSpawner_.getSelected()) {
npcSpawner_.removeCreature(npcSpawner_.getSelectedIndex());
objectsDirty_ = true;
}
}
if (sc == SDL_SCANCODE_Z && (event.key.keysym.mod & KMOD_CTRL)) {
if (event.key.keysym.mod & KMOD_SHIFT)
@ -242,7 +260,7 @@ void EditorApp::processEvents() {
giz.endDrag();
giz.setMode(TransformMode::None);
} else if (objectPlacer_.getSelected()) {
ImGui::OpenPopup("ObjectContextMenu");
openContextMenu_ = true;
} else {
camera_.processMouseButton(event.button);
}