From Doug McCorkle, "Attached is patch that corrects/improves the following issues with the OBJ loader:

1. Added options to control wether the osgUtil::Tessellator or osgUtil::TriStripVisitor are run. By default they still run just as before.
2. Added support for the Emissive material. The data was being read from the mtl file but was never being applied to the model.
3. This is the main bug addressed, when a model is read in with an alpha value specified like:

newmtl Material__8
       Ns 24
       d 0.33
       illum 2
       Kd 0.204 0.204 0.204
       Ks 0 0 0
       Ka 0.153 0.153 0.153

where the alpha value is d. The loader would then overwrite the alpha value when reading the diffuse, specular, and ambient colors. I have changed all the material color readers to only set the values they read and to use the default colors specified in the constructor of the obj class. With these changes, the obj reader now handles opacity correctly if the alpha value is specified before the material colo"
This commit is contained in:
Robert Osfield
2008-07-12 12:00:58 +00:00
parent ccb50019e4
commit 4ca61c38f0
2 changed files with 184 additions and 42 deletions

View File

@@ -155,46 +155,136 @@ bool Model::readMTL(std::istream& fin)
{
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);
if (fieldsRead==1)
{
material->ambient[ 0 ] = r;
}
else if (fieldsRead==2)
{
material->ambient[ 0 ] = r;
material->ambient[ 1 ] = g;
}
else if (fieldsRead==3)
{
material->ambient[ 0 ] = r;
material->ambient[ 1 ] = g;
material->ambient[ 2 ] = b;
}
else if (fieldsRead==4)
{
material->ambient[ 0 ] = r;
material->ambient[ 1 ] = g;
material->ambient[ 2 ] = b;
material->ambient[ 3 ] = 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);
if (fieldsRead==1)
{
material->diffuse[ 0 ] = r;
}
else if (fieldsRead==2)
{
material->diffuse[ 0 ] = r;
material->diffuse[ 1 ] = g;
}
else if (fieldsRead==3)
{
material->diffuse[ 0 ] = r;
material->diffuse[ 1 ] = g;
material->diffuse[ 2 ] = b;
}
else if (fieldsRead==4)
{
material->diffuse[ 0 ] = r;
material->diffuse[ 1 ] = g;
material->diffuse[ 2 ] = b;
material->diffuse[ 3 ] = 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);
if (fieldsRead==1)
{
material->specular[ 0 ] = r;
}
else if (fieldsRead==2)
{
material->specular[ 0 ] = r;
material->specular[ 1 ] = g;
}
else if (fieldsRead==3)
{
material->specular[ 0 ] = r;
material->specular[ 1 ] = g;
material->specular[ 2 ] = b;
}
else if (fieldsRead==4)
{
material->specular[ 0 ] = r;
material->specular[ 1 ] = g;
material->specular[ 2 ] = b;
material->specular[ 3 ] = 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);
if (fieldsRead==1)
{
material->emissive[ 0 ] = r;
}
else if (fieldsRead==2)
{
material->emissive[ 0 ] = r;
material->emissive[ 1 ] = g;
}
else if (fieldsRead==3)
{
material->emissive[ 0 ] = r;
material->emissive[ 1 ] = g;
material->emissive[ 2 ] = b;
}
else if (fieldsRead==4)
{
material->emissive[ 0 ] = r;
material->emissive[ 1 ] = g;
material->emissive[ 2 ] = b;
material->emissive[ 3 ] = 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);
if (fieldsRead==1)
{
material->Tf[ 0 ] = r;
}
else if (fieldsRead==2)
{
material->Tf[ 0 ] = r;
material->Tf[ 1 ] = g;
}
else if (fieldsRead==3)
{
material->Tf[ 0 ] = r;
material->Tf[ 1 ] = g;
material->Tf[ 2 ] = b;
}
else if (fieldsRead==4)
{
material->Tf[ 0 ] = r;
material->Tf[ 1 ] = g;
material->Tf[ 2 ] = b;
material->Tf[ 3 ] = a;
}
}
else if (strncmp(line,"sharpness ",10)==0)
{