LifePlay-Revival/Source/LifePlay/LPRoomBoundsCameraModifier.h
edujiro5972 56dfcfc3d2 LifePlay UE 5.8 : état de développement au 2026-10-20
Tickets : PUB-20261020-T1

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-20 17:35:10 +02:00

59 lines
2.6 KiB
C++

// Lot CAM2 (CAM2-SPEC-01 rev. 3 § 12.4, F2-B) : borne de la vue de la camera de scene.
//
// Le BP de Room deplace CameraScene a chaque image (minuterie UpdateRoomCam, orbite a la souris, AutoCamera) : une borne posee
// sur l'acteur serait reecrite. Ce modificateur agit dans le calcul de la vue (PlayerCameraManager), apres tous les BP : la vue
// reste dans la piece (murs, sol, plafond) et devant le mur du studio (GI.Wall), quel que soit le chemin qui a deplace l'acteur.
// L'etat est pose a chaque image par ULPCameraModeSubsystem (liste blanche des vues) ; le modificateur ne decide rien seul et
// n'agit que si la cible de vue est l'acteur designe (jamais en C1, POV, Overview, C2, Builder, Studio).
#pragma once
#include "CoreMinimal.h"
#include "Camera/CameraModifier.h"
#include "LPRoomBoundsCameraModifier.generated.h"
UCLASS()
class LIFEPLAY_API ULPRoomBoundsCameraModifier : public UCameraModifier
{
GENERATED_BODY()
public:
/**
* Etat de la borne pour les images suivantes.
* @param InViewTarget acteur dont la vue est bornee (Room.SceneCamera) ; nul = borne inactive
* @param bInRoom vrai si InAllowed est une zone de piece valide (X, Y, Z)
* @param bInWall vrai si le mur du studio s'applique : sur l'axe InWallAxis (0 = X, 1 = Y), la vue reste du cote
* InWallSign (+1 ou -1) de InWallLimit, quand elle est dans l'emprise InWallSpan (autre axe, Z)
*/
void SetBounds(AActor* InViewTarget, bool bInRoom, const FBox& InAllowed, bool bInWall, int32 InWallAxis, double InWallLimit,
double InWallSign, const FBox2D& InWallSpan);
/** Derniere correction appliquee depuis l'appel precedent : position avant et apres, bornes franchies. Faux si aucune. */
bool ConsumeCorrection(FVector& OutBefore, FVector& OutAfter, FString& OutWhat);
/**
* CAM2-SPEC-02 § 5 (S1-C++) : decalage de la vue du studio de creation. Quand la cible de vue est InStudioView, la vue est
* decalee de InOffset (le personnage edite est decale du meme vecteur par le sous-systeme). Nul = decalage inactif.
*/
void SetStudio(AActor* InStudioView, const FVector& InOffset);
virtual bool ModifyCamera(float DeltaTime, FMinimalViewInfo& InOutPOV) override;
private:
TWeakObjectPtr<AActor> BoundedView;
bool bRoom = false;
FBox Allowed = FBox(ForceInit);
bool bWall = false;
int32 WallAxis = 0;
double WallLimit = 0.0;
double WallSign = 1.0;
FBox2D WallSpan = FBox2D(ForceInit);
TWeakObjectPtr<AActor> StudioView;
FVector StudioOffset = FVector::ZeroVector;
bool bCorrected = false;
FVector CorrectedBefore = FVector::ZeroVector;
FVector CorrectedAfter = FVector::ZeroVector;
FString CorrectedWhat;
};