152 lines
5.3 KiB
C++
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;
|
|
};
|