1#ifndef OE_SCENE_LOADER_GLTF_UTILS_H
2#define OE_SCENE_LOADER_GLTF_UTILS_H
5#include "../../render/mesh_skinned_renderer.h"
6#include <OxygenEngine/render/texture_manager.h>
18 std::vector<oe::render::MeshRenderer>& mesh_renderers;
19 std::vector<oe::render::MeshSkinnedRenderer>& mesh_skinned_renderers;
27 auto& mesh_renderers = results.mesh_renderers;
28 auto& mesh_skinned_renderers = results.mesh_skinned_renderers;
30 for (
const auto& it : info.render_mesh_nodes)
33 auto id_mesh = it.second;
35 if (info.render_mesh_is_skinned[id_mesh])
37 const oe::scene::SkinnedMesh& skinned_mesh = info.skinned_meshes[id_mesh];
39 const auto id_armature = info.skinned_meshes[id_mesh];
41 mesh_skinned_renderers.reserve(mesh_skinned_renderers.size() + 1);
42 mesh_skinned_renderers.emplace_back(node, skinned_mesh, info.skins[node]);
44 auto& renderer = mesh_skinned_renderers.back();
46 auto& mesh_materials = info.render_meshs_material_ids[id_mesh];
48 renderer.materials.clear();
49 renderer.materials.reserve(mesh_materials.size());
51 for (
const auto& id_material : mesh_materials)
53 if (id_material != -1)
55 renderer.materials.push_back(materials[id_material]);
59 renderer.materials.push_back(default_material);
63 renderer.primitives_by_material = info.render_meshs_material_target[id_mesh];
67 const oe::scene::SolidMesh& solid_mesh = info.solid_meshes[id_mesh];
69 mesh_renderers.reserve(mesh_renderers.size() + 1);
70 mesh_renderers.emplace_back(node, solid_mesh);
72 auto& renderer = mesh_renderers.back();
74 auto& mesh_materials = info.render_meshs_material_ids[id_mesh];
76 renderer.materials.clear();
77 renderer.materials.reserve(mesh_materials.size());
79 for (
const auto& id_material : mesh_materials)
81 if (id_material != -1)
83 renderer.materials.push_back(materials[id_material]);
87 renderer.materials.push_back(default_material);
91 renderer.primitives_by_material = info.render_meshs_material_target[id_mesh];
107 texture_manager.
registerTexture(
"default_gltf/white", 1, 1, [] (
const uint32_t,
const uint32_t)
109 return glm::vec4(1.0f);
112 texture_manager.
registerTexture(
"default_gltf/normal_map", 1, 1, [] (
const uint32_t,
const uint32_t)
114 return glm::vec4(0.5f, 0.5f, 1.0f, 1.0f);
125 material.
setProperty<
bool>(
"uUsePBR", gltf_material.use_pbr);
137 material.setTexture(
"uAlbedo", texture_manager.
getTexture(
"default_gltf/white"));
142 material.setTexture(
"uNormalmap", gltf_material.
normalTexture);
146 material.setTexture(
"uNormalmap", texture_manager.
getTexture(
"default_gltf/normal_map"));
155 material.setTexture(
"uEmissive", texture_manager.
getTexture(
"default_gltf/white"));
164 material.setTexture(
"uRouMetAo", texture_manager.
getTexture(
"default_gltf/white"));
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;
184 uniform sampler2D uAlbedo;
185 uniform sampler2D uEmissive;
186 uniform sampler2D uNormalmap;
187 uniform sampler2D uRouMetAo;
189 void depth(in SurfaceInput input, inout float result)
191 result = texture(uAlbedo, input.tex_coords_0).a;
194 void surface(in SurfaceInput input, inout SurfaceOutput result)
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);
200 result.normal = OE_UNPACK_NORMAL_MAP(uNormalmap, input.tex_coords_0);
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;
206 vec4 rou_met_ao = texture(uRouMetAo, input.tex_coords_0);
207 rou_met_ao.rgb *= uRouMetAoColor;
209 result.roughness = rou_met_ao.r;
210 result.metalness = rou_met_ao.g;
211 result.ao = rou_met_ao.b;
213 result.use_pbr = uUsePBR;
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