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:
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user