A Demo Project for the UnrealEngineSDK
Loading...
Searching...
No Matches
FadingComponent.cpp
Go to the documentation of this file.
1// Copyright(c) Pixo Group. All Rights Reserved.
2
4
5// Sets default values for this component's properties
7{
8 PrimaryComponentTick.bCanEverTick = true;
9
10 static ConstructorHelpers::FObjectFinder<UCurveFloat> FadeOpacityCurveAsset(TEXT("CurveFloat'/PixoCore/Blueprints/FadeOpacityCurve.FadeOpacityCurve'"));
11 ChangingFadeOpacityCurve = FadeOpacityCurveAsset.Object;
12}
13
14void UFadingComponent::FadeStaticMeshes(TArray<UStaticMeshComponent*> StaticMeshes, float TimeForFade, float DesiredOpacity)
15{
16 FadeDuration = TimeForFade;
17
18 FinalOpacity = FMath::Clamp(DesiredOpacity, 0.0f, 1.0f);
19
21 {
23 }
25 {
27 }
28 else
29 {
30 UE_LOG(LogTemp, Error, TEXT("UFadingComponent::FadeStaticMeshes: FinalOpacity equals CurrentOpacity"));
31 return;
32 }
33
34 if (StaticMeshes.Num() == 0)
35 {
36 UE_LOG(LogTemp, Error, TEXT("UFadingComponent::FadeStaticMeshes: TargetMeshes array is empty"));
37 return;
38 }
39
40 MaterialData.Empty();
41
42 for (UStaticMeshComponent* Mesh : StaticMeshes)
43 {
44 if (!Mesh->IsValidLowLevelFast())
45 {
46 UE_LOG(LogTemp, Error, TEXT("UFadingComponent::FadeStaticMeshes: Mesh isn't valid"));
47 }
48
49 AActor* Owner = Mesh->GetOwner();
50 if (Owner->Implements<UPixoVRStoryObject>())
51 {
52 TArray<FTransparentMaterialData> MaterialDataTemp = IPixoVRStoryObject::Execute_GetActorTransparentMaterialData(Owner);
53
54 if (MaterialDataTemp.Num() != 0)
55 {
56 FTransparentMaterialData* MeshData = MaterialDataTemp.FindByPredicate([Mesh](const FTransparentMaterialData& MeshDataIt)
57 {
58 return MeshDataIt.MeshRef == Mesh;
59 });
60
61 if (MeshData)
62 MaterialData.Add(*MeshData);
63 else
64 UE_LOG(LogTemp, Error, TEXT("UFadingComponent::FadeStaticMeshes: There is no MaterialData for %s mesh"), *Mesh->GetName());
65 }
66 else
67 {
68 UE_LOG(LogTemp, Error, TEXT("UFadingComponent::FadeStaticMeshes: Actor has no transparent data!"));
69 GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, "UFadingComponent::FadeStaticMeshes: Actor has no transparent data!");
70 }
71 }
72 else
73 {
74 UE_LOG(LogTemp, Error, TEXT("UFadingComponent::FadeStaticMeshes: Actor doesn't implement interface!"));
75 GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, "UFadingComponent::FadeStaticMeshes: Actor doesn't implement interface!");
76 }
77 }
78
79 Fade();
80}
81
82void UFadingComponent::FadeStaticMeshesFromTo(TArray<UStaticMeshComponent*> StaticMeshes, float TimeForFade,float FromOpacity, float ToOpacity)
83{
84 CurrentOpacity = FMath::Clamp(FromOpacity, 0.0f, 1.0f);
85 FadeStaticMeshes(StaticMeshes, TimeForFade, ToOpacity);
86}
87
88void UFadingComponent::FadeActor(AActor* Actor, float TimeForFade, float DesiredOpacity)
89{
90 TArray<UStaticMeshComponent*> ActorStaticMeshes;
91 Actor->GetComponents<UStaticMeshComponent>(ActorStaticMeshes);
92 FadeStaticMeshes(ActorStaticMeshes, TimeForFade, DesiredOpacity);
93}
94
96{
98
99 if (CurrentOpacity == 1.0f)
101 else if (CurrentOpacity == 0.0f)
102 SetMeshesHidden(true);
103}
104
105// Called when the game starts
107{
108 Super::BeginPlay();
109
110 if (ChangingFadeOpacityCurve != nullptr)
111 {
112 FOnTimelineFloat TimelineProgress;
113 TimelineProgress.BindUFunction(this, FName("FadeOpacityTimelineProcess"));
114 FadeTimeline.AddInterpFloat(ChangingFadeOpacityCurve, TimelineProgress);
115
116 FadeTimeline.SetLooping(false);
117
119 }
120 else
121 {
122 GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, "UFadingComponent::BeginPlay Setup ChangingFadeOpacityCurve");
123 }
124}
125
127{
128 for (FTransparentMaterialData TransparentMaterialData : MaterialData)
129 {
130 for (int MaterialIndex = 0; MaterialIndex < TransparentMaterialData.MI_OpaqueMaterials.Num(); MaterialIndex++)
131 {
132 TransparentMaterialData.MeshRef->SetMaterial(MaterialIndex, TransparentMaterialData.MI_OpaqueMaterials[MaterialIndex]);
133 }
134 }
135}
136
138{
139 for (const FTransparentMaterialData & TransparentMaterialData : MaterialData)
140 {
141 TransparentMaterialData.MeshRef->SetHiddenInGame(Hidden);
142 }
143}
144
145void UFadingComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
146{
147 Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
148
149 FadeTimeline.TickTimeline(DeltaTime);
150}
151
153{
154 for (FTransparentMaterialData TransparentMaterialData : MaterialData)
155 {
156 for (int MaterialIndex = 0; MaterialIndex < TransparentMaterialData.MI_TransparentMaterials.Num(); MaterialIndex++)
157 {
158 TransparentMaterialData.MeshRef->SetMaterial(MaterialIndex, TransparentMaterialData.MI_TransparentMaterials[MaterialIndex]);
159 }
160 }
161 SetMeshesHidden(false);
162
163 FadeTimeline.SetNewTime(CurrentOpacity);
164 if (FadeDuration > MIN_flt)
165 {
166 FadeTimeline.SetPlayRate(1.0f / FadeDuration);
167
168 switch (FadeType)
169 {
170 case FadeIn:
171 FadeTimeline.Reverse();
172 break;
173 case FadeOut:
174 FadeTimeline.Play();
175 break;
176 }
177 }
178 else
179 {
181 }
182}
183
184void UFadingComponent::SetOpacity(const float Value)
185{
186 for (const FTransparentMaterialData & TransparentMaterialData : MaterialData)
187 {
188 TransparentMaterialData.MeshRef->SetScalarParameterValueOnMaterials("Opacity", Value);
189 CurrentOpacity = Value;
190 }
191}
192
194{
195 switch (FadeType)
196 {
197 case FadeIn:
198 if (Value <= FinalOpacity)
199 {
200 FadeTimeline.Stop();
201 OnFadeCompleted.Broadcast();
202 }
203 else
204 {
205 SetOpacity(Value);
206 }
207 break;
208 case FadeOut:
209 if (Value >= FinalOpacity)
210 {
211 FadeTimeline.Stop();
212 OnFadeCompleted.Broadcast();
213 }
214 else
215 {
216 SetOpacity(Value);
217 }
218 break;
219 }
220}
@ FadeIn
@ FadeOut
void FadeStaticMeshes(TArray< UStaticMeshComponent * > StaticMeshes, float TimeForFade=1.0f, float DesiredOpacity=0.0f)
Function that allows you to fade meshes to smoothly make them invisible, ghost or visible (Owner shou...
void FadeCompleted()
UFUNCTION()
void FadeOpacityTimelineProcess(float Value)
UFUNCTION()
FOnFadeCompleted OnFadeCompleted
UPROPERTY(BlueprintAssignable)
void SetOpaqueMaterial()
Sets opaque material if mesh is visible to reduce the consumption of resources for rendering.
void SetOpacity(float Value)
Set opacity for meshes in MaterialData.
void FadeStaticMeshesFromTo(TArray< UStaticMeshComponent * > StaticMeshes, float TimeForFade=1.0f, float FromOpacity=0.0f, float ToOpacity=0.0f)
Function that allows you to fade meshes to smoothly make them invisible, ghost or visible (Owner shou...
virtual void BeginPlay() override
void SetMeshesHidden(bool Hidden)
Sets meshes hidden if mesh is invisible to reduce the consumption of resources for rendering.
void FadeActor(AActor *Actor, float TimeForFade=1.0f, float DesiredOpacity=0.0f)
Function that allows you to fade actor to smoothly make them invisible, ghost or visible (Actor shoul...
UCurveFloat * ChangingFadeOpacityCurve
UPROPERTY()
virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction) override
TArray< FTransparentMaterialData > MaterialData
UPROPERTY()
UINTERFACE(MinimalAPI)
Struct used in Fadable component.
UStaticMeshComponent * MeshRef
UPROPERTY(BlueprintReadWrite)