Oxygen Engine
Modern C++ 3D Engine using OpenGL
Loading...
Searching...
No Matches
gltf.h
1#ifndef OE_SCENE_LOADER_GLTF_H
2#define OE_SCENE_LOADER_GLTF_H
3
4#include "../../lib/json.hpp"
5#include <functional>
6#include "../skin.h"
7#include "../mesh.h"
8#include "../camera.h"
9#include "../lighting.h"
10
11#include "gltf_extensions.h"
12
13namespace oe::scene
14{
15 class SkinnedMeshNode;
16}
17
18namespace oe::render
19{
20 class TextureManager;
21}
22
23namespace tinygltf
24{
25 class TinyGLTF;
26 class Model;
27}
28
29namespace oe::scene::loader
30{
37 {
39 glm::vec4 albedoColor = glm::vec4(1.0);
40
42 glm::vec3 emissiveColor = glm::vec4(0.0);
43
45 glm::vec3 rouMetAoColor = glm::vec3(1.0);
46
49
52
55
58
59 bool use_pbr = true;
60 };
61
97 class Gltf
98 {
99 public:
105 Gltf(const std::string& filename);
106
107 ~Gltf();
108
109 using MeshFlags = uint8_t;
110
112 {
113 // Solid Mesh by ids
114 std::map<size_t, scene::SolidMesh> solid_meshes;
115
116 // Skinned Mesh by mesh ids
117 std::map<size_t, scene::SkinnedMesh> skinned_meshes;
118
119 // Armature by node
120 std::map<NodePtr, scene::skin::Armature> skins;
121
122 // Nodes containing a camera
123 std::vector<std::pair<NodePtr, scene::Camera>> cameras;
124
125 // Nodes containing a light
126 std::vector<std::pair<NodePtr, scene::PointLight>> point_lights;
127
128 // Vector and not map because a mesh can be used by many nodes
129 // pair first is the node related to the mesh, second is the mesh id
130 std::vector<std::pair<NodePtr, size_t>> render_mesh_nodes;
131
132 // For next 3 vectors, sizes are count of meshes, vector position is id_mesh
133 std::vector<bool> render_mesh_is_skinned;
134
135 // Second vector position is material position in mesh, then final one are id_materials
136 std::vector<std::vector<ssize_t>> render_meshs_material_ids;
137
138 // Don't be afraid: This is "primitives_by_material" member for each mesh
139 // Second vector position is id_material, then final one are enabled primitives
140 std::vector<std::vector<std::vector<bool>>> render_meshs_material_target;
141 };
142
151 GltfSceneData convertSceneData(oe::scene::NodePtr root_node, uint16_t id_scene = 0) const;
152
161
170 //oe::scene::NodePtr addIntoScene(oe::scene::Scene& scene, oe::scene::NodePtr root_node, uint16_t id_scene = 0);
171
176 {
180 std::vector<oe::render::Texture*> imported;
181
187 std::map<size_t, oe::render::Texture*> rou_met_ao;
188 };
189
203 GltfTextureList convertTextures(render::TextureManager& texture_manager, std::string_view prefix) const;
204
208 void setMaterialFiller(std::function<void(const GltfPbrMaterial& gltf_material, Material& oe_material)> material_filler)
209 {
210 _material_filler = material_filler;
211 }
212
219 std::vector<Material> convertMaterials(GltfTextureList textures) const;
220
225
226 /*static constexpr const char* getGltfShaderSurfaceCode()
227 {
228 return R"(
229 uniform sampler2D uAlbedo;
230
231 void surface(in SurfaceInput surface_input, inout SurfaceOutput result)
232 {
233 result.albedo = texture(uAlbedo, surface_input.tex_coords_0);
234
235 if (result.albedo.a < 0.5)
236 discard;
237
238 result.normal = vec3(0, 0, 1);
239 }
240 )";
241 }*/
242
243 //void setOnTexture(???);
244
245 /*std::shared_ptr<oe::scene::Node>& getScene(uint16_t i)
246 {
247 return _scenes.at(i);
248 }
249
250 std::shared_ptr<oe::scene::Node>& getNode(uint16_t i)
251 {
252 return _nodes.at(i);
253 }
254
255 std::shared_ptr<oe::scene::Material>& getMaterial(uint16_t i = 0);
256
257 std::shared_ptr<oe::scene::SkinnedMeshNode>& getSkinnedNode(uint16_t i = 0);*/
258
259 protected:
260 Gltf();
261
262 //std::vector<std::shared_ptr<oe::scene::Node>> _scenes;
263
264 // Todo clean unused members...
265 //std::vector<oe::scene::Node*> _nodes;
266 /* std::vector<std::shared_ptr<oe::scene::SkinnedMeshNode>> _skinned_nodes;
267*/
268 // std::vector<std::shared_ptr<oe::scene::Material>> _materials;
269
270 // For each mesh, contain the primitive data + material id
271 // Maybe make a difference between classic vertex and skinned primitives ?
273
274 // For each mesh, contains the primitive data + material id
275// std::unordered_map<uint32_t, std::list<std::pair<std::shared_ptr<oe::scene::SolidMesh>, int32_t>>> _meshes;
276
277 // For each skinned mesh, contains the primitive data + material id
278 // std::unordered_map<uint32_t, std::list<std::pair<std::shared_ptr<oe::scene::SkinnedMesh>, int32_t>>> _skinned_meshes;
279
280 // For each skinned, contain the skinnedMeshNode + skin id
281 //std::unordered_map<oe::scene::SkinnedMeshNode*, uint32_t> _skinned_nodes_skins;
282
283 // std::vector<oe::scene::MultiMeshNode> _meshes;
284 //std::vector<oe::scene::MultiSkinnedMeshNode> _skinned_meshes;
285 // OU
286 //std::vector<oe::scene::MultiMeshNode<Mesh>> _skinned_meshes;
287
288 //std::vector<oe::render::Texture*> _textures;
289
290 std::function<void(const GltfPbrMaterial&, Material&)> _material_filler = {};
291 //std::function<void(Node& node, Material& node_material)> _node_material_modifier = {};
292
293 //oe::scene::Material _default_material;
294
295 tinygltf::TinyGLTF* _loader;
296 tinygltf::Model* _model;
297
298 void _custom_load(const std::string& filename);
299
300 std::function<void(const std::string& extension, NodePtr root_node, const nlohmann::json& extension_data, const bool pre_load)> _custom_asset_extension_handler = {};
301 std::function<void(const std::string& extension, NodePtr node, const nlohmann::json& extension_data)> _custom_node_extension_handler = {};
302 std::function<void(const std::string& extension, Material& material, const nlohmann::json& extension_data)> _custom_material_extension_handler = {};
303 };
304
331 template <typename ExtensionManager = gltf::ExtensionManager<gltf::Extension>>
333 {
334 public:
340 GltfWithExtensions(const ExtensionManager& extension_manager):
341 Gltf(),
342 extensions(extension_manager)
343 {
344 _custom_asset_extension_handler = [this] (const std::string& extension, NodePtr root_node, const nlohmann::json& extension_data, const bool pre_load)
345 {
346 extensions.applyOnAsset(extension, root_node, extension_data, pre_load);
347 };
348
349 _custom_node_extension_handler = [this] (const std::string& extension, NodePtr node, const nlohmann::json& extension_data)
350 {
351 extensions.applyOnNode(extension, node, extension_data);
352 };
353 }
354
360 void load(const std::string& filename)
361 {
362 _custom_load(filename);
363 }
364
365 ExtensionManager extensions;
366 };
367}
368
369#endif
handles the load and deletion of textures/cubemaps
Definition texture_manager.h:49
Definition texture.h:31
Render agnostic material.
Definition material.h:90
Load a glTF asset with custom extensions registered.
Definition gltf.h:333
void load(const std::string &filename)
Load a glTF asset from a file.
Definition gltf.h:360
GltfWithExtensions(const ExtensionManager &extension_manager)
Init the glTF loader with a custom list of extensions.
Definition gltf.h:340
Loader to load Khronos glTF assets.
Definition gltf.h:98
GltfTextureList convertTextures(render::TextureManager &texture_manager, std::string_view prefix) const
Load model textures.
std::function< void(const GltfPbrMaterial &, Material &)> _material_filler
std::list<std::pair<oe::scene::Mesh, int32_t>> _primitives;
Definition gltf.h:290
Material generateDefaultMaterial() const
Generate a default material suitable for glTF rendering.
std::vector< Material > convertMaterials(GltfTextureList textures) const
Convert and return materials.
void setMaterialFiller(std::function< void(const GltfPbrMaterial &gltf_material, Material &oe_material)> material_filler)
Apply application specific properties on the materials.
Definition gltf.h:208
Gltf(const std::string &filename)
Load a glTF asset from a file.
GltfSceneData convertSceneData(oe::scene::NodePtr root_node, uint16_t id_scene=0) const
Convert the glTF asset into scene data under the specified node.
Render related abstractions (Shader, Framebuffer, Cubemaps, Textures)
Definition opengl.h:10
Generators of geometry / scene by computation (eg. Bezier) or from files (eg. Gltf)
Definition bezier.h:10
Scene related management (Render-agnostic Geometry, Manger, etc...)
Definition debug.h:19
Wrapper to a node reference to use pointers to node even if the actual node moves in memory.
Definition node_ptr.h:19
Common properties/textures tied to a Gltf PBR material.
Definition gltf.h:37
glm::vec4 albedoColor
Definition gltf.h:39
oe::render::Texture * emissiveTexture
Definition gltf.h:51
glm::vec3 emissiveColor
Definition gltf.h:42
oe::render::Texture * normalTexture
Definition gltf.h:54
oe::render::Texture * albedoTexture
Definition gltf.h:48
glm::vec3 rouMetAoColor
Definition gltf.h:45
oe::render::Texture * rouMetAoTexture
Definition gltf.h:57
Load the glTF asset into a scene (a new root node will be created)
Definition gltf.h:176
std::vector< oe::render::Texture * > imported
textured imported from the asset
Definition gltf.h:180
std::map< size_t, oe::render::Texture * > rou_met_ao
PBR textures converted from the material.
Definition gltf.h:187