Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
c1003e5
Base Data Container asset class
MiquelBarbara May 20, 2026
7933ff1
Created DataContainer System similar to the Script one
MiquelBarbara May 20, 2026
bd01366
DataContainer detection and creation via Editor
MiquelBarbara May 20, 2026
c63bc24
System fully working and we can modify the members throw the inspector
MiquelBarbara May 20, 2026
9f37406
Data Container now can be saved when we apply changes
MiquelBarbara May 21, 2026
81b3aa9
Import and export of the data containers working
MiquelBarbara May 21, 2026
33cfcd2
Drag and drop of the config working
MiquelBarbara May 22, 2026
e2da984
Merged with main
MiquelBarbara May 25, 2026
64b7215
Solving merge conflicts
MiquelBarbara May 25, 2026
396636e
.gitignore update
MiquelBarbara May 31, 2026
a32a547
Merged with main
MiquelBarbara May 31, 2026
b83a300
Created Generic Factory for both Scripts and Data Containers.
MiquelBarbara May 31, 2026
4206bee
Fxing bugs
MiquelBarbara Jun 1, 2026
182ae72
Improvements in the ScriptDataContainerRef
MiquelBarbara Jun 1, 2026
e0e698a
Added a central window to manage all the containers existing in the p…
MiquelBarbara Jun 1, 2026
47d62dc
Merged with main
MiquelBarbara Jun 3, 2026
014b7bc
Adding collapse group to the data containers
MiquelBarbara Jun 3, 2026
2c61ab6
now it compiles in release
MiquelBarbara Jun 4, 2026
1a566b5
Renamed FieldHandlers
MiquelBarbara Jun 4, 2026
2b25f1f
drawUi handler signature changed from void (*)(const FieldInfo&, void…
MiquelBarbara Jun 4, 2026
1fcc9dc
Created FieldUtils.h/.cpp with 5 shared functions (drawUi, serialize,…
MiquelBarbara Jun 4, 2026
1bacf81
3 functions in AnimationComponent.cpp — drawScriptFieldsUi (160 lines…
MiquelBarbara Jun 4, 2026
fab149c
Changed names for ScriptComponentRef and ScriptDataContainerRef
MiquelBarbara Jun 4, 2026
393b958
Fixing filters
MiquelBarbara Jun 4, 2026
1bcea72
automatic registration of the configurations
MiquelBarbara Jun 4, 2026
f60bce8
Merged
MiquelBarbara Jun 5, 2026
e6f329a
DataContainer now uses serialize method, deleted ImporterDataContainer
MiquelBarbara Jun 5, 2026
0a8c6b0
Fixing issues
MiquelBarbara Jun 5, 2026
f07583c
Merged with main
MiquelBarbara Jun 16, 2026
e8035d5
Solving errors of the merge
MiquelBarbara Jun 16, 2026
c7e3517
Modifing classes to merge them
MiquelBarbara Jun 16, 2026
3a6e1da
The merge now is compiling, need some changes
MiquelBarbara Jun 17, 2026
b2e7bc2
All working again
MiquelBarbara Jun 17, 2026
e8916ca
Removed unused code and remove duplication
MiquelBarbara Jun 17, 2026
9ba4e91
Updated scripts
MiquelBarbara Jul 8, 2026
c1d2f5d
merging with main
MiquelBarbara Jul 8, 2026
41bfb81
Added new Scripts
MiquelBarbara Jul 8, 2026
99abdc6
Merged with library folder branch because we will combine the scripts…
MiquelBarbara Jul 8, 2026
4d2362e
Changing scripts
MiquelBarbara Jul 9, 2026
5a5b548
merged with main
MiquelBarbara Jul 10, 2026
684d8fd
fixing bugs and adding new configurations
MiquelBarbara Jul 10, 2026
3266766
Merged
MiquelBarbara Jul 10, 2026
61239c6
New configs
MiquelBarbara Jul 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
294 changes: 15 additions & 279 deletions Engine_Master_UPC/AnimationComponent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,10 @@
#include "GameObject.h"
#include "Transform.h"
#include "StateMachineScript.h"
#include "ScriptFactory.h"
#include "GenericTypeFactory.h"
#include "Script.h"
#include "ScriptComponentRef.h"
#include "ComponentRef.h"
#include "FieldUtils.h"
#include "ModuleScene.h"
#include "Scene.h"

Expand Down Expand Up @@ -873,163 +874,8 @@ void AnimationComponent::drawStateBehaviourFieldsUi(AnimationStateMachineState&

void AnimationComponent::drawScriptFieldsUi(Script& script)
{
ScriptFieldList fieldList = script.getExposedFields();
char* base = reinterpret_cast<char*>(&script);

for (const ScriptFieldInfo& field : fieldList.fields)
{
void* data = base + field.offset;
bool changed = false;

switch (field.type)
{
case ScriptFieldType::Float:
{
float* value = reinterpret_cast<float*>(data);
changed = ImGui::DragFloat(field.name, value, field.floatInfo.dragSpeed, field.floatInfo.min, field.floatInfo.max);
break;
}

case ScriptFieldType::Int:
{
int* value = reinterpret_cast<int*>(data);
changed = ImGui::DragInt(field.name, value);
break;
}

case ScriptFieldType::Bool:
{
bool* value = reinterpret_cast<bool*>(data);
changed = ImGui::Checkbox(field.name, value);
break;
}

case ScriptFieldType::Vec3:
{
Vector3* value = reinterpret_cast<Vector3*>(data);
changed = ImGui::DragFloat3(field.name, &value->x, 0.1f);
break;
}

case ScriptFieldType::EnumInt:
{
int* value = reinterpret_cast<int*>(data);

const char* preview = "";
if (*value >= 0 && *value < field.enumInfo.count)
{
preview = field.enumInfo.names[*value];
}

if (ImGui::BeginCombo(field.name, preview))
{
for (int enumIndex = 0; enumIndex < field.enumInfo.count; ++enumIndex)
{
bool selected = (*value == enumIndex);
if (ImGui::Selectable(field.enumInfo.names[enumIndex], selected))
{
*value = enumIndex;
changed = true;
}

if (selected)
{
ImGui::SetItemDefaultFocus();
}
}

ImGui::EndCombo();
}
break;
}

case ScriptFieldType::String:
{
std::string* value = reinterpret_cast<std::string*>(data);

char buffer[256];
std::strncpy(buffer, value->c_str(), sizeof(buffer));
buffer[sizeof(buffer) - 1] = '\0';

if (ImGui::InputText(field.name, buffer, sizeof(buffer)))
{
*value = buffer;
changed = true;
}
break;
}

case ScriptFieldType::ComponentRef:
{
ScriptComponentRef<Component>* componentReference = reinterpret_cast<ScriptComponentRef<Component>*>(data);

Component* component = componentReference->component;

ImGui::Text("%s", field.name);
ImGui::SameLine();

if (component != nullptr)
{
ImGui::TextColored(ImVec4(0.0f, 1.0f, 0.0f, 1.0f), "%s", component->getOwner()->GetName().c_str());
}
else
{
ImGui::TextColored(ImVec4(1.0f, 0.0f, 0.0f, 1.0f), "None");
}

if (ImGui::BeginDragDropTarget())
{
if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("GAME_OBJECT"))
{
GameObject* droppedObject = *(GameObject**)payload->Data;
GameObject* sceneObject = app->getModuleScene()->getScene()->findGameObjectByUID(droppedObject->GetID());

if (sceneObject != nullptr)
{
Component* candidate = nullptr;

if (field.componentRefInfo.componentType == ComponentType::TRANSFORM)
{
candidate = sceneObject->GetTransform();
}
else
{
candidate = sceneObject->GetComponent(field.componentRefInfo.componentType);
}

if (candidate != nullptr)
{
componentReference->uid = candidate->getID();
componentReference->component = candidate;
script.onFieldEdited(field);
changed = true;
}
}
}

ImGui::EndDragDropTarget();
}

ImGui::SameLine();

std::string clearLabel = std::string("Clear###") + field.name;
if (ImGui::Button(clearLabel.c_str()))
{
componentReference->uid = 0;
componentReference->component = nullptr;
script.onFieldEdited(field);
changed = true;
}
break;
}
}

if (changed)
{
script.onFieldEdited(field);
m_stateMachineDirty = true;
}
}
FieldUtils::drawUi(script, reinterpret_cast<char*>(&script));
m_stateMachineDirty = true;
}
void AnimationComponent::debugDrawRecursive(GameObject* go)
{
Expand Down Expand Up @@ -1689,7 +1535,7 @@ StateMachineScript* AnimationComponent::createStateBehaviourIfNeeded(const Anima
return existing;
}

std::unique_ptr<Script> newScript = ScriptFactory::createScript(state.behaviourScriptName, getOwner());
std::unique_ptr<Script> newScript = ScriptFactory::create(state.behaviourScriptName, getOwner());
if (!newScript)
{
return nullptr;
Expand Down Expand Up @@ -1807,64 +1653,16 @@ void AnimationComponent::invalidateAllStateBehaviours()

std::string AnimationComponent::serializeScriptFields(const Script& script) const
{
rapidjson::Document document;
document.SetObject();
rapidjson::Document::AllocatorType& allocator = document.GetAllocator();

ScriptFieldList fieldList = script.getExposedFields();
const char* base = reinterpret_cast<const char*>(&script);

for (const ScriptFieldInfo& field : fieldList.fields)
{
const void* data = base + field.offset;
JsonArchive archive(ArchiveMode::Output);
FieldUtils::serialize(script, reinterpret_cast<const char*>(&script), archive);

rapidjson::Value key(field.name, allocator);

switch (field.type)
{
case ScriptFieldType::Float:
document.AddMember(key, *reinterpret_cast<const float*>(data), allocator);
break;

case ScriptFieldType::Int:
case ScriptFieldType::EnumInt:
document.AddMember(key, *reinterpret_cast<const int*>(data), allocator);
break;

case ScriptFieldType::Bool:
document.AddMember(key, *reinterpret_cast<const bool*>(data), allocator);
break;

case ScriptFieldType::Vec3:
{
const Vector3* value = reinterpret_cast<const Vector3*>(data);
rapidjson::Value array(rapidjson::kArrayType);
array.PushBack(value->x, allocator);
array.PushBack(value->y, allocator);
array.PushBack(value->z, allocator);
document.AddMember(key, array, allocator);
break;
}

case ScriptFieldType::String:
{
const std::string* value = reinterpret_cast<const std::string*>(data);
document.AddMember(key, rapidjson::Value(value->c_str(), allocator), allocator);
break;
}

case ScriptFieldType::ComponentRef:
{
const ScriptComponentRef<Component>* componentReference = reinterpret_cast<const ScriptComponentRef<Component>*>(data);
document.AddMember(key, static_cast<uint64_t>(componentReference->uid), allocator);
break;
}
}
}
rapidjson::Document doc;
rapidjson::Value value = archive.extractValue(doc.GetAllocator());
doc.Swap(value);

rapidjson::StringBuffer buffer;
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
document.Accept(writer);
doc.Accept(writer);

return buffer.GetString();
}
Expand All @@ -1884,71 +1682,9 @@ void AnimationComponent::deserializeScriptFields(Script& script, const std::stri
return;
}

ScriptFieldList fieldList = script.getExposedFields();
char* base = reinterpret_cast<char*>(&script);

for (const ScriptFieldInfo& field : fieldList.fields)
{
if (!document.HasMember(field.name))
{
continue;
}

void* data = base + field.offset;
const rapidjson::Value& valueJson = document[field.name];

switch (field.type)
{
case ScriptFieldType::Float:
if (valueJson.IsNumber())
{
*reinterpret_cast<float*>(data) = valueJson.GetFloat();
}
break;

case ScriptFieldType::Int:
case ScriptFieldType::EnumInt:
if (valueJson.IsInt())
{
*reinterpret_cast<int*>(data) = valueJson.GetInt();
}
break;

case ScriptFieldType::Bool:
if (valueJson.IsBool())
{
*reinterpret_cast<bool*>(data) = valueJson.GetBool();
}
break;

case ScriptFieldType::Vec3:
if (valueJson.IsArray() && valueJson.Size() == 3)
{
Vector3* vector = reinterpret_cast<Vector3*>(data);
vector->x = valueJson[0].GetFloat();
vector->y = valueJson[1].GetFloat();
vector->z = valueJson[2].GetFloat();
}
break;

case ScriptFieldType::String:
if (valueJson.IsString())
{
*reinterpret_cast<std::string*>(data) = valueJson.GetString();
}
break;

case ScriptFieldType::ComponentRef:
if (valueJson.IsUint64())
{
ScriptComponentRef<Component>* componentReference = reinterpret_cast<ScriptComponentRef<Component>*>(data);
componentReference->uid = static_cast<UID>(valueJson.GetUint64());
componentReference->component = nullptr;
}
break;
}
}

JsonArchive archive(ArchiveMode::Input);
archive.setValue(document);
FieldUtils::deserialize(script, reinterpret_cast<char*>(&script), archive);
script.onAfterDeserialize();
}

Expand Down
5 changes: 3 additions & 2 deletions Engine_Master_UPC/Application.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
#include "ModuleMusic.h"
#include "ModuleScripting.h"

#include "ScriptFactory.h"
#include "GenericTypeFactory.h"

#include "Settings.h"
#include "ThreadPool.h"
Expand All @@ -46,12 +46,13 @@ Application::Application(int argc, wchar_t** argv, void* hWnd)
modules.push_back(m_moduleResources = new ModuleResources(m_moduleD3d12M->getDevice(), m_moduleD3d12M->getCommandQueue()));

//Needed to create the LOGs
modules.push_back(m_moduleEditor = new ModuleEditor());
modules.push_back(m_moduleHaptics = new ModuleHaptics());

modules.push_back(m_moduleScripting = new ModuleScripting());

modules.push_back(m_moduleAssets = new ModuleAssets());

modules.push_back(m_moduleEditor = new ModuleEditor());
modules.push_back(m_eventSystemModule = new ModuleEventSystem());

modules.push_back(m_moduleUI = new ModuleUI());
Expand Down
5 changes: 4 additions & 1 deletion Engine_Master_UPC/Asset.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@
#include "MD5Fwd.h"
#include "ImportSettings.h"
#include <memory>
#include "EngineAPI.h"

class IArchive;

class Asset : public ISerializable
class ENGINE_API Asset : public ISerializable
{
public:
Asset() = default;
Expand All @@ -35,3 +36,5 @@ class Asset : public ISerializable
AssetType m_type = AssetType::UNKNOWN;
std::unique_ptr<ImportSettings> m_importSettings;
};

#pragma warning(pop)
2 changes: 1 addition & 1 deletion Engine_Master_UPC/AssetCache.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ class AssetCache
void clear();

std::shared_ptr<Asset> get(const UID& uid);
void insert(const UID& uid, std::shared_ptr<Asset> asset);

private:
void insert(const UID& uid, std::shared_ptr<Asset> asset);

WeakCache<UID, Asset> m_cache;
};
Expand Down
Loading