New component field type to support files

Also fixed Audio System to work with this new supported component field type
This commit is contained in:
WiggleWizard
2024-09-12 23:37:29 +01:00
parent 68ffe1d6b4
commit 65c8ab79af
8 changed files with 203 additions and 200 deletions

View File

@@ -18,6 +18,8 @@ namespace Nuake
NK_HASHED_STATIC_STR(FloatStep)
NK_HASHED_STATIC_STR(FloatMin)
NK_HASHED_STATIC_STR(FloatMax)
NK_HASHED_STATIC_STR(ResourceFileType)
};
struct HashedName
@@ -50,72 +52,78 @@ namespace Nuake
}
}
#define NUAKECOMPONENT(klass, componentName) \
public: \
static std::string ClassName() \
{ \
static std::string className = #klass; \
return className; \
} \
\
static std::string ComponentName() \
{ \
static std::string name = componentName; \
return name; \
} \
\
static void AddToEntity(entt::entity entity, entt::registry* enttRegistry) \
{ \
enttRegistry->emplace_or_replace<klass>(entity); \
} \
\
\
static void (*GetInitializeComponentClass())() \
{ \
return &klass::InitializeComponentClass; \
} \
\
inline static auto ComponentFactory = entt::meta<klass>(); \
static void InternalInitializeClass() \
{ \
static bool initialized = false; \
if (initialized) \
return; \
\
ComponentFactory.type(entt::hashed_string(#klass)) \
.traits(ComponentTypeTrait::InspectorExposed); \
ComponentFactory.func<&klass::ComponentName>(HashedFnName::GetComponentName); \
ComponentFactory.func<&klass::AddToEntity>(HashedFnName::AddToEntity); \
\
if (klass::GetInitializeComponentClass() != Component::GetInitializeComponentClass()) \
{ \
GetInitializeComponentClass()(); \
} \
\
initialized = true; \
\
}\
\
template<auto Data> \
static auto BindComponentField(const char* varName, const char* displayName) \
{ \
return ComponentFactory \
.data<Data>(entt::hashed_string(varName)) \
.prop(HashedName::DisplayName, displayName); \
} \
#define NUAKECOMPONENT(klass, componentName) \
public: \
static std::string ClassName() \
{ \
static std::string className = #klass; \
return className; \
} \
\
static std::string ComponentName() \
{ \
static std::string name = componentName; \
return name; \
} \
\
static void AddToEntity(entt::entity entity, entt::registry* enttRegistry) \
{ \
enttRegistry->emplace_or_replace<klass>(entity); \
} \
\
\
static void (*GetInitializeComponentClass())() \
{ \
return &klass::InitializeComponentClass; \
} \
\
inline static auto ComponentFactory = entt::meta<klass>(); \
static void InternalInitializeClass() \
{ \
static bool initialized = false; \
if (initialized) \
return; \
\
ComponentFactory.type(entt::hashed_string(#klass)) \
.traits(ComponentTypeTrait::InspectorExposed); \
ComponentFactory.func<&klass::ComponentName>(HashedFnName::GetComponentName); \
ComponentFactory.func<&klass::AddToEntity>(HashedFnName::AddToEntity); \
\
if (klass::GetInitializeComponentClass() != Component::GetInitializeComponentClass()) \
{ \
GetInitializeComponentClass()(); \
} \
\
initialized = true; \
\
} \
\
template<auto Data> \
static auto BindComponentField(const char* varName, const char* displayName) \
{ \
return ComponentFactory \
.data<Data>(entt::hashed_string(varName)) \
.prop(HashedName::DisplayName, displayName); \
} \
\
template<auto Getter, auto Setter> \
static auto BindComponentProperty(const char* varName, const char* displayName) \
{ \
return ComponentFactory \
.data<Getter, Setter>(entt::hashed_string(varName)) \
.prop(HashedName::DisplayName, displayName); \
} \
\
static auto FloatFieldLimits(float stepSize, float min, float max) \
{ \
return ComponentFactory \
.prop(HashedFieldPropName::FloatStep, stepSize) \
.prop(HashedFieldPropName::FloatMin, min) \
.prop(HashedFieldPropName::FloatMax, max); \
} \
\
template<auto Getter, auto Setter> \
static auto BindComponentProperty(const char* varName, const char* displayName) \
static auto ResourceFileRestriction(const char* fileType) \
{ \
return ComponentFactory \
.data<Getter, Setter>(entt::hashed_string(varName)) \
.prop(HashedName::DisplayName, displayName); \
} \
\
static auto FloatFieldLimits(float stepSize, float min, float max) \
{ \
return ComponentFactory \
.prop(HashedFieldPropName::FloatStep, stepSize) \
.prop(HashedFieldPropName::FloatMin, min) \
.prop(HashedFieldPropName::FloatMax, max); \
}
.prop(HashedFieldPropName::ResourceFileType, fileType); \
}

View File

@@ -1,11 +1,20 @@
#include "AudioEmitterComponent.h"
#include "src/FileSystem/FileSystem.h"
namespace Nuake {
json AudioEmitterComponent::Serialize()
{
BEGIN_SERIALIZE();
SERIALIZE_VAL(FilePath);
bool validFile = FilePath.file != nullptr && FilePath.file->Exist();
j["validFile"] = validFile;
if (validFile)
{
j["file"] = FilePath.file->GetRelativePath();
}
SERIALIZE_VAL(IsPlaying);
SERIALIZE_VAL(Volume);
SERIALIZE_VAL(Pan);
@@ -20,7 +29,16 @@ namespace Nuake {
bool AudioEmitterComponent::Deserialize(const json& j)
{
DESERIALIZE_VAL(FilePath);
if (j.contains("validFile"))
{
bool validFile = j["validFile"];
if (validFile)
{
std::string filePath = j["file"];
FilePath.file = FileSystem::GetFile(filePath);
}
}
DESERIALIZE_VAL(Volume);
DESERIALIZE_VAL(IsPlaying);
DESERIALIZE_VAL(Pan);
@@ -32,4 +50,4 @@ namespace Nuake {
DESERIALIZE_VAL(Loop);
return true;
}
}
}

View File

@@ -1,8 +1,11 @@
#pragma once
#include "Component.h"
#include "FieldTypes.h"
#include "src/Core/Core.h"
#include "src/FileSystem/File.h"
#include "src/Resource/Resource.h"
#include "src/Resource/Serializable.h"
namespace Nuake {
@@ -13,6 +16,11 @@ namespace Nuake {
static void InitializeComponentClass()
{
BindComponentField<&AudioEmitterComponent::File>("FilePath", "File Path");
BindComponentField<&AudioEmitterComponent::FilePath>("FilePath", "File Path");
ResourceFileRestriction("_AudioFile");
BindComponentField<&AudioEmitterComponent::IsPlaying>("IsPlaying", "Is Playing");
BindComponentField<&AudioEmitterComponent::Loop>("Loop", "Loop");
@@ -34,7 +42,8 @@ namespace Nuake {
}
public:
std::string FilePath;
Ref<File> File;
ResourceFile FilePath;
bool IsPlaying = false;
bool Loop = false;

View File

@@ -0,0 +1,18 @@
#pragma once
#include <string>
#include "src/Core/Core.h"
namespace Nuake
{
class File;
struct ResourceFile
{
ResourceFile() {}
ResourceFile(const Ref<File>& inFile) : file(inFile) {}
Ref<File> file = nullptr;
};
}

View File

@@ -44,14 +44,14 @@ namespace Nuake
{
auto [transformComponent, audioEmitterComponent] = view.get<TransformComponent, AudioEmitterComponent>(e);
if (audioEmitterComponent.FilePath.empty())
if (audioEmitterComponent.FilePath.file == nullptr || !audioEmitterComponent.FilePath.file->Exist())
{
// Doesn't have a file
continue;
}
const bool isPlaying = audioEmitterComponent.IsPlaying;
const std::string absoluteFilePath = FileSystem::RelativeToAbsolute(audioEmitterComponent.FilePath);
const std::string absoluteFilePath = audioEmitterComponent.FilePath.file->GetAbsolutePath();
const bool isVoiceActive = audioManager.IsVoiceActive(absoluteFilePath);
AudioRequest audioRequest;