From ff3c28bbd910983147ddc1d99d83c482ae23df7d Mon Sep 17 00:00:00 2001 From: fallenoak Date: Sun, 1 Jan 2023 23:27:44 -0600 Subject: [PATCH] feat(datamgr): add DataMgr functions --- .gitmodules | 3 ++ common/CMakeLists.txt | 2 + common/DataMgr.cpp | 68 +++++++++++++++++++++++++++++++++ common/DataMgr.hpp | 17 +++++++++ common/datamgr/CBaseManaged.hpp | 33 ++++++++++++++++ common/datamgr/CDataMgr.cpp | 24 ++++++++++++ common/datamgr/CDataMgr.hpp | 24 ++++++++++++ common/datamgr/TManaged.hpp | 29 ++++++++++++++ lib/CMakeLists.txt | 1 + lib/typhoon | 1 + 10 files changed, 202 insertions(+) create mode 100644 common/DataMgr.cpp create mode 100644 common/DataMgr.hpp create mode 100644 common/datamgr/CBaseManaged.hpp create mode 100644 common/datamgr/CDataMgr.cpp create mode 100644 common/datamgr/CDataMgr.hpp create mode 100644 common/datamgr/TManaged.hpp create mode 160000 lib/typhoon diff --git a/.gitmodules b/.gitmodules index a331068..7405339 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "lib/system"] path = lib/system url = https://github.com/whoahq/system +[submodule "lib/typhoon"] + path = lib/typhoon + url = https://github.com/whoahq/typhoon diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 61122f8..6a50605 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -1,5 +1,6 @@ file(GLOB COMMON_SOURCES "*.cpp" + "datamgr/*.cpp" "datastore/*.cpp" "mempool/*.cpp" "objectalloc/*.cpp" @@ -22,4 +23,5 @@ target_link_libraries(common PUBLIC expat-2.0 storm + tempest ) diff --git a/common/DataMgr.cpp b/common/DataMgr.cpp new file mode 100644 index 0000000..96eddac --- /dev/null +++ b/common/DataMgr.cpp @@ -0,0 +1,68 @@ +#include "common/DataMgr.hpp" +#include + +void DataMgrGetCoord(HDATAMGR mgr, uint32_t fieldId, C3Vector* coord) { + auto mgrPtr = reinterpret_cast(mgr); + + STORM_ASSERT(mgrPtr); + STORM_ASSERT(fieldId < mgrPtr->m_managedArray.Count()); + STORM_ASSERT(mgrPtr->m_managedArray[fieldId]); + STORM_ASSERT(CBaseManaged::COORD == mgrPtr->m_managedArray[fieldId]->m_dataTypeId); + + auto field = static_cast*>(mgrPtr->m_managedArray[fieldId]); + + if (field->m_flags & CBaseManaged::REQUIRESUPDATE) { + if (field->m_flags & CBaseManaged::READONLY) { + // TODO + } else { + // TODO + } + } + + *coord = field->m_data; +} + +void DataMgrSetCoord(HDATAMGR mgr, uint32_t fieldId, const C3Vector& coord, uint32_t coordFlags) { + auto dataMgr = reinterpret_cast(mgr); + auto typeId = CBaseManaged::COORD; + + C3Vector cur = { 0.0f, 0.0f, 0.0f }; + DataMgrGetCoord(mgr, fieldId, &cur); + + C3Vector setTo = { + (coordFlags & 0x1) ? cur.x : coord.x, + (coordFlags & 0x2) ? cur.y : coord.y, + (coordFlags & 0x4) ? cur.z : coord.z + }; + + STORM_ASSERT(dataMgr); + STORM_ASSERT(fieldId < dataMgr->m_managedArray.Count()); + STORM_ASSERT(dataMgr->m_managedArray[fieldId]); + STORM_ASSERT(typeId == dataMgr->m_managedArray[fieldId]->m_dataTypeId); + STORM_ASSERT(!(dataMgr->m_managedArray[fieldId]->m_flags & CBaseManaged::READONLY)); + + auto field = static_cast*>(dataMgr->m_managedArray[fieldId]); + + field->m_updateFcn = nullptr; + field->m_updateData = nullptr; + field->m_updatePriority = 0.0f; + field->Set(setTo); +} + +void DataMgrSetFloat(HDATAMGR mgr, uint32_t fieldId, float val) { + auto dataMgr = reinterpret_cast(mgr); + auto typeId = CBaseManaged::FLOAT; + + STORM_ASSERT(dataMgr); + STORM_ASSERT(fieldId < dataMgr->m_managedArray.Count()); + STORM_ASSERT(dataMgr->m_managedArray[fieldId]); + STORM_ASSERT(typeId == dataMgr->m_managedArray[fieldId]->m_dataTypeId); + STORM_ASSERT(!(dataMgr->m_managedArray[fieldId]->m_flags & CBaseManaged::READONLY)); + + auto field = static_cast*>(dataMgr->m_managedArray[fieldId]); + + field->m_updateFcn = nullptr; + field->m_updateData = nullptr; + field->m_updatePriority = 0.0f; + field->Set(val); +} diff --git a/common/DataMgr.hpp b/common/DataMgr.hpp new file mode 100644 index 0000000..07acdb3 --- /dev/null +++ b/common/DataMgr.hpp @@ -0,0 +1,17 @@ +#ifndef COMMON_DATA_MGR_HPP +#define COMMON_DATA_MGR_HPP + +#include "common/Handle.hpp" +#include "common/datamgr/CDataMgr.hpp" + +typedef HOBJECT HDATAMGR; + +class C3Vector; + +void DataMgrGetCoord(HDATAMGR mgr, uint32_t fieldId, C3Vector* coord); + +void DataMgrSetCoord(HDATAMGR mgr, uint32_t fieldId, const C3Vector& coord, uint32_t coordFlags); + +void DataMgrSetFloat(HDATAMGR mgr, uint32_t fieldId, float val); + +#endif diff --git a/common/datamgr/CBaseManaged.hpp b/common/datamgr/CBaseManaged.hpp new file mode 100644 index 0000000..2e9eeda --- /dev/null +++ b/common/datamgr/CBaseManaged.hpp @@ -0,0 +1,33 @@ +#ifndef COMMON_DATAMGR_C_BASE_MANAGED_HPP +#define COMMON_DATAMGR_C_BASE_MANAGED_HPP + +#include +#include + +class CBaseManaged { + public: + // Types + enum ManagedTypeIds { + // TODO + COORD = 3, + FLOAT = 6, + DATATYPEIDS = 7, + }; + + enum ManagedFlags { + ALWAYSUPDATE = 0x1, + READONLY = 0x2, + REQUIRESUPDATE = 0x4, + UPDATED = 0x8, + }; + + // Member variables + TSLink m_link; + uint8_t m_dataTypeId = 0; + uint8_t m_flags = 0; + void (*m_updateFcn)(float, void*, void*) = nullptr; + void* m_updateData = nullptr; + float m_updatePriority = 0.0f; +}; + +#endif diff --git a/common/datamgr/CDataMgr.cpp b/common/datamgr/CDataMgr.cpp new file mode 100644 index 0000000..ac22818 --- /dev/null +++ b/common/datamgr/CDataMgr.cpp @@ -0,0 +1,24 @@ +#include "common/datamgr/CDataMgr.hpp" + +void CDataMgr::AddManaged(CBaseManaged* managed, uint32_t fieldId, uint32_t flags, uint32_t dataTypeId) { + managed->m_flags = flags; + managed->m_dataTypeId = dataTypeId; + + this->m_managedArray[fieldId] = managed; + + if (flags & CBaseManaged::ALWAYSUPDATE) { + this->LinkManaged(managed); + } +} + +void CDataMgr::AddManaged(TManaged* managed, uint32_t fieldId, uint32_t flags) { + this->AddManaged(managed, fieldId, flags, CBaseManaged::COORD); +} + +void CDataMgr::AddManaged(TManaged* managed, uint32_t fieldId, uint32_t flags) { + this->AddManaged(managed, fieldId, flags, CBaseManaged::FLOAT); +} + +void CDataMgr::LinkManaged(CBaseManaged* managed) { + // TODO +} diff --git a/common/datamgr/CDataMgr.hpp b/common/datamgr/CDataMgr.hpp new file mode 100644 index 0000000..acc52a1 --- /dev/null +++ b/common/datamgr/CDataMgr.hpp @@ -0,0 +1,24 @@ +#ifndef COMMON_DATAMGR_C_DATA_MGR_HPP +#define COMMON_DATAMGR_C_DATA_MGR_HPP + +#include "common/Handle.hpp" +#include "common/datamgr/CBaseManaged.hpp" +#include "common/datamgr/TManaged.hpp" +#include +#include +#include + +class CDataMgr : public CHandleObject { + public: + // Member variables + TSFixedArray m_managedArray; + STORM_EXPLICIT_LIST(CBaseManaged, m_link) m_updateList; + + // Member functions + void AddManaged(CBaseManaged* managed, uint32_t fieldId, uint32_t flags, uint32_t dataTypeId); + void AddManaged(TManaged* managed, uint32_t fieldId, uint32_t flags); + void AddManaged(TManaged* managed, uint32_t fieldId, uint32_t flags); + void LinkManaged(CBaseManaged* managed); +}; + +#endif diff --git a/common/datamgr/TManaged.hpp b/common/datamgr/TManaged.hpp new file mode 100644 index 0000000..5ceaa61 --- /dev/null +++ b/common/datamgr/TManaged.hpp @@ -0,0 +1,29 @@ +#ifndef COMMON_DATAMGR_T_MANAGED_HPP +#define COMMON_DATAMGR_T_MANAGED_HPP + +#include "common/datamgr/CBaseManaged.hpp" + +template +class TManaged : public CBaseManaged { + public: + // Member variables + T m_data; + + // Virtual member functions + virtual void Set(const T& val); + + // Member functions + TManaged() = default; + TManaged(const T& val) + : m_data(val) {}; +}; + +template +void TManaged::Set(const T& val) { + if (this->m_data != val) { + this->m_data = val; + this->m_flags |= CBaseManaged::UPDATED; + } +} + +#endif diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index e7dc307..f41015e 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -1,2 +1,3 @@ add_subdirectory(squall) add_subdirectory(system) +add_subdirectory(typhoon) diff --git a/lib/typhoon b/lib/typhoon new file mode 160000 index 0000000..36d1777 --- /dev/null +++ b/lib/typhoon @@ -0,0 +1 @@ +Subproject commit 36d177759d273ae599e7c99920466e4886d57a41