Skip to content

Commit 4a7d297

Browse files
authored
Merge pull request #8 from arthursw/master
Added bindings to JavascriptEditorViewport
2 parents 7cce58e + 4571a2d commit 4a7d297

File tree

3 files changed

+222
-22
lines changed

3 files changed

+222
-22
lines changed

Source/JavascriptEditor/JavascriptEdMode.cpp

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,23 @@ PRAGMA_DISABLE_SHADOW_VARIABLE_WARNINGS
1212
/** Util to find named canvas in transient package, and create if not found */
1313
static UCanvas* GetCanvasByName(FName CanvasName)
1414
{
15-
// Cache to avoid FString/FName conversions/compares
16-
static TMap<FName, UCanvas*> CanvasMap;
17-
UCanvas** FoundCanvas = CanvasMap.Find(CanvasName);
18-
if (!FoundCanvas)
19-
{
20-
UCanvas* CanvasObject = FindObject<UCanvas>(GetTransientPackage(), *CanvasName.ToString());
21-
if (!CanvasObject)
22-
{
23-
CanvasObject = NewObject<UCanvas>(GetTransientPackage(), CanvasName);
24-
CanvasObject->AddToRoot();
25-
}
26-
27-
CanvasMap.Add(CanvasName, CanvasObject);
28-
return CanvasObject;
29-
}
30-
31-
return *FoundCanvas;
15+
// Cache to avoid FString/FName conversions/compares
16+
static TMap<FName, UCanvas*> CanvasMap;
17+
UCanvas** FoundCanvas = CanvasMap.Find(CanvasName);
18+
if (!FoundCanvas)
19+
{
20+
UCanvas* CanvasObject = FindObject<UCanvas>(GetTransientPackage(), *CanvasName.ToString());
21+
if (!CanvasObject)
22+
{
23+
CanvasObject = NewObject<UCanvas>(GetTransientPackage(), CanvasName);
24+
CanvasObject->AddToRoot();
25+
}
26+
27+
CanvasMap.Add(CanvasName, CanvasObject);
28+
return CanvasObject;
29+
}
30+
31+
return *FoundCanvas;
3232
}
3333

3434
class FJavascriptEdToolkit : public FModeToolkit, public FGCObject
@@ -386,4 +386,4 @@ void UJavascriptEdMode::Unregister()
386386

387387
#endif
388388

389-
PRAGMA_ENABLE_SHADOW_VARIABLE_WARNINGS
389+
PRAGMA_ENABLE_SHADOW_VARIABLE_WARNINGS

Source/JavascriptEditor/JavascriptEditorViewport.cpp

Lines changed: 163 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,25 @@
88

99
PRAGMA_DISABLE_SHADOW_VARIABLE_WARNINGS
1010

11+
12+
class FCanvasOwner : public FGCObject
13+
{
14+
15+
public:
16+
FCanvasOwner(): FGCObject()
17+
{
18+
Canvas = nullptr;
19+
}
20+
21+
virtual void AddReferencedObjects(FReferenceCollector& Collector) override
22+
{
23+
Collector.AddReferencedObject(Canvas);
24+
}
25+
26+
public:
27+
UCanvas* Canvas;
28+
};
29+
1130
#if WITH_EDITOR
1231
class FJavascriptEditorViewportClient : public FEditorViewportClient
1332
{
@@ -49,6 +68,60 @@ class FJavascriptEditorViewportClient : public FEditorViewportClient
4968
}
5069
}
5170

71+
virtual bool InputKey(FViewport* Viewport, int32 ControllerId, FKey Key, EInputEvent Event, float AmountDepressed = 1.f, bool bGamepad = false)
72+
{
73+
FEditorViewportClient::InputKey(Viewport, ControllerId, Key, Event, AmountDepressed, bGamepad);
74+
if (Widget.IsValid() && Widget->OnInputKey.IsBound())
75+
{
76+
return Widget->OnInputKey.Execute(ControllerId, Key, Event, Widget.Get());
77+
}
78+
else
79+
{
80+
return false;
81+
}
82+
}
83+
84+
virtual bool InputAxis(FViewport* Viewport, int32 ControllerId, FKey Key, float Delta, float DeltaTime, int32 NumSamples = 1, bool bGamepad = false) override
85+
{
86+
FEditorViewportClient::InputAxis(Viewport, ControllerId, Key, Delta, DeltaTime, NumSamples, bGamepad);
87+
if (Widget.IsValid() && Widget->OnInputAxis.IsBound())
88+
{
89+
return Widget->OnInputAxis.Execute(ControllerId, Key, Delta, DeltaTime, Widget.Get());
90+
}
91+
else
92+
{
93+
return false;
94+
}
95+
}
96+
97+
virtual void MouseEnter(FViewport* Viewport, int32 x, int32 y) override
98+
{
99+
100+
FEditorViewportClient::MouseEnter(Viewport, x, y);
101+
if (Widget.IsValid() && Widget->OnMouseEnter.IsBound())
102+
{
103+
Widget->OnMouseEnter.Execute(x, y, Widget.Get());
104+
}
105+
}
106+
107+
virtual void MouseMove(FViewport* Viewport, int32 x, int32 y) override
108+
{
109+
FEditorViewportClient::MouseMove(Viewport, x, y);
110+
if (Widget.IsValid() && Widget->OnMouseMove.IsBound())
111+
{
112+
Widget->OnMouseMove.Execute(x, y, Widget.Get());
113+
}
114+
}
115+
116+
virtual void MouseLeave(FViewport* Viewport) override
117+
{
118+
FEditorViewportClient::MouseLeave(Viewport);
119+
if (Widget.IsValid() && Widget->OnMouseLeave.IsBound())
120+
{
121+
Widget->OnMouseLeave.Execute(Widget.Get());
122+
}
123+
}
124+
52125
virtual bool InputWidgetDelta(FViewport* InViewport, EAxisList::Type CurrentAxis, FVector& Drag, FRotator& Rot, FVector& Scale) override
53126
{
54127
if (Widget.IsValid() && Widget->OnInputWidgetDelta.IsBound())
@@ -70,6 +143,26 @@ class FJavascriptEditorViewportClient : public FEditorViewportClient
70143
Widget->OnDraw.Execute(FJavascriptPDI(PDI),Widget.Get());
71144
}
72145
}
146+
147+
virtual void DrawCanvas(FViewport& InViewport, FSceneView& View, FCanvas& Canvas) override
148+
{
149+
FEditorViewportClient::DrawCanvas(InViewport, View, Canvas);
150+
151+
if (Widget.IsValid() && Widget->OnDrawCanvas.IsBound())
152+
{
153+
if(CanvasOwner.Canvas == nullptr){
154+
CanvasOwner.Canvas = NewObject<UCanvas>(Widget.Get());
155+
}
156+
157+
CanvasOwner.Canvas->Canvas = &Canvas;
158+
CanvasOwner.Canvas->Init(View.UnscaledViewRect.Width(), View.UnscaledViewRect.Height(), const_cast<FSceneView*>(&View));
159+
CanvasOwner.Canvas->ApplySafeZoneTransform();
160+
161+
Widget->OnDrawCanvas.Execute(CanvasOwner.Canvas, Widget.Get());
162+
163+
CanvasOwner.Canvas->PopSafeZoneTransform();
164+
}
165+
}
73166

74167
virtual FWidget::EWidgetMode GetWidgetMode() const override
75168
{
@@ -141,6 +234,9 @@ class FJavascriptEditorViewportClient : public FEditorViewportClient
141234
FPostProcessSettings PostProcessSettings;
142235
float PostProcessSettingsWeight;
143236
FLinearColor BackgroundColor;
237+
238+
private:
239+
FCanvasOwner CanvasOwner;
144240
};
145241

146242
class SAutoRefreshEditorViewport : public SEditorViewport
@@ -223,6 +319,16 @@ class SAutoRefreshEditorViewport : public SEditorViewport
223319
return EditorViewportClient->GetCameraSpeedSetting();
224320
}
225321

322+
void SetViewportType(ELevelViewportType InViewportType)
323+
{
324+
EditorViewportClient->SetViewportType(InViewportType);
325+
}
326+
327+
void SetViewMode(EViewModeIndex InViewModeIndex)
328+
{
329+
EditorViewportClient->SetViewMode(InViewModeIndex);
330+
}
331+
226332
void OverridePostProcessSettings(const FPostProcessSettings& PostProcessSettings, float Weight)
227333
{
228334
EditorViewportClient->PostProcessSettings = PostProcessSettings;
@@ -259,7 +365,13 @@ class SAutoRefreshEditorViewport : public SEditorViewport
259365
void SetWidgetMode(EJavascriptWidgetMode WidgetMode)
260366
{
261367
EditorViewportClient->SetWidgetMode(WidgetMode == EJavascriptWidgetMode::WM_None ? FWidget::WM_None : (FWidget::EWidgetMode)WidgetMode);
262-
}
368+
}
369+
370+
EJavascriptWidgetMode GetWidgetMode()
371+
{
372+
FWidget::EWidgetMode WidgetMode = EditorViewportClient->GetWidgetMode();
373+
return FWidget::WM_None ? EJavascriptWidgetMode::WM_None : (EJavascriptWidgetMode)WidgetMode;
374+
}
263375

264376
FString GetEngineShowFlags()
265377
{
@@ -500,6 +612,55 @@ void UJavascriptEditorViewport::SetWidgetMode(EJavascriptWidgetMode WidgetMode)
500612
}
501613
}
502614

615+
EJavascriptWidgetMode UJavascriptEditorViewport::GetWidgetMode()
616+
{
617+
if (ViewportWidget.IsValid())
618+
{
619+
return ViewportWidget->GetWidgetMode();
620+
}
621+
else {
622+
return EJavascriptWidgetMode::WM_None;
623+
}
624+
}
625+
626+
void UJavascriptEditorViewport::SetViewportType(ELevelViewportType InViewportType)
627+
{
628+
if (ViewportWidget.IsValid())
629+
{
630+
ViewportWidget->SetViewportType(InViewportType);
631+
}
632+
}
633+
634+
void UJavascriptEditorViewport::SetViewMode(EViewModeIndex InViewModeIndex)
635+
{
636+
if (ViewportWidget.IsValid())
637+
{
638+
ViewportWidget->SetViewMode(InViewModeIndex);
639+
}
640+
}
641+
642+
void UJavascriptEditorViewport::DeprojectScreenToWorld(const FVector2D &ScreenPosition, FVector &OutRayOrigin, FVector& OutRayDirection)
643+
{
644+
if (ViewportWidget.IsValid())
645+
{
646+
FSceneViewFamilyContext ViewFamily(FSceneViewFamily::ConstructionValues( ViewportWidget->EditorViewportClient->Viewport, ViewportWidget->EditorViewportClient->GetScene(), ViewportWidget->EditorViewportClient->EngineShowFlags ));
647+
FSceneView* View = ViewportWidget->EditorViewportClient->CalcSceneView(&ViewFamily);
648+
649+
FSceneView::DeprojectScreenToWorld(ScreenPosition, View->ViewRect, View->ViewMatrices.GetInvViewProjMatrix(), OutRayOrigin, OutRayDirection);
650+
}
651+
}
652+
653+
void UJavascriptEditorViewport::ProjectWorldToScreen(const FVector &WorldPosition, FVector2D &OutScreenPosition)
654+
{
655+
if (ViewportWidget.IsValid())
656+
{
657+
FSceneViewFamilyContext ViewFamily(FSceneViewFamily::ConstructionValues( ViewportWidget->EditorViewportClient->Viewport, ViewportWidget->EditorViewportClient->GetScene(), ViewportWidget->EditorViewportClient->EngineShowFlags ));
658+
FSceneView* View = ViewportWidget->EditorViewportClient->CalcSceneView(&ViewFamily);
659+
660+
FSceneView::ProjectWorldToScreen(WorldPosition, View->ViewRect, View->ViewMatrices.GetViewProjMatrix(), OutScreenPosition);
661+
}
662+
}
663+
503664
FString UJavascriptEditorViewport::GetEngineShowFlags()
504665
{
505666
if (ViewportWidget.IsValid())
@@ -526,4 +687,4 @@ bool UJavascriptEditorViewport::SetEngineShowFlags(const FString& In)
526687

527688
PRAGMA_ENABLE_SHADOW_VARIABLE_WARNINGS
528689

529-
#undef LOCTEXT_NAMESPACE
690+
#undef LOCTEXT_NAMESPACE

Source/JavascriptEditor/JavascriptEditorViewport.h

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,13 @@ class JAVASCRIPTEDITOR_API UJavascriptEditorViewport : public UPanelWidget
2525
DECLARE_DYNAMIC_DELEGATE_FourParams(FOnViewportTrackingStarted, const FJavascriptInputEventState&, InputState, bool, bIsDraggingWidget, bool, bNudge, UJavascriptEditorViewport*, Instance);
2626
DECLARE_DYNAMIC_DELEGATE_OneParam(FOnViewportTrackingStopped, UJavascriptEditorViewport*, Instance);
2727
DECLARE_DYNAMIC_DELEGATE_RetVal_FourParams(bool, FOnInputWidgetDelta, FVector&, Drag, FRotator&, Rot, FVector&, Scale, UJavascriptEditorViewport*, Instance);
28+
DECLARE_DYNAMIC_DELEGATE_RetVal_FourParams(bool, FOnInputKey, int32, ControllerId, FKey, Key, EInputEvent, Event, UJavascriptEditorViewport*, Instance);
29+
DECLARE_DYNAMIC_DELEGATE_RetVal_FiveParams(bool, FOnInputAxis, int32, ControllerId, FKey, Key, float, Delta, float, DeltaTime, UJavascriptEditorViewport*, Instance);
30+
DECLARE_DYNAMIC_DELEGATE_RetVal_ThreeParams(bool, FOnMouseEnter, int32, x, int32, y, UJavascriptEditorViewport*, Instance);
31+
DECLARE_DYNAMIC_DELEGATE_RetVal_ThreeParams(bool, FOnMouseMove, int32, x, int32, y, UJavascriptEditorViewport*, Instance);
32+
DECLARE_DYNAMIC_DELEGATE_RetVal_OneParam(bool, FOnMouseLeave, UJavascriptEditorViewport*, Instance);
2833
DECLARE_DYNAMIC_DELEGATE_TwoParams(FOnViewportDraw, const FJavascriptPDI&, PDI, UJavascriptEditorViewport*, Instance);
34+
DECLARE_DYNAMIC_DELEGATE_TwoParams(FOnViewportDrawCanvas, UCanvas*, Canvas, UJavascriptEditorViewport*, Instance);
2935
DECLARE_DYNAMIC_DELEGATE_RetVal_OneParam(FVector, FOnGetWidgetLocation, UJavascriptEditorViewport*, Instance);
3036
DECLARE_DYNAMIC_DELEGATE_RetVal_OneParam(FRotator, FOnGetWidgetRotation, UJavascriptEditorViewport*, Instance);
3137
DECLARE_DYNAMIC_DELEGATE_RetVal_OneParam(EJavascriptWidgetMode, FOnGetWidgetMode, UJavascriptEditorViewport*, Instance);
@@ -42,9 +48,27 @@ class JAVASCRIPTEDITOR_API UJavascriptEditorViewport : public UPanelWidget
4248
UPROPERTY(EditAnywhere, Category = Events, meta = (IsBindableEvent = "True"))
4349
FOnInputWidgetDelta OnInputWidgetDelta;
4450

51+
UPROPERTY(EditAnywhere, Category = Events, meta = (IsBindableEvent = "True"))
52+
FOnInputKey OnInputKey;
53+
54+
UPROPERTY(EditAnywhere, Category = Events, meta = (IsBindableEvent = "True"))
55+
FOnInputAxis OnInputAxis;
56+
57+
UPROPERTY(EditAnywhere, Category = Events, meta = (IsBindableEvent = "True"))
58+
FOnMouseEnter OnMouseEnter;
59+
60+
UPROPERTY(EditAnywhere, Category = Events, meta = (IsBindableEvent = "True"))
61+
FOnMouseMove OnMouseMove;
62+
63+
UPROPERTY(EditAnywhere, Category = Events, meta = (IsBindableEvent = "True"))
64+
FOnMouseLeave OnMouseLeave;
65+
4566
UPROPERTY(EditAnywhere, Category = Events, meta = (IsBindableEvent = "True"))
4667
FOnViewportDraw OnDraw;
4768

69+
UPROPERTY(EditAnywhere, Category = Events, meta = (IsBindableEvent = "True"))
70+
FOnViewportDrawCanvas OnDrawCanvas;
71+
4872
UPROPERTY(EditAnywhere, Category = Events, meta = (IsBindableEvent = "True"))
4973
FOnGetWidgetLocation OnGetWidgetLocation;
5074

@@ -53,7 +77,7 @@ class JAVASCRIPTEDITOR_API UJavascriptEditorViewport : public UPanelWidget
5377

5478
UPROPERTY(EditAnywhere, Category = Events, meta = (IsBindableEvent = "True"))
5579
FOnGetWidgetMode OnGetWidgetMode;
56-
80+
5781
UFUNCTION(BlueprintCallable, Category = "Viewport")
5882
UWorld* GetViewportWorld() const;
5983

@@ -107,13 +131,28 @@ class JAVASCRIPTEDITOR_API UJavascriptEditorViewport : public UPanelWidget
107131

108132
UFUNCTION(BlueprintCallable, Category = "Viewport")
109133
void SetWidgetMode(EJavascriptWidgetMode WidgetMode);
110-
134+
135+
UFUNCTION(BlueprintCallable, Category = "Viewport")
136+
EJavascriptWidgetMode GetWidgetMode();
137+
111138
UFUNCTION(BlueprintCallable, Category = "Viewport")
112139
FString GetEngineShowFlags();
113140

114141
UFUNCTION(BlueprintCallable, Category = "Viewport")
115142
bool SetEngineShowFlags(const FString& In);
116143

144+
UFUNCTION(BlueprintCallable, Category = "Viewport")
145+
void SetViewportType(ELevelViewportType InViewportType);
146+
147+
UFUNCTION(BlueprintCallable, Category = "Viewport")
148+
void SetViewMode(EViewModeIndex InViewModeIndex);
149+
150+
UFUNCTION(BlueprintCallable, Category = "Viewport")
151+
void DeprojectScreenToWorld(const FVector2D &ScreenPosition, FVector &OutRayOrigin, FVector& OutRayDirection);
152+
153+
UFUNCTION(BlueprintCallable, Category = "Viewport")
154+
void ProjectWorldToScreen(const FVector &WorldPosition, FVector2D &OutScreenPosition);
155+
117156
// UPanelWidget
118157
virtual UClass* GetSlotClass() const override;
119158
virtual void OnSlotAdded(UPanelSlot* Slot) override;

0 commit comments

Comments
 (0)