Program Listing for File additional_material_loader.hpp¶
↰ Return to documentation for file (/home/runner/work/Legion-Engine/Legion-Engine/legion/engine/rendering/util/additional_material_loader.hpp
)
#pragma once
#include <core/core.hpp>
#include <physics/mesh_splitter_utils/mesh_splitter.hpp>
#include <rendering/data/model.hpp>
namespace legion::rendering
{
struct EmbeddedLoader
{
static void loader(ecs::entity_handle eH)
{
static const auto defaultLitShader = ShaderCache::create_shader("default lit", fs::view("engine://shaders/default_lit.shs"));
auto mInfo = eH.read_component<use_embedded_material>();
static const std::string name = "%%VERY_FAKE_YES%%";
material_handle material = MaterialCache::create_material(mInfo.materialName, defaultLitShader);
material_list loadedMaterials;
auto settings = default_mesh_settings;
settings.materials = &loadedMaterials;
ModelCache::create_model(name, fs::view(mInfo.embedded_material_path), settings);
if (loadedMaterials.size())
{
auto& mat = loadedMaterials[0];
if (mat.doubleSided)
material.set_variant("double_sided");
material.set_param("alphaCutoff", mat.alphaCutoff);
if (mat.albedoMap)
{
material.set_param("useAlbedoTex", true);
material.set_param("albedoTex", TextureCache::create_texture_from_image(mat.albedoMap));
}
else
{
material.set_param("useAlbedoTex", false);
material.set_param("albedoColor", mat.albedoValue);
}
if (mat.metallicRoughnessMap)
{
material.set_param("useMetallicRoughness", true);
material.set_param("metallicRoughness", TextureCache::create_texture_from_image(mat.metallicRoughnessMap));
}
else
{
material.set_param("useMetallicRoughness", false);
if (mat.metallicMap)
{
material.set_param("useMetallicTex", true);
material.set_param("metallicTex", TextureCache::create_texture_from_image(mat.metallicMap));
}
else
{
material.set_param("useMetallicTex", false);
material.set_param("metallicValue", mat.metallicValue);
}
if (mat.roughnessMap)
{
material.set_param("useRoughnessTex", true);
material.set_param("roughnessTex", TextureCache::create_texture_from_image(mat.roughnessMap));
}
else
{
material.set_param("useRoughnessTex", false);
material.set_param("roughnessValue", mat.roughnessValue);
}
}
if (mat.emissiveMap)
{
material.set_param("useEmissiveTex", true);
material.set_param("emissiveTex", TextureCache::create_texture_from_image(mat.emissiveMap));
}
else
{
material.set_param("useEmissiveTex", false);
material.set_param("emissiveColor", mat.emissiveValue);
}
if (mat.normalMap)
{
material.set_param("useNormal", true);
material.set_param("normalTex", TextureCache::create_texture_from_image(mat.normalMap));
}
else
{
material.set_param("useNormal", false);
}
if (mat.aoMap)
{
material.set_param("useAmbientOcclusion", true);
material.set_param("ambientOcclusionTex", TextureCache::create_texture_from_image(mat.aoMap));
}
else
{
material.set_param("useAmbientOcclusion", false);
}
if (mat.heightMap)
{
material.set_param("useHeight", true);
material.set_param("heightTex", TextureCache::create_texture_from_image(mat.heightMap));
}
else
{
material.set_param("useHeight", false);
}
material.setLoadOrSaveBit(false);
log::debug("Loaded embedded material {}", material.get_name());
}
ModelCache::destroy_model(name);
eH.modify_component<mesh_renderer>([&material](mesh_renderer& mr) {mr.material = material; });
}
};
}