summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/render/bgfx/effectmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/modules/render/bgfx/effectmanager.cpp')
-rw-r--r--src/osd/modules/render/bgfx/effectmanager.cpp55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/osd/modules/render/bgfx/effectmanager.cpp b/src/osd/modules/render/bgfx/effectmanager.cpp
new file mode 100644
index 00000000000..094abb66b5b
--- /dev/null
+++ b/src/osd/modules/render/bgfx/effectmanager.cpp
@@ -0,0 +1,55 @@
+#include "emu.h"
+
+#include <rapidjson/document.h>
+
+#include <bgfx/bgfxplatform.h>
+#include <bgfx/bgfx.h>
+#include <bx/readerwriter.h>
+
+#include "effectmanager.h"
+#include "effectreader.h"
+#include "effect.h"
+
+using namespace rapidjson;
+
+effect_manager::~effect_manager()
+{
+ for (std::pair<std::string, bgfx_effect*> effect : m_effects)
+ {
+ delete effect.second;
+ }
+ m_effects.clear();
+}
+
+bgfx_effect* effect_manager::effect(std::string name)
+{
+ std::map<std::string, bgfx_effect*>::iterator iter = m_effects.find(name);
+ if (iter != m_effects.end())
+ {
+ return iter->second;
+ }
+
+ return load_effect(name);
+}
+
+bgfx_effect* effect_manager::load_effect(std::string name) {
+ std::string path = "bgfx/effects/" + name + ".json";
+
+ bx::CrtFileReader reader;
+ bx::open(&reader, path.c_str());
+
+ int32_t size = (uint32_t)bx::getSize(&reader);
+
+ char* data = new char[size + 1];
+ bx::read(&reader, reinterpret_cast<void*>(data), size);
+ bx::close(&reader);
+ data[size] = 0;
+
+ Document document;
+ document.Parse<0>(data);
+ bgfx_effect* effect = effect_reader::read_from_value(m_shaders, document);
+
+ m_effects[name] = effect;
+
+ return effect;
+}