Commit 8da691b9 authored by MURRAY David's avatar MURRAY David
Browse files

restore old multi utia behavior in additionto multi material

parent d8f4ff99
......@@ -122,7 +122,7 @@ void OptixMaterialHandler::releaseMemory()
texture->destroy();
}
for (auto it = _utia_maps_indexes.begin(); it != _utia_maps_indexes.end(); ++it)
for (auto it = _utia_maps_indices.begin(); it != _utia_maps_indices.end(); ++it)
{
auto buffer = it->second;
buffer->destroy();
......@@ -263,6 +263,8 @@ optix::Material OptixMaterialHandler::createMaterialFromMRF(
setCustomRadianceVariables(optix_mat, material, variable_values, variable_names, wavelengths);
updateTexturesGlass(fresnel_glass, wavelengths);
auto it = _glass_cdf.find(material);
if (it != _glass_cdf.end())
{
......@@ -304,6 +306,8 @@ optix::Material OptixMaterialHandler::createMaterialFromMRF(
setCustomRadianceVariables(optix_mat, material, variable_values, variable_names, wavelengths);
updateTexturesGlass(walter_glass, wavelengths);
auto it = _glass_cdf.find(material);
if (it != _glass_cdf.end())
{
......@@ -592,7 +596,7 @@ optix::Material OptixMaterialHandler::createMaterialFromMRF(
updateTextureUTIA(utia);
#endif
auto &id_buffer = _utia_maps_indexes[material];
auto &id_buffer = _utia_maps_indices[material];
optix_mat["_utia_tex_ids"]->set(id_buffer);
auto &param_buffer = _utia_maps_param[material];
......@@ -605,6 +609,35 @@ optix::Material OptixMaterialHandler::createMaterialFromMRF(
return optix_mat;
}
auto idx_utia = dynamic_cast<mrf::materials::IndexedUTIA *>(material);
if (idx_utia)
{
updateTextureIndexedUTIA(idx_utia);
auto it = _index_map.find(material);
if (it != _index_map.end())
{
optix_mat["_material_tex_id"]->setInt(it->second->getId());
}
else
{
optix_mat["_material_tex_id"]->setInt(-1);
_loger.info("Missing index map, setting variable to -1");
}
auto &id_buffer = _utia_maps_indices[material];
optix_mat["_utia_tex_ids"]->set(id_buffer);
auto &param_buffer = _utia_maps_param[material];
optix_mat["_utia_parameters"]->set(param_buffer);
optix_mat["_parameterization"]->setUint(idx_utia->getParameterization());
compile_options.push_back("-DUTIA");
compileBRDF(optix_mat, compile_options);
return optix_mat;
}
//TODO: use the multi-material mechanics here
//auto idx_utia = dynamic_cast<mrf::materials::IndexedUTIA *>(material);
//if (idx_utia)
......@@ -620,7 +653,7 @@ optix::Material OptixMaterialHandler::createMaterialFromMRF(
// _loger.info("Missing index map, setting variable to -1");
// }
// auto &id_buffer = _utia_maps_indexes[material];
// auto &id_buffer = _utia_maps_indices[material];
// optix_mat["_utia_tex_ids"]->set(id_buffer);
// auto &param_buffer = _utia_maps_param[material];
......@@ -780,7 +813,11 @@ void OptixMaterialHandler::createMaterials(std::vector<std::string> const &cuda_
//Multi material is a proxy, no need to compile a specific kernel.
//All its underlying materials are in general material list and will be compiled normally.
auto multi_mat = dynamic_cast<mrf::materials::MultiMaterial *>(_mrf_materials[i]);
if (multi_mat) continue;
if (multi_mat)
{
updateMaterialIndex(multi_mat);
continue;
}
if (_mrf_materials[i])
#ifdef MRF_RENDERING_MODE_SPECTRAL
......@@ -1270,8 +1307,8 @@ void OptixMaterialHandler::updateTextureUTIA(mrf::materials::UTIA *utia)
_utia_texture[utia] = tex_sampler;
{
auto it = _utia_maps_indexes.find(utia);
if (it == _utia_maps_indexes.end())
auto it = _utia_maps_indices.find(utia);
if (it == _utia_maps_indices.end())
{
auto index_buffer = _context->createBuffer(RT_BUFFER_INPUT, RT_FORMAT_INT);
index_buffer->setSize(1);
......@@ -1280,7 +1317,7 @@ void OptixMaterialHandler::updateTextureUTIA(mrf::materials::UTIA *utia)
int_data[0] = tex_sampler->getId();
index_buffer->unmap();
_utia_maps_indexes[utia] = index_buffer;
_utia_maps_indices[utia] = index_buffer;
}
}
......@@ -1324,7 +1361,7 @@ void OptixMaterialHandler::updateTextureIndexedUTIA(mrf::materials::IndexedUTIA
tex_format = RT_FORMAT_FLOAT4;
#endif
std::vector<unsigned int> indexes;
std::vector<unsigned int> indices;
std::vector<optix::TextureSampler> textures;
optix::TextureSampler tex_sampler;
for (int i = 0; i < static_cast<int>(idx_utia->depth()); ++i)
......@@ -1342,7 +1379,7 @@ void OptixMaterialHandler::updateTextureIndexedUTIA(mrf::materials::IndexedUTIA
idx_utia->getUTIAData(i).width(),
idx_utia->getUTIAData(i).height());
textures.push_back(tex_sampler);
indexes.push_back(tex_sampler->getId());
indices.push_back(tex_sampler->getId());
#ifdef MRF_RENDERING_MODE_SPECTRAL
//TODO ASAP
//mrf::optix_backend::updateTextureFromSpectralImage(utia->getUTIAData(i), tex_sampler, 0);
......@@ -1385,32 +1422,33 @@ void OptixMaterialHandler::updateTextureIndexedUTIA(mrf::materials::IndexedUTIA
}
{
auto it = _utia_maps_indexes.find(idx_utia);
if (it == _utia_maps_indexes.end() && indexes.size() > 0)
auto it = _utia_maps_indices.find(idx_utia);
if (it == _utia_maps_indices.end() && indices.size() > 0)
{
auto index_buffer = _context->createBuffer(RT_BUFFER_INPUT, RT_FORMAT_INT);
index_buffer->setSize(indexes.size());
index_buffer->setSize(indices.size());
void *data = index_buffer->map();
int * int_data = (int *)(data);
for (int i = 0; i < indexes.size(); ++i)
int_data[i] = indexes[i];
for (int i = 0; i < indices.size(); ++i)
int_data[i] = indices[i];
index_buffer->unmap();
_utia_maps_indexes[idx_utia] = index_buffer;
_utia_maps_indices[idx_utia] = index_buffer;
}
}
{
auto it = _utia_maps_param.find(idx_utia);
if (it == _utia_maps_param.end() && indexes.size() > 0)
if (it == _utia_maps_param.end() && indices.size() > 0)
{
auto param_buffer = _context->createBuffer(RT_BUFFER_INPUT);
param_buffer->setFormat(RT_FORMAT_USER);
param_buffer->setElementSize(sizeof(int) * 6 * indexes.size());
param_buffer->setSize(1);
_loger.info(std::to_string(sizeof(int) * 6));
param_buffer->setElementSize(sizeof(int) * 8); //Padding to align on 32bit
param_buffer->setSize(indices.size());
void *data = param_buffer->map();
int * int_data = (int *)(data);
for (int i = 0; i < indexes.size(); ++i)
for (int i = 0; i < indices.size(); ++i)
{
int_data[i * 6] = idx_utia->getThetaVDiv(i);
int_data[i * 6 + 1] = idx_utia->getPhiVDiv(i);
......@@ -1739,8 +1777,8 @@ void OptixMaterialHandler::applyMaterial(/*OptiXMesh &optix_mesh,*/
else
{
mrf_indices.push_back(material_index);
geom_instance["index_tex_id"]->setInt(-1);
}
geom_instance["index_tex_id"]->setInt(-1);
for (unsigned int i = 0; i < mrf_indices.size(); ++i)
......
......@@ -204,7 +204,7 @@ private:
/**
* Textures for utia materials
**/
std::map<mrf::materials::UMat *, optix::Buffer> _utia_maps_indexes;
std::map<mrf::materials::UMat *, optix::Buffer> _utia_maps_indices;
std::map<mrf::materials::UMat *, optix::Buffer> _utia_maps_param;
std::map<mrf::materials::UMat *, optix::TextureSampler> _utia_texture;
std::map<mrf::materials::UMat *, std::vector<optix::TextureSampler>> _utia_indexed_textures;
......
......@@ -138,9 +138,13 @@ static __device__ void meshIntersect(int primIdx)
}
uint index = material_buffer[primIdx];
if(index_tex_id > -1 && texcoord_buffer.size() == 0)
if(index_tex_id > -1 && texcoord_buffer.size() >= 0)
{
index = optix::rtTex2D<float>(index_tex_id, texcoord.x, texcoord.y);
float2 uv = make_float2(texcoord.x - floorf(texcoord.x), texcoord.y - floorf(texcoord.y));
uint2 tex_size = make_uint2(optix::rtTexSize(index_tex_id));
uint2 uvi = make_uint2(uv * make_float2(tex_size));
float indexf = optix::rtTex2DFetch<float4>(index_tex_id, uvi.x, uvi.y).x;
index = indexf * 255;
}
rtReportIntersection(index);
}
......
......@@ -358,9 +358,9 @@ COLOR bsdf_eval(float3 normal, float3 eye, float3 light, int lobe)
COLOR bsdf_eval_optim(float3 h, float3 ffnormal, float3 eye, float3 light, int lobe, float external_pdf)
{
float pdf = bsdf_pdf(ffnormal, eye, light, lobe);
if (pdf < 0.f) return COLOR(0.f);
if (pdf <= 0.f) return COLOR(0.f);
float nDotL = dot(light, ffnormal);
float nDotL = abs(dot(light, ffnormal));
return bsdf_eval(ffnormal, eye, light, lobe) * nDotL / pdf;
}
......
......@@ -849,7 +849,7 @@ bool SceneParser::parseShapes(mrf::rendering::Scene &scene)
for (int i = 0; i < is_mat_used.size(); ++i)
{
auto diffuse = dynamic_cast<mrf::materials::DiffuseEmittance *>(&(scene.umaterial(i)));
auto dirac = dynamic_cast<mrf::materials::DiracEmittance *>(&(scene.umaterial(i)));
auto dirac = dynamic_cast<mrf::materials::DiracEmittance *>(&(scene.umaterial(i)));
if (!is_mat_used[i] && diffuse == nullptr && dirac == nullptr)
{
_loger->trace("Material " + std::to_string(i) + " is unused by any shape, removing it.");
......@@ -1277,7 +1277,7 @@ SceneParser::addMesh(XMLElement *a_mesh_element, mrf::rendering::Scene &scene, i
enforced_materials.resize(per_face_material.size());
#pragma omp parallel for schedule(static)
#pragma omp parallel for schedule(static)
for (int i = 0; i < enforced_materials.size(); ++i)
{
unsigned int prev = per_face_material[i];
......@@ -2891,7 +2891,7 @@ bool SceneParser::parseUTIATexture(tinyxml2::XMLElement *a_tex_element, mrf::mat
unsigned int interpolate = 0;
int interpolOK = a_tex_element->QueryUnsignedAttribute(SceneLexer::UTIA_INTERPOLATION_AT, &interpolate);
int interpolOK = a_tex_element->QueryUnsignedAttribute(SceneLexer::UTIA_INTERPOLATION_AT, &interpolate);
utia_mat->setInterpolate(interpolate);
//int param;
......@@ -2908,9 +2908,9 @@ bool SceneParser::parseUTIATexture(tinyxml2::XMLElement *a_tex_element, mrf::mat
// //TODO use string ?
// utia_mat->setParameterization(param);
//}
const char* param;
int paramOK = a_tex_element->QueryStringAttribute(SceneLexer::UTIA_PARAMETERIZATION_AT, &param);
const char *param;
int paramOK = a_tex_element->QueryStringAttribute(SceneLexer::UTIA_PARAMETERIZATION_AT, &param);
if (paramOK != XML_SUCCESS)
{
if (utia_mat->getPhiVDiv() * utia_mat->getPhiIDiv() == 1)
......@@ -2953,7 +2953,6 @@ bool SceneParser::parseUTIATexture(tinyxml2::XMLElement *a_tex_element, mrf::mat
{
utia_mat->setParameterization(MeasuredMaterial::UTIA_4D);
}
}
XMLElement *div_elem = a_tex_element->FirstChildElement(SceneLexer::UTIA_PARAM_MK);
......@@ -2972,13 +2971,11 @@ bool SceneParser::parseUTIATexture(tinyxml2::XMLElement *a_tex_element, mrf::mat
}
else
{
if (utia_mat->getParameterization() == UTIA::UTIA_2D
|| utia_mat->getParameterization() == UTIA::RUSINKIEWICZ_2D
if (utia_mat->getParameterization() == UTIA::UTIA_2D || utia_mat->getParameterization() == UTIA::RUSINKIEWICZ_2D
|| utia_mat->getParameterization() == UTIA::RUSINKIEWICZ_2D_COS)
{
//If isotropic DH requested, only warn that image dimension are used, do not force the V/I parameterization.
_loger->trace(
"No parameter markup detected, using image resolution as theta (D/H) resolution.");
_loger->trace("No parameter markup detected, using image resolution as theta (D/H) resolution.");
}
else
{
......@@ -2994,9 +2991,9 @@ bool SceneParser::parseUTIATexture(tinyxml2::XMLElement *a_tex_element, mrf::mat
utia_mat->setThetaIDiv(theta_i);
utia_mat->setPhiIDiv(phi_i);
_loger->info("Parsed and loaded single UTIA texture with param:");
_loger->info("Theta V: " + std::to_string(theta_v) + "| Phi V : " + std::to_string(phi_v));
_loger->info("Theta I: " + std::to_string(theta_i) + "| Phi I : " + std::to_string(phi_i));
_loger->trace("Parsed and loaded single UTIA texture with param:");
_loger->trace("Theta V: " + std::to_string(theta_v) + "| Phi V : " + std::to_string(phi_v));
_loger->trace("Theta I: " + std::to_string(theta_i) + "| Phi I : " + std::to_string(phi_i));
}
return true;
}
......@@ -3053,7 +3050,54 @@ bool SceneParser::parseIndexedUTIATexture(
rOK &= a_tex_element->QueryUnsignedAttribute(SceneLexer::UTIA_PHI_I_AT, &phi_i);
idx_utia_mat->setPhiIDiv((rOK != XML_SUCCESS) ? 1 : phi_i, tex_index);
idx_utia_mat->setParameterization(MeasuredMaterial::UTIA_4D, tex_index);
const char *param;
int paramOK = a_tex_element->QueryStringAttribute(SceneLexer::UTIA_PARAMETERIZATION_AT, &param);
if (paramOK != XML_SUCCESS)
{
if (phi_v * phi_i == 1)
idx_utia_mat->setParameterization(MeasuredMaterial::UTIA_2D, tex_index);
else
idx_utia_mat->setParameterization(MeasuredMaterial::UTIA_4D, tex_index);
}
else
{
std::string param_str = std::string(param);
if (param_str.compare(SceneLexer::UTIA_2D_VAL) == 0)
{
idx_utia_mat->setParameterization(MeasuredMaterial::UTIA_2D, tex_index);
}
else if (param_str.compare(SceneLexer::RUSINKIEWICZ_2D_VAL) == 0)
{
idx_utia_mat->setParameterization(MeasuredMaterial::RUSINKIEWICZ_2D, tex_index);
}
else if (param_str.compare(SceneLexer::RUSINKIEWICZ_2D_COS_VAL) == 0)
{
idx_utia_mat->setParameterization(MeasuredMaterial::RUSINKIEWICZ_2D_COS, tex_index);
}
else if (param_str.compare(SceneLexer::RUSINKIEWICZ_4D_VAL) == 0)
{
idx_utia_mat->setParameterization(MeasuredMaterial::RUSINKIEWICZ_4D, tex_index);
}
else if (param_str.compare(SceneLexer::UTIA_4D_H_VAL) == 0)
{
idx_utia_mat->setParameterization(MeasuredMaterial::UTIA_4D_H, tex_index);
}
else if (param_str.compare(SceneLexer::UTIA_4D_H_NL_VAL) == 0)
{
idx_utia_mat->setParameterization(MeasuredMaterial::UTIA_4D_H_NL, tex_index);
}
else if (param_str.compare(SceneLexer::HEMISPHERICAL_VAL) == 0)
{
idx_utia_mat->setParameterization(MeasuredMaterial::HEMISPHERICAL_ALBEDO, tex_index);
}
else
{
idx_utia_mat->setParameterization(MeasuredMaterial::UTIA_4D, tex_index);
}
}
//idx_utia_mat->setParameterization(MeasuredMaterial::UTIA_4D, tex_index);
_loger->trace("Parsed and loaded UTIA texture " + std::to_string(tex_index) + " with param:");
_loger->trace("Theta V: " + std::to_string(theta_v) + "| Phi V : " + std::to_string(phi_v));
......@@ -3085,16 +3129,17 @@ bool SceneParser::parseIndexedUTIA(tinyxml2::XMLElement *a_mat_element, mrf::mat
XMLElement *all_tex_mk = a_mat_element->FirstChildElement(SceneLexer::UTIA_LIST_MK);
if (all_tex_mk)
{
_loger->trace("Found multiple UTIA, parsing them.");
_loger->info("Found multiple UTIA, parsing them.");
// For each UTIA NOW
XMLElement *texture_elem = all_tex_mk->FirstChildElement(SceneLexer::UTIA_TEXTURE_MK);
_loger->info("Found multiple UTIA, parsing them.");
int i = 0;
for (; texture_elem; texture_elem = texture_elem->NextSiblingElement())
{
if (parseIndexedUTIATexture(texture_elem, idx_utia_mat, i)) ++i;
}
_loger->trace("Parsed and loaded " + std::to_string(i) + " UTIA textures.");
_loger->info("Parsed and loaded " + std::to_string(i) + " UTIA textures.");
if (parseTexture(a_mat_element, SceneLexer::UTIA_INDEX_MAP_MK, texture_path))
{
......@@ -3103,8 +3148,8 @@ bool SceneParser::parseIndexedUTIA(tinyxml2::XMLElement *a_mat_element, mrf::mat
//delete lphong_mat;
return false;
}
_loger->trace("Normalizing indexes");
idx_utia_mat->normalizeMapIndexes();
_loger->info("Normalizing indices");
idx_utia_mat->normalizeMapIndices();
}
return i > 0 ? true : false;
......@@ -6126,7 +6171,7 @@ bool SceneParser::checkErrorOnTextureLoading(mrf::image::IMAGE_LOAD_SAVE_FLAGS f
using namespace mrf::image;
if (flag == MRF_NO_ERROR)
{
_loger->trace("Successfully loaded ", name);
_loger->info("Successfully loaded ", name);
return true;
}
if (flag == MRF_ERROR_WRONG_EXTENSION)
......
......@@ -64,7 +64,11 @@ IndexedUTIA::~IndexedUTIA() {}
mrf::image::IMAGE_LOAD_SAVE_FLAGS IndexedUTIA::loadUTIAData(std::string const &filename, const int index)
{
return _utia_materials.at(index).loadUTIAData(filename);
if (_utia_materials.count(index) == 0)
{
_utia_materials[index] = new UTIA("");
}
return _utia_materials.at(index)->loadUTIAData(filename);
}
mrf::image::IMAGE_LOAD_SAVE_FLAGS IndexedUTIA::loadUTIAMap(std::string const &filename)
......@@ -87,7 +91,7 @@ mrf::image::IMAGE_LOAD_SAVE_FLAGS IndexedUTIA::loadUTIAMap(std::string const &fi
return mrf::image::IMAGE_LOAD_SAVE_FLAGS::MRF_NO_ERROR;
}
void IndexedUTIA::normalizeMapIndexes(std::string exportPath)
void IndexedUTIA::normalizeMapIndices(std::string exportPath)
{
std::map<unsigned int, int> matToIndex;
for (int i = 0; i < _utia_index_list.size(); ++i)
......
......@@ -40,7 +40,6 @@ protected:
unsigned int _phiIdiv;
public:
UTIA(): MeasuredMaterial("default_utia") {};
UTIA(std::string const &name);
......@@ -70,7 +69,7 @@ public:
#ifdef MRF_RENDERING_MODE_SPECTRAL
mrf::image::UniformSpectralImage const &getUTIAData() const { return *_utia_data.get(); }
#else
mrf::image::ColorImage const & getUTIAData() const { return *_utia_data.get(); }
mrf::image::ColorImage const &getUTIAData() const { return *_utia_data.get(); }
#endif
mrf::image::IMAGE_LOAD_SAVE_FLAGS loadUTIAData(std::string const &filename);
......@@ -94,7 +93,7 @@ public:
class MRF_CORE_EXPORT IndexedUTIA: public BRDF
{
protected:
std::map<int, UTIA> _utia_materials;
std::map<int, UTIA*> _utia_materials;
std::unique_ptr<mrf::image::ColorImage> _utia_index_map;
......@@ -110,37 +109,37 @@ public:
unsigned int getMatIndex(const int index = 0) const { return _utia_index_list.at(index); }
void setMatIndex(unsigned int value, const int index = 0) { _utia_index_list[index] = value; }
unsigned int getThetaVDiv(const int index = 0) const { return _utia_materials.at(index).getThetaVDiv(); }
void setThetaVDiv(unsigned int value, const int index = 0) { _utia_materials[index].setThetaVDiv(value); }
unsigned int getThetaVDiv(const int index = 0) const { return _utia_materials.at(index)->getThetaVDiv(); }
void setThetaVDiv(unsigned int value, const int index = 0) { _utia_materials[index]->setThetaVDiv(value); }
unsigned int getPhiVDiv(const int index = 0) const { return _utia_materials.at(index).getPhiVDiv(); }
void setPhiVDiv(unsigned int value, const int index = 0) { _utia_materials[index].setPhiVDiv(value); }
unsigned int getPhiVDiv(const int index = 0) const { return _utia_materials.at(index)->getPhiVDiv(); }
void setPhiVDiv(unsigned int value, const int index = 0) { _utia_materials[index]->setPhiVDiv(value); }
unsigned int getThetaIDiv(const int index = 0) const { return _utia_materials.at(index).getThetaIDiv(); }
void setThetaIDiv(unsigned int value, const int index = 0) { _utia_materials[index].setThetaIDiv(value); }
unsigned int getThetaIDiv(const int index = 0) const { return _utia_materials.at(index)->getThetaIDiv(); }
void setThetaIDiv(unsigned int value, const int index = 0) { _utia_materials[index]->setThetaIDiv(value); }
unsigned int getPhiIDiv(const int index = 0) const { return _utia_materials.at(index).getPhiIDiv(); }
void setPhiIDiv(unsigned int value, const int index = 0) { _utia_materials[index].setPhiIDiv(value); }
unsigned int getPhiIDiv(const int index = 0) const { return _utia_materials.at(index)->getPhiIDiv(); }
void setPhiIDiv(unsigned int value, const int index = 0) { _utia_materials[index]->setPhiIDiv(value); }
unsigned int getParameterization(const int index = 0) const
{
return _utia_materials.at(index).getParameterization();
return _utia_materials.at(index)->getParameterization();
}
void setParameterization(MeasuredMaterial::Parameterization value, const int index = 0)
{
_utia_materials[index].setParameterization(value);
_utia_materials[index]->setParameterization(value);
}
bool getInterpolate() const { return _interpolate; }
bool getInterpolate(const int index) const { return _utia_materials.at(index).getInterpolate(); }
bool getInterpolate(const int index) const { return _utia_materials.at(index)->getInterpolate(); }
void setInterpolate(bool value) { _interpolate = value; }
void setInterpolate(bool value, const int index) { _utia_materials.at(index).setInterpolate(value); }
void setInterpolate(bool value, const int index) { _utia_materials.at(index)->setInterpolate(value); }
bool hasTexture(const int index = 0) const { return _utia_materials.at(index).hasTexture(); }
bool hasTexture(const int index = 0) const { return _utia_materials.at(index)->hasTexture(); }
bool hasMap() const { return _utia_index_map.get() != nullptr; }
size_t width(const int index = 0) const { return _utia_materials.at(index).width(); }
size_t height(const int index = 0) const { return _utia_materials.at(index).height(); }
size_t width(const int index = 0) const { return _utia_materials.at(index)->width(); }
size_t height(const int index = 0) const { return _utia_materials.at(index)->height(); }
size_t depth() const { return _utia_materials.size(); }
#ifdef MRF_RENDERING_MODE_SPECTRAL
......@@ -149,15 +148,15 @@ public:
return _utia_materials.at(index).getUTIAData();
}
#else
mrf::image::ColorImage const & getUTIAData(const int index = 0) const
mrf::image::ColorImage const &getUTIAData(const int index = 0) const
{
return _utia_materials.at(index).getUTIAData();
return _utia_materials.at(index)->getUTIAData();
}
#endif
mrf::image::ColorImage const &getUTIAMap() const { return *_utia_index_map.get(); }
void normalizeMapIndexes(std::string exportPath = "");
void normalizeMapIndices(std::string exportPath = "");
mrf::image::IMAGE_LOAD_SAVE_FLAGS loadUTIAData(std::string const &filename, const int index = 0);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment