Add "hack" fix for black materials being exported from Maya.
This commit is contained in:
@@ -23,6 +23,7 @@
|
||||
#include <osg/Node>
|
||||
#include <osg/MatrixTransform>
|
||||
#include <osg/Geode>
|
||||
#include <osg/io_utils>
|
||||
|
||||
#include <osg/Geometry>
|
||||
#include <osg/StateSet>
|
||||
@@ -48,7 +49,7 @@
|
||||
class ReaderWriterOBJ : public osgDB::ReaderWriter
|
||||
{
|
||||
public:
|
||||
ReaderWriterOBJ() { }
|
||||
ReaderWriterOBJ():_fixBlackMaterials(true) {}
|
||||
|
||||
virtual const char* className() const { return "Wavefront OBJ Reader"; }
|
||||
virtual bool acceptsExtension(const std::string& extension) const {
|
||||
@@ -72,6 +73,8 @@ protected:
|
||||
|
||||
inline osg::Vec3 transformVertex(const osg::Vec3& vec, const bool rotate) const ;
|
||||
inline osg::Vec3 transformNormal(const osg::Vec3& vec, const bool rotate) const ;
|
||||
|
||||
bool _fixBlackMaterials;
|
||||
|
||||
};
|
||||
|
||||
@@ -105,6 +108,47 @@ osgDB::RegisterReaderWriterProxy<ReaderWriterOBJ> g_objReaderWriterProxy;
|
||||
|
||||
void ReaderWriterOBJ::buildMaterialToStateSetMap(obj::Model& model, MaterialToStateSetMap& materialToStateSetMap) const
|
||||
{
|
||||
if (_fixBlackMaterials)
|
||||
{
|
||||
osg::notify(osg::NOTICE)<<"Testing for black materials"<<std::endl;
|
||||
|
||||
// hack to fix Maya exported models that contian all black materials.
|
||||
int numBlack = 0;
|
||||
int numNotBlack = 0;
|
||||
obj::Model::MaterialMap::iterator itr;
|
||||
for(itr = model.materialMap.begin();
|
||||
itr != model.materialMap.end();
|
||||
++itr)
|
||||
{
|
||||
obj::Material& material = itr->second;
|
||||
if (material.ambient==osg::Vec4(0.0f,0.0f,0.0f,1.0f) &&
|
||||
material.diffuse==osg::Vec4(0.0f,0.0f,0.0f,1.0f))
|
||||
{
|
||||
++numBlack;
|
||||
}
|
||||
else
|
||||
{
|
||||
++numNotBlack;
|
||||
}
|
||||
}
|
||||
|
||||
if (numNotBlack==0 && numBlack!=0)
|
||||
{
|
||||
for(itr = model.materialMap.begin();
|
||||
itr != model.materialMap.end();
|
||||
++itr)
|
||||
{
|
||||
obj::Material& material = itr->second;
|
||||
if (material.ambient==osg::Vec4(0.0f,0.0f,0.0f,1.0f) &&
|
||||
material.diffuse==osg::Vec4(0.0f,0.0f,0.0f,1.0f))
|
||||
{
|
||||
material.ambient.set(0.3f,0.3f,0.3f,1.0f);
|
||||
material.diffuse.set(1.0f,1.0f,1.0f,1.0f);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(obj::Model::MaterialMap::iterator itr = model.materialMap.begin();
|
||||
itr != model.materialMap.end();
|
||||
++itr)
|
||||
|
||||
@@ -119,7 +119,7 @@ bool Model::readMTL(std::istream& fin)
|
||||
char line[LINE_SIZE];
|
||||
float r = 1.0f, g = 1.0f, b = 1.0f, a = 1.0f;
|
||||
|
||||
Material* material = &(materialMap[""]);
|
||||
Material* material = 0;// &(materialMap[""]);
|
||||
|
||||
while (fin)
|
||||
{
|
||||
@@ -131,139 +131,143 @@ bool Model::readMTL(std::istream& fin)
|
||||
}
|
||||
else if (strlen(line)>0)
|
||||
{
|
||||
if (strncmp(line,"Ka ",3)==0)
|
||||
{
|
||||
unsigned int fieldsRead = sscanf(line+3,"%f %f %f %f", &r, &g, &b, &a);
|
||||
|
||||
if (fieldsRead==1) material->ambient.set(r,0.0f,0.0f,1.0f);
|
||||
else if (fieldsRead==2) material->ambient.set(r,g,0.0f,1.0f);
|
||||
else if (fieldsRead==3) material->ambient.set(r,g,b,1.0f);
|
||||
else if (fieldsRead==4) material->ambient.set(r,g,b,a);
|
||||
}
|
||||
else if (strncmp(line,"Kd ",3)==0)
|
||||
{
|
||||
unsigned int fieldsRead = sscanf(line+3,"%f %f %f %f", &r, &g, &b, &a);
|
||||
|
||||
if (fieldsRead==1) material->diffuse.set(r,0.0f,0.0f,1.0f);
|
||||
else if (fieldsRead==2) material->diffuse.set(r,g,0.0f,1.0f);
|
||||
else if (fieldsRead==3) material->diffuse.set(r,g,b,1.0f);
|
||||
else if (fieldsRead==4) material->diffuse.set(r,g,b,a);
|
||||
}
|
||||
else if (strncmp(line,"Ks ",3)==0)
|
||||
{
|
||||
unsigned int fieldsRead = sscanf(line+3,"%f %f %f %f", &r, &g, &b, &a);
|
||||
|
||||
if (fieldsRead==1) material->specular.set(r,0.0f,0.0f,1.0f);
|
||||
else if (fieldsRead==2) material->specular.set(r,g,0.0f,1.0f);
|
||||
else if (fieldsRead==3) material->specular.set(r,g,b,1.0f);
|
||||
else if (fieldsRead==4) material->specular.set(r,g,b,a);
|
||||
}
|
||||
else if (strncmp(line,"Ke ",3)==0)
|
||||
{
|
||||
unsigned int fieldsRead = sscanf(line+3,"%f %f %f %f", &r, &g, &b, &a);
|
||||
|
||||
if (fieldsRead==1) material->emissive.set(r,0.0f,0.0f,1.0f);
|
||||
else if (fieldsRead==2) material->emissive.set(r,g,0.0f,1.0f);
|
||||
else if (fieldsRead==3) material->emissive.set(r,g,b,1.0f);
|
||||
else if (fieldsRead==4) material->emissive.set(r,g,b,a);
|
||||
}
|
||||
else if (strncmp(line,"Tf ",3)==0)
|
||||
{
|
||||
unsigned int fieldsRead = sscanf(line+3,"%f %f %f %f", &r, &g, &b, &a);
|
||||
|
||||
if (fieldsRead==1) material->Tf.set(r,0.0f,0.0f,1.0f);
|
||||
else if (fieldsRead==2) material->Tf.set(r,g,0.0f,1.0f);
|
||||
else if (fieldsRead==3) material->Tf.set(r,g,b,1.0f);
|
||||
else if (fieldsRead==4) material->Tf.set(r,g,b,a);
|
||||
}
|
||||
else if (strncmp(line,"newmtl ",7)==0)
|
||||
if (strncmp(line,"newmtl ",7)==0)
|
||||
{
|
||||
std::string materialName(line+7);
|
||||
if (material->name != materialName)
|
||||
material = & materialMap[materialName];
|
||||
material->name = materialName;
|
||||
}
|
||||
else if (material)
|
||||
{
|
||||
if (strncmp(line,"Ka ",3)==0)
|
||||
{
|
||||
material = & materialMap[materialName];
|
||||
material->name = materialName;
|
||||
unsigned int fieldsRead = sscanf(line+3,"%f %f %f %f", &r, &g, &b, &a);
|
||||
|
||||
if (fieldsRead==1) material->ambient.set(r,0.0f,0.0f,1.0f);
|
||||
else if (fieldsRead==2) material->ambient.set(r,g,0.0f,1.0f);
|
||||
else if (fieldsRead==3) material->ambient.set(r,g,b,1.0f);
|
||||
else if (fieldsRead==4) material->ambient.set(r,g,b,a);
|
||||
}
|
||||
}
|
||||
else if (strncmp(line,"sharpness ",10)==0)
|
||||
{
|
||||
float sharpness = 0.0f;
|
||||
unsigned int fieldsRead = sscanf(line+10,"%f", &sharpness);
|
||||
|
||||
if (fieldsRead==1) material->sharpness = sharpness;
|
||||
}
|
||||
else if (strncmp(line,"illum ",6)==0)
|
||||
{
|
||||
int illum = 0;
|
||||
unsigned int fieldsRead = sscanf(line+6,"%d", &illum);
|
||||
|
||||
if (fieldsRead==1) material->illum = illum;
|
||||
}
|
||||
else if (strncmp(line,"Ns ",3)==0)
|
||||
{
|
||||
int Ns = 0;
|
||||
unsigned int fieldsRead = sscanf(line+3,"%d", &Ns);
|
||||
|
||||
if (fieldsRead==1) material->Ns = Ns;
|
||||
}
|
||||
else if (strncmp(line,"Ni ",3)==0)
|
||||
{
|
||||
int Ni = 0;
|
||||
unsigned int fieldsRead = sscanf(line+3,"%d", &Ni);
|
||||
|
||||
if (fieldsRead==1) material->Ni = Ni;
|
||||
}
|
||||
else if (strncmp(line,"illum ",6)==0)
|
||||
{
|
||||
int illum = 0;
|
||||
unsigned int fieldsRead = sscanf(line+6,"%d", &illum);
|
||||
|
||||
if (fieldsRead==1) material->illum = illum;
|
||||
}
|
||||
else if (strncmp(line,"Tr ",3)==0)
|
||||
{
|
||||
float alpha=1.0f;
|
||||
unsigned int fieldsRead = sscanf(line+3,"%f", &alpha);
|
||||
|
||||
if (fieldsRead==1)
|
||||
else if (strncmp(line,"Kd ",3)==0)
|
||||
{
|
||||
material->ambient[3] = alpha;
|
||||
material->diffuse[3] = alpha;
|
||||
material->specular[3] = alpha;
|
||||
material->emissive[3] = alpha;
|
||||
}
|
||||
}
|
||||
else if (strncmp(line,"d ",2)==0)
|
||||
{
|
||||
float alpha=1.0f;
|
||||
unsigned int fieldsRead = sscanf(line+2,"%f", &alpha);
|
||||
unsigned int fieldsRead = sscanf(line+3,"%f %f %f %f", &r, &g, &b, &a);
|
||||
|
||||
if (fieldsRead==1)
|
||||
{
|
||||
material->ambient[3] = alpha;
|
||||
material->diffuse[3] = alpha;
|
||||
material->specular[3] = alpha;
|
||||
material->emissive[3] = alpha;
|
||||
if (fieldsRead==1) material->diffuse.set(r,0.0f,0.0f,1.0f);
|
||||
else if (fieldsRead==2) material->diffuse.set(r,g,0.0f,1.0f);
|
||||
else if (fieldsRead==3) material->diffuse.set(r,g,b,1.0f);
|
||||
else if (fieldsRead==4) material->diffuse.set(r,g,b,a);
|
||||
}
|
||||
else if (strncmp(line,"Ks ",3)==0)
|
||||
{
|
||||
unsigned int fieldsRead = sscanf(line+3,"%f %f %f %f", &r, &g, &b, &a);
|
||||
|
||||
if (fieldsRead==1) material->specular.set(r,0.0f,0.0f,1.0f);
|
||||
else if (fieldsRead==2) material->specular.set(r,g,0.0f,1.0f);
|
||||
else if (fieldsRead==3) material->specular.set(r,g,b,1.0f);
|
||||
else if (fieldsRead==4) material->specular.set(r,g,b,a);
|
||||
}
|
||||
else if (strncmp(line,"Ke ",3)==0)
|
||||
{
|
||||
unsigned int fieldsRead = sscanf(line+3,"%f %f %f %f", &r, &g, &b, &a);
|
||||
|
||||
if (fieldsRead==1) material->emissive.set(r,0.0f,0.0f,1.0f);
|
||||
else if (fieldsRead==2) material->emissive.set(r,g,0.0f,1.0f);
|
||||
else if (fieldsRead==3) material->emissive.set(r,g,b,1.0f);
|
||||
else if (fieldsRead==4) material->emissive.set(r,g,b,a);
|
||||
}
|
||||
else if (strncmp(line,"Tf ",3)==0)
|
||||
{
|
||||
unsigned int fieldsRead = sscanf(line+3,"%f %f %f %f", &r, &g, &b, &a);
|
||||
|
||||
if (fieldsRead==1) material->Tf.set(r,0.0f,0.0f,1.0f);
|
||||
else if (fieldsRead==2) material->Tf.set(r,g,0.0f,1.0f);
|
||||
else if (fieldsRead==3) material->Tf.set(r,g,b,1.0f);
|
||||
else if (fieldsRead==4) material->Tf.set(r,g,b,a);
|
||||
}
|
||||
else if (strncmp(line,"sharpness ",10)==0)
|
||||
{
|
||||
float sharpness = 0.0f;
|
||||
unsigned int fieldsRead = sscanf(line+10,"%f", &sharpness);
|
||||
|
||||
if (fieldsRead==1) material->sharpness = sharpness;
|
||||
}
|
||||
else if (strncmp(line,"illum ",6)==0)
|
||||
{
|
||||
int illum = 0;
|
||||
unsigned int fieldsRead = sscanf(line+6,"%d", &illum);
|
||||
|
||||
if (fieldsRead==1) material->illum = illum;
|
||||
}
|
||||
else if (strncmp(line,"Ns ",3)==0)
|
||||
{
|
||||
int Ns = 0;
|
||||
unsigned int fieldsRead = sscanf(line+3,"%d", &Ns);
|
||||
|
||||
if (fieldsRead==1) material->Ns = Ns;
|
||||
}
|
||||
else if (strncmp(line,"Ni ",3)==0)
|
||||
{
|
||||
int Ni = 0;
|
||||
unsigned int fieldsRead = sscanf(line+3,"%d", &Ni);
|
||||
|
||||
if (fieldsRead==1) material->Ni = Ni;
|
||||
}
|
||||
else if (strncmp(line,"illum ",6)==0)
|
||||
{
|
||||
int illum = 0;
|
||||
unsigned int fieldsRead = sscanf(line+6,"%d", &illum);
|
||||
|
||||
if (fieldsRead==1) material->illum = illum;
|
||||
}
|
||||
else if (strncmp(line,"Tr ",3)==0)
|
||||
{
|
||||
float alpha=1.0f;
|
||||
unsigned int fieldsRead = sscanf(line+3,"%f", &alpha);
|
||||
|
||||
if (fieldsRead==1)
|
||||
{
|
||||
material->ambient[3] = alpha;
|
||||
material->diffuse[3] = alpha;
|
||||
material->specular[3] = alpha;
|
||||
material->emissive[3] = alpha;
|
||||
}
|
||||
}
|
||||
else if (strncmp(line,"d ",2)==0)
|
||||
{
|
||||
float alpha=1.0f;
|
||||
unsigned int fieldsRead = sscanf(line+2,"%f", &alpha);
|
||||
|
||||
if (fieldsRead==1)
|
||||
{
|
||||
material->ambient[3] = alpha;
|
||||
material->diffuse[3] = alpha;
|
||||
material->specular[3] = alpha;
|
||||
material->emissive[3] = alpha;
|
||||
}
|
||||
}
|
||||
else if (strncmp(line,"map_Ka ",7)==0)
|
||||
{
|
||||
std::string filename(line+7);
|
||||
material->map_Ka = filename;
|
||||
}
|
||||
else if (strncmp(line,"map_Kd ",7)==0)
|
||||
{
|
||||
std::string filename(line+7);
|
||||
material->map_Kd = filename;
|
||||
}
|
||||
else if (strncmp(line,"map_Ks ",7)==0)
|
||||
{
|
||||
std::string filename(line+7);
|
||||
material->map_Ks = filename;
|
||||
}
|
||||
else if (strcmp(line,"refl")==0 || strncmp(line,"refl ",5)==0)
|
||||
{
|
||||
material->textureReflection = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
osg::notify(osg::NOTICE) <<"*** line not handled *** :"<<line<<std::endl;
|
||||
}
|
||||
}
|
||||
else if (strncmp(line,"map_Ka ",7)==0)
|
||||
{
|
||||
std::string filename(line+7);
|
||||
material->map_Ka = filename;
|
||||
}
|
||||
else if (strncmp(line,"map_Kd ",7)==0)
|
||||
{
|
||||
std::string filename(line+7);
|
||||
material->map_Kd = filename;
|
||||
}
|
||||
else if (strncmp(line,"map_Ks ",7)==0)
|
||||
{
|
||||
std::string filename(line+7);
|
||||
material->map_Ks = filename;
|
||||
}
|
||||
else if (strcmp(line,"refl")==0 || strncmp(line,"refl ",5)==0)
|
||||
{
|
||||
material->textureReflection = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user