123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324 |
- #pragma once
- #include "Components/TextRenderComponent.h"
- #include "GameFramework/Volume.h"
- #include "AkGameplayTypes.h"
- #include "Wwise/AkPortalObstructionAndOcclusionService.h"
- #if WITH_EDITOR
- #include "AkSettings.h"
- #endif
- #include "AkAcousticPortal.generated.h"
- class UAkRoomComponent;
- class UAkLateReverbComponent;
- class FAkEnvironmentIndex;
- UCLASS(ClassGroup = Audiokinetic, hidecategories = (Advanced, Attachment, Volume), BlueprintType, meta = (BlueprintSpawnableComponent))
- class AKAUDIO_API UAkPortalComponent : public USceneComponent
- {
- GENERATED_BODY()
- public:
- UAkPortalComponent(const class FObjectInitializer& ObjectInitializer);
-
- UFUNCTION(BlueprintCallable, Category = "Audiokinetic|AkPortalComponent")
- void EnablePortal();
-
- UFUNCTION(BlueprintCallable, Category = "Audiokinetic|AkPortalComponent")
- void DisablePortal();
-
- UFUNCTION(BlueprintCallable, Category = "Audiokinetic|AkPortalComponent")
- AkAcousticPortalState GetCurrentState() const;
-
- UFUNCTION(BlueprintCallable, Category = "Audiokinetic|AkPortalComponent")
- float GetPortalOcclusion() const;
-
- UFUNCTION(BlueprintCallable, Category = "Audiokinetic|AkPortalComponent")
- void SetPortalOcclusion(float InPortalOcclusion);
-
- UFUNCTION(BlueprintCallable, Category = "Audiokinetic|AkPortalComponent")
- UPrimitiveComponent* GetPrimitiveParent() const;
-
- UFUNCTION(BlueprintCallable, Category = "Audiokinetic|AkPortalComponent")
- bool PortalPlacementValid() const;
-
- UPROPERTY(EditAnywhere, BlueprintSetter = SetDynamic, Category = "AkPortalComponent", meta = (DisplayName = "Is Dynamic"))
- bool bDynamic = false;
- UFUNCTION(BlueprintSetter, Category = "AkPortalComponent")
- void SetDynamic(bool bInDynamic);
-
- UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "AkPortalComponent")
- AkAcousticPortalState InitialState = AkAcousticPortalState::Open;
-
- UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "AkPortalComponent|Obstruction Occlusion", meta = (ClampMin = 0.0f, ClampMax = 1.0f))
- float InitialOcclusion = 0.f;
-
- UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AkPortalComponent|Obstruction Occlusion", meta = (ClampMin = 0.f))
- float ObstructionRefreshInterval = .0f;
-
- UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AkPortalComponent|Obstruction Occlusion")
- TEnumAsByte<ECollisionChannel> ObstructionCollisionChannel = ECollisionChannel::ECC_Visibility;
- void ResetPortalState();
- void ResetPortalOcclusion();
- FVector GetExtent() const;
- AkRoomID GetFrontRoomID() const;
- AkRoomID GetBackRoomID() const;
- AkPortalID GetPortalID() const { return AkPortalID(this); }
-
- bool UpdateConnectedRooms(bool in_bForceUpdate = false);
- void RemovePortalConnections();
- const TWeakObjectPtr<UAkRoomComponent> GetFrontRoomComponent() const { return FrontRoom; }
- const TWeakObjectPtr<UAkRoomComponent> GetBackRoomComponent() const { return BackRoom; }
- virtual void BeginPlay() override;
- #if WITH_EDITOR
- virtual void BeginDestroy() override;
- virtual void InitializeComponent() override;
- virtual void OnComponentCreated() override;
- virtual void PostLoad() override;
- virtual void OnComponentDestroyed(bool bDestroyingHierarchy) override;
- void UpdateTextRotations() const;
- void UpdateRoomNames();
- #endif
- virtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction * ThisTickFunction) override;
- virtual void OnRegister() override;
- virtual void OnUnregister() override;
- virtual void OnUpdateTransform(EUpdateTransformFlags UpdateTransformFlags, ETeleportType Teleport) override;
- virtual bool MoveComponentImpl(
- const FVector & Delta,
- const FQuat & NewRotation,
- bool bSweep,
- FHitResult * Hit,
- EMoveComponentFlags MoveFlags,
- ETeleportType Teleport) override;
- FString GetPortalName();
- private:
- TWeakObjectPtr<class UPrimitiveComponent> Parent;
- void InitializeParent();
- void SetSpatialAudioPortal();
- void FindConnectedComponents(FAkEnvironmentIndex& RoomQuery, TWeakObjectPtr<UAkRoomComponent>& out_pFront, TWeakObjectPtr<UAkRoomComponent>& out_pBack);
- AkAcousticPortalState PortalState = AkAcousticPortalState::Open;
- float PortalOcclusion = 0.f;
- static const float RoomsRefreshIntervalGame;
- static const float RoomsRefreshDistanceThreshold;
- static const float RoomsRefreshMinRotationThreshold_Degrees;
- float RoomsRefreshIntervalSeconds = 0.5f;
- float LastRoomsUpdate = 0.0f;
- FVector PreviousLocation;
- FRotator PreviousRotation;
- bool PortalNeedsUpdate = false;
- bool PortalOcclusionChanged = false;
- bool PortalRoomsNeedUpdate = false;
- TWeakObjectPtr<UAkRoomComponent> FrontRoom;
- TWeakObjectPtr<UAkRoomComponent> BackRoom;
- AkPortalObstructionAndOcclusionService ObstructionServiceFrontRoom;
- AkPortalObstructionAndOcclusionService ObstructionServiceBackRoom;
- #if WITH_EDITOR
- static const float RoomsRefreshIntervalEditor;
- void HandleObjectsReplaced(const TMap<UObject*, UObject*>& ReplacementMap);
- class UDrawPortalComponent* DrawPortalComponent = nullptr;
- void RegisterVisEnabledCallback();
- void InitializeDrawComponent();
- void DestroyDrawComponent();
- FDelegateHandle ShowPortalsChangedHandle;
- bool AreTextVisualizersInitialized() const;
- void InitTextVisualizers();
- void DestroyTextVisualizers();
- void UpdateTextVisibility();
-
- void UpdateTextLocRotVis();
- bool bWasSelected = false;
- #endif
- #if WITH_EDITORONLY_DATA
- UPROPERTY(SkipSerialization, NonTransactional)
- mutable UTextRenderComponent* FrontRoomText = nullptr;
- UPROPERTY(SkipSerialization, NonTransactional)
- mutable UTextRenderComponent* BackRoomText = nullptr;
- #endif
- };
- UCLASS(ClassGroup = Audiokinetic, hidecategories = (Advanced, Attachment, Volume), BlueprintType)
- class AKAUDIO_API AAkAcousticPortal : public AVolume
- {
- GENERATED_BODY()
- public:
- AAkAcousticPortal(const class FObjectInitializer& ObjectInitializer);
- UFUNCTION(BlueprintCallable, Category = "Audiokinetic|AkAcousticPortal")
- void EnablePortal();
- UFUNCTION(BlueprintCallable, Category = "Audiokinetic|AkAcousticPortal")
- void DisablePortal();
- UFUNCTION(BlueprintCallable, Category = "Audiokinetic|AkAcousticPortal")
- AkAcousticPortalState GetCurrentState() const;
- UPROPERTY(VisibleAnywhere, Category = "AcousticPortal", BlueprintReadOnly, meta = (ShowOnlyInnerProperties))
- UAkPortalComponent* Portal = nullptr;
- virtual void PostRegisterAllComponents() override;
- virtual void PostLoad() override;
- virtual void Serialize(FArchive& Ar) override;
- #if WITH_EDITOR
- void FitRaycast();
- void FitPortal();
- virtual void PostEditMove(bool bFinished) override;
- virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;
- bool GetBestHits(FVector& Start0, FVector& End0, FVector& Start1, FVector& End1)
- {
- if (BestFitValid)
- {
- Start0 = BestFit[0];
- End0 = BestFit[1];
- Start1 = BestFit[2];
- End1 = BestFit[3];
-
- return true;
- }
- return false;
- }
- float GetDetectionRadius() const { return DetectionRadius; }
- bool GetFitToGeometry() const { return FitToGeometry; }
- bool GetIsDragging() const { return IsDragging; }
- virtual FName GetCustomIconName() const override
- {
- static const FName IconName("ClassIcon.AkAcousticPortal");
- return IconName;
- }
- #endif
- protected:
- static const int kNumRaycasts = 128;
- #if WITH_EDITORONLY_DATA
- void ClearBestFit();
-
- UPROPERTY(EditAnywhere, Category = "Fit to Geometry")
- bool FitToGeometry = false;
-
- UPROPERTY(EditAnywhere, Category = "Fit to Geometry")
- TEnumAsByte<EAkCollisionChannel> CollisionChannel = { EAkCollisionChannel::EAKCC_UseIntegrationSettingsDefault };
- #if WITH_EDITOR
-
- UFUNCTION(BlueprintCallable, Category = "Fit to Geometry")
- ECollisionChannel GetCollisionChannel();
- #endif
-
- UPROPERTY(EditAnywhere, Category = "Fit to Geometry", meta = (ClampMin = 1.0f, ClampMax = 100000.0f, UIMin = 100.0f, UIMax = 5000.0f))
- float DetectionRadius = 500.0f;
- FVector SavedRaycastOrigin;
- bool bUseSavedRaycastOrigin = false;
- FVector BestFit[4];
- bool BestFitValid = false;
- bool IsDragging = false;
- #endif
- private:
-
- UPROPERTY()
- AkAcousticPortalState InitialState;
- UPROPERTY(Transient)
- bool bRequiresStateMigration = false;
- bool bRequiresTransformMigration = false;
- };
|