Add "hack" fix for black materials being exported from Maya.

This commit is contained in:
Robert Osfield
2006-07-06 11:30:20 +00:00
parent 8563e692a9
commit fd7ee0cf21
2 changed files with 176 additions and 128 deletions

View File

@@ -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)

View File

@@ -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
{