ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
FilamentEntitiesMods.cpp
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
9 
10 // 4068: Filament has some clang-specific vectorizing pragma's that MSVC flags
11 #ifdef _MSC_VER
12 #pragma warning(push)
13 #pragma warning(disable : 4068)
14 #endif // _MSC_VER
15 
16 #include <filament/MaterialInstance.h>
17 #include <filament/TextureSampler.h>
18 
19 #ifdef _MSC_VER
20 #pragma warning(pop)
21 #endif // _MSC_VER
22 
23 #include <Logging.h>
24 
27 
28 namespace cloudViewer {
29 namespace visualization {
30 namespace rendering {
31 
32 namespace {
33 
34 using namespace filament;
35 
36 TextureSampler::WrapMode ConvertWrapMode(
38  switch (mode) {
40  return TextureSampler::WrapMode::CLAMP_TO_EDGE;
42  return TextureSampler::WrapMode::REPEAT;
44  return TextureSampler::WrapMode::MIRRORED_REPEAT;
45  }
46 
47  return TextureSampler::WrapMode::CLAMP_TO_EDGE;
48 }
49 
50 } // namespace
51 
53  const TextureSamplerParameters& sampler_config) {
54  TextureSampler sampler;
55 
56  switch (sampler_config.filter_mag) {
58  sampler.setMagFilter(TextureSampler::MagFilter::NEAREST);
59  break;
61  sampler.setMagFilter(TextureSampler::MagFilter::LINEAR);
62  break;
63  }
64 
65  switch (sampler_config.filter_min) {
67  sampler.setMinFilter(TextureSampler::MinFilter::NEAREST);
68  break;
70  sampler.setMinFilter(TextureSampler::MinFilter::LINEAR);
71  break;
73  sampler.setMinFilter(
74  TextureSampler::MinFilter::NEAREST_MIPMAP_NEAREST);
75  break;
77  sampler.setMinFilter(
78  TextureSampler::MinFilter::LINEAR_MIPMAP_NEAREST);
79  break;
81  sampler.setMinFilter(
82  TextureSampler::MinFilter::NEAREST_MIPMAP_LINEAR);
83  break;
85  sampler.setMinFilter(
86  TextureSampler::MinFilter::LINEAR_MIPMAP_LINEAR);
87  break;
88  }
89 
90  sampler.setWrapModeS(ConvertWrapMode(sampler_config.wrap_u));
91  sampler.setWrapModeT(ConvertWrapMode(sampler_config.wrap_v));
92  sampler.setWrapModeR(ConvertWrapMode(sampler_config.wrap_w));
93 
94  sampler.setAnisotropy(sampler.getAnisotropy());
95 
96  return sampler;
97 }
98 
100  const std::shared_ptr<filament::MaterialInstance>& material_instance,
101  const MaterialInstanceHandle& id) {
102  Init(material_instance, id);
103 }
104 
106  if (material_instance_ != nullptr) {
108  "Previous material instance modifications are not finished!");
109  }
110 
111  material_instance_ = nullptr;
112  current_handle_ = MaterialInstanceHandle::kBad;
113 }
114 
116  const std::shared_ptr<filament::MaterialInstance>& material_instance,
117  const MaterialInstanceHandle& id) {
118  if (material_instance_ != nullptr) {
120  "Previous material instance modifications are not finished!");
121  }
122 
123  material_instance_ = material_instance;
124  current_handle_ = id;
125 }
126 
128  const int value) {
129  if (material_instance_) {
130  material_instance_->setParameter(parameter, value);
131  }
132 
133  return *this;
134 }
135 
137  const float value) {
138  if (material_instance_) {
139  material_instance_->setParameter(parameter, value);
140  }
141 
142  return *this;
143 }
144 
146  const char* parameter, const Eigen::Vector3f& v) {
147  if (material_instance_) {
148  material_instance_->setParameter(parameter,
149  math::float3{v(0), v(1), v(2)});
150  }
151 
152  return *this;
153 }
154 
156  const char* parameter, const Eigen::Vector3f& value, bool srgb) {
157  if (material_instance_) {
158  const auto color =
159  filament::math::float3{value.x(), value.y(), value.z()};
160  auto rgb_type =
161  srgb ? filament::RgbType::sRGB : filament::RgbType::LINEAR;
162  material_instance_->setParameter(parameter, rgb_type, color);
163  }
164 
165  return *this;
166 }
167 
169  const char* parameter, const Eigen::Vector4f& value, bool srgb) {
170  if (material_instance_) {
171  const auto color =
172  filament::math::float4{value(0), value(1), value(2), value(3)};
173  auto rgba_type =
174  srgb ? filament::RgbaType::sRGB : filament::RgbaType::LINEAR;
175  material_instance_->setParameter(parameter, rgba_type, color);
176  }
177 
178  return *this;
179 }
180 
182  const char* parameter,
183  const TextureHandle& texture_handle,
184  const TextureSamplerParameters& sampler_config) {
185  if (material_instance_) {
186  auto w_texture =
188 
189  if (auto texture_ptr = w_texture.lock()) {
190  material_instance_->setParameter(
191  parameter, texture_ptr.get(),
192  SamplerFromSamplerParameters(sampler_config));
193  } else {
195  "Failed to set texture for material.\n\tMaterial handle: "
196  "{}\n\tTexture handle: {}\n\tParameter name: {}",
197  current_handle_, texture_handle, parameter);
198  }
199  }
200 
201  return *this;
202 }
203 
205  if (material_instance_) {
206  material_instance_->setDoubleSided(double_sided);
207  }
208  return *this;
209 }
210 
212  auto res = current_handle_;
213 
214  material_instance_ = nullptr;
215  current_handle_ = MaterialInstanceHandle::kBad;
216 
217  return res;
218 }
219 
220 } // namespace rendering
221 } // namespace visualization
222 } // namespace cloudViewer
math::float4 color
static FilamentResourceManager & GetResourceManager()
MaterialModifier & SetTexture(const char *parameter, const TextureHandle &texture, const TextureSamplerParameters &sampler) override
MaterialModifier & SetParameter(const char *parameter, int value) override
void Init(const std::shared_ptr< filament::MaterialInstance > &material_instance, const MaterialInstanceHandle &id)
MaterialModifier & SetDoubleSided(bool double_sided) override
static filament::TextureSampler SamplerFromSamplerParameters(const TextureSamplerParameters &sampler_config)
MaterialModifier & SetColor(const char *parameter, const Eigen::Vector3f &value, bool srgb) override
std::weak_ptr< filament::Texture > GetTexture(const TextureHandle &id)
#define LogWarning(...)
Definition: Logging.h:72
Generic file read and write utility for python interface.
@ Linear
Box filtering. Weighted average of 4 neighbors is used.
@ NearestMipmapNearest
Mip-mapping is activated. But no filtering occurs.
@ Linear
Box filtering. Weighted average of 4 neighbors is used.