Skip to content
Snippets Groups Projects
Commit 7e04c23b authored by Philipp Schäfer's avatar Philipp Schäfer
Browse files

WIP: introducing signal source components

parent fc1ac6e7
Branches
No related tags found
No related merge requests found
Showing
with 387 additions and 17 deletions
// Fill out your copyright notice in the Description page of Project Settings.
#include "VAAbstractSignalSource.h"
std::string UVAAbstractSignalSource::GetID() const
{
return sID;
}
bool UVAAbstractSignalSource::IsValid() const
{
return !bool( FString(sID.c_str()).Equals(FString("-1")) );
}
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include <string>
#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "VAAbstractSignalSource.generated.h"
UCLASS( ClassGroup=(Custom), Abstract, meta=(BlueprintSpawnableComponent), HideDropdown, HideCategories=("Tags", "AssetUserData", "Activation", "Collision", "Cooking") )
class UVAAbstractSignalSource : public UActorComponent
{
GENERATED_BODY()
protected:
std::string sID = "-1";
bool bInitialized = false;
public:
// Sets default values for this component's properties
UVAAbstractSignalSource() = default;
// Creates the signal source in VA and sets the ID accordingly
virtual void Initialize() PURE_VIRTUAL(UVAAbstractSignalSource::Initialize, );
// Returns the VA signal source identifier (string)
std::string GetID() const;
// Checks whether this signal source was properly initialized and has a valid ID
bool IsValid() const;
};
// Fill out your copyright notice in the Description page of Project Settings.
#include "VAAudiofileSignalSource.h"
#include "VAUtils.h"
#include "VAPlugin.h"
// ****************************************************************** //
// ******* Initialization ******************************************* //
// ****************************************************************** //
void UVAAudiofileSignalSource::Initialize()
{
if (bInitialized)
{
FVAUtils::LogStuff("[UVAAudiofileSignalSource::Initialize()]: Signal source is already initialized, aborting...", true);
return;
}
sID = FVAPlugin::CreateNewBuffer(SoundFile, bLoop, StartingTime);
if (sID == "-1")
{
FVAUtils::LogStuff("[UVAAudiofileSignalSource::Initialize()]: Error creating Audiofile Signal Source", true);
return;
}
bInitialized = true;
if (!FVAPlugin::SetSoundBufferAction(sID, StartingPlayAction))
FVAUtils::LogStuff("[UVAAudiofileSignalSource::Initialize()]: Could not set Play Action during initializing", true);
}
// ****************************************************************** //
// ******* Bluepring Functions ************************************** //
// ****************************************************************** //
bool UVAAudiofileSignalSource::Play()
{
return SetPlayAction(EPlayAction::Play);
}
bool UVAAudiofileSignalSource::PlayFromTime(const float fTime)
{
if (SetPlayBackPosition(fTime))
return SetPlayAction(EPlayAction::Play);
return false;
}
bool UVAAudiofileSignalSource::Pause()
{
return SetPlayAction(EPlayAction::Pause);
}
bool UVAAudiofileSignalSource::Stop()
{
return SetPlayAction(EPlayAction::Stop);
}
// ****************************************************************** //
// ******* Setter Functions ***************************************** //
// ****************************************************************** //
bool UVAAudiofileSignalSource::SetLoop(const bool bLoopN)
{
if (!FVAPlugin::GetIsMaster())
{
return false;
}
if (bLoop == bLoopN)
{
return true;
}
bLoop = bLoopN;
return FVAPlugin::SetSoundBufferLoop(sID, bLoop);
}
bool UVAAudiofileSignalSource::SetPlayBackPosition(const float fTime)
{
if (!FVAPlugin::GetIsMaster())
{
return false;
}
return FVAPlugin::SetSoundBufferTime(sID, fTime);
}
bool UVAAudiofileSignalSource::SetPlayAction(const int Action)
{
if (!FVAPlugin::GetIsMaster())
{
return false;
}
if (int(GetPlayAction()) == Action)
{
return true;
}
return FVAPlugin::SetSoundBufferAction(sID, EPlayAction::Type(Action));
}
// ****************************************************************** //
// ******* Getter Functions ***************************************** //
// ****************************************************************** //
FString UVAAudiofileSignalSource::GetFileName() const
{
return SoundFile;
}
bool UVAAudiofileSignalSource::GetLoop() const
{
return bLoop;
}
int UVAAudiofileSignalSource::GetPlayAction() const
{
if (!FVAPlugin::GetIsMaster())
{
return -1;
}
return FVAPlugin::GetSoundBufferAction(sID);
}
// Fill out your copyright notice in the Description page of Project Settings.
#include "VAJetEngineSignalSource.h"
#include "VAUtils.h"
#include "VAPlugin.h"
void UVAJetEngineSignalSource::Initialize()
{
if (bInitialized)
{
FVAUtils::LogStuff("[UVAJetEngineSignalSource::Initialize()]: Signal source is already initialized, aborting...", true);
return;
}
sID = FVAPlugin::CreateSignalSourcePrototype(ESignalSource::JetEngine);
if (sID == "-1")
{
FVAUtils::LogStuff("[UVAJetEngineSignalSource::Initialize()]: Error initializing Jet Engine Signal Source", true);
return;
}
bInitialized = true;
if (!FVAPlugin::SetSignalSourceParameter(sID, "rpm", JetRPM))
{
FVAUtils::LogStuff("[UVAJetEngineSignalSource::Initialize()]: Could not set Jet RPM during initialization", true);
}
}
bool UVAJetEngineSignalSource::SetJetRPM(float fRPM)
{
if (!bInitialized)
return false;
if (!FVAPlugin::SetSignalSourceParameter(sID, "rpm", fRPM))
return false;
JetRPM = fRPM;
return true;
}
float UVAJetEngineSignalSource::GetJetRPM() const
{
return JetRPM;
}
......@@ -676,6 +676,9 @@ std::string FVAPlugin::CreateSignalSourcePrototype(ESignalSource::Type SignalSou
case ESignalSource::JetEngine:
ClassName = "jet_engine";
break;
default:
ProcessException("FVAPluginModule::CreateSignalSourcePrototype()", FString("Trying to create unknown signal source class") );
return "-1";
}
try
......@@ -691,15 +694,15 @@ std::string FVAPlugin::CreateSignalSourcePrototype(ESignalSource::Type SignalSou
}
}
bool FVAPlugin::SetJetEngineRMP(std::string SignalSourceID, float fRPM)
bool FVAPlugin::SetSignalSourceParameter(std::string sSignalSourceID, std::string sParamName, float fParamValue)
{
if (!ShouldInteractWithServer())
{
return false;
}
if (SignalSourceID == "-1")
if (sSignalSourceID == "-1")
{
FVAUtils::LogStuff("[FVAPlugin::SetJetEngineRMP()]: SignalSourceID invalid (=-1)", true);
FVAUtils::LogStuff("[FVAPlugin::SetSignalSourceParameter()]: SignalSourceID invalid (=-1)", true);
return false;
}
......@@ -707,17 +710,22 @@ bool FVAPlugin::SetJetEngineRMP(std::string SignalSourceID, float fRPM)
try
{
CVAStruct VAParams;
VAParams["rpm"] = fRPM;
VAServer->SetSignalSourceParameters(SignalSourceID, VAParams);
VAParams[sParamName] = fParamValue;
VAServer->SetSignalSourceParameters(sSignalSourceID, VAParams);
return true;
}
catch (CVAException & e)
{
ProcessException("FVAPluginModule::SetJetEngineRMP()", FString(e.ToString().c_str()));
ProcessException("FVAPlugin::SetSignalSourceParameter()", FString(e.ToString().c_str()));
return false;
}
}
bool FVAPlugin::SetJetEngineRMP(std::string sSignalSourceID, float fRPM)
{
return SetSignalSourceParameter(sSignalSourceID, "rpm", fRPM);
}
// ****************************************************************** //
// ******* Sound Sources ******************************************** //
......
......@@ -81,7 +81,8 @@ public:
// ******* Signal Sources ******* //
static std::string CreateSignalSourcePrototype(ESignalSource::Type SignalSourceClass);
static bool SetJetEngineRMP(std::string SignalSourceID, float fRPM);
static bool SetSignalSourceParameter(std::string sSignalSourceID, std::string sParamName, float fParamValue);
static bool SetJetEngineRMP(std::string sSignalSourceID, float fRPM);
// ******* Sound Sources ******* //
......
......@@ -39,7 +39,6 @@ FVASoundSource::FVASoundSource(UVASourceComponent* ParentComponent, TArray<AVARe
if ( ParentComponent->GetSignalSourceType() == ESignalSource::JetEngine )
{
sSignalID = FVAPlugin::CreateSignalSourcePrototype( ESignalSource::JetEngine );
//FVAPlugin::SetJetEngineRMP(sSignalID, ParentComponent->GetJetRPM());
}
else
{
......
......@@ -7,6 +7,9 @@
#include "VAPlugin.h"
#include "VAUtils.h"
#include "SignalSources\VAAudiofileSignalSource.h"
#include "SignalSources\VAJetEngineSignalSource.h"
#include "Components/SkeletalMeshComponent.h" // Skeletons
#include "Kismet/GameplayStatics.h" // Get Actors of Class
......@@ -24,8 +27,9 @@ UVASourceComponent::UVASourceComponent()
{
Initialize();
}
}
SignalSource = NewObject<UVAAudiofileSignalSource>();
}
// Called when the game starts
void UVASourceComponent::BeginPlay()
......@@ -149,6 +153,10 @@ void UVASourceComponent::Initialize()
SpawnPosition = GetOwner()->GetTransform().GetLocation();
SpawnRotation = GetOwner()->GetTransform().GetRotation().Rotator();
SignalSource->Initialize();
TArray<AVAReflectionWall*> WallArray = CurrentReceiverActor->GetReflectionWalls();
SoundSource = MakeShared<FVASoundSource>(this, WallArray);
if (FVAPlugin::GetIsMaster())
......@@ -626,6 +634,34 @@ float UVASourceComponent::GetSoundTimeOffset() const
// ****************************************************************** //
#if WITH_EDITOR
void UVASourceComponent::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
{
if (PropertyChangedEvent.GetPropertyName() != GET_MEMBER_NAME_CHECKED(UVASourceComponent, SignalSourceType))
return;
if (SignalSource != nullptr)
{
SignalSource->Rename(*MakeUniqueObjectName(this, UVAAbstractSignalSource::StaticClass(), "Settings_EXPIRED").ToString());
SignalSource->MarkPendingKill();
SignalSource = nullptr;
}
switch (SignalSourceType)
{
case ESignalSource::AudioFile:
SignalSource = NewObject<UVAAudiofileSignalSource>();
break;
case ESignalSource::JetEngine:
SignalSource = NewObject<UVAJetEngineSignalSource>();
break;
default:
FVAUtils::OpenMessageBox("[UVASourceComponent::PostEditChangeProperty()]: Signal source type is not supported", true);
break;
}
Super::PostEditChangeProperty(PropertyChangedEvent);
}
bool UVASourceComponent::CanEditChange(const UProperty* InProperty) const
{
const bool ParentVal = Super::CanEditChange(InProperty);
......
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "VAEnums.h"
#include "CoreMinimal.h"
#include "SignalSources/VAAbstractSignalSource.h"
#include "VAAudiofileSignalSource.generated.h"
/**
*
*/
UCLASS()
class VAPLUGIN_API UVAAudiofileSignalSource : public UVAAbstractSignalSource
{
GENERATED_BODY()
protected:
// Action of the sound source at the first tick
UPROPERTY(EditAnywhere, meta = (DisplayName = "Action", Category = "Audio file"))
TEnumAsByte<EPlayAction::Type> StartingPlayAction = EPlayAction::Type::Stop;
// Name of Sound file. Folder are possible too: "folder/soundfile.wav"
UPROPERTY(EditAnywhere, meta = (DisplayName = "Filename", Category = "Audio file"))
FString SoundFile = "WelcomeToVA.wav";
// Sets Buffer to a specific time stamp when playing back at the first tick (see Action)
UPROPERTY(EditAnywhere, meta = (DisplayName = "Play from x [s]", Category = "Audio file"))
float StartingTime = 0.0f;
// Check if the sound should be played back in a loop
UPROPERTY(EditAnywhere, meta = (DisplayName = "Loop", Category = "Audio file"))
bool bLoop = false;
public:
UVAAudiofileSignalSource() = default;
// Creates the signal source in VA and sets the ID accordingly
void Initialize() override;
UFUNCTION(BlueprintCallable)
bool Play();
UFUNCTION(BlueprintCallable)
bool PlayFromTime(float fTime);
UFUNCTION(BlueprintCallable)
bool Pause();
UFUNCTION(BlueprintCallable)
bool Stop();
// Setter
bool SetLoop(bool bLoopN);
bool SetPlayBackPosition(float fTime);
bool SetPlayAction(int iAction);
// Getter
FString GetFileName() const;
bool GetLoop() const;
int GetPlayAction() const;
};
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "SignalSources/VAAbstractSignalSource.h"
#include "VAJetEngineSignalSource.generated.h"
/**
*
*/
UCLASS()
class VAPLUGIN_API UVAJetEngineSignalSource : public UVAAbstractSignalSource
{
GENERATED_BODY()
protected:
// Set rotations per minute of the jet
UPROPERTY(EditAnywhere, meta = (DisplayName = "RPM", Category = "Jet Engine"))
float JetRPM = 1000.0f;
public:
UVAJetEngineSignalSource() = default;
// Creates the signal source in VA and sets the ID accordingly
void Initialize() override;
// Sets the rounds per minute (RPM) of the jet
bool SetJetRPM(float fRPM);
// Returns the rounds per minute (RPM) of the jet
float GetJetRPM() const;
};
......@@ -3,6 +3,7 @@
#pragma once
#include "VAEnums.h" // EDir, EPlayAction, EMovement
#include "SignalSources\VAAbstractSignalSource.h"
#include "GameFramework/Actor.h"
#include "SharedPointer.h"
......@@ -36,10 +37,20 @@ protected:
float SoundPower = 0.0316227749f;
// Select the class of the signal source
UPROPERTY(EditAnywhere, meta = (DisplayName = "Signal Class", Category = "Signal Source", AllowAbstract = "false"))
TSubclassOf<UVAAbstractSignalSource> SignalSourceClass;
// Select the type of the signal source
UPROPERTY(EditAnywhere, meta = (DisplayName = "Signal Type", Category = "Signal Source Settings"))
UPROPERTY(EditAnywhere, meta = (DisplayName = "Signal Type", Category = "Signal Source"))
TEnumAsByte<ESignalSource::Type> SignalSourceType = ESignalSource::Type::AudioFile;
// Select the type of the signal source
UPROPERTY(EditInstanceOnly, Instanced, meta = (DisplayName = "Signal Source", Category = "Signal Source", AllowAbstract = "false"))
UVAAbstractSignalSource* SignalSource = nullptr;
// Action of the sound source at the first tick
UPROPERTY(EditAnywhere, meta = (DisplayName = "Action", Category = "Signal Source Settings|Audio File"))
TEnumAsByte<EPlayAction::Type> StartingPlayAction = EPlayAction::Type::Stop;
......@@ -56,10 +67,6 @@ protected:
UPROPERTY(EditAnywhere, meta = (DisplayName = "Loop", Category = "Signal Source Settings|Audio File"))
bool bLoop = false;
// Set rotations per minute of the jet
UPROPERTY(EditAnywhere, meta = (DisplayName = "RPM", Category = "Signal Source Settings|Jet Engine"))
float JetRPM = 1000.0f;
// Decide whether to use manual Transform (below) or use Transform / Movement of Actor
UPROPERTY(EditAnywhere, meta = (DisplayName = "Position Settings", Category = "Position",
CustomStructureParam = "Move With the Object, At Object Spawn Point (unmovable, also reflections), Attatch to a Bone"))
......@@ -216,7 +223,7 @@ public:
// Sets the Visibility of the Sound Source and its reflections.
UFUNCTION(BlueprintCallable)
bool SetVisibility(bool bVisibility);
virtual bool SetVisibility(bool bVisibility);
// Gets the Visibility of the Sound Source and its reflections.
UFUNCTION(BlueprintCallable)
......@@ -264,6 +271,8 @@ protected:
int UpdateRate;
#if WITH_EDITOR
virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;
// Function to improve settings displayed in Editor, can only be used in editor mode
bool CanEditChange(const UProperty* InProperty) const override;
#endif
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment