From 225d9cfa82d40a3dca56768be9c7572581f6ec1f Mon Sep 17 00:00:00 2001 From: Mario Date: Sun, 16 Aug 2026 13:31:15 +0200 Subject: [PATCH] Fehler beim Selection Tool behoben --- .../main/java/de/blight/editor/EditorApp.java | 19 +++++++++++++++++++ .../java/de/blight/editor/SharedInput.java | 10 +++++++++- .../de/blight/editor/state/EmitterState.java | 18 ++++++++++++++++++ .../de/blight/editor/state/LightState.java | 18 ++++++++++++++++++ .../blight/editor/state/SceneObjectState.java | 2 ++ 5 files changed, 66 insertions(+), 1 deletion(-) diff --git a/blight-editor/src/main/java/de/blight/editor/EditorApp.java b/blight-editor/src/main/java/de/blight/editor/EditorApp.java index 7abecb0..0de2a73 100644 --- a/blight-editor/src/main/java/de/blight/editor/EditorApp.java +++ b/blight-editor/src/main/java/de/blight/editor/EditorApp.java @@ -762,6 +762,25 @@ public class EditorApp extends Application { root.setRight(buildZonenPanel()); } + if (input.auswahlLightSelected) { + input.auswahlLightSelected = false; + if (atmosphaereBtn != null) { + atmosphaereBtn.setSelected(true); + root.setRight(buildAtmospherePanel()); + updateLightPanel(input.selectedLightInfo); + } + } + + if (input.auswahlEmitterSelected) { + input.auswahlEmitterSelected = false; + if (atmosphaereBtn != null) { + atmosphaereBtn.setSelected(true); + input.activeLayer = SharedInput.LAYER_EMITTERS; + root.setRight(buildAtmospherePanel()); + updateEmitterPanel(input.selectedEmitterInfo); + } + } + if (input.itemSelectionChanged) { input.itemSelectionChanged = false; updateAuswahlItemPanel(input.selectedItemInfo); diff --git a/blight-editor/src/main/java/de/blight/editor/SharedInput.java b/blight-editor/src/main/java/de/blight/editor/SharedInput.java index 69151b3..e88a2b3 100644 --- a/blight-editor/src/main/java/de/blight/editor/SharedInput.java +++ b/blight-editor/src/main/java/de/blight/editor/SharedInput.java @@ -1124,7 +1124,15 @@ public class SharedInput { /** JavaFX → JME3: Selektierten Item-Spawn löschen. */ public volatile boolean deleteSelectedItemRequested = false; /** JME3-intern: Auswahl-Klick für ItemPlacementState (kein Objekt/keine Zone getroffen). */ - public final ConcurrentLinkedQueue auswahlClickQueue = new ConcurrentLinkedQueue<>(); + public final ConcurrentLinkedQueue auswahlClickQueue = new ConcurrentLinkedQueue<>(); + /** JME3-intern: Auswahl-Klick für LightState (kein Objekt/keine Zone getroffen). */ + public final ConcurrentLinkedQueue auswahlLightClickQueue = new ConcurrentLinkedQueue<>(); + /** JME3-intern: Auswahl-Klick für EmitterState (kein Objekt/keine Zone getroffen). */ + public final ConcurrentLinkedQueue auswahlEmitterClickQueue = new ConcurrentLinkedQueue<>(); + /** JME3 → JavaFX: Licht im Auswahl-Modus selektiert → Atmosphäre/Licht-Werkzeug aktivieren. */ + public volatile boolean auswahlLightSelected = false; + /** JME3 → JavaFX: Emitter im Auswahl-Modus selektiert → Atmosphäre/Emitter-Werkzeug aktivieren. */ + public volatile boolean auswahlEmitterSelected = false; // ── Voxel-Textur-Malen ──────────────────────────────────────────────────── /** Parallel-Queue zu textureEditQueue – wird von submitEdit(layer=4) mitbefüllt, diff --git a/blight-editor/src/main/java/de/blight/editor/state/EmitterState.java b/blight-editor/src/main/java/de/blight/editor/state/EmitterState.java index 5bcb6ae..fa2f57f 100644 --- a/blight-editor/src/main/java/de/blight/editor/state/EmitterState.java +++ b/blight-editor/src/main/java/de/blight/editor/state/EmitterState.java @@ -82,6 +82,11 @@ public class EmitterState extends BaseAppState { @Override public void update(float tpf) { + SharedInput.ObjectClick auswahlClick; + while ((auswahlClick = input.auswahlEmitterClickQueue.poll()) != null) { + handleAuswahlClick(auswahlClick); + } + if (input.activeLayer != SharedInput.LAYER_EMITTERS) return; SharedInput.EmitterClick click; @@ -135,6 +140,19 @@ public class EmitterState extends BaseAppState { }; } + private void handleAuswahlClick(SharedInput.ObjectClick click) { + float jmeX = click.screenX() * (float) input.viewportScaleX; + float jmeY = cam.getHeight() - click.screenY() * (float) input.viewportScaleY; + Vector3f near = cam.getWorldCoordinates(new Vector2f(jmeX, jmeY), 0f); + Vector3f far = cam.getWorldCoordinates(new Vector2f(jmeX, jmeY), 1f); + Ray ray = new Ray(near, far.subtract(near).normalizeLocal()); + int hit = pickMarker(ray); + if (hit >= 0) { + selectEmitter(hit); + input.auswahlEmitterSelected = true; + } + } + private int pickMarker(Ray ray) { for (int i = 0; i < markers.size(); i++) { CollisionResults res = new CollisionResults(); diff --git a/blight-editor/src/main/java/de/blight/editor/state/LightState.java b/blight-editor/src/main/java/de/blight/editor/state/LightState.java index 71a0ed1..9b7b534 100644 --- a/blight-editor/src/main/java/de/blight/editor/state/LightState.java +++ b/blight-editor/src/main/java/de/blight/editor/state/LightState.java @@ -86,6 +86,11 @@ public class LightState extends BaseAppState { @Override public void update(float tpf) { + SharedInput.ObjectClick auswahlClick; + while ((auswahlClick = input.auswahlLightClickQueue.poll()) != null) { + handleAuswahlClick(auswahlClick); + } + if (input.activeLayer != SharedInput.LAYER_LIGHTS) return; SharedInput.LightClick click; @@ -137,6 +142,19 @@ public class LightState extends BaseAppState { selectLight(lights.size() - 1); } + private void handleAuswahlClick(SharedInput.ObjectClick click) { + float jmeX = click.screenX() * (float) input.viewportScaleX; + float jmeY = cam.getHeight() - click.screenY() * (float) input.viewportScaleY; + Vector3f near = cam.getWorldCoordinates(new Vector2f(jmeX, jmeY), 0f); + Vector3f far = cam.getWorldCoordinates(new Vector2f(jmeX, jmeY), 1f); + Ray ray = new Ray(near, far.subtract(near).normalizeLocal()); + int hit = pickMarker(ray); + if (hit >= 0) { + selectLight(hit); + input.auswahlLightSelected = true; + } + } + /** Trifft den Glow-Halo oder den Bulb irgendeines Markers. */ private int pickMarker(Ray ray) { for (int i = 0; i < markers.size(); i++) { diff --git a/blight-editor/src/main/java/de/blight/editor/state/SceneObjectState.java b/blight-editor/src/main/java/de/blight/editor/state/SceneObjectState.java index fabb7a1..0e36b85 100644 --- a/blight-editor/src/main/java/de/blight/editor/state/SceneObjectState.java +++ b/blight-editor/src/main/java/de/blight/editor/state/SceneObjectState.java @@ -715,6 +715,8 @@ public class SceneObjectState extends BaseAppState { input.soundAreaClickQueue.offer(new SharedInput.SoundAreaClick(sx, sy, false)); input.locationZoneClickQueue.offer(new SharedInput.LocationZoneClick(sx, sy, false)); input.auswahlClickQueue.offer(click); + input.auswahlLightClickQueue.offer(click); + input.auswahlEmitterClickQueue.offer(click); return; } if (input.activeLayer != SharedInput.LAYER_OBJECTS) { deselectAll(); return; }