Browse Source

Fix VehicleCreator not receiving input

The root cause was that keyboard events captured by SceneViewerTopComponent
were only forwarded to the active camera controller's onKeyEvent method,
but never reached the jME3 InputManager. This meant VehicleEditorController's
input mappings registered via InputManager.addListener were never triggered.

The fix follows the pattern used by ComposerCameraController:
1. VehicleCreatorCameraController now overrides onKeyEvent to forward
   key events to VehicleEditorController
2. VehicleEditorController now has an onKeyEvent method that translates
   key codes to action bindings and calls onAction
3. VehicleCreatorTopComponent passes the editorController reference to
   the cameraController

Co-authored-by: neph1 <[email protected]>
copilot-swe-agent[bot] 2 weeks ago
parent
commit
e13d1a6ed5

+ 17 - 0
jme3-vehicle-creator/src/com/jme3/gde/vehiclecreator/VehicleCreatorCameraController.java

@@ -33,6 +33,7 @@ package com.jme3.gde.vehiclecreator;
 
 import com.jme3.gde.core.scene.controller.AbstractCameraController;
 import com.jme3.input.InputManager;
+import com.jme3.input.event.KeyInputEvent;
 import com.jme3.renderer.Camera;
 import com.jme3.scene.Spatial;
 
@@ -43,6 +44,7 @@ import com.jme3.scene.Spatial;
 public class VehicleCreatorCameraController extends AbstractCameraController {
 
     private Spatial vehicle;
+    private VehicleEditorController editorController;
 
     public VehicleCreatorCameraController(Camera cam, InputManager inputManager) {
         super(cam, inputManager);
@@ -67,6 +69,21 @@ public class VehicleCreatorCameraController extends AbstractCameraController {
         this.vehicle = vehicle;
     }
 
+    /**
+     * @param editorController the VehicleEditorController to forward key events to
+     */
+    public void setEditorController(VehicleEditorController editorController) {
+        this.editorController = editorController;
+    }
+
+    @Override
+    public void onKeyEvent(KeyInputEvent kie) {
+        super.onKeyEvent(kie);
+        if (editorController != null) {
+            editorController.onKeyEvent(kie);
+        }
+    }
+
     @Override
     public boolean useCameraControls() {
         return true;

+ 1 - 0
jme3-vehicle-creator/src/com/jme3/gde/vehiclecreator/VehicleCreatorTopComponent.java

@@ -909,6 +909,7 @@ public final class VehicleCreatorTopComponent extends TopComponent implements Sc
             editorController = newEditorController;
             cameraController = new VehicleCreatorCameraController(SceneApplication.getApplication().getCamera(), SceneApplication.getApplication().getInputManager());
             cameraController.setMaster(this);
+            cameraController.setEditorController(editorController);
             cameraController.enable();
             cameraController.setVehicle(request.getRootNode());
             setLoadedScene(currentRequest.getDataObject().getNodeDelegate(), true);

+ 36 - 0
jme3-vehicle-creator/src/com/jme3/gde/vehiclecreator/VehicleEditorController.java

@@ -22,6 +22,7 @@ import com.jme3.gde.core.undoredo.SceneUndoRedoManager;
 import com.jme3.input.KeyInput;
 import com.jme3.input.controls.ActionListener;
 import com.jme3.input.controls.KeyTrigger;
+import com.jme3.input.event.KeyInputEvent;
 import com.jme3.light.DirectionalLight;
 import com.jme3.math.Matrix3f;
 import com.jme3.math.Vector3f;
@@ -522,6 +523,41 @@ public class VehicleEditorController implements LookupListener, ActionListener {
         }
     }
 
+    /**
+     * Handles key input events forwarded from the camera controller.
+     * Converts key codes to action bindings and calls onAction.
+     * 
+     * @param kie the key input event
+     */
+    public void onKeyEvent(KeyInputEvent kie) {
+        String binding = null;
+        switch (kie.getKeyCode()) {
+            case KeyInput.KEY_A:
+                binding = "VehicleEditor_Left";
+                break;
+            case KeyInput.KEY_D:
+                binding = "VehicleEditor_Right";
+                break;
+            case KeyInput.KEY_W:
+                binding = "VehicleEditor_Up";
+                break;
+            case KeyInput.KEY_S:
+                binding = "VehicleEditor_Down";
+                break;
+            case KeyInput.KEY_SPACE:
+                binding = "VehicleEditor_Space";
+                break;
+            case KeyInput.KEY_RETURN:
+                binding = "VehicleEditor_Reset";
+                break;
+            default:
+                return;
+        }
+        if (binding != null) {
+            onAction(binding, kie.isPressed(), 0);
+        }
+    }
+
     /**
      * @return the motorForce
      */