Files
UnrealEngine/Engine/Plugins/Experimental/Water/Source/Runtime/Public/BuoyancyComponent.h
2025-05-18 13:04:45 +08:00

156 lines
6.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "BuoyancyTypes.h"
#include "BuoyancyComponent.generated.h"
#define UE_API WATER_API
namespace EEndPlayReason { enum Type : int; }
class UWaterBodyComponent;
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnPontoonEnteredWater, const FSphericalPontoon&, Pontoon);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnPontoonExitedWater, const FSphericalPontoon&, Pontoon);
UCLASS(MinimalAPI, Blueprintable, Config = Game, meta = (BlueprintSpawnableComponent))
class UBuoyancyComponent : public UActorComponent
{
GENERATED_BODY()
public:
UE_API UBuoyancyComponent(const FObjectInitializer& ObjectInitializer);
//~ Begin UActorComponent Interface.
UE_API virtual void BeginPlay() override;
UE_API virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
UE_API virtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
//~ End UActorComponent Interface
//~ Begin UObject Interface.
UE_API virtual void GetResourceSizeEx(FResourceSizeEx& CumulativeResourceSize) override;
UE_API virtual void PostLoad() override;
UE_API virtual void Serialize(FArchive& Ar) override;
//~ End UObject Interface
UE_API virtual void Update(float DeltaTime);
UE_API virtual void ApplyForces(float DeltaTime, FVector LinearVelocity, float ForwardSpeed, float ForwardSpeedKmh, UPrimitiveComponent* PrimitiveComponent);
virtual void FinalizeAuxData() {}
UE_API virtual TUniquePtr<FBuoyancyComponentAsyncInput> SetCurrentAsyncInputOutput(int32 InputIdx, FBuoyancyManagerAsyncOutput* CurOutput, FBuoyancyManagerAsyncOutput* NextOutput, float Alpha, int32 BuoyancyManagerTimestamp);
UE_API void SetCurrentAsyncInputOutputInternal(FBuoyancyComponentAsyncInput* CurInput, int32 InputIdx, FBuoyancyManagerAsyncOutput* CurOutput, FBuoyancyManagerAsyncOutput* NextOutput, float Alpha, int32 BuoyancyManagerTimestamp);
UE_API void FinalizeSimCallbackData(FBuoyancyManagerAsyncInput& Input);
UE_API void GameThread_ProcessIntermediateAsyncOutput(const FBuoyancyManagerAsyncOutput& AsyncOutput);
UE_API virtual void GameThread_ProcessIntermediateAsyncOutput(const FBuoyancyComponentAsyncOutput& Output);
UE_API bool IsUsingAsyncPath() const;
UE_API virtual TUniquePtr<FBuoyancyComponentAsyncAux> CreateAsyncAux() const;
UE_API virtual void SetupWaterBodyOverlaps();
UPrimitiveComponent* GetSimulatingComponent() { return SimulatingComponent; }
bool HasPontoons() const { return BuoyancyData.Pontoons.Num() > 0; }
UE_API void AddCustomPontoon(float Radius, FName CenterSocketName);
UE_API void AddCustomPontoon(float Radius, const FVector& RelativeLocation);
UE_API virtual int32 UpdatePontoons(float DeltaTime, float ForwardSpeed, float ForwardSpeedKmh, UPrimitiveComponent* PrimitiveComponent);
UE_API void UpdatePontoonCoefficients();
UE_API FVector ComputeWaterForce(const float DeltaTime, const FVector LinearVelocity) const;
UE_API FVector ComputeLinearDragForce(const FVector& PhyiscsVelocity) const;
UE_API FVector ComputeAngularDragTorque(const FVector& AngularVelocity) const;
UE_API void EnteredWaterBody(UWaterBodyComponent* WaterBodyComponent);
UE_API void ExitedWaterBody(UWaterBodyComponent* WaterBodyComponent);
UFUNCTION(BlueprintCallable, Category = Buoyancy)
const TArray<UWaterBodyComponent*>& GetCurrentWaterBodyComponents() const { return CurrentWaterBodyComponents; }
TArray<TObjectPtr<UWaterBodyComponent>>& GetCurrentWaterBodyComponents() { return CurrentWaterBodyComponents; }
UFUNCTION(BlueprintCallable, Category = Buoyancy)
bool IsOverlappingWaterBody() const { return bIsOverlappingWaterBody; }
virtual bool IsActive() const { return bCanBeActive && IsOverlappingWaterBody(); }
void SetCanBeActive(bool bInCanBeActive) { bCanBeActive = bInCanBeActive; }
UFUNCTION(BlueprintCallable, Category = Buoyancy)
bool IsInWaterBody() const { return bIsInWaterBody; }
UPROPERTY(meta = (DeprecatedProperty, DeprecationMessage = "Use BuoyancyData.Pontoons instead."))
TArray<FSphericalPontoon> Pontoons_DEPRECATED;
UE_API void GetWaterSplineKey(FVector Location, TMap<const UWaterBodyComponent*, float>& OutMap, TMap<const UWaterBodyComponent*, float>& OutSegmentMap) const;
UE_API float GetWaterHeight(FVector Position, const TMap<const UWaterBodyComponent*, float>& SplineKeyMap, float DefaultHeight, UWaterBodyComponent*& OutWaterBodyComponent, float& OutWaterDepth, FVector& OutWaterPlaneLocation, FVector& OutWaterPlaneNormal, FVector& OutWaterSurfacePosition, FVector& OutWaterVelocity, int32& OutWaterBodyIdx, bool bShouldIncludeWaves = true);
UE_API float GetWaterHeight(FVector Position, const TMap<const UWaterBodyComponent*, float>& SplineKeyMap, float DefaultHeight, bool bShouldIncludeWaves = true);
UFUNCTION(BlueprintCallable, Category = Cosmetic)
UE_API void OnPontoonEnteredWater(const FSphericalPontoon& Pontoon);
UFUNCTION(BlueprintCallable, Category = Cosmetic)
UE_API void OnPontoonExitedWater(const FSphericalPontoon& Pontoon);
UPROPERTY(BlueprintAssignable, Category = Cosmetic)
FOnPontoonEnteredWater OnEnteredWaterDelegate;
UPROPERTY(BlueprintAssignable, Category = Cosmetic)
FOnPontoonExitedWater OnExitedWaterDelegate;
UFUNCTION(BlueprintCallable, Category = Buoyancy)
UE_API void GetLastWaterSurfaceInfo(FVector& OutWaterPlaneLocation, FVector& OutWaterPlaneNormal,
FVector& OutWaterSurfacePosition, float& OutWaterDepth, int32& OutWaterBodyIdx, FVector& OutWaterVelocity);
UPROPERTY(BlueprintReadOnly, EditDefaultsOnly, Category = Buoyancy)
FBuoyancyData BuoyancyData;
protected:
UE_API virtual void ApplyBuoyancy(UPrimitiveComponent* PrimitiveComponent);
UE_API void ComputeBuoyancy(FSphericalPontoon& Pontoon, float ForwardSpeedKmh);
UE_API void ComputePontoonCoefficients();
UPROPERTY(Transient)
TArray<TObjectPtr<UWaterBodyComponent>> CurrentWaterBodyComponents;
// Primitive component that will be used for physics simulation.
UPROPERTY()
TObjectPtr<UPrimitiveComponent> SimulatingComponent;
// async data
FBuoyancyComponentAsyncInput* CurAsyncInput;
FBuoyancyComponentAsyncOutput* CurAsyncOutput;
FBuoyancyComponentAsyncOutput* NextAsyncOutput;
EAsyncBuoyancyComponentDataType CurAsyncType;
float OutputInterpAlpha = 0.f;
struct FAsyncOutputWrapper
{
int32 Idx;
int32 Timestamp;
FAsyncOutputWrapper()
: Idx(INDEX_NONE)
, Timestamp(INDEX_NONE)
{
}
};
TArray<FAsyncOutputWrapper> OutputsWaitingOn;
// async end
uint32 PontoonConfiguration;
TMap<uint32, TArray<float>> ConfiguredPontoonCoefficients;
int32 VelocityPontoonIndex;
int8 bIsOverlappingWaterBody : 1;
int8 bCanBeActive : 1;
int8 bIsInWaterBody : 1;
public:
uint8 bUseAsyncPath : 1;
};
#undef UE_API