Monolith/Source/Monolith/PilotCamera.h

62 lines
1.6 KiB
C++

// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "MoveState.h"
#include "Camera/CameraComponent.h"
#include "PilotCamera.generated.h"
class FMoveState;
UCLASS(Blueprintable, ClassGroup=Camera, meta=(BlueprintSpawnableComponent))
class MONOLITH_API UPilotCamera : public UCameraComponent
{
GENERATED_BODY()
using FOVs = std::tuple<float, float, float>;
#define ARE(Stand, Walk, Sprint) std::make_tuple(Stand, Walk, Sprint)
void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction);
inline bool isMoveStateSet() const;
bool TrySetMoveState();
// FOV
FOVs TargetFOVs = ARE(87.f, 92.f, 100.f);
const float RateOfChange = 30;
float GetTargetFOV() const;
void UpdateFOV(float DeltaTime);
// Roll
float TargetRoll = 0;
// Max amount of roll applied when strafing
UPROPERTY(EditDefaultsOnly, Category = "Move State", meta = (AllowPrivateAccess = "true"))
float MaxStrafeRoll = 3;
// Amount of roll applied per second
UPROPERTY(EditDefaultsOnly, Category = "Move State", meta = (AllowPrivateAccess = "true"))
float RollRateOfChange = 15;
void UpdateRoll(float DeltaTime);
// TODO - Implement these
void ApplyImpulseFOV();
void ImpactCameraShake();
FMoveState* MoveState;
};
inline float UPilotCamera::GetTargetFOV() const
{
auto[stand, walk, sprint] = TargetFOVs;
if (MoveState->Is(SPRINT)) return sprint;
if (!MoveState->Is(STILL)
&& !MoveState->Is(STRAFE_R)
&& !MoveState->Is(STRAFE_L)) return walk;
return stand;
}
inline bool UPilotCamera::isMoveStateSet() const
{
return MoveState != nullptr;
}