59 lines
2.6 KiB
C++
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;
|
|
};
|