From Bob Kuehne, "* add easy multiple texture targets support for obj by refactoring texture
load into it's own method. * use new method from step 1 to load 'map_opacity' textures from .mtl files"
This commit is contained in:
parent
db2cf75b23
commit
61cb0833b9
@ -159,10 +159,56 @@ inline osg::Vec3 ReaderWriterOBJ::transformNormal(const osg::Vec3& vec, const bo
|
|||||||
// register with Registry to instantiate the above reader/writer.
|
// register with Registry to instantiate the above reader/writer.
|
||||||
REGISTER_OSGPLUGIN(obj, ReaderWriterOBJ)
|
REGISTER_OSGPLUGIN(obj, ReaderWriterOBJ)
|
||||||
|
|
||||||
|
void load_material_texture( obj::Model &model,
|
||||||
|
obj::Material &material,
|
||||||
|
osg::StateSet *stateset,
|
||||||
|
const std::string & filename,
|
||||||
|
const unsigned int texture_unit )
|
||||||
|
{
|
||||||
|
if (!filename.empty())
|
||||||
|
{
|
||||||
|
osg::ref_ptr< osg::Image > image;
|
||||||
|
if ( !model.getDatabasePath().empty() )
|
||||||
|
{
|
||||||
|
// first try with databasr path of parent.
|
||||||
|
image = osgDB::readImageFile(model.getDatabasePath()+'/'+filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !image.valid() )
|
||||||
|
{
|
||||||
|
// if not already set then try the filename as is.
|
||||||
|
image = osgDB::readImageFile(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( image.valid() )
|
||||||
|
{
|
||||||
|
osg::Texture2D* texture = new osg::Texture2D( image.get() );
|
||||||
|
osg::Texture::WrapMode textureWrapMode = osg::Texture::REPEAT;
|
||||||
|
texture->setWrap(osg::Texture2D::WRAP_R, textureWrapMode);
|
||||||
|
texture->setWrap(osg::Texture2D::WRAP_S, textureWrapMode);
|
||||||
|
texture->setWrap(osg::Texture2D::WRAP_T, textureWrapMode);
|
||||||
|
stateset->setTextureAttributeAndModes( texture_unit, texture,osg::StateAttribute::ON );
|
||||||
|
|
||||||
|
if ( material.textureReflection )
|
||||||
|
{
|
||||||
|
osg::TexGen* texgen = new osg::TexGen;
|
||||||
|
texgen->setMode(osg::TexGen::SPHERE_MAP);
|
||||||
|
stateset->setTextureAttributeAndModes( texture_unit,texgen,osg::StateAttribute::ON );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( image->isImageTranslucent())
|
||||||
|
{
|
||||||
|
osg::notify(osg::INFO)<<"Found transparent image"<<std::endl;
|
||||||
|
stateset->setMode(GL_BLEND, osg::StateAttribute::ON);
|
||||||
|
stateset->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void ReaderWriterOBJ::buildMaterialToStateSetMap(obj::Model& model, MaterialToStateSetMap& materialToStateSetMap) const
|
void ReaderWriterOBJ::buildMaterialToStateSetMap(obj::Model& model, MaterialToStateSetMap& materialToStateSetMap) const
|
||||||
{
|
{
|
||||||
osg::Texture::WrapMode textureWrapMode = osg::Texture::REPEAT;
|
|
||||||
|
|
||||||
if (_fixBlackMaterials)
|
if (_fixBlackMaterials)
|
||||||
{
|
{
|
||||||
// hack to fix Maya exported models that contian all black materials.
|
// hack to fix Maya exported models that contian all black materials.
|
||||||
@ -208,7 +254,7 @@ void ReaderWriterOBJ::buildMaterialToStateSetMap(obj::Model& model, MaterialToSt
|
|||||||
{
|
{
|
||||||
obj::Material& material = itr->second;
|
obj::Material& material = itr->second;
|
||||||
|
|
||||||
osg::StateSet* stateset = new osg::StateSet;
|
osg::ref_ptr< osg::StateSet > stateset = new osg::StateSet;
|
||||||
|
|
||||||
bool isTransparent = false;
|
bool isTransparent = false;
|
||||||
|
|
||||||
@ -238,51 +284,15 @@ void ReaderWriterOBJ::buildMaterialToStateSetMap(obj::Model& model, MaterialToSt
|
|||||||
}
|
}
|
||||||
|
|
||||||
// handle textures
|
// handle textures
|
||||||
if (!material.map_Kd.empty())
|
enum TextureUnit
|
||||||
{
|
{
|
||||||
std::string filename = material.map_Kd;
|
TEXTURE_UNIT_KD = 0,
|
||||||
osg::Image* image = 0;
|
TEXTURE_UNIT_OPACITY
|
||||||
if (!model.getDatabasePath().empty())
|
};
|
||||||
{
|
load_material_texture( model, material, stateset.get(), material.map_Kd, TEXTURE_UNIT_KD );
|
||||||
// first try with databasr path of parent.
|
load_material_texture( model, material, stateset.get(), material.map_opacity, TEXTURE_UNIT_OPACITY );
|
||||||
image = osgDB::readImageFile(model.getDatabasePath()+'/'+filename);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!image)
|
materialToStateSetMap[material.name] = stateset.get();
|
||||||
{
|
|
||||||
// if not already set then try the filename as is.
|
|
||||||
image = osgDB::readImageFile(filename);
|
|
||||||
}
|
|
||||||
if (image)
|
|
||||||
{
|
|
||||||
osg::Texture2D* texture = new osg::Texture2D(image);
|
|
||||||
texture->setWrap(osg::Texture2D::WRAP_R, textureWrapMode);
|
|
||||||
texture->setWrap(osg::Texture2D::WRAP_S, textureWrapMode);
|
|
||||||
texture->setWrap(osg::Texture2D::WRAP_T, textureWrapMode);
|
|
||||||
stateset->setTextureAttributeAndModes(0,texture,osg::StateAttribute::ON);
|
|
||||||
|
|
||||||
if (material.textureReflection)
|
|
||||||
{
|
|
||||||
osg::TexGen* texgen = new osg::TexGen;
|
|
||||||
texgen->setMode(osg::TexGen::SPHERE_MAP);
|
|
||||||
stateset->setTextureAttributeAndModes(0,texgen,osg::StateAttribute::ON);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isTransparent && image->isImageTranslucent())
|
|
||||||
{
|
|
||||||
osg::notify(osg::INFO)<<"Found transparent image"<<std::endl;
|
|
||||||
isTransparent = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isTransparent)
|
|
||||||
{
|
|
||||||
stateset->setMode(GL_BLEND, osg::StateAttribute::ON);
|
|
||||||
stateset->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
|
|
||||||
}
|
|
||||||
|
|
||||||
materialToStateSetMap[material.name] = stateset;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -631,7 +641,7 @@ osgDB::ReaderWriter::ReadResult ReaderWriterOBJ::readNode(const std::string& fil
|
|||||||
model.setDatabasePath(osgDB::getFilePath(fileName.c_str()));
|
model.setDatabasePath(osgDB::getFilePath(fileName.c_str()));
|
||||||
model.readOBJ(fin, local_opt.get());
|
model.readOBJ(fin, local_opt.get());
|
||||||
|
|
||||||
// code for checking the nonRotation
|
// code for checking the noRotation
|
||||||
bool rotate = true;
|
bool rotate = true;
|
||||||
if ((options!=NULL) && (options->getOptionString() == "noRotation"))
|
if ((options!=NULL) && (options->getOptionString() == "noRotation"))
|
||||||
{
|
{
|
||||||
|
@ -263,6 +263,10 @@ bool Model::readMTL(std::istream& fin)
|
|||||||
{
|
{
|
||||||
material->map_Ks = lastComponent(line+7);
|
material->map_Ks = lastComponent(line+7);
|
||||||
}
|
}
|
||||||
|
else if (strncmp(line,"map_opacity ",7)==0)
|
||||||
|
{
|
||||||
|
material->map_opacity = lastComponent(line+7);
|
||||||
|
}
|
||||||
else if (strcmp(line,"refl")==0 || strncmp(line,"refl ",5)==0)
|
else if (strcmp(line,"refl")==0 || strncmp(line,"refl ",5)==0)
|
||||||
{
|
{
|
||||||
material->textureReflection = true;
|
material->textureReflection = true;
|
||||||
|
@ -67,6 +67,7 @@ public:
|
|||||||
std::string map_Ka;
|
std::string map_Ka;
|
||||||
std::string map_Kd;
|
std::string map_Kd;
|
||||||
std::string map_Ks;
|
std::string map_Ks;
|
||||||
|
std::string map_opacity;
|
||||||
bool textureReflection;
|
bool textureReflection;
|
||||||
float alpha;
|
float alpha;
|
||||||
float uScale;
|
float uScale;
|
||||||
|
Loading…
Reference in New Issue
Block a user