2
\$\begingroup\$

I would like to react to user inputs in an editor plugin, how can I do that? In a game I can use a custom Pawn or a custom PlayerController but how can I do it in the editor?

\$\endgroup\$
0
\$\begingroup\$

You can do it by extending FEdMode in your plugin:

class FPBEdMode : public FEdMode
{
public:
    const static FEditorModeID EM_PBPEdModeId;
public:
    FPBEdMode();
    virtual ~FPBEdMode();

    // FEdMode interface
    virtual void Enter() override;
    virtual void Exit() override;

    virtual void Render(const FSceneView* View, FViewport* Viewport, FPrimitiveDrawInterface* PDI) override;
    virtual void DrawHUD(FEditorViewportClient* ViewportClient, FViewport* Viewport, const FSceneView* View, FCanvas* Canvas) override;
    virtual void Tick(FEditorViewportClient* ViewportClient,float DeltaTime) override;

    virtual bool MouseEnter( FEditorViewportClient* ViewportClient,FViewport* Viewport,int32 x, int32 y );
    virtual bool MouseLeave( FEditorViewportClient* ViewportClient,FViewport* Viewport );
    virtual bool MouseMove(FEditorViewportClient* ViewportClient,FViewport* Viewport,int32 x, int32 y);
    virtual bool CapturedMouseMove( FEditorViewportClient* InViewportClient, FViewport* InViewport, int32 InMouseX, int32 InMouseY ) override;
    virtual bool InputKey(FEditorViewportClient* ViewportClient, FViewport* Viewport, FKey Key, EInputEvent Event) override;
    virtual bool InputAxis(FEditorViewportClient* InViewportClient, FViewport* Viewport, int32 ControllerId, FKey Key, float Delta, float DeltaTime) override;

    bool UsesToolkits() const override;
    // End of FEdMode interface

    FIntRect ViewRect;
    FViewMatrices ViewMatrices;

};

Note that you can get the ViewMatrices and the ViewRect in Render() to use those functions:

FSceneView::DeprojectScreenToWorld(
    ScreenPosition,
    ViewRect,
    ViewMatrices.GetInvViewMatrix(),
    ViewMatrices.GetInvProjMatrix(),
    RayOrigin,
    RayDirection
);

FSceneView::ProjectWorldToScreen(WorldPosition, ViewRect, ViewMatrices.GetViewProjMatrix(), ScreenPosition);

This enables to replace the PlayerController->ProjectWorldLocationToScreen() and PlayerController->DeprojectScreenPositionToWorld() that you would use in game.

You can also replace PlayerController->GetHitResultUnderCursor() with this:

 GetWorld()->LineTraceSingleByChannel(HitResult,
            RayOrigin,
            RayOrigin + RayDirection,
            TraceChannel);
| improve this answer | |
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.