22 #pragma warning(disable : 4068 4146 4293 4305)
25 #include <filament/Engine.h>
26 #include <filament/IndexBuffer.h>
27 #include <filament/IndirectLight.h>
28 #include <filament/LightManager.h>
29 #include <filament/Material.h>
30 #include <filament/RenderTarget.h>
31 #include <filament/RenderableManager.h>
32 #include <filament/Scene.h>
33 #include <filament/Skybox.h>
34 #include <filament/Texture.h>
35 #include <filament/TextureSampler.h>
36 #include <image/KtxBundle.h>
37 #include <image/KtxUtility.h>
53 namespace visualization {
57 template <
class ResourceType>
58 using ResourcesContainer =
59 FilamentResourceManager::ResourcesContainer<ResourceType>;
63 template <
class ResourceType>
64 std::shared_ptr<ResourceType> MakeShared(ResourceType* pointer,
65 filament::Engine& engine) {
66 return std::move(std::shared_ptr<ResourceType>(
67 pointer, [&engine](ResourceType* p) { engine.destroy(p); }));
70 template <
class ResourceType>
71 FilamentResourceManager::BoxedResource<ResourceType> BoxResource(
72 ResourceType* pointer, filament::Engine& engine) {
73 return FilamentResourceManager::BoxedResource<ResourceType>(
74 MakeShared(pointer, engine));
77 template <
class Handle,
class ResourceType>
78 Handle RegisterResource(filament::Engine& engine,
79 ResourceType* resource,
80 ResourcesContainer<ResourceType>& container) {
86 auto new_handle = Handle::Next();
87 container[new_handle] = std::move(BoxResource(resource, engine));
91 template <
class ResourceType>
92 std::weak_ptr<ResourceType> FindResource(
93 const REHandle_abstract&
id,
94 ResourcesContainer<ResourceType>& container) {
95 auto found = container.find(
id);
96 if (found != container.end()) {
97 return found->second.ptr;
101 return std::weak_ptr<ResourceType>();
104 template <
class ResourceType>
105 void DestroyResource(
const REHandle_abstract&
id,
106 ResourcesContainer<ResourceType>& container) {
107 auto found = container.find(
id);
108 if (found == container.end()) {
113 found->second.use_count -= 1;
114 if (found->second.use_count == 0) {
115 container.erase(found);
116 }
else if (found->second.use_count < 0) {
124 std::unordered_map<std::intptr_t, std::shared_ptr<geometry::Image>>
127 std::intptr_t RetainImageForLoading(
128 const std::shared_ptr<geometry::Image>& img) {
129 static std::intptr_t img_id = 1;
131 const auto id = img_id;
132 pending_images[img_id] = img;
138 static void DeallocateBuffer(
void* buffer,
size_t size,
void* user_ptr) {
142 void FreeRetainedImage(
void* buffer,
size_t size,
void* user_ptr) {
143 const auto id =
reinterpret_cast<std::intptr_t
>(user_ptr);
144 auto found = pending_images.find(
id);
145 if (found != pending_images.end()) {
146 pending_images.erase(found);
149 "Trying to release non existent image shared pointer, id: {}",
154 filament::Material* LoadMaterialFromFile(
const std::string&
path,
155 filament::Engine& engine) {
156 std::vector<char> material_data;
157 std::string error_str;
159 std::string platform_path =
path;
161 std::replace(platform_path.begin(), platform_path.end(),
'/',
'\\');
167 return Material::Builder()
168 .package(material_data.data(), material_data.size())
173 platform_path, error_str);
178 struct TextureSettings {
179 filament::Texture::Format
image_format = filament::Texture::Format::RGB;
180 filament::Texture::Type
image_type = filament::Texture::Type::UBYTE;
181 filament::Texture::InternalFormat
format =
182 filament::Texture::InternalFormat::RGB8;
187 void FormatSettingsFromImage(TextureSettings& settings,
189 int bytes_per_channel,
192 static std::unordered_map<unsigned int, filament::Texture::InternalFormat>
194 {(1 << 4 | 1), filament::Texture::InternalFormat::R8},
195 {(1 << 4 | 2), filament::Texture::InternalFormat::RG8},
196 {(1 << 4 | 3), filament::Texture::InternalFormat::RGB8},
197 {(1 << 4 | 4), filament::Texture::InternalFormat::RGBA8}};
200 switch (num_channels) {
202 settings.image_format = filament::Texture::Format::R;
205 settings.image_format = filament::Texture::Format::RG;
208 settings.image_format = filament::Texture::Format::RGB;
211 settings.image_format = filament::Texture::Format::RGBA;
220 unsigned int key = (bytes_per_channel << 4 | num_channels);
221 if (format_map.count(key) > 0) {
222 settings.format = format_map[key];
225 "Unsupported combination of number of channels ({}) and bytes "
227 num_channels, bytes_per_channel);
231 if (srgb && bytes_per_channel == 1 &&
232 (num_channels == 3 || num_channels == 4)) {
233 if (num_channels == 3) {
234 settings.format = filament::Texture::InternalFormat::SRGB8;
236 settings.format = filament::Texture::InternalFormat::SRGB8_A8;
241 void DataTypeFromImage(TextureSettings& settings,
int bytes_per_channel) {
242 switch (bytes_per_channel) {
244 settings.image_type = filament::Texture::Type::UBYTE;
247 settings.image_type = filament::Texture::Type::USHORT;
251 settings.image_type = filament::Texture::Type::FLOAT;
261 TextureSettings GetSettingsFromImage(
const geometry::Image&
image,
bool srgb) {
262 TextureSettings settings;
264 settings.texel_width =
image.width_;
265 settings.texel_height =
image.height_;
267 FormatSettingsFromImage(settings,
image.num_of_channels_,
268 image.bytes_per_channel_, srgb);
269 DataTypeFromImage(settings,
image.bytes_per_channel_);
273 TextureSettings GetSettingsFromImage(
const t::geometry::Image&
image,
275 TextureSettings settings;
277 settings.texel_width =
image.GetCols();
278 settings.texel_height =
image.GetRows();
280 FormatSettingsFromImage(settings,
image.GetChannels(),
281 image.GetDtype().ByteSize(), srgb);
282 DataTypeFromImage(settings,
image.GetDtype().ByteSize());
357 const void* material_data,
const size_t data_size) {
360 Material* material = Material::Builder()
361 .package(material_data, data_size)
367 RegisterResource<MaterialHandle>(engine_, material, materials_);
377 if (!request.
path_.empty()) {
378 std::vector<char> material_data;
379 std::string error_str;
383 handle =
CreateMaterial(material_data.data(), material_data.size());
401 auto found = materials_.find(
id);
402 if (found != materials_.end()) {
403 auto material_instance = found->second->createInstance();
404 return RegisterResource<MaterialInstanceHandle>(
405 engine_, material_instance, material_instances_);
414 std::shared_ptr<geometry::Image> img;
426 const std::shared_ptr<geometry::Image>& img,
bool srgb) {
428 if (img->HasData()) {
429 auto texture = LoadTextureFromImage(img, srgb);
431 handle = RegisterResource<TextureHandle>(engine_, texture, textures_);
440 if (
image.HasData()) {
441 auto copy = std::make_shared<geometry::Image>(
image);
443 auto texture = LoadTextureFromImage(
copy, srgb);
445 handle = RegisterResource<TextureHandle>(engine_, texture, textures_);
454 auto texture = LoadTextureFromImage(
image, srgb);
455 handle = RegisterResource<TextureHandle>(engine_, texture, textures_);
460 const Eigen::Vector3f&
color,
size_t dimension) {
462 auto texture = LoadFilledTexture(
color, dimension);
463 handle = RegisterResource<TextureHandle>(engine_, texture, textures_);
470 const std::shared_ptr<geometry::Image>
image,
473 if (
auto ftexture = ftexture_weak.lock()) {
474 if (ftexture->getWidth() ==
size_t(
image->width_) &&
475 ftexture->getHeight() ==
size_t(
image->height_)) {
476 auto retained_img_id = RetainImageForLoading(
image);
477 auto texture_settings = GetSettingsFromImage(*
image, srgb);
478 filament::Texture::PixelBufferDescriptor desc(
480 texture_settings.image_format, texture_settings.image_type,
481 FreeRetainedImage, (
void*)retained_img_id);
482 ftexture->setImage(engine_, 0, std::move(desc));
493 if (
auto ftexture = ftexture_weak.lock()) {
494 if (ftexture->getWidth() ==
size_t(
image.GetCols()) &&
495 ftexture->getHeight() ==
size_t(
image.GetRows())) {
496 auto texture_settings = GetSettingsFromImage(
image, srgb);
497 filament::Texture::PixelBufferDescriptor desc(
500 image.GetDtype().ByteSize(),
501 texture_settings.image_format, texture_settings.image_type);
502 ftexture->setImage(engine_, 0, std::move(desc));
512 auto texture = Texture::Builder()
516 .format(Texture::InternalFormat::RGBA16F)
517 .usage(Texture::Usage::COLOR_ATTACHMENT |
518 Texture::Usage::SAMPLEABLE)
521 handle = RegisterResource<TextureHandle>(engine_, texture, textures_);
528 auto texture = Texture::Builder()
532 .format(Texture::InternalFormat::DEPTH32F)
533 .usage(Texture::Usage::DEPTH_ATTACHMENT)
536 handle = RegisterResource<TextureHandle>(engine_, texture, textures_);
547 auto color_tex = color_tex_weak.lock();
548 auto depth_tex = depth_tex_weak.lock();
549 if (!color_tex || !depth_tex) {
554 auto rt = RenderTarget::Builder()
555 .texture(RenderTarget::COLOR, color_tex.get())
556 .texture(RenderTarget::DEPTH, depth_tex.get())
558 handle = RegisterResource<RenderTargetHandle>(engine_, rt, render_targets_);
566 if (!request.
path_.empty()) {
567 std::vector<char> ibl_data;
568 std::string error_str;
574 auto* ibl_ktx =
new image::KtxBundle(
575 reinterpret_cast<std::uint8_t*
>(ibl_data.data()),
576 std::uint32_t(ibl_data.size()));
578 image::ktx::createTexture(&engine_, ibl_ktx,
false);
580 filament::math::float3 bands[9] = {};
581 if (!ibl_ktx->getSphericalHarmonics(bands)) {
582 engine_.destroy(ibl_texture);
585 "Failed to read spherical harmonics from ktx");
589 auto indirect_light = IndirectLight::Builder()
590 .reflections(ibl_texture)
591 .irradiance(3, bands)
595 if (indirect_light) {
596 handle = RegisterResource<IndirectLightHandle>(
597 engine_, indirect_light, ibls_);
599 auto htexture = RegisterResource<TextureHandle>(
600 engine_, ibl_texture, textures_);
601 dependencies_[handle].insert(htexture);
604 request, 3,
"Failed to create indirect light from ktx");
605 engine_.destroy(ibl_texture);
618 const Eigen::Vector3f&
color) {
619 filament::math::float4 fcolor;
620 fcolor.r =
color.x();
621 fcolor.g =
color.y();
622 fcolor.b =
color.z();
625 filament::Skybox::Builder().showSun(
false).color(fcolor).build(
627 auto handle = RegisterResource<SkyboxHandle>(engine_, skybox, skyboxes_);
635 if (!request.
path_.empty()) {
636 std::vector<char> sky_data;
637 std::string error_str;
643 auto* sky_ktx =
new image::KtxBundle(
644 reinterpret_cast<std::uint8_t*
>(sky_data.data()),
645 std::uint32_t(sky_data.size()));
647 image::ktx::createTexture(&engine_, sky_ktx,
false);
649 auto skybox = Skybox::Builder()
650 .environment(sky_texture)
655 handle = RegisterResource<SkyboxHandle>(engine_, skybox,
658 auto htex = RegisterResource<TextureHandle>(
659 engine_, sky_texture, textures_);
660 dependencies_[handle].insert(htex);
663 request, 3,
"Failed to create indirect light from ktx");
664 engine_.destroy(sky_texture);
677 filament::VertexBuffer* vertex_buffer) {
678 return RegisterResource<VertexBufferHandle>(engine_, vertex_buffer,
683 auto found = vertex_buffers_.find(
vb);
684 if (found != vertex_buffers_.end()) {
685 found->second.use_count += 1;
692 size_t indices_count,
size_t index_stride) {
696 IndexBuffer::Builder()
697 .bufferType(index_stride == 2
698 ? IndexBuffer::IndexType::USHORT
699 : IndexBuffer::IndexType::UINT)
700 .indexCount(std::uint32_t(indices_count))
705 handle = RegisterResource<IndexBufferHandle>(engine_, ibuf,
714 return FindResource(
id, materials_);
717 std::weak_ptr<filament::MaterialInstance>
719 return FindResource(
id, material_instances_);
724 return FindResource(
id, textures_);
729 return FindResource(
id, render_targets_);
732 std::weak_ptr<filament::IndirectLight>
734 return FindResource(
id, ibls_);
739 return FindResource(
id, skyboxes_);
744 return FindResource(
id, vertex_buffers_);
749 return FindResource(
id, index_buffers_);
753 material_instances_.clear();
756 render_targets_.clear();
757 vertex_buffers_.clear();
758 index_buffers_.clear();
766 "Trying to destroy default resource {}. Nothing will happen.",
773 DestroyResource(
id, materials_);
776 DestroyResource(
id, material_instances_);
779 DestroyResource(
id, textures_);
782 DestroyResource(
id, vertex_buffers_);
785 DestroyResource(
id, index_buffers_);
788 DestroyResource(
id, skyboxes_);
791 DestroyResource(
id, ibls_);
794 DestroyResource(
id, render_targets_);
799 "Resource {} is not suited for destruction by "
805 auto found = dependencies_.find(
id);
806 if (found != dependencies_.end()) {
807 for (
const auto& dependent : found->second) {
811 dependencies_.erase(found);
817 uint8_t levels =
static_cast<uint8_t
>(std::ilogbf(
float(maxdim)));
821 filament::Texture* FilamentResourceManager::LoadTextureFromImage(
822 const std::shared_ptr<geometry::Image>&
image,
bool srgb) {
825 auto retained_img_id = RetainImageForLoading(
image);
826 auto texture_settings = GetSettingsFromImage(*
image, srgb);
828 texture_settings.texel_height);
830 Texture::PixelBufferDescriptor pb(
832 texture_settings.image_format, texture_settings.image_type,
833 FreeRetainedImage, (
void*)retained_img_id);
834 auto texture = Texture::Builder()
835 .width(texture_settings.texel_width)
836 .height(texture_settings.texel_height)
838 .format(texture_settings.format)
839 .sampler(Texture::Sampler::SAMPLER_2D)
842 texture->setImage(engine_, 0, std::move(pb));
843 texture->generateMipmaps(engine_);
847 filament::Texture* FilamentResourceManager::LoadTextureFromImage(
851 auto texture_settings = GetSettingsFromImage(
image, srgb);
853 texture_settings.texel_height);
855 const size_t image_bytes =
image.GetRows() *
image.GetCols() *
856 image.GetChannels() *
857 image.GetDtype().ByteSize();
860 auto* image_data = malloc(image_bytes);
861 memcpy(image_data, cpu_image.
GetDataPtr(), image_bytes);
862 Texture::PixelBufferDescriptor pb(
863 image_data, image_bytes, texture_settings.image_format,
864 texture_settings.image_type, DeallocateBuffer);
865 auto texture = Texture::Builder()
866 .width(texture_settings.texel_width)
867 .height(texture_settings.texel_height)
869 .format(texture_settings.format)
870 .sampler(Texture::Sampler::SAMPLER_2D)
872 texture->setImage(engine_, 0, std::move(pb));
873 texture->generateMipmaps(engine_);
876 Texture::PixelBufferDescriptor pb(
image.GetDataPtr(), image_bytes,
877 texture_settings.image_format,
878 texture_settings.image_type);
879 auto texture = Texture::Builder()
880 .width(texture_settings.texel_width)
881 .height(texture_settings.texel_height)
883 .format(texture_settings.format)
884 .sampler(Texture::Sampler::SAMPLER_2D)
886 texture->setImage(engine_, 0, std::move(pb));
887 texture->generateMipmaps(engine_);
892 filament::Texture* FilamentResourceManager::LoadFilledTexture(
893 const Eigen::Vector3f&
color,
size_t dimension) {
894 auto image = std::make_shared<geometry::Image>();
895 image->Prepare(
int(dimension),
int(dimension), 3, 1);
898 std::uint8_t r, g, b;
901 RGB c = {
static_cast<uint8_t
>(
color(0) * 255.f),
902 static_cast<uint8_t
>(
color(1) * 255.f),
903 static_cast<uint8_t
>(
color(2) * 255.f)};
905 auto data =
reinterpret_cast<RGB*
>(
image->data_.data());
906 for (
size_t i = 0; i < dimension * dimension; ++i) {
910 auto texture = LoadTextureFromImage(
image,
false);
914 void FilamentResourceManager::LoadDefaults() {
918 const auto texture_path = resource_root +
"/defaultTexture.png";
920 auto texture = LoadTextureFromImage(texture_img,
false);
923 const auto colormap_path = resource_root +
"/defaultGradient.png";
925 auto color_map = LoadTextureFromImage(colormap_img,
false);
928 auto normal_map = LoadFilledTexture(Eigen::Vector3f(0.5, 0.5, 1.f), 1);
931 const auto default_sampler =
934 const auto default_color = filament::math::float3{1.0f, 1.0f, 1.0f};
935 const auto default_color_alpha =
936 filament::math::float4{1.0f, 1.0f, 1.0f, 1.0f};
938 const auto lit_path = resource_root +
"/defaultLit.filamat";
939 auto lit_mat = LoadMaterialFromFile(lit_path, engine_);
940 lit_mat->setDefaultParameter(
"baseColor", filament::RgbType::sRGB,
942 lit_mat->setDefaultParameter(
"baseRoughness", 0.7f);
943 lit_mat->setDefaultParameter(
"reflectance", 0.5f);
944 lit_mat->setDefaultParameter(
"baseMetallic", 0.f);
945 lit_mat->setDefaultParameter(
"clearCoat", 0.f);
946 lit_mat->setDefaultParameter(
"clearCoatRoughness", 0.f);
947 lit_mat->setDefaultParameter(
"anisotropy", 0.f);
948 lit_mat->setDefaultParameter(
"pointSize", 3.f);
949 lit_mat->setDefaultParameter(
"albedo", texture, default_sampler);
950 lit_mat->setDefaultParameter(
"ao_rough_metalMap", texture, default_sampler);
951 lit_mat->setDefaultParameter(
"normalMap", normal_map, default_sampler);
952 lit_mat->setDefaultParameter(
"reflectanceMap", texture, default_sampler);
958 lit_mat->setDefaultParameter(
"anisotropyMap", texture, default_sampler);
959 materials_[
kDefaultLit] = BoxResource(lit_mat, engine_);
961 const auto gaussian_path = resource_root +
"/gaussianSplat.filamat";
962 auto gaussian_mat = LoadMaterialFromFile(gaussian_path, engine_);
963 gaussian_mat->setDefaultParameter(
"baseColor", filament::RgbType::sRGB,
965 gaussian_mat->setDefaultParameter(
"baseRoughness", 0.7f);
966 gaussian_mat->setDefaultParameter(
"reflectance", 0.5f);
967 gaussian_mat->setDefaultParameter(
"baseMetallic", 0.f);
968 gaussian_mat->setDefaultParameter(
"clearCoat", 0.f);
969 gaussian_mat->setDefaultParameter(
"clearCoatRoughness", 0.f);
970 gaussian_mat->setDefaultParameter(
"anisotropy", 0.f);
971 gaussian_mat->setDefaultParameter(
"pointSize", 3.f);
972 gaussian_mat->setDefaultParameter(
"albedo", texture, default_sampler);
973 gaussian_mat->setDefaultParameter(
"ao_rough_metalMap", texture,
975 gaussian_mat->setDefaultParameter(
"normalMap", normal_map, default_sampler);
976 gaussian_mat->setDefaultParameter(
"reflectanceMap", texture,
979 gaussian_mat->setDefaultParameter(
"anisotropyMap", texture,
983 const auto lit_trans_path =
984 resource_root +
"/defaultLitTransparency.filamat";
985 auto lit_trans_mat = LoadMaterialFromFile(lit_trans_path, engine_);
986 lit_trans_mat->setDefaultParameter(
"baseColor",
987 filament::RgbaType::PREMULTIPLIED_sRGB,
988 default_color_alpha);
989 lit_trans_mat->setDefaultParameter(
"baseRoughness", 0.7f);
990 lit_trans_mat->setDefaultParameter(
"reflectance", 0.5f);
991 lit_trans_mat->setDefaultParameter(
"baseMetallic", 0.f);
992 lit_trans_mat->setDefaultParameter(
"clearCoat", 0.f);
993 lit_trans_mat->setDefaultParameter(
"clearCoatRoughness", 0.f);
994 lit_trans_mat->setDefaultParameter(
"anisotropy", 0.f);
995 lit_trans_mat->setDefaultParameter(
"pointSize", 3.f);
996 lit_trans_mat->setDefaultParameter(
"albedo", texture, default_sampler);
997 lit_trans_mat->setDefaultParameter(
"ao_rough_metalMap", texture,
999 lit_trans_mat->setDefaultParameter(
"normalMap", normal_map,
1001 lit_trans_mat->setDefaultParameter(
"reflectanceMap", texture,
1009 lit_trans_mat->setDefaultParameter(
"anisotropyMap", texture,
1012 BoxResource(lit_trans_mat, engine_);
1014 const auto lit_ssr_path = resource_root +
"/defaultLitSSR.filamat";
1015 auto lit_ssr_mat = LoadMaterialFromFile(lit_ssr_path, engine_);
1016 lit_ssr_mat->setDefaultParameter(
"baseColor",
1017 filament::RgbaType::PREMULTIPLIED_sRGB,
1018 default_color_alpha);
1019 lit_ssr_mat->setDefaultParameter(
"baseRoughness", 0.7f);
1020 lit_ssr_mat->setDefaultParameter(
"reflectance", 0.5f);
1021 lit_ssr_mat->setDefaultParameter(
"baseMetallic", 0.f);
1022 lit_ssr_mat->setDefaultParameter(
"clearCoat", 0.f);
1023 lit_ssr_mat->setDefaultParameter(
"clearCoatRoughness", 0.f);
1024 lit_ssr_mat->setDefaultParameter(
"anisotropy", 0.f);
1025 lit_ssr_mat->setDefaultParameter(
"thickness", 0.5f);
1026 lit_ssr_mat->setDefaultParameter(
"transmission", 1.f);
1027 lit_ssr_mat->setDefaultParameter(
"absorption",
1028 filament::math::float3(0.f, 0.f, 0.f));
1029 lit_ssr_mat->setDefaultParameter(
"pointSize", 3.f);
1030 lit_ssr_mat->setDefaultParameter(
"albedo", texture, default_sampler);
1031 lit_ssr_mat->setDefaultParameter(
"ao_rough_metalMap", texture,
1033 lit_ssr_mat->setDefaultParameter(
"normalMap", normal_map, default_sampler);
1034 lit_ssr_mat->setDefaultParameter(
"reflectanceMap", texture,
1038 const auto unlit_path = resource_root +
"/defaultUnlit.filamat";
1039 auto unlit_mat = LoadMaterialFromFile(unlit_path, engine_);
1040 unlit_mat->setDefaultParameter(
"baseColor", filament::RgbType::sRGB,
1042 unlit_mat->setDefaultParameter(
"pointSize", 3.f);
1043 unlit_mat->setDefaultParameter(
"albedo", texture, default_sampler);
1044 unlit_mat->setDefaultParameter(
"srgbColor", 0.f);
1045 materials_[
kDefaultUnlit] = BoxResource(unlit_mat, engine_);
1047 const auto unlit_trans_path =
1048 resource_root +
"/defaultUnlitTransparency.filamat";
1049 auto unlit_trans_mat = LoadMaterialFromFile(unlit_trans_path, engine_);
1050 unlit_trans_mat->setDefaultParameter(
"baseColor", filament::RgbType::sRGB,
1052 unlit_trans_mat->setDefaultParameter(
"pointSize", 3.f);
1053 unlit_trans_mat->setDefaultParameter(
"albedo", texture, default_sampler);
1055 BoxResource(unlit_trans_mat, engine_);
1057 const auto depth_path = resource_root +
"/depth.filamat";
1058 auto depth_mat = LoadMaterialFromFile(depth_path, engine_);
1059 depth_mat->setDefaultParameter(
"pointSize", 3.f);
1062 const auto gradient_path = resource_root +
"/unlitGradient.filamat";
1063 auto gradient_mat = LoadMaterialFromFile(gradient_path, engine_);
1064 gradient_mat->setDefaultParameter(
"pointSize", 3.f);
1066 BoxResource(gradient_mat, engine_);
1069 const auto hdepth =
CreateMaterial(ResourceLoadRequest(depth_path.data()));
1070 auto depth_mat_inst = materials_[hdepth];
1071 depth_mat_inst->setDefaultParameter(
"pointSize", 3.f);
1073 BoxResource(depth_mat_inst->createInstance(), engine_);
1075 const auto normals_path = resource_root +
"/normals.filamat";
1076 auto normals_mat = LoadMaterialFromFile(normals_path, engine_);
1077 normals_mat->setDefaultParameter(
"pointSize", 3.f);
1081 const auto hnormals =
1083 auto normals_mat_inst = materials_[hnormals];
1084 normals_mat_inst->setDefaultParameter(
"pointSize", 3.f);
1086 BoxResource(normals_mat_inst->createInstance(), engine_);
1088 const auto colormap_map_path = resource_root +
"/colorMap.filamat";
1089 const auto hcolormap_mat =
1091 auto colormap_mat = materials_[hcolormap_mat];
1092 auto colormap_mat_inst = colormap_mat->createInstance();
1093 colormap_mat_inst->setParameter(
"colorMap", color_map, default_sampler);
1095 BoxResource(colormap_mat_inst, engine_);
1097 const auto solid_path = resource_root +
"/unlitSolidColor.filamat";
1098 auto solid_mat = LoadMaterialFromFile(solid_path, engine_);
1099 solid_mat->setDefaultParameter(
"baseColor", filament::RgbType::sRGB,
1100 {0.5f, 0.5f, 0.5f});
1103 const auto bg_path = resource_root +
"/unlitBackground.filamat";
1104 auto bg_mat = LoadMaterialFromFile(bg_path, engine_);
1105 bg_mat->setDefaultParameter(
"baseColor", filament::RgbType::sRGB,
1106 {1.0f, 1.0f, 1.0f});
1107 bg_mat->setDefaultParameter(
"albedo", texture, default_sampler);
1108 bg_mat->setDefaultParameter(
"aspectRatio", 0.0f);
1109 bg_mat->setDefaultParameter(
"yOrigin", 0.0f);
1112 const auto inf_path = resource_root +
"/infiniteGroundPlane.filamat";
1113 auto inf_mat = LoadMaterialFromFile(inf_path, engine_);
1114 inf_mat->setDefaultParameter(
"baseColor", filament::RgbType::sRGB,
1115 {0.4f, 0.4f, 0.4f});
1116 inf_mat->setDefaultParameter(
"axis", 0.0f);
1119 const auto line_path = resource_root +
"/unlitLine.filamat";
1120 auto line_mat = LoadMaterialFromFile(line_path, engine_);
1121 line_mat->setDefaultParameter(
"baseColor", filament::RgbaType::LINEAR,
1122 default_color_alpha);
1123 line_mat->setDefaultParameter(
"emissiveColor",
1124 filament::math::float4(0.0, 0.0, 0.0, 1.0f));
1125 line_mat->setDefaultParameter(
"lineWidth", 1.f);
1128 const auto poffset_path = resource_root +
"/unlitPolygonOffset.filamat";
1129 auto poffset_mat = LoadMaterialFromFile(poffset_path, engine_);
1131 BoxResource(poffset_mat, engine_);
std::shared_ptr< core::Tensor > image
filament::Texture::InternalFormat format
filament::Texture::Format image_format
std::uint32_t texel_width
filament::Texture::Type image_type
std::uint32_t texel_height
std::vector< UVAtlasVertex > vb
The Image class stores image with customizable width, height, num of channels and bytes per channel.
The Image class stores image with customizable rows, cols, channels, dtype and device.
void * GetDataPtr()
Get raw buffer of the Image data.
static const std::string & GetResourcePath()
static filament::TextureSampler SamplerFromSamplerParameters(const TextureSamplerParameters &sampler_config)
IndexBufferHandle CreateIndexBuffer(size_t indices_count, size_t index_stride)
static const MaterialHandle kDefaultUnlitSolidColorShader
static const MaterialHandle kDefaultUnlitPolygonOffsetShader
TextureHandle CreateTextureFilled(const Eigen::Vector3f &color, size_t dimension)
std::weak_ptr< filament::Material > GetMaterial(const MaterialHandle &id)
static const MaterialHandle kDefaultLit
static const MaterialHandle kDefaultDepthValueShader
std::weak_ptr< filament::IndexBuffer > GetIndexBuffer(const IndexBufferHandle &id)
void Destroy(const REHandle_abstract &id)
std::weak_ptr< filament::IndirectLight > GetIndirectLight(const IndirectLightHandle &id)
static const MaterialHandle kDefaultLitSSR
static const MaterialInstanceHandle kNormalsMaterial
static const MaterialHandle kInfinitePlaneShader
bool UpdateTexture(TextureHandle texture, const std::shared_ptr< geometry::Image > image, bool srgb)
static const MaterialHandle kGaussianSplatShader
static const TextureHandle kDefaultColorMap
std::weak_ptr< filament::RenderTarget > GetRenderTarget(const RenderTargetHandle &id)
std::weak_ptr< filament::Texture > GetTexture(const TextureHandle &id)
std::weak_ptr< filament::Skybox > GetSkybox(const SkyboxHandle &id)
SkyboxHandle CreateColorSkybox(const Eigen::Vector3f &color)
TextureHandle CreateTexture(const char *path, bool srgb)
TextureHandle CreateColorAttachmentTexture(int width, int height)
static const TextureHandle kDefaultNormalMap
static const MaterialHandle kDefaultLitWithTransparency
RenderTargetHandle CreateRenderTarget(TextureHandle color, TextureHandle depth)
static const MaterialInstanceHandle kColorMapMaterial
void ReuseVertexBuffer(VertexBufferHandle vb)
std::weak_ptr< filament::VertexBuffer > GetVertexBuffer(const VertexBufferHandle &id)
static const MaterialHandle kDefaultUnlitWithTransparency
std::weak_ptr< filament::MaterialInstance > GetMaterialInstance(const MaterialInstanceHandle &id)
SkyboxHandle CreateSkybox(const ResourceLoadRequest &request)
MaterialInstanceHandle CreateMaterialInstance(const MaterialHandle &id)
static const MaterialInstanceHandle kDepthMaterial
TextureHandle CreateDepthAttachmentTexture(int width, int height)
FilamentResourceManager(filament::Engine &engine)
IndirectLightHandle CreateIndirectLight(const ResourceLoadRequest &request)
~FilamentResourceManager()
static const MaterialHandle kDefaultLineShader
static const MaterialHandle kDefaultUnlit
MaterialHandle CreateMaterial(const void *material_data, size_t data_size)
static const MaterialHandle kDefaultUnlitBackgroundShader
static const MaterialHandle kDefaultUnlitGradientShader
static const MaterialHandle kDefaultDepthShader
VertexBufferHandle AddVertexBuffer(filament::VertexBuffer *vertex_buffer)
static const TextureHandle kDefaultTexture
static const MaterialHandle kDefaultNormalShader
ErrorCallback error_callback_
std::shared_ptr< geometry::Image > CreateImageFromFile(const std::string &filename)
static const std::string path
bool FReadToBuffer(const std::string &path, std::vector< char > &bytes, std::string *errorStr)
REHandle< EntityType::Texture > TextureHandle
REHandle< EntityType::Material > MaterialHandle
static const std::unordered_set< REHandle_abstract > kDefaultResources
REHandle< EntityType::MaterialInstance > MaterialInstanceHandle
uint8_t maxLevelCount(uint32_t width, uint32_t height)
Generic file read and write utility for python interface.
static const char * TypeToString(EntityType type)
static TextureSamplerParameters Pretty()