Avoid setting metallic/roughness/sheen/clearcoat properties when they are not found on mtl file.
parent
a305d14b8f
commit
51e248909f
|
@ -43,6 +43,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#ifndef OBJ_FILEDATA_H_INC
|
#ifndef OBJ_FILEDATA_H_INC
|
||||||
#define OBJ_FILEDATA_H_INC
|
#define OBJ_FILEDATA_H_INC
|
||||||
|
|
||||||
|
#include <Common/maybe.h>
|
||||||
#include <assimp/mesh.h>
|
#include <assimp/mesh.h>
|
||||||
#include <assimp/types.h>
|
#include <assimp/types.h>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
@ -183,15 +184,15 @@ struct Material {
|
||||||
aiColor3D transparent;
|
aiColor3D transparent;
|
||||||
|
|
||||||
//! PBR Roughness
|
//! PBR Roughness
|
||||||
ai_real roughness;
|
Maybe<ai_real> roughness;
|
||||||
//! PBR Metallic
|
//! PBR Metallic
|
||||||
ai_real metallic;
|
Maybe<ai_real> metallic;
|
||||||
//! PBR Metallic
|
//! PBR Metallic
|
||||||
aiColor3D sheen;
|
Maybe<aiColor3D> sheen;
|
||||||
//! PBR Clearcoat Thickness
|
//! PBR Clearcoat Thickness
|
||||||
ai_real clearcoat_thickness;
|
Maybe<ai_real> clearcoat_thickness;
|
||||||
//! PBR Clearcoat Rougness
|
//! PBR Clearcoat Rougness
|
||||||
ai_real clearcoat_roughness;
|
Maybe<ai_real> clearcoat_roughness;
|
||||||
//! PBR Anisotropy
|
//! PBR Anisotropy
|
||||||
ai_real anisotropy;
|
ai_real anisotropy;
|
||||||
|
|
||||||
|
@ -206,11 +207,11 @@ struct Material {
|
||||||
illumination_model(1),
|
illumination_model(1),
|
||||||
ior(ai_real(1.0)),
|
ior(ai_real(1.0)),
|
||||||
transparent(ai_real(1.0), ai_real(1.0), ai_real(1.0)),
|
transparent(ai_real(1.0), ai_real(1.0), ai_real(1.0)),
|
||||||
roughness(ai_real(1.0)),
|
roughness(),
|
||||||
metallic(ai_real(0.0)),
|
metallic(),
|
||||||
sheen(ai_real(1.0), ai_real(1.0), ai_real(1.0)),
|
sheen(),
|
||||||
clearcoat_thickness(ai_real(0.0)),
|
clearcoat_thickness(),
|
||||||
clearcoat_roughness(ai_real(0.0)),
|
clearcoat_roughness(),
|
||||||
anisotropy(ai_real(0.0)),
|
anisotropy(ai_real(0.0)),
|
||||||
bump_multiplier(ai_real(1.0)) {
|
bump_multiplier(ai_real(1.0)) {
|
||||||
std::fill_n(clamp, static_cast<unsigned int>(TextureTypeCount), false);
|
std::fill_n(clamp, static_cast<unsigned int>(TextureTypeCount), false);
|
||||||
|
|
|
@ -616,11 +616,16 @@ void ObjFileImporter::createMaterials(const ObjFile::Model *pModel, aiScene *pSc
|
||||||
mat->AddProperty(&pCurrentMaterial->shineness, 1, AI_MATKEY_SHININESS);
|
mat->AddProperty(&pCurrentMaterial->shineness, 1, AI_MATKEY_SHININESS);
|
||||||
mat->AddProperty(&pCurrentMaterial->alpha, 1, AI_MATKEY_OPACITY);
|
mat->AddProperty(&pCurrentMaterial->alpha, 1, AI_MATKEY_OPACITY);
|
||||||
mat->AddProperty(&pCurrentMaterial->transparent, 1, AI_MATKEY_COLOR_TRANSPARENT);
|
mat->AddProperty(&pCurrentMaterial->transparent, 1, AI_MATKEY_COLOR_TRANSPARENT);
|
||||||
mat->AddProperty(&pCurrentMaterial->roughness, 1, AI_MATKEY_ROUGHNESS_FACTOR);
|
if (pCurrentMaterial->roughness)
|
||||||
mat->AddProperty(&pCurrentMaterial->metallic, 1, AI_MATKEY_METALLIC_FACTOR);
|
mat->AddProperty(&pCurrentMaterial->roughness.Get(), 1, AI_MATKEY_ROUGHNESS_FACTOR);
|
||||||
mat->AddProperty(&pCurrentMaterial->sheen, 1, AI_MATKEY_SHEEN_COLOR_FACTOR);
|
if (pCurrentMaterial->metallic)
|
||||||
mat->AddProperty(&pCurrentMaterial->clearcoat_thickness, 1, AI_MATKEY_CLEARCOAT_FACTOR);
|
mat->AddProperty(&pCurrentMaterial->metallic.Get(), 1, AI_MATKEY_METALLIC_FACTOR);
|
||||||
mat->AddProperty(&pCurrentMaterial->clearcoat_roughness, 1, AI_MATKEY_CLEARCOAT_ROUGHNESS_FACTOR);
|
if (pCurrentMaterial->sheen)
|
||||||
|
mat->AddProperty(&pCurrentMaterial->sheen.Get(), 1, AI_MATKEY_SHEEN_COLOR_FACTOR);
|
||||||
|
if (pCurrentMaterial->clearcoat_thickness)
|
||||||
|
mat->AddProperty(&pCurrentMaterial->clearcoat_thickness.Get(), 1, AI_MATKEY_CLEARCOAT_FACTOR);
|
||||||
|
if (pCurrentMaterial->clearcoat_roughness)
|
||||||
|
mat->AddProperty(&pCurrentMaterial->clearcoat_roughness.Get(), 1, AI_MATKEY_CLEARCOAT_ROUGHNESS_FACTOR);
|
||||||
mat->AddProperty(&pCurrentMaterial->anisotropy, 1, AI_MATKEY_ANISOTROPY_FACTOR);
|
mat->AddProperty(&pCurrentMaterial->anisotropy, 1, AI_MATKEY_ANISOTROPY_FACTOR);
|
||||||
|
|
||||||
// Adding refraction index
|
// Adding refraction index
|
||||||
|
|
|
@ -205,7 +205,7 @@ void ObjFileMtlImporter::load() {
|
||||||
break;
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
++m_DataIt;
|
++m_DataIt;
|
||||||
getColorRGBA(&m_pModel->m_pCurrentMaterial->sheen);
|
getColorRGBA(m_pModel->m_pCurrentMaterial->sheen);
|
||||||
break;
|
break;
|
||||||
case 'c':
|
case 'c':
|
||||||
++m_DataIt;
|
++m_DataIt;
|
||||||
|
@ -267,6 +267,12 @@ void ObjFileMtlImporter::getColorRGBA(aiColor3D *pColor) {
|
||||||
pColor->b = b;
|
pColor->b = b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ObjFileMtlImporter::getColorRGBA(Maybe<aiColor3D> &value) {
|
||||||
|
aiColor3D v;
|
||||||
|
getColorRGBA(&v);
|
||||||
|
value = Maybe<aiColor3D>(v);
|
||||||
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
// Loads the kind of illumination model.
|
// Loads the kind of illumination model.
|
||||||
void ObjFileMtlImporter::getIlluminationModel(int &illum_model) {
|
void ObjFileMtlImporter::getIlluminationModel(int &illum_model) {
|
||||||
|
@ -274,6 +280,7 @@ void ObjFileMtlImporter::getIlluminationModel(int &illum_model) {
|
||||||
illum_model = atoi(&m_buffer[0]);
|
illum_model = atoi(&m_buffer[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
// Loads a single float value.
|
// Loads a single float value.
|
||||||
void ObjFileMtlImporter::getFloatValue(ai_real &value) {
|
void ObjFileMtlImporter::getFloatValue(ai_real &value) {
|
||||||
|
@ -283,10 +290,19 @@ void ObjFileMtlImporter::getFloatValue(ai_real &value) {
|
||||||
value = 0.0f;
|
value = 0.0f;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
value = (ai_real)fast_atof(&m_buffer[0]);
|
value = (ai_real)fast_atof(&m_buffer[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ObjFileMtlImporter::getFloatValue(Maybe<ai_real> &value) {
|
||||||
|
m_DataIt = CopyNextWord<DataArrayIt>(m_DataIt, m_DataItEnd, &m_buffer[0], BUFFERSIZE);
|
||||||
|
size_t len = std::strlen(&m_buffer[0]);
|
||||||
|
if (len)
|
||||||
|
value = Maybe<ai_real>(fast_atof(&m_buffer[0]));
|
||||||
|
else
|
||||||
|
value = Maybe<ai_real>();
|
||||||
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
// Creates a material from loaded data.
|
// Creates a material from loaded data.
|
||||||
void ObjFileMtlImporter::createMaterial() {
|
void ObjFileMtlImporter::createMaterial() {
|
||||||
|
|
|
@ -40,6 +40,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#ifndef OBJFILEMTLIMPORTER_H_INC
|
#ifndef OBJFILEMTLIMPORTER_H_INC
|
||||||
#define OBJFILEMTLIMPORTER_H_INC
|
#define OBJFILEMTLIMPORTER_H_INC
|
||||||
|
|
||||||
|
#include <Common/maybe.h>
|
||||||
#include <assimp/defs.h>
|
#include <assimp/defs.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
@ -81,10 +82,12 @@ private:
|
||||||
void load();
|
void load();
|
||||||
/// Get color data.
|
/// Get color data.
|
||||||
void getColorRGBA(aiColor3D *pColor);
|
void getColorRGBA(aiColor3D *pColor);
|
||||||
|
void getColorRGBA(Maybe<aiColor3D> &value);
|
||||||
/// Get illumination model from loaded data
|
/// Get illumination model from loaded data
|
||||||
void getIlluminationModel(int &illum_model);
|
void getIlluminationModel(int &illum_model);
|
||||||
/// Gets a float value from data.
|
/// Gets a float value from data.
|
||||||
void getFloatValue(ai_real &value);
|
void getFloatValue(ai_real &value);
|
||||||
|
void getFloatValue(Maybe<ai_real> &value);
|
||||||
/// Creates a new material from loaded data.
|
/// Creates a new material from loaded data.
|
||||||
void createMaterial();
|
void createMaterial();
|
||||||
/// Get texture name from loaded data.
|
/// Get texture name from loaded data.
|
||||||
|
|
|
@ -181,6 +181,7 @@ SET( Common_SRCS
|
||||||
Common/DefaultIOSystem.cpp
|
Common/DefaultIOSystem.cpp
|
||||||
Common/ZipArchiveIOSystem.cpp
|
Common/ZipArchiveIOSystem.cpp
|
||||||
Common/PolyTools.h
|
Common/PolyTools.h
|
||||||
|
Common/Maybe.h
|
||||||
Common/Importer.cpp
|
Common/Importer.cpp
|
||||||
Common/IFF.h
|
Common/IFF.h
|
||||||
Common/SGSpatialSort.cpp
|
Common/SGSpatialSort.cpp
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
#pragma once
|
||||||
|
#include <assimp/ai_assert.h>
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
struct Maybe {
|
||||||
|
private:
|
||||||
|
T _val;
|
||||||
|
bool _valid;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Maybe() :
|
||||||
|
_valid(false) {}
|
||||||
|
|
||||||
|
explicit Maybe(const T &val) :
|
||||||
|
_valid(true), _val(val) {
|
||||||
|
}
|
||||||
|
|
||||||
|
operator bool() const {
|
||||||
|
return _valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
const T &Get() const {
|
||||||
|
ai_assert(_valid);
|
||||||
|
return _val;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
Maybe &operator&() = delete;
|
||||||
|
};
|
Loading…
Reference in New Issue