Oxygen Engine
Modern C++ 3D Engine using OpenGL
Loading...
Searching...
No Matches
gltf_extensions.h
1#ifndef OE_SCENE_LOADER_GLTF_EXTENSIONS_H
2#define OE_SCENE_LOADER_GLTF_EXTENSIONS_H
3
4#include "../node_ptr.h"
5#include "../material.h"
6#include "../../lib/json.hpp"
7
9{
19 {
20 public:
32 void applyOnAssetPreload(scene::NodePtr root_node, const nlohmann::json& extension_data)
33 {
34 // Empty default implementation
35
36 (void)root_node;
37 (void)extension_data;
38 }
39
51 void applyOnAssetPostload(scene::NodePtr root_node, const nlohmann::json& extension_data)
52 {
53 // Empty default implementation
54
55 (void)root_node;
56 (void)extension_data;
57 }
58
67 void applyOnNode(scene::NodePtr node, const nlohmann::json& extension_data)
68 {
69 // Empty default implementation
70
71 (void)node;
72 (void)extension_data;
73 }
74
83 void applyOnMaterial(scene::Material& material, const nlohmann::json& extension_data)
84 {
85 // Empty default implementation
86
87 (void)material;
88 (void)extension_data;
89 }
90
91 /*
92 std::shared_ptr<GltfLoader> getLoader()
93 {
94 return _loader;
95 }
96
97 private:
98 std::shared_ptr<GltfLoader> _loader;
99
100 friend class GltfLoader;
101 */
102 };
103
104 // TODO: Maybe make this generic and renamd to something like "named_factory"
105 // Then put the applyOn*** in GltfExtensionManager::public NamedFactory
106
114 template <typename ...ExtensionTypes>
116 {
117 public:
126 template <typename T, typename... Args>
127 void addExtension(const std::string& name, Args&&... args)
128 {
129 _extensions.emplace(name, std::in_place_type<T>, std::forward<Args>(args)...);
130 }
131
140 void applyOnAsset(const std::string& name, NodePtr root_node, const nlohmann::json& extension_data, const bool pre_load)
141 {
142 //OE_APPLY_EXTENSION_ON(Asset, component.applyOnAsset(root_node, extension_data))
143
144 if (_extensions.count(name))
145 {
146 std::visit([&root_node, &extension_data, &pre_load](auto& extension)
147 {
148 if (pre_load)
149 extension.applyOnAssetPreload(root_node, extension_data);
150 else
151 extension.applyOnAssetPostload(root_node, extension_data);
152
153 }, _extensions.at(name));
154 }
155 }
156
164 void applyOnNode(const std::string& name, NodePtr node, const nlohmann::json& extension_data)
165 {
166 //OE_APPLY_EXTENSION_ON(node, component.applyOnNode(node, extension_data))
167
168 if (_extensions.count(name))
169 {
170 std::visit([&node, &extension_data](auto& extension)
171 {
172 extension.applyOnNode(node, extension_data);
173 }, _extensions.at(name));
174 }
175 }
176
184 void applyOnMaterial(const std::string& name, Material& material, const nlohmann::json& extension_data)
185 {
186 if (_extensions.count(name))
187 {
188 std::visit([&material, &extension_data](auto& extension)
189 {
190 extension.applyOnMaterial(material, extension_data);
191 }, _extensions.at(name));
192 }
193 }
194
195 private:
196 std::unordered_map<std::string, std::variant<ExtensionTypes...>> _extensions;
197 };
198}
199#endif
Render agnostic material.
Definition material.h:90
glTF custom extension manager
Definition gltf_extensions.h:116
void addExtension(const std::string &name, Args &&... args)
Add a new extension.
Definition gltf_extensions.h:127
void applyOnNode(const std::string &name, NodePtr node, const nlohmann::json &extension_data)
Apply a specific extension on a node with the provided data.
Definition gltf_extensions.h:164
void applyOnAsset(const std::string &name, NodePtr root_node, const nlohmann::json &extension_data, const bool pre_load)
Apply a specific extension on an asset with the provided data.
Definition gltf_extensions.h:140
void applyOnMaterial(const std::string &name, Material &material, const nlohmann::json &extension_data)
Apply a specific extension on a material with the provided data.
Definition gltf_extensions.h:184
Base class to handle glTF extensions.
Definition gltf_extensions.h:19
void applyOnNode(scene::NodePtr node, const nlohmann::json &extension_data)
Apply the extension on a node.
Definition gltf_extensions.h:67
void applyOnAssetPreload(scene::NodePtr root_node, const nlohmann::json &extension_data)
Apply the extension on the asset (preload)
Definition gltf_extensions.h:32
void applyOnAssetPostload(scene::NodePtr root_node, const nlohmann::json &extension_data)
Apply the extension on the asset (postload)
Definition gltf_extensions.h:51
void applyOnMaterial(scene::Material &material, const nlohmann::json &extension_data)
Apply the extension on a material.
Definition gltf_extensions.h:83
Helpers and classes related to glTF models.
Definition gltf_extensions.h:9
Wrapper to a node reference to use pointers to node even if the actual node moves in memory.
Definition node_ptr.h:19