Oxygen Engine
Modern C++ 3D Engine using OpenGL
Loading...
Searching...
No Matches
gltf_utils.h
1#ifndef OE_SCENE_LOADER_GLTF_UTILS_H
2#define OE_SCENE_LOADER_GLTF_UTILS_H
3
4#include "gltf.h"
5#include "../../render/mesh_skinned_renderer.h"
6#include <OxygenEngine/render/texture_manager.h>
7
12{
17 {
18 std::vector<oe::render::MeshRenderer>& mesh_renderers;
19 std::vector<oe::render::MeshSkinnedRenderer>& mesh_skinned_renderers;
20 };
21
25 inline void generateRenderMeshes(oe::scene::loader::Gltf::GltfSceneData& info, std::span<oe::scene::Material> materials, const oe::scene::Material& default_material, GenerateRenderMeshResults results)
26 {
27 auto& mesh_renderers = results.mesh_renderers;
28 auto& mesh_skinned_renderers = results.mesh_skinned_renderers;
29
30 for (const auto& it : info.render_mesh_nodes)
31 {
32 auto node = it.first;
33 auto id_mesh = it.second;
34
35 if (info.render_mesh_is_skinned[id_mesh])
36 {
37 const oe::scene::SkinnedMesh& skinned_mesh = info.skinned_meshes[id_mesh];
38
39 const auto id_armature = info.skinned_meshes[id_mesh];
40
41 mesh_skinned_renderers.reserve(mesh_skinned_renderers.size() + 1);
42 mesh_skinned_renderers.emplace_back(node, skinned_mesh, info.skins[node]);
43
44 auto& renderer = mesh_skinned_renderers.back();
45
46 auto& mesh_materials = info.render_meshs_material_ids[id_mesh];
47
48 renderer.materials.clear();
49 renderer.materials.reserve(mesh_materials.size());
50
51 for (const auto& id_material : mesh_materials)
52 {
53 if (id_material != -1)
54 {
55 renderer.materials.push_back(materials[id_material]);
56 }
57 else
58 {
59 renderer.materials.push_back(default_material);
60 }
61 }
62
63 renderer.primitives_by_material = info.render_meshs_material_target[id_mesh];
64 }
65 else
66 {
67 const oe::scene::SolidMesh& solid_mesh = info.solid_meshes[id_mesh];
68
69 mesh_renderers.reserve(mesh_renderers.size() + 1);
70 mesh_renderers.emplace_back(node, solid_mesh);
71
72 auto& renderer = mesh_renderers.back();
73
74 auto& mesh_materials = info.render_meshs_material_ids[id_mesh];
75
76 renderer.materials.clear();
77 renderer.materials.reserve(mesh_materials.size());
78
79 for (const auto& id_material : mesh_materials)
80 {
81 if (id_material != -1)
82 {
83 renderer.materials.push_back(materials[id_material]);
84 }
85 else
86 {
87 renderer.materials.push_back(default_material);
88 }
89 }
90
91 renderer.primitives_by_material = info.render_meshs_material_target[id_mesh];
92 }
93 }
94 }
95
106 {
107 texture_manager.registerTexture("default_gltf/white", 1, 1, [] (const uint32_t, const uint32_t)
108 {
109 return glm::vec4(1.0f);
110 });
111
112 texture_manager.registerTexture("default_gltf/normal_map", 1, 1, [] (const uint32_t, const uint32_t)
113 {
114 return glm::vec4(0.5f, 0.5f, 1.0f, 1.0f);
115 });
116 }
117
122 {
123 loader.setMaterialFiller([shader, &texture_manager] (const oe::scene::loader::GltfPbrMaterial& gltf_material, oe::scene::Material& material)
124 {
125 material.setProperty<bool>("uUsePBR", gltf_material.use_pbr);
126
127 material.setProperty<glm::vec4>("uAlbedoColor", gltf_material.albedoColor);
128 material.setProperty<glm::vec3>("uEmissiveColor", gltf_material.emissiveColor);
129 material.setProperty<glm::vec3>("uRouMetAoColor", gltf_material.rouMetAoColor);
130
131 if (gltf_material.albedoTexture)
132 {
133 material.setTexture("uAlbedo", gltf_material.albedoTexture);
134 }
135 else
136 {
137 material.setTexture("uAlbedo", texture_manager.getTexture("default_gltf/white"));
138 }
139
140 if (gltf_material.normalTexture)
141 {
142 material.setTexture("uNormalmap", gltf_material.normalTexture);
143 }
144 else
145 {
146 material.setTexture("uNormalmap", texture_manager.getTexture("default_gltf/normal_map"));
147 }
148
149 if (gltf_material.emissiveTexture)
150 {
151 material.setTexture("uEmissive", gltf_material.emissiveTexture);
152 }
153 else
154 {
155 material.setTexture("uEmissive", texture_manager.getTexture("default_gltf/white"));
156 }
157
158 if (gltf_material.rouMetAoTexture)
159 {
160 material.setTexture("uRouMetAo", gltf_material.rouMetAoTexture);
161 }
162 else
163 {
164 material.setTexture("uRouMetAo", texture_manager.getTexture("default_gltf/white"));
165 }
166
167 material.shader = shader;
168 });
169 }
170
176 constexpr const char* getShader()
177 {
178 return R"(
179 uniform vec4 uAlbedoColor = vec4(1.0);
180 uniform vec3 uEmissiveColor = vec3(0.0);
181 uniform vec3 uRouMetAoColor = vec3(1.0);
182 uniform bool uUsePBR = true;
183
184 uniform sampler2D uAlbedo;
185 uniform sampler2D uEmissive;
186 uniform sampler2D uNormalmap;
187 uniform sampler2D uRouMetAo;
188
189 void depth(in SurfaceInput input, inout float result)
190 {
191 result = texture(uAlbedo, input.tex_coords_0).a;
192 }
193
194 void surface(in SurfaceInput input, inout SurfaceOutput result)
195 {
196 vec4 albedo = texture(uAlbedo, input.tex_coords_0);
197 albedo.rgb = input.color * OE_CONVERT_SRGB_TO_LINEAR(albedo.rgb);
198 result.albedo = vec4(uAlbedoColor.rgb * albedo.rgb, albedo.a);
199
200 result.normal = OE_UNPACK_NORMAL_MAP(uNormalmap, input.tex_coords_0);
201
202 vec4 emissive = texture(uEmissive, input.tex_coords_0);
203 emissive.rgb = OE_CONVERT_SRGB_TO_LINEAR(emissive.rgb);
204 result.emissive = uEmissiveColor * emissive.rgb;
205
206 vec4 rou_met_ao = texture(uRouMetAo, input.tex_coords_0);
207 rou_met_ao.rgb *= uRouMetAoColor;
208
209 result.roughness = rou_met_ao.r;
210 result.metalness = rou_met_ao.g;
211 result.ao = rou_met_ao.b;
212
213 result.use_pbr = uUsePBR;
214 }
215 )";
216 }
217}
218
219#endif
Shader class.
Definition shader_base.h:32
handles the load and deletion of textures/cubemaps
Definition texture_manager.h:49
Texture * registerTexture(const std::string &name, Args &&... args)
Generate and register a texture by calling texture constructor.
Definition texture_manager.h:101
const Texture * getTexture(const std::string &name) const
Get a texture by name.
Render agnostic material.
Definition material.h:90
Material * setProperty(const std::string &name, const T &value)=delete
Get all material textures.
oe::render::ShaderBase * shader
Shader to use to render this material.
Definition material.h:114
Loader to load Khronos glTF assets.
Definition gltf.h:98
Various glTF utils.
Definition gltf_utils.h:12
void generateDefaultTextures(oe::render::TextureManager &texture_manager)
Generate default glTF textures.
Definition gltf_utils.h:105
constexpr const char * getShader()
Get a surface shader ready for glTF.
Definition gltf_utils.h:176
void generateRenderMeshes(oe::scene::loader::Gltf::GltfSceneData &info, std::span< oe::scene::Material > materials, const oe::scene::Material &default_material, GenerateRenderMeshResults results)
Generate GPU Meshes based on glTF scene.
Definition gltf_utils.h:25
void applyCommonCallbacks(oe::scene::loader::Gltf &loader, oe::render::ShaderBase *shader, oe::render::TextureManager &texture_manager)
Get a surface shader ready for glTF.
Definition gltf_utils.h:121
References to store results of generateRenderMeshes().
Definition gltf_utils.h:17
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