A Demo Project for the UnrealEngineSDK
Loading...
Searching...
No Matches
VRLogComponent.cpp
Go to the documentation of this file.
1// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.
2
4#include "Engine/Engine.h"
5
6/* Top of File */
7#define LOCTEXT_NAMESPACE "VRLogComponent"
8
9 //=============================================================================
10UVRLogComponent::UVRLogComponent(const FObjectInitializer& ObjectInitializer)
11 : Super(ObjectInitializer)
12{
13 PrimaryComponentTick.bCanEverTick = false;
14 MaxLineLength = 130;
15 MaxStoredMessages = 10000;
16}
17
18//=============================================================================
23
24
26{
27 UConsole* ViewportConsole = (GEngine->GameViewport != nullptr) ? GEngine->GameViewport->ViewportConsole : nullptr;
28
29 if (!ViewportConsole)
30 return;
31
32 // Using append because UpdatePrecompletedInputLine is private and append calls it
33 ViewportConsole->SetInputText("");
34 ViewportConsole->AppendInputText(Text);
35}
36
37void UVRLogComponent::SendKeyEventToConsole(FKey Key, EInputEvent KeyEvent)
38{
39 UConsole* ViewportConsole = (GEngine->GameViewport != nullptr) ? GEngine->GameViewport->ViewportConsole : nullptr;
40
41 if (!ViewportConsole)
42 return;
43
44 ViewportConsole->FakeGotoState(FName(TEXT("Typing")));
45 ViewportConsole->InputKey(0, Key, KeyEvent);
46 ViewportConsole->FakeGotoState(NAME_None);
47}
48
49void UVRLogComponent::AppendTextToConsole(FString Text, bool bReturnAtEnd)
50{
51 UConsole* ViewportConsole = (GEngine->GameViewport != nullptr) ? GEngine->GameViewport->ViewportConsole : nullptr;
52
53 if (!ViewportConsole)
54 return;
55
56 ViewportConsole->AppendInputText(Text);
57
58 if (bReturnAtEnd)
59 {
60 ViewportConsole->FakeGotoState(FName(TEXT("Typing")));
61 ViewportConsole->InputKey(0, EKeys::Enter, EInputEvent::IE_Released);
62 ViewportConsole->FakeGotoState(NAME_None);
63 }
64
65}
66
67bool UVRLogComponent::DrawConsoleToRenderTarget2D(EBPVRConsoleDrawType DrawType, UTextureRenderTarget2D * Texture, float ScrollOffset, bool bForceDraw)
68{
70 {
71 return false;
72 }
73 //LastRenderedOutputLogSize
74
75// check(WorldContextObject);
76 UWorld* World = GetWorld();//GEngine->GetWorldFromContextObject(WorldContextObject, false);
77
78 if (!World)
79 return false;
80
81 // Create or find the canvas object to use to render onto the texture. Multiple canvas render target textures can share the same canvas.
82 UCanvas* Canvas = World->GetCanvasForRenderingToTarget();
83
84 if (!Canvas)
85 return false;
86
87 // Create the FCanvas which does the actual rendering.
88 //const ERHIFeatureLevel::Type FeatureLevel = World != nullptr ? World->FeatureLevel : GMaxRHIFeatureLevel;
89
90 FCanvas * RenderCanvas = new FCanvas(
91 Texture->GameThread_GetRenderTargetResource(),
92 nullptr,
93 World,
94 World->FeatureLevel,
95 // Draw immediately so that interleaved SetVectorParameter (etc) function calls work as expected
96 FCanvas::CDM_ImmediateDrawing);
97
98 Canvas->Init(Texture->GetSurfaceWidth(), Texture->GetSurfaceHeight(), nullptr, RenderCanvas);
99 Canvas->Update();
100
101 switch (DrawType)
102 {
103 //case EBPVRConsoleDrawType::VRConsole_Draw_ConsoleAndOutputLog: DrawConsole(true, Canvas); DrawOutputLog(true, Canvas); break;
105 case EBPVRConsoleDrawType::VRConsole_Draw_OutputLogOnly: DrawOutputLog(false, Canvas, ScrollOffset); break;
106 default: break;
107 }
108
109 // Clean up and flush the rendering canvas.
110 Canvas->Canvas = nullptr;
111 RenderCanvas->Flush_GameThread();
112 delete RenderCanvas;
113 RenderCanvas = nullptr;
114
115 // It renders without this, is it actually required?
116 // Enqueue the rendering command to copy the freshly rendering texture resource back to the render target RHI
117 // so that the texture is updated and available for rendering.
118 /*ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER
119 (
120 CanvasRenderTargetResolveCommand,
121 FTextureRenderTargetResource*,
122 RenderTargetResource,
123 Texture->GameThread_GetRenderTargetResource(),
124 {
125 RHICmdList.CopyToResolveTarget(RenderTargetResource->GetRenderTargetTexture(), RenderTargetResource->TextureRHI, true, FResolveParams());
126 }
127 );*/
128
129 return true;
130}
131
132
133
134void UVRLogComponent::DrawConsole(bool bLowerHalf, UCanvas* Canvas)
135{
136 UConsole* ViewportConsole = (GEngine->GameViewport != nullptr) ? GEngine->GameViewport->ViewportConsole : nullptr;
137 if (!ViewportConsole)
138 return;
139
140 ViewportConsole->PostRender_Console_Open(Canvas);
141
142}
143
144void UVRLogComponent::DrawOutputLog(bool bUpperHalf, UCanvas* Canvas, float ScrollOffset)
145{
146 UFont* Font = GEngine->GetSmallFont();// GEngine->GetTinyFont();//GEngine->GetSmallFont();
147
148 // determine the height of the text
149 float xl, yl;
150 Canvas->StrLen(Font, TEXT("M"), xl, yl);
151 float Height = FMath::FloorToFloat(Canvas->ClipY);// *0.75f);
152
153
154 // Background
155 FLinearColor BackgroundColor = FColor::Black.ReinterpretAsLinear();
156 BackgroundColor.A = 1.0f;
157 FCanvasTileItem ConsoleTile(FVector2D(0, 0.0f), GBlackTexture, FVector2D(Canvas->ClipX, Canvas->ClipY), FVector2D(0.0f, 0.0f), FVector2D(1.0f, 1.0f), BackgroundColor);
158
159 // Preserve alpha to allow single-pass composite
160 ConsoleTile.BlendMode = SE_BLEND_AlphaBlend;
161
162 Canvas->DrawItem(ConsoleTile);
163
164 FCanvasTextItem ConsoleText(FVector2D(0, 0 + Height - 5 - yl), FText::FromString(TEXT("")), Font, FColor::Emerald);
165
166 const TArray< TSharedPtr<FVRLogMessage> > LoggedMessages = OutputLogHistory.GetMessages();
167
168 int32 ScrollPos = 0;
169
170 if(ScrollOffset > 0 && LoggedMessages.Num() > 1)
171 ScrollPos = FMath::Clamp(FMath::RoundToInt(LoggedMessages.Num() * ScrollOffset ) , 0, LoggedMessages.Num() - 1);
172
173 float Xpos = 0.0f;
174 float Ypos = 0.0f;
175 for (int i = LoggedMessages.Num() - (1 + ScrollPos); i >= 0 && Ypos <= Height - yl; i--)//auto &Message : LoggedMessages)
176 {
177 switch (LoggedMessages[i]->Verbosity)
178 {
179
180 case ELogVerbosity::Error:
181 case ELogVerbosity::Fatal: ConsoleText.SetColor(FLinearColor(0.7f,0.1f,0.1f)); break;
182 case ELogVerbosity::Warning: ConsoleText.SetColor(FLinearColor(0.5f,0.5f,0.0f)); break;
183
184 case ELogVerbosity::Log:
185 default: ConsoleText.SetColor(FLinearColor(0.8f,0.8f,0.8f));
186 }
187
188 Ypos += yl;
189 ConsoleText.Text = FText::Format(NSLOCTEXT("VRLogComponent", "ConsoleFormat", "{0}"), FText::FromString(*LoggedMessages[i]->Message));
190 Canvas->DrawItem(ConsoleText, 0, Height - Ypos);
191 }
192
194}
195
196
197
198#undef LOCTEXT_NAMESPACE
199/* Bottom of File */
EBPVRConsoleDrawType
UENUM(BlueprintType)
const TArray< TSharedPtr< FVRLogMessage > > & GetMessages() const
void DrawOutputLog(bool bUpperHalfOnly, UCanvas *Canvas, float ScrollOffset)
FVROutputLogHistory OutputLogHistory
void AppendTextToConsole(FString Text, bool bReturnAtEnd=false)
UFUNCTION(BlueprintCallable, Category = "VRLogComponent|Console", meta = (bIgnoreSelf = "true"))
bool DrawConsoleToRenderTarget2D(EBPVRConsoleDrawType DrawType, UTextureRenderTarget2D *Texture, float ScrollOffset, bool bForceDraw)
UFUNCTION(BlueprintCallable, Category = "VRLogComponent|Console", meta = (bIgnoreSelf = "true",...
int32 MaxLineLength
UPROPERTY(BlueprintReadWrite,EditAnywhere, Category = "VRLogComponent|Console")
void DrawConsole(bool bLowerHalfOnly, UCanvas *Canvas)
UVRLogComponent(const FObjectInitializer &ObjectInitializer)
void SendKeyEventToConsole(FKey Key, EInputEvent KeyEvent)
UFUNCTION(BlueprintCallable, Category = "VRLogComponent|Console", meta = (bIgnoreSelf = "true"))
int32 MaxStoredMessages
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "VRLogComponent|Console")
void SetConsoleText(FString Text)
UFUNCTION(BlueprintCallable, Category = "VRLogComponent|Console", meta = (bIgnoreSelf = "true"))