Changeset 11251

Show
Ignore:
Timestamp:
03/18/10 20:02:12 (5 years ago)
Author:
mplatings
Message:

Workaround for models with inverted transparency

Location:
OpenSceneGraph/trunk/src/osgPlugins/fbx
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/src/osgPlugins/fbx/ReaderWriterFBX.cpp

    r11153 r11251  
    271271            if (res.success()) 
    272272            { 
     273                fbxMaterialToOsgStateSet.checkInvertTransparency(); 
     274 
    273275                resolveBindMatrices(*res.getNode(), boneBindMatrices, nodeMap); 
    274276 
  • OpenSceneGraph/trunk/src/osgPlugins/fbx/fbxMaterialToOsgStateSet.cpp

    r11108 r11251  
    8181        } 
    8282    } 
    83     return std::make_pair(pOsgMat.release(), pOsgTex.release()); 
     83    StateSetContent result(pOsgMat.release(), pOsgTex.release()); 
     84    _kFbxMaterialMap.insert(KFbxMaterialMap::value_type(pFbxMat, result)); 
     85    return result; 
    8486} 
    8587 
     
    110112    } 
    111113} 
     114 
     115void FbxMaterialToOsgStateSet::checkInvertTransparency() 
     116{ 
     117    int zeroAlpha = 0, oneAlpha = 0; 
     118    for (KFbxMaterialMap::const_iterator it = _kFbxMaterialMap.begin(); it != _kFbxMaterialMap.end(); ++it) 
     119    { 
     120        const osg::Material* pMaterial = it->second.first; 
     121        float alpha = pMaterial->getDiffuse(osg::Material::FRONT).a(); 
     122        if (alpha > 0.999f) 
     123        { 
     124            ++oneAlpha; 
     125        } 
     126        else if (alpha < 0.001f) 
     127        { 
     128            ++zeroAlpha; 
     129        } 
     130    } 
     131 
     132    if (zeroAlpha > oneAlpha) 
     133    { 
     134        //Transparency values seem to be back to front so invert them. 
     135 
     136        for (KFbxMaterialMap::const_iterator it = _kFbxMaterialMap.begin(); it != _kFbxMaterialMap.end(); ++it) 
     137        { 
     138            osg::Material* pMaterial = it->second.first; 
     139            osg::Vec4 diffuse = pMaterial->getDiffuse(osg::Material::FRONT); 
     140            diffuse.a() = 1.0f - diffuse.a(); 
     141            pMaterial->setDiffuse(osg::Material::FRONT_AND_BACK, diffuse); 
     142        } 
     143    } 
     144} 
  • OpenSceneGraph/trunk/src/osgPlugins/fbx/fbxMaterialToOsgStateSet.h

    r11107 r11251  
    3434        _options(options), 
    3535        _dir(dir) {} 
     36 
     37    void checkInvertTransparency(); 
    3638private: 
    3739    //Convert a texture fbx to an osg texture.