123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269 |
- #pragma once
- #include "Components/TextRenderComponent.h"
- #include "GameFramework/Volume.h"
- #include "ObstructionAndOcclusionService/AkPortalObstructionAndOcclusionService.h"
- #include "AkGameplayTypes.h"
- #if WITH_EDITOR
- #include "AkSettings.h"
- #endif
- #include "AkAcousticPortal.generated.h"
- class UAkRoomComponent;
- class UAkLateReverbComponent;
- 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 OpenPortal();
- UFUNCTION(BlueprintCallable, Category = "Audiokinetic|AkPortalComponent")
- void ClosePortal();
- UFUNCTION(BlueprintCallable, Category = "Audiokinetic|AkPortalComponent")
- AkAcousticPortalState GetCurrentState() const;
- UFUNCTION(BlueprintCallable, Category = "Audiokinetic|AkPortalComponent")
- UPrimitiveComponent* GetPrimitiveParent() const;
- UFUNCTION(BlueprintCallable, Category = "Audiokinetic|AkPortalComponent")
- bool PortalPlacementValid() const { return GetFrontRoom() != GetBackRoom(); }
-
- UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AkPortalComponent", meta = (DisplayName = "Is Dynamic"))
- bool bDynamic = false;
- UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "AkPortalComponent")
- AkAcousticPortalState InitialState = AkAcousticPortalState::Open;
-
- UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AkPortalComponent|Obstruction")
- float ObstructionRefreshInterval = .0f;
-
- UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AkPortalComponent|Obstruction")
- TEnumAsByte<ECollisionChannel> ObstructionCollisionChannel = ECollisionChannel::ECC_Visibility;
- void ResetPortalState();
- FVector GetExtent() const;
- AkRoomID GetFrontRoom() const;
- AkRoomID GetBackRoom() const;
- AkPortalID GetPortalID() const { return AkPortalID(this); }
-
- bool UpdateConnectedRooms();
- const UAkRoomComponent* GetFrontRoomComponent() const { return FrontRoom; }
- const 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;
- #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;
- private:
- class UPrimitiveComponent* Parent;
- void InitializeParent();
- void SetSpatialAudioPortal();
- template <typename tComponent>
- void FindConnectedComponents(FAkEnvironmentIndex& RoomQuery, tComponent*& out_pFront, tComponent*& out_pBack);
- AkAcousticPortalState PortalState;
- #if WITH_EDITOR
- static const float RoomsRefreshIntervalEditor;
- #endif
- 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 PortalNeedUpdated = false;
- UAkRoomComponent* FrontRoom;
- UAkRoomComponent* BackRoom;
- AkPortalObstructionAndOcclusionService ObstructionService;
- #if WITH_EDITOR
- 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 UpdateRoomNames();
- 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 OpenPortal();
- UFUNCTION(BlueprintCallable, Category = "Audiokinetic|AkAcousticPortal")
- void ClosePortal();
- UFUNCTION(BlueprintCallable, Category = "Audiokinetic|AkAcousticPortal")
- AkAcousticPortalState GetCurrentState() const;
- AkRoomID GetFrontRoom() const;
- AkRoomID GetBackRoom() const;
- UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Portal", 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;
- };
|