1
0
Fork 0
mirror of https://github.com/gwm17/Specter.git synced 2024-11-23 02:38:52 -05:00

Fleshed out parameter system

This commit is contained in:
Gordon McCann 2022-01-07 17:05:04 -05:00
parent 2176992f81
commit 58b6612a3e
4 changed files with 105 additions and 14 deletions

View File

@ -18,5 +18,6 @@
#include "Navigator/Logger.h" #include "Navigator/Logger.h"
#include "Navigator/Application.h" #include "Navigator/Application.h"
#include "Navigator/Physics/PhysicsEventBuilder.h"
#endif #endif

View File

@ -1,4 +1,5 @@
#include "Application.h" #include "Application.h"
#include "ParameterMap.h"
#include "Renderer/Renderer.h" #include "Renderer/Renderer.h"
#include "Renderer/RenderCommand.h" #include "Renderer/RenderCommand.h"
@ -7,15 +8,22 @@ namespace Navigator {
Application* Application::s_instance = nullptr; Application* Application::s_instance = nullptr;
Application::Application() : Application::Application() :
m_runFlag(true) m_runFlag(true), m_physThread(nullptr)
{ {
s_instance = this; s_instance = this;
m_window = std::unique_ptr<Window>(Window::Create()); m_window = std::unique_ptr<Window>(Window::Create());
m_window->SetEventCallback(BIND_EVENT_FUNCTION(Application::OnEvent)); m_window->SetEventCallback(BIND_EVENT_FUNCTION(Application::OnEvent));
/*order is important, must be pMap then evb*/
CreateParameterMap();
CreatePhysicsEventBuilder(); CreatePhysicsEventBuilder();
NavParameter par("joseph","mama");
par.SetValue(8);
NAV_INFO("Does the par exist? {0}", ParameterMap::GetInstance().IsParameterValid("joseph"));
NAV_INFO("What is its value? {0}", ParameterMap::GetInstance().GetParameterValue("joseph"));
PushLayer(new Layer()); PushLayer(new Layer());
m_imgui_layer = new ImGuiLayer(); m_imgui_layer = new ImGuiLayer();

View File

@ -0,0 +1,63 @@
//
// ParameterMap.cpp
// Navigator
//
// Created by Gordon McCann on 1/7/22.
//
#include "ParameterMap.h"
namespace Navigator {
NavParameter::NavParameter(const std::string& name, const std::string& alias) :
m_name(name)
{
NAV_INFO("Making a new parameter named {0}...",name);
m_pdata = nullptr;
ParameterMap& map = ParameterMap::GetInstance();
auto iter = map.find(name);
if(iter == map.end())
{
NAV_INFO("Added it to the map.");
map.AddParameter(name);
}
NAV_INFO("Setting the memory...");
map.SetParameter(name, m_pdata);
}
NavParameter::~NavParameter() {}
ParameterMap* ParameterMap::s_instance = nullptr;
ParameterMap* CreateParameterMap() { return new ParameterMap(); }
ParameterMap::ParameterMap()
{
NAV_INFO("Created ParameterMap");
if(s_instance != nullptr)
NAV_ERROR("Cannot have multiple instances of ParameterMap!!!");
s_instance = this;
}
ParameterMap::~ParameterMap() {}
double ParameterMap::GetParameterValue(const std::string& name)
{
auto iter = m_map.find(name);
if(iter != m_map.end())
return iter->second->value;
else
return 0.0;
}
bool ParameterMap::IsParameterValid(const std::string& name)
{
auto iter = m_map.find(name);
if(iter != m_map.end())
return iter->second->validFlag;
else
return false;
}
}

View File

@ -1,14 +1,20 @@
#ifndef PARAMETER_MAP_H #ifndef PARAMETER_MAP_H
#define PARAMETER_MAP_H #define PARAMETER_MAP_H
#include <atomic>
namespace Navigator { namespace Navigator {
struct ParameterData struct ParameterData
{ {
double value = 0; std::atomic<double> value=0.0;
bool validFlag = false; std::atomic<bool> validFlag=false;
}; };
/*
For use inside of the physics thread only!!!!!! Do not use elsewhere as complex operations on parameter values are !not!
guaranteed to be thread-safe, only the accesing is!
*/
class NavParameter class NavParameter
{ {
@ -16,30 +22,43 @@ namespace Navigator {
NavParameter(const std::string& name, const std::string& alias); NavParameter(const std::string& name, const std::string& alias);
~NavParameter(); ~NavParameter();
inline void SetValue(double value) { p.value = value; } inline bool IsValid() const { return m_pdata->validFlag; }
inline void Invalidate() { m_pdata->validFlag = false; }
inline void SetValue(double value) { m_pdata->validFlag = true; m_pdata->value = value; }
inline double GetValue() const { return m_pdata->value; }
private: private:
std::string name; std::string m_name;
ParameterData p; std::shared_ptr<ParameterData> m_pdata;
}; };
/*
Global parameter accesing, storage
*/
class ParameterMap class ParameterMap
{ {
public: public:
using Iter = std::unordered_map<std::string, std::shared_ptr<ParameterData>>::iterator;
ParameterMap(); ParameterMap();
~ParameterMap(); ~ParameterMap();
inline void AddParameter(const std::string& name) { m_map[name] = nullptr; } inline void AddParameter(const std::string& name) { m_map[name] = std::make_shared<ParameterData>(); }
inline void SetParameter(const std::string& name, ParameterData* param) { m_map[name] = param; } inline void SetParameter(const std::string& name, std::shared_ptr<ParameterData>& param) { param = m_map[name]; }
double GetParameterValue(const std::string& name); double GetParameterValue(const std::string& name);
bool IsParameterValid(const std::string& name);
void ResetParameters(); void ResetParameters();
inline Iter end() { return m_map.end(); }
inline Iter begin() { return m_map.begin(); }
inline Iter find(const std::string& name) { return m_map.find(name); }
inline static ParameterMap& GetParameterMap() { return s_map; } inline static ParameterMap& GetInstance() { return *s_instance; }
private: private:
std::unordered_map<std::string, ParameterData*> m_map; std::unordered_map<std::string, std::shared_ptr<ParameterData>> m_map;
static ParameterMap s_map; static ParameterMap* s_instance;
}; };