bmh/FlightSimulation/Plugins/CesiumForUnreal_5.4/Source/CesiumRuntime/Public/CesiumOriginShiftComponent.h
2025-02-07 22:52:32 +08:00

152 lines
5.3 KiB
C++

// Copyright 2020-2024 CesiumGS, Inc. and Contributors
#pragma once
#include "CesiumGlobeAnchoredActorComponent.h"
#include "CoreMinimal.h"
#include "CesiumOriginShiftComponent.generated.h"
class UCesiumGlobeAnchorComponent;
/**
* Indicates how to shift the origin as the Actor to which a
* CesiumOriginShiftComponent is attached moves.
*/
UENUM(BlueprintType)
enum class ECesiumOriginShiftMode : uint8 {
/**
* This component is disabled and will have no effect.
*/
Disabled,
/**
* The origin of the CesiumGeoreference will be changed when the Actor enters
* a new sub-level, but it will otherwise not be modified as the Actor moves.
* Any objects that are not anchored to the globe with a
* CesiumGlobeAnchorComponent will appear to move when the Actor enters a
* sub-level.
*/
SwitchSubLevelsOnly,
/**
* The origin of the CesiumGeoreference will change as the Actor moves in
* order to maintain small, precise coordinate values near the Actor, as well
* as to keep the globe's local "up" direction aligned with the +Z axis. Any
* objects that are not anchored to the globe with a
* CesiumGlobeAnchorComponent will appear to move whenever the origin changes.
*
* When using this mode, all Cesium3DTileset instances as well as any Actors
* with a CesiumGlobeAnchorComponent need to be marked Movable, because these
* objects _will_ be moved when the origin is shifted.
*/
ChangeCesiumGeoreference,
};
/**
* Automatically shifts the origin of the Unreal world coordinate system as the
* object to which this component is attached moves. This improves rendering
* precision by keeping coordinate values small, and can also help world
* building by keeping the globe's local up direction aligned with the +Z axis.
*
* This component is typically attached to a camera or Pawn. By default, it only
* shifts the origin when entering a new sub-level (a Level Instance Actor with
* a CesiumSubLevelComponent attached to it). By changing the Mode and Distance
* properties, it can also shift the origin continually when in between
* sub-levels (or when not using sub-levels at all).
*
* It is essential to add a CesiumGlobeAnchorComponent to all other non-globe
* aware objects in the level; otherwise, they will appear to move when the
* origin is shifted. It is not necessary to anchor objects that are in
* sub-levels, because the origin remains constant for the entire time that a
* sub-level is active.
*/
UCLASS(ClassGroup = "Cesium", Meta = (BlueprintSpawnableComponent))
class CESIUMRUNTIME_API UCesiumOriginShiftComponent
: public UCesiumGlobeAnchoredActorComponent {
GENERATED_BODY()
#pragma region Properties
private:
/**
* Indicates how to shift the origin as the Actor to which this component is
* attached moves.
*/
UPROPERTY(
EditAnywhere,
BlueprintReadWrite,
BlueprintGetter = GetMode,
BlueprintSetter = SetMode,
Category = "Cesium",
Meta = (AllowPrivateAccess))
ECesiumOriginShiftMode Mode = ECesiumOriginShiftMode::SwitchSubLevelsOnly;
/**
* The maximum distance between the origin of the Unreal coordinate system and
* the Actor to which this component is attached. When this distance is
* exceeded, the origin is shifted to bring it close to the Actor. This
* property is ignored if the Mode property is set to "Disabled" or "Switch
* Sub Levels Only".
*
* When the value of this property is 0.0, the origin is shifted continuously.
*/
UPROPERTY(
EditAnywhere,
BlueprintReadWrite,
BlueprintGetter = GetDistance,
BlueprintSetter = SetDistance,
Category = "Cesium",
Meta = (AllowPrivateAccess))
double Distance = 0.0;
#pragma endregion
#pragma region Property Accessors
public:
/**
* Gets a value indicating how to shift the origin as the Actor to which this
* component is attached moves.
*/
UFUNCTION(BlueprintGetter)
ECesiumOriginShiftMode GetMode() const;
/**
* Sets a value indicating how to shift the origin as the Actor to which this
* component is attached moves.
*/
UFUNCTION(BlueprintSetter)
void SetMode(ECesiumOriginShiftMode NewMode);
/**
* Gets the maximum distance between the origin of the Unreal coordinate
* system and the Actor to which this component is attached. When this
* distance is exceeded, the origin is shifted to bring it close to the Actor.
* This property is ignored if the Mode property is set to "Disabled" or
* "Switch Sub Levels Only".
*
* When the value of this property is 0.0, the origin is shifted continuously.
*/
UFUNCTION(BlueprintGetter)
double GetDistance() const;
/**
* Sets the maximum distance between the origin of the Unreal coordinate
* system and the Actor to which this component is attached. When this
* distance is exceeded, the origin is shifted to bring it close to the Actor.
* This property is ignored if the Mode property is set to "Disabled" or
* "Switch Sub Levels Only".
*
* When the value of this property is 0.0, the origin is shifted continuously.
*/
UFUNCTION(BlueprintSetter)
void SetDistance(double NewDistance);
#pragma endregion
public:
UCesiumOriginShiftComponent();
protected:
virtual void TickComponent(
float DeltaTime,
ELevelTick TickType,
FActorComponentTickFunction* ThisTickFunction) override;
};