8
8
9
9
PRAGMA_DISABLE_SHADOW_VARIABLE_WARNINGS
10
10
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
+
11
30
#if WITH_EDITOR
12
31
class FJavascriptEditorViewportClient : public FEditorViewportClient
13
32
{
@@ -49,6 +68,60 @@ class FJavascriptEditorViewportClient : public FEditorViewportClient
49
68
}
50
69
}
51
70
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
+
52
125
virtual bool InputWidgetDelta (FViewport* InViewport, EAxisList::Type CurrentAxis, FVector& Drag, FRotator& Rot, FVector& Scale) override
53
126
{
54
127
if (Widget.IsValid () && Widget->OnInputWidgetDelta .IsBound ())
@@ -70,6 +143,26 @@ class FJavascriptEditorViewportClient : public FEditorViewportClient
70
143
Widget->OnDraw .Execute (FJavascriptPDI (PDI),Widget.Get ());
71
144
}
72
145
}
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
+ }
73
166
74
167
virtual FWidget::EWidgetMode GetWidgetMode () const override
75
168
{
@@ -141,6 +234,9 @@ class FJavascriptEditorViewportClient : public FEditorViewportClient
141
234
FPostProcessSettings PostProcessSettings;
142
235
float PostProcessSettingsWeight;
143
236
FLinearColor BackgroundColor;
237
+
238
+ private:
239
+ FCanvasOwner CanvasOwner;
144
240
};
145
241
146
242
class SAutoRefreshEditorViewport : public SEditorViewport
@@ -223,6 +319,16 @@ class SAutoRefreshEditorViewport : public SEditorViewport
223
319
return EditorViewportClient->GetCameraSpeedSetting ();
224
320
}
225
321
322
+ void SetViewportType (ELevelViewportType InViewportType)
323
+ {
324
+ EditorViewportClient->SetViewportType (InViewportType);
325
+ }
326
+
327
+ void SetViewMode (EViewModeIndex InViewModeIndex)
328
+ {
329
+ EditorViewportClient->SetViewMode (InViewModeIndex);
330
+ }
331
+
226
332
void OverridePostProcessSettings (const FPostProcessSettings& PostProcessSettings, float Weight)
227
333
{
228
334
EditorViewportClient->PostProcessSettings = PostProcessSettings;
@@ -259,7 +365,13 @@ class SAutoRefreshEditorViewport : public SEditorViewport
259
365
void SetWidgetMode (EJavascriptWidgetMode WidgetMode)
260
366
{
261
367
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
+ }
263
375
264
376
FString GetEngineShowFlags ()
265
377
{
@@ -500,6 +612,55 @@ void UJavascriptEditorViewport::SetWidgetMode(EJavascriptWidgetMode WidgetMode)
500
612
}
501
613
}
502
614
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
+
503
664
FString UJavascriptEditorViewport::GetEngineShowFlags ()
504
665
{
505
666
if (ViewportWidget.IsValid ())
@@ -526,4 +687,4 @@ bool UJavascriptEditorViewport::SetEngineShowFlags(const FString& In)
526
687
527
688
PRAGMA_ENABLE_SHADOW_VARIABLE_WARNINGS
528
689
529
- #undef LOCTEXT_NAMESPACE
690
+ #undef LOCTEXT_NAMESPACE
0 commit comments