From 8bb7542dfd65360c33d019c114a34ca39f902718 Mon Sep 17 00:00:00 2001 From: Emilie Schott <43524962+EmilieSchott@users.noreply.github.com> Date: Sun, 9 Mar 2025 22:23:36 +0100 Subject: [PATCH] [ADD] Display post process material on screen with radius depending on damages amount taken over time --- .../Ennemy/MeleeEnemy/BP_MeleeEnemy.uasset | 4 +- Content/Legumix/Levels/LVL_GYM_00.umap | 2 +- Content/Legumix/Player/BP_Play.uasset | 4 +- .../Player/HUD/M_Postprocess_Damage.uasset | 4 +- Source/LegumeMix/Private/Player/LMPlayer.cpp | 67 ++++++++++++++++++- .../Public/Player/LMHealthComponent.h | 2 + Source/LegumeMix/Public/Player/LMPlayer.h | 60 +++++++++++++++-- 7 files changed, 126 insertions(+), 17 deletions(-) diff --git a/Content/Legumix/Ennemy/MeleeEnemy/BP_MeleeEnemy.uasset b/Content/Legumix/Ennemy/MeleeEnemy/BP_MeleeEnemy.uasset index 9d91910..15490a4 100644 --- a/Content/Legumix/Ennemy/MeleeEnemy/BP_MeleeEnemy.uasset +++ b/Content/Legumix/Ennemy/MeleeEnemy/BP_MeleeEnemy.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:93f9b1b58b4fbcd25edbd71b7c063ceff3eb570196cff23c65734dd201bc1132 -size 156474 +oid sha256:79ce1eaf8c92f3dcbe0b59ca6c976be1a161d8acf14d36cea7a8f3e6e3b43349 +size 141512 diff --git a/Content/Legumix/Levels/LVL_GYM_00.umap b/Content/Legumix/Levels/LVL_GYM_00.umap index d523f28..2794140 100644 --- a/Content/Legumix/Levels/LVL_GYM_00.umap +++ b/Content/Legumix/Levels/LVL_GYM_00.umap @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:84197784f712cc43d6b4e3512ca08739be790090387576fd7d1f2c915ac36c95 +oid sha256:a030ec9cab6b4b991b2cd4ac11ab5e88b47346bcd0bcb657b6af3208bdbd8320 size 979590 diff --git a/Content/Legumix/Player/BP_Play.uasset b/Content/Legumix/Player/BP_Play.uasset index b3bc6bc..47cf459 100644 --- a/Content/Legumix/Player/BP_Play.uasset +++ b/Content/Legumix/Player/BP_Play.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bd8399d8102d6f0110ecf618b4decef972e915c833035ab6058ff7512acf695b -size 484954 +oid sha256:281dcd4cdfd08af9eaa65e33fe67f7d72e40c10d2ca503cb9668058e15549aa0 +size 463534 diff --git a/Content/Legumix/Player/HUD/M_Postprocess_Damage.uasset b/Content/Legumix/Player/HUD/M_Postprocess_Damage.uasset index 5c6e575..d01996c 100644 --- a/Content/Legumix/Player/HUD/M_Postprocess_Damage.uasset +++ b/Content/Legumix/Player/HUD/M_Postprocess_Damage.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0dcb8de706099ffc7ee8024490eafff0c3cee3540d1f546509d2dcc39dd02ffc -size 23688 +oid sha256:2e9485574a4e11a2b875255a8dc3a7874ae00b4caac0e5cd995e55f6c0df992d +size 24558 diff --git a/Source/LegumeMix/Private/Player/LMPlayer.cpp b/Source/LegumeMix/Private/Player/LMPlayer.cpp index a2dbffc..c21a898 100644 --- a/Source/LegumeMix/Private/Player/LMPlayer.cpp +++ b/Source/LegumeMix/Private/Player/LMPlayer.cpp @@ -28,9 +28,16 @@ ALMPlayer::ALMPlayer() SpreadStream = FRandomStream(FMath::Rand()); HealthComponent = CreateDefaultSubobject(TEXT("HealthComponent")); - HitPeriodLengthInSeconds = 0.f; - TimeElapsedSinceLastDamageInSeconds = 0.f; + HitPeriodLengthInSeconds = 15.f; + bHitPeriodInProgress = false; + TimeOfTheLastDamage = 0.f; + HealthAtTheCurrentHitPeriodBeginning = 100.f; CumulatedDamagesOnCurrentHitPeriod = 0.f; + PlayerViewOcclusionPercent = 0.f; + NextPlayerViewOcclusionPercent = 0.f; + PlayerViewOcclusionPercent = 0.f; + AlphaLerpForPlayerViewOcclusionPercent = 0.f; + } void ALMPlayer::BeginPlay() @@ -41,9 +48,41 @@ void ALMPlayer::BeginPlay() GetCamera()->SetFieldOfView(ULMUserSettings::GetLegumixUserSettings()->FieldOfView); - + HealthComponent->OnHealthChanged.AddDynamic(this, &ALMPlayer::SetDisplayDamageParameters); } +void ALMPlayer::Tick(float DeltaTime) +{ + if(bHitPeriodInProgress == true) + { + double TimeElapsedSinceLastDamage = GetWorld()->GetTimeSeconds() - TimeOfTheLastDamage; + if(TimeElapsedSinceLastDamage > HitPeriodLengthInSeconds) + { + if(bHitPeriodInProgress == true) + { + bHitPeriodInProgress = false; + PlayerViewOcclusionPercent = NextPlayerViewOcclusionPercent; + NextPlayerViewOcclusionPercent = 0.f; + AlphaLerpForPlayerViewOcclusionPercent = 0.f; + TimeOfTheLastDamage = 0.f; + CumulatedDamagesOnCurrentHitPeriod = 0.f; + } + } + } + + if(PlayerViewOcclusionPercent != NextPlayerViewOcclusionPercent) + { + AlphaLerpForPlayerViewOcclusionPercent = FMath::Clamp(AlphaLerpForPlayerViewOcclusionPercent + DeltaTime, 0, 1); + PlayerViewOcclusionPercent = FMath::Lerp(PlayerViewOcclusionPercent, NextPlayerViewOcclusionPercent, AlphaLerpForPlayerViewOcclusionPercent); + DamageDynamicMaterialInstance->SetScalarParameterValue("PlayerViewOcclusionPercent", PlayerViewOcclusionPercent); + } + else if(PlayerViewOcclusionPercent == NextPlayerViewOcclusionPercent) + { + AlphaLerpForPlayerViewOcclusionPercent = 0; + } +} + + bool ALMPlayer::PickUpAmmo(ALMAmmo* Ammo) { if (GEngine) @@ -163,3 +202,25 @@ USkeletalMeshComponent* ALMPlayer::GetArms() return ArmsMesh; } +void ALMPlayer::SetDisplayDamageParameters(float Health, float Damage) +{ + if (bHitPeriodInProgress == false) + { + HealthAtTheCurrentHitPeriodBeginning = Health; + bHitPeriodInProgress = true; + } + TimeOfTheLastDamage = GetWorld()->GetTimeSeconds(); + CumulatedDamagesOnCurrentHitPeriod += Damage; + SetPlayerViewOcclusionPercent(); +} + + + +void ALMPlayer::SetPlayerViewOcclusionPercent() +{ + AlphaLerpForPlayerViewOcclusionPercent = 0; + PlayerViewOcclusionPercent = NextPlayerViewOcclusionPercent; + NextPlayerViewOcclusionPercent = CumulatedDamagesOnCurrentHitPeriod / HealthAtTheCurrentHitPeriodBeginning; +} + + diff --git a/Source/LegumeMix/Public/Player/LMHealthComponent.h b/Source/LegumeMix/Public/Player/LMHealthComponent.h index cb9a577..a780596 100644 --- a/Source/LegumeMix/Public/Player/LMHealthComponent.h +++ b/Source/LegumeMix/Public/Player/LMHealthComponent.h @@ -23,6 +23,8 @@ public: void Kill(); public: + FORCEINLINE float GetHealth() const { return Health; } + /** * Applies an amount of damage to the component. * @param Damage The damage to apply the Health to. diff --git a/Source/LegumeMix/Public/Player/LMPlayer.h b/Source/LegumeMix/Public/Player/LMPlayer.h index 38bbe50..f86b10c 100644 --- a/Source/LegumeMix/Public/Player/LMPlayer.h +++ b/Source/LegumeMix/Public/Player/LMPlayer.h @@ -11,6 +11,7 @@ class UCameraComponent; class ULMWeaponManager; class ULMHealthComponent; +class UMaterialInstanceDynamic; class ALMAmmo; DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnRequestUnpauseSignature); @@ -48,6 +49,9 @@ protected: // Called when the game starts or when spawned virtual void BeginPlay() override; + // Called every frame + virtual void Tick(float DeltaTime) override; + public: UFUNCTION(BlueprintCallable) ULMWeaponManager* GetWeaponManager() { return WeaponManager; } @@ -113,34 +117,76 @@ private: UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Legumix, meta = (AllowPrivateAccess = true)) TObjectPtr HealthComponent; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Legumix, meta = (AllowPrivateAccess = true)) + TObjectPtr DamageDynamicMaterialInstance; + /** - * Length of the period in which the damages HUD will be displayed on player screen. + * Is a hit period in progress + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Legumix, meta = (AllowPrivateAccess = true)) + bool bHitPeriodInProgress; + + /** + * Length of the period in which the damage texture effect will be displayed on player screen. */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Legumix, meta = (AllowPrivateAccess = true)) double HitPeriodLengthInSeconds; /** - * Time elapsed since last damage taken. - * If it's superior to the HitPeriodLengthInSeconds variable, ends the Hit period - * and so the displaying of damages HUD on player screen + * Time of last damage taken. + * If the time elapsed since is superior to the HitPeriodLengthInSeconds variable, ends the Hit period + * and so the displaying the damage texture effect on player screen */ UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Legumix, meta = (AllowPrivateAccess = true)) - double TimeElapsedSinceLastDamageInSeconds; + double TimeOfTheLastDamage; /** * Cumulated damages taken by the player on the current hit period - * To calculate view occlusion percent for the damage HUD + * To calculate view occlusion percent for the damage texture effect */ UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Legumix, meta = (AllowPrivateAccess = true)) float CumulatedDamagesOnCurrentHitPeriod; /** * Player health at the current hit period beginning - * To calculate view occlusion percent for the damage HUD + * To calculate view occlusion percent for the damage texture effect */ UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Legumix, meta = (AllowPrivateAccess = true)) float HealthAtTheCurrentHitPeriodBeginning; + /** + * Percent of the player screen occupied with damage texture effect to reach + */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Legumix, meta = (AllowPrivateAccess = true)) + float NextPlayerViewOcclusionPercent; + + /** + * Previous percent of the player screen occupied with damage texture effect + * mandatory to make interpolation between this core and the current one + */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Legumix, meta = (AllowPrivateAccess = true)) + float PlayerViewOcclusionPercent; + + /** + * Percent of the player screen occupied with damage texture effect + */ + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category=Legumix, meta = (AllowPrivateAccess = true)) + float AlphaLerpForPlayerViewOcclusionPercent; + + /** + * Actualize all parameters needed to calculate PlayerViewOcclusionPercent + */ + UFUNCTION(BlueprintCallable, Category=PostProcess) + void SetDisplayDamageParameters(float Health, float Damage); + + /** + * Determine Percent of the player screen occupied with damage texture effect + */ + UFUNCTION(BlueprintCallable, Category=PostProcess) + void SetPlayerViewOcclusionPercent(); + + + private: #if WITH_EDITORONLY_DATA /** If set, bullet debug will be drawn. */