feat(editor): undo object placement, snap to ground, keyboard shortcuts

- Ctrl+Z in Object/NPC mode undoes last placement (50-deep stack)
- "Snap Ground" button raycasts straight down to place object on terrain
- Useful for objects placed too high or moved off terrain surface
- Undo stack adjusts indices when objects are removed mid-stack
This commit is contained in:
Kelsi 2026-05-05 04:01:06 -07:00
parent ace6173401
commit 88abbfb564
5 changed files with 50 additions and 5 deletions

View file

@ -212,10 +212,17 @@ void EditorApp::processEvents() {
}
}
if (sc == SDL_SCANCODE_Z && (event.key.keysym.mod & KMOD_CTRL)) {
if (event.key.keysym.mod & KMOD_SHIFT)
terrainEditor_.redo();
else
terrainEditor_.undo();
if (mode_ == EditorMode::Sculpt) {
if (event.key.keysym.mod & KMOD_SHIFT)
terrainEditor_.redo();
else
terrainEditor_.undo();
} else if (mode_ == EditorMode::PlaceObject || mode_ == EditorMode::NPC) {
if (!(event.key.keysym.mod & KMOD_SHIFT) && objectPlacer_.canUndoPlace()) {
objectPlacer_.undoLastPlace();
objectsDirty_ = true;
}
}
}
}
if (!io.WantCaptureKeyboard)
@ -554,6 +561,21 @@ void EditorApp::setGizmoAxis(TransformAxis axis) {
viewport_.getGizmo().setTarget(sel->position, sel->scale);
}
void EditorApp::snapSelectedToGround() {
auto* sel = objectPlacer_.getSelected();
if (!sel || !terrain_.isLoaded()) return;
// Cast ray straight down from object position
rendering::Ray ray;
ray.origin = sel->position + glm::vec3(0, 0, 500);
ray.direction = glm::vec3(0, 0, -1);
glm::vec3 hitPos;
if (terrainEditor_.raycastTerrain(ray, hitPos)) {
sel->position.z = hitPos.z;
objectsDirty_ = true;
}
}
void EditorApp::resetCamera() {
camera_.setPosition(glm::vec3(0.0f, 0.0f, 300.0f));
camera_.setYawPitch(0.0f, -30.0f);