From d3c97fc99204a733bb5683ce85b79803c74e0363 Mon Sep 17 00:00:00 2001 From: Steve Streeting Date: Mon, 6 Nov 2023 16:59:07 +0000 Subject: [PATCH] Add light flicker component --- ReadMe.md | 2 + .../Private/StevesLightFlicker.cpp | 178 ++++++++++++++++++ .../Public/StevesLightFlicker.h | 119 ++++++++++++ doc/LightFlicker.md | 49 +++++ doc/configure.png | Bin 0 -> 14495 bytes doc/flickerupdate.png | Bin 0 -> 24696 bytes 6 files changed, 348 insertions(+) create mode 100644 Source/StevesUEHelpers/Private/StevesLightFlicker.cpp create mode 100644 Source/StevesUEHelpers/Public/StevesLightFlicker.h create mode 100644 doc/LightFlicker.md create mode 100644 doc/configure.png create mode 100644 doc/flickerupdate.png diff --git a/ReadMe.md b/ReadMe.md index bd8c7c1..f22b4c0 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -11,6 +11,8 @@ which makes a bunch of things better: * Reliable notification when the player changes input method * [Debug visualisation](https://www.stevestreeting.com/2021/09/14/ue4-editor-visualisation-helper/) * [Better DataTable Row References](https://www.stevestreeting.com/2023/10/06/a-better-unreal-datatable-row-picker/) +* [Light Flicker](doc/LightFlicker.md) +* Halton Sequence based random stream ## Examples diff --git a/Source/StevesUEHelpers/Private/StevesLightFlicker.cpp b/Source/StevesUEHelpers/Private/StevesLightFlicker.cpp new file mode 100644 index 0000000..79765fd --- /dev/null +++ b/Source/StevesUEHelpers/Private/StevesLightFlicker.cpp @@ -0,0 +1,178 @@ +// Copyright Steve Streeting +// Licensed under the MIT License (see License.txt) +#include "StevesLightFlicker.h" + +#include "Net/UnrealNetwork.h" + +TMap UStevesLightFlickerHelper::Curves; +TMap UStevesLightFlickerHelper::CustomCurves; +FCriticalSection UStevesLightFlickerHelper::CriticalSection; + +// Quake lighting flicker functions +// https://github.com/id-Software/Quake/blob/bf4ac424ce754894ac8f1dae6a3981954bc9852d/qw-qc/world.qc#L328-L372 +const TMap UStevesLightFlickerHelper::QuakeCurveSources { + { EStevesLightFlickerPattern::Flicker1, TEXT("mmnmmommommnonmmonqnmmo") }, + { EStevesLightFlickerPattern::SlowStrongPulse, TEXT("abcdefghijklmnopqrstuvwxyzyxwvutsrqponmlkjihgfedcba") }, + { EStevesLightFlickerPattern::Candle1, TEXT("mmmmmaaaaammmmmaaaaaabcdefgabcdefg") }, + { EStevesLightFlickerPattern::FastStrobe, TEXT("mamamamamama") }, + { EStevesLightFlickerPattern::GentlePulse1, TEXT("jklmnopqrstuvwxyzyxwvutsrqponmlkj") }, + { EStevesLightFlickerPattern::Flicker2, TEXT("nmonqnmomnmomomno") }, + { EStevesLightFlickerPattern::Candle2, TEXT("mmmaaaabcdefgmmmmaaaammmaamm") }, + { EStevesLightFlickerPattern::Candle3, TEXT("mmmaaammmaaammmabcdefaaaammmmabcdefmmmaaaa") }, + { EStevesLightFlickerPattern::SlowStrobe, TEXT("aaaaaaaazzzzzzzz") }, + { EStevesLightFlickerPattern::FlourescentFlicker, TEXT("mmamammmmammamamaaamammma") }, + { EStevesLightFlickerPattern::SlowPulseNoBlack, TEXT("abcdefghijklmnopqrrqponmlkjihgfedcba") }, +}; + +float UStevesLightFlickerHelper::EvaluateLightCurve(EStevesLightFlickerPattern CurveType, float Time) +{ + return GetLightCurve(CurveType).Eval(Time); +} + +const FRichCurve& UStevesLightFlickerHelper::GetLightCurve(EStevesLightFlickerPattern CurveType) +{ + FScopeLock ScopeLock(&CriticalSection); + + if (auto pCurve = Curves.Find(CurveType)) + { + return *pCurve; + } + + auto& Curve = Curves.Emplace(CurveType); + BuildCurve(CurveType, Curve); + return Curve; +} + +const FRichCurve& UStevesLightFlickerHelper::GetLightCurve(const FString& CurveStr) +{ + FScopeLock ScopeLock(&CriticalSection); + + if (auto pCurve = CustomCurves.Find(CurveStr)) + { + return *pCurve; + } + + auto& Curve = CustomCurves.Emplace(CurveStr); + BuildCurve(CurveStr, Curve); + return Curve; +} + +void UStevesLightFlickerHelper::BuildCurve(EStevesLightFlickerPattern CurveType, FRichCurve& OutCurve) +{ + if (auto pTxt = QuakeCurveSources.Find(CurveType)) + { + BuildCurve(*pTxt, OutCurve); + } + +} + +void UStevesLightFlickerHelper::BuildCurve(const FString& QuakeCurveChars, FRichCurve& OutCurve) +{ + OutCurve.Reset(); + + for (int i = 0; i < QuakeCurveChars.Len(); ++i) + { + // We actually build the curve a..z = 0..1, and then use a default max value of 2 to restore the original behaviour. + // Actually the curve is 0..1.04 due to original behaviour that z is 2.08 not 2 + const int CharIndex = QuakeCurveChars[i] - 'a'; + const float Val = (float)CharIndex / 24.f; // to ensure m==1, z==2.08 (rescaled to half that so 0..1.04) + // Quake default was each character was 0.1s + OutCurve.AddKey(i * 0.1f, Val); + } + + // To catch empty + if (QuakeCurveChars.IsEmpty()) + { + OutCurve.AddKey(0, 1); + } +} + +UStevesLightFlickerComponent::UStevesLightFlickerComponent(const FObjectInitializer& Initializer): + Super(Initializer), + TimePos(0), + CurrentValue(0), + Curve(nullptr) +{ + PrimaryComponentTick.bCanEverTick = true; + PrimaryComponentTick.bTickEvenWhenPaused = false; + PrimaryComponentTick.bStartWithTickEnabled = false; +} + +void UStevesLightFlickerComponent::BeginPlay() +{ + Super::BeginPlay(); + + if (FlickerPattern == EStevesLightFlickerPattern::Custom) + { + Curve = &UStevesLightFlickerHelper::GetLightCurve(CustomFlickerPattern); + } + else + { + Curve = &UStevesLightFlickerHelper::GetLightCurve(FlickerPattern); + } + TimePos = 0; + if (bAutoPlay) + { + Play(); + } +} + +void UStevesLightFlickerComponent::ValueUpdate() +{ + CurrentValue = FMath::Lerp(MinValue, MaxValue, Curve->Eval(TimePos)); + OnLightFlickerUpdate.Broadcast(CurrentValue); +} + +void UStevesLightFlickerComponent::Play(bool bResetTime) +{ + if (GetOwnerRole() == ROLE_Authority || !GetIsReplicated()) + { + if (bResetTime) + { + TimePos = 0; + } + ValueUpdate(); + + PrimaryComponentTick.SetTickFunctionEnable(true); + } +} + +void UStevesLightFlickerComponent::Pause() +{ + if (GetOwnerRole() == ROLE_Authority || !GetIsReplicated()) + { + PrimaryComponentTick.SetTickFunctionEnable(false); + } +} + +float UStevesLightFlickerComponent::GetCurrentValue() const +{ + return CurrentValue; +} + +void UStevesLightFlickerComponent::OnRep_TimePos() +{ + ValueUpdate(); +} + +void UStevesLightFlickerComponent::TickComponent(float DeltaTime, + ELevelTick TickType, + FActorComponentTickFunction* ThisTickFunction) +{ + Super::TickComponent(DeltaTime, TickType, ThisTickFunction); + + TimePos += DeltaTime * Speed; + const float MaxTime = Curve->GetLastKey().Time; + while (TimePos > MaxTime) + { + TimePos -= MaxTime; + } + ValueUpdate(); +} + +void UStevesLightFlickerComponent::GetLifetimeReplicatedProps(TArray< FLifetimeProperty > & OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + + DOREPLIFETIME(UStevesLightFlickerComponent, TimePos); +} diff --git a/Source/StevesUEHelpers/Public/StevesLightFlicker.h b/Source/StevesUEHelpers/Public/StevesLightFlicker.h new file mode 100644 index 0000000..50fbec8 --- /dev/null +++ b/Source/StevesUEHelpers/Public/StevesLightFlicker.h @@ -0,0 +1,119 @@ +// Copyright Steve Streeting +// Licensed under the MIT License (see License.txt) + +#pragma once + +#include "CoreMinimal.h" +#include "Kismet/BlueprintFunctionLibrary.h" +#include "StevesLightFlicker.generated.h" + + +UENUM(BlueprintType) +enum class EStevesLightFlickerPattern : uint8 +{ + Flicker1, + Flicker2, + SlowStrongPulse, + Candle1, + Candle2, + Candle3, + FastStrobe, + SlowStrobe, + GentlePulse1, + FlourescentFlicker, + SlowPulseNoBlack, + + Custom + +}; +/** + * Helper class to get lighting flicker curves + */ +UCLASS() +class STEVESUEHELPERS_API UStevesLightFlickerHelper : public UBlueprintFunctionLibrary +{ + GENERATED_BODY() +protected: + static TMap Curves; + static TMap CustomCurves; + static FCriticalSection CriticalSection; + static const TMap QuakeCurveSources; + + + static void BuildCurve(EStevesLightFlickerPattern CurveType, FRichCurve& OutCurve); + static void BuildCurve(const FString& QuakeCurveChars, FRichCurve& OutCurve); + +public: + /** + * Directly evaluate a lighting curve. Alternatively, see ULightingCurveComponent. + * @param CurveType The type of curve + * @param Time The time index (0..1 period) + * @return Normalised value of the curve at this time + */ + UFUNCTION(BlueprintPure, Category="Lighting Curves") + static float EvaluateLightCurve(EStevesLightFlickerPattern CurveType, float Time); + + static const FRichCurve& GetLightCurve(EStevesLightFlickerPattern CurveType); + static const FRichCurve& GetLightCurve(const FString& CurveStr); + +}; + +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnLightFlickerUpdate, float, LightValue); +/** + * This is like a generated version of TimelineComponent, providing a generated lighting curve. + */ +UCLASS(Blueprintable, ClassGroup=(Lights), meta=(BlueprintSpawnableComponent)) +class UStevesLightFlickerComponent : public UActorComponent +{ + GENERATED_UCLASS_BODY() + +protected: + UPROPERTY(EditAnywhere, Category="Light Flicker") + EStevesLightFlickerPattern FlickerPattern = EStevesLightFlickerPattern::Candle1; + + /// If using a custom pattern, provide your own Quake-style string of letters, a-z (a = 0, m = 1, z = 2) + UPROPERTY(EditAnywhere, Category="Light Flicker") + FString CustomFlickerPattern; + + /// Max output intensity multiplier value. Defaults to 2 since that's what Quake used! + /// We can *very slightly* exceed this max with 'z' as per standard Quake where z was 2.08 + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Light Flicker") + float MaxValue = 2; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Light Flicker") + float MinValue = 0; + + /// Playback speed + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Light Flicker") + float Speed = 1; + + /// Whether to auto-start + UPROPERTY(EditAnywhere, Category="Light Flicker") + bool bAutoPlay = true; + + UPROPERTY(ReplicatedUsing=OnRep_TimePos) + float TimePos; + float CurrentValue; + + const FRichCurve* Curve; + + UFUNCTION() + void OnRep_TimePos(); + void ValueUpdate(); + +public: + + UPROPERTY(BlueprintAssignable) + FOnLightFlickerUpdate OnLightFlickerUpdate; + + UFUNCTION(BlueprintCallable) + void Play(bool bResetTime = false); + UFUNCTION(BlueprintCallable) + void Pause(); + UFUNCTION(BlueprintPure) + float GetCurrentValue() const; + virtual void BeginPlay() override; + virtual void TickComponent(float DeltaTime, + ELevelTick TickType, + FActorComponentTickFunction* ThisTickFunction) override; +}; \ No newline at end of file diff --git a/doc/LightFlicker.md b/doc/LightFlicker.md new file mode 100644 index 0000000..d3da81c --- /dev/null +++ b/doc/LightFlicker.md @@ -0,0 +1,49 @@ +# Light Flicker Component + +This component adds the ability to generate a light flicker value, which can be plugged into light intensities, or material parameters, or anything else you want. + +It works on the same basis as Quake, Half Life: Alyx and countless other games; there is a "flicker string" made up of lower-case letters a-z, where a = 0, m = 1 and z ~= 2 (actually 2.08 in practice), meaning the default value range is from completely off, to double brightness. + +You can use all the [Quake in-built flicker patterns](https://github.com/id-Software/Quake/blob/bf4ac424ce754894ac8f1dae6a3981954bc9852d/qw-qc/world.qc#L328-L372), or make your own. + +## Adding the component + +The flicker component is a non-scene component that can be added to any actor, just search for "Steves Light Flicker" + +## Configure it + + +![](configure.png) + +### Patterns and Min/Max + +If you select "Custom" in the flicker pattern field, you need to supply your own string of a-z characters in "Custom Flicker Pattern". With the default min/max of 0-2 the character values are: + + +| Char |Value| +|-|--| +|a|0| +|m|1| +|z|2.08| + +The max is slightly over 2 as you can see, that's because to make 'm' (char index 12) exactly 1 the divisor has to be 24, meaning 'z' as character 25 is slightly over ('y' is actually 2). + +You can change the output range from the default of 0-2 if you want, just remember that 'z' will slightly exceed the max. + +### Speed + +By default as with Quake every character in the pattern applies for 0.1s. Change the speed multiplier if you want that to be different. + +### AutoPlay + +Whether to start playing the flicker immediately, or whether to await a call to `Play()`. + +> When not playing, the component does not tick. + +## Using the Output + +The component will just output values when it's played on the OnLightFlicker event: + +![](flickerupdate.png) + +It's up to you to feed these into light intensity values, material parameters etc. diff --git a/doc/configure.png b/doc/configure.png new file mode 100644 index 0000000000000000000000000000000000000000..faf7ac32bd057de08b03e213f47f8d94cead98cd GIT binary patch literal 14495 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 literal 0 HcmV?d00001 diff --git a/doc/flickerupdate.png b/doc/flickerupdate.png new file mode 100644 index 0000000000000000000000000000000000000000..b536e7e298748acc5c032e1c8da35ba7ed881e17 GIT binary patch literal 24696 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 literal 0 HcmV?d00001