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.h"
5
7{
17 {
18 public:
30 void applyOnAssetPreload(scene::Node& root_node, const nlohmann::json& extension_data)
31 {
32 // Empty default implementation
33
34 (void)root_node;
35 (void)extension_data;
36 }
37
49 void applyOnAssetPostload(scene::Node& root_node, const nlohmann::json& extension_data)
50 {
51 // Empty default implementation
52
53 (void)root_node;
54 (void)extension_data;
55 }
56
65 void applyOnNode(scene::Node& node, const nlohmann::json& extension_data)
66 {
67 // Empty default implementation
68
69 (void)node;
70 (void)extension_data;
71 }
72
81 void applyOnMaterial(scene::Material& material, const nlohmann::json& extension_data)
82 {
83 // Empty default implementation
84
85 (void)material;
86 (void)extension_data;
87 }
88
89 /*
90 std::shared_ptr<GltfLoader> getLoader()
91 {
92 return _loader;
93 }
94
95 private:
96 std::shared_ptr<GltfLoader> _loader;
97
98 friend class GltfLoader;
99 */
100 };
101
102 // TODO: Maybe make this generic and renamd to something like "named_factory"
103 // Then put the applyOn*** in GltfExtensionManager::public NamedFactory
104
112 template <typename ...ExtensionTypes>
114 {
115 public:
124 template <typename T, typename... Args>
125 void addExtension(const std::string& name, Args&&... args)
126 {
127 _extensions.emplace(name, std::in_place_type<T>, std::forward<Args>(args)...);
128 }
129
138 void applyOnAsset(const std::string& name, Node& root_node, const nlohmann::json& extension_data, const bool pre_load)
139 {
140 //OE_APPLY_EXTENSION_ON(Asset, component.applyOnAsset(root_node, extension_data))
141
142 if (_extensions.count(name))
143 {
144 std::visit([&root_node, &extension_data, &pre_load](auto& extension)
145 {
146 if (pre_load)
147 extension.applyOnAssetPreload(root_node, extension_data);
148 else
149 extension.applyOnAssetPostload(root_node, extension_data);
150
151 }, _extensions.at(name));
152 }
153 }
154
162 void applyOnNode(const std::string& name, Node& node, const nlohmann::json& extension_data)
163 {
164 //OE_APPLY_EXTENSION_ON(node, component.applyOnNode(node, extension_data))
165
166 if (_extensions.count(name))
167 {
168 std::visit([&node, &extension_data](auto& extension)
169 {
170 extension.applyOnNode(node, extension_data);
171 }, _extensions.at(name));
172 }
173 }
174
182 void applyOnMaterial(const std::string& name, Material& material, const nlohmann::json& extension_data)
183 {
184 if (_extensions.count(name))
185 {
186 std::visit([&material, &extension_data](auto& extension)
187 {
188 extension.applyOnMaterial(material, extension_data);
189 }, _extensions.at(name));
190 }
191 }
192
193 private:
194 std::unordered_map<std::string, std::variant<ExtensionTypes...>> _extensions;
195 };
196}
197#endif
Render agnostic material.
Definition material.h:26
Definition node.h:31
glTF custom extension manager
Definition gltf_extensions.h:114
void applyOnNode(const std::string &name, Node &node, const nlohmann::json &extension_data)
Apply a specific extension on a node with the provided data.
Definition gltf_extensions.h:162
void addExtension(const std::string &name, Args &&... args)
Add a new extension.
Definition gltf_extensions.h:125
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:182
void applyOnAsset(const std::string &name, Node &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:138
Base class to handle glTF extensions.
Definition gltf_extensions.h:17
void applyOnNode(scene::Node &node, const nlohmann::json &extension_data)
Apply the extension on a node.
Definition gltf_extensions.h:65
void applyOnAssetPostload(scene::Node &root_node, const nlohmann::json &extension_data)
Apply the extension on the asset (postload)
Definition gltf_extensions.h:49
void applyOnAssetPreload(scene::Node &root_node, const nlohmann::json &extension_data)
Apply the extension on the asset (preload)
Definition gltf_extensions.h:30
void applyOnMaterial(scene::Material &material, const nlohmann::json &extension_data)
Apply the extension on a material.
Definition gltf_extensions.h:81
Helpers and classes related to glTF models.
Definition gltf_extensions.h:7