Thanks Neil, changes now merged and submitted to svn/trunk and OSG-2.8 branch.
On Tue, Mar 10, 2009 at 8:57 PM, <[email protected]> wrote: > Hi Robert, > > Sorry about that. I didn't read the submissions protocol first....you can > take a horse to water and all that ;-( > > Anyway, please find attached the modified file. I tested the change in OSG1.2 > and it corrected the issue I was having, but as per the submissions protocol, > I've downloaded the latest release version - OSG2.8 - of that file and made > the same modification (but not tested in 2.8) , and it is this that I've > attached. > > Hope this helps. > > Kind regards > > Neil. > > > > > > > ---- Robert Osfield <[email protected]> wrote: >> Hi Neil, >> >> Could you send me the whole modified file as I'm afraid the mail >> client just blitz's code copy and pasted into emails making it >> impossible to do a reliable merge. >> >> Thanks, >> Robert. >> >> On Mon, Mar 2, 2009 at 12:38 PM, <[email protected]> wrote: >> > Hi Robert, >> > >> > I've spent the past four days playing with PNG files on 3DS objects, and I >> > think I may have come across a small issue with the 3DS loader. >> > >> > At the company where I work we model literally thousands of 3DS models for >> > all types of objects. Most don't have transparent textures applied to >> > them, but a few do. The issue is that a texture may have an alpha channel >> > defined, yet its 3DS material definition is not marked as being an alpha >> > source, or transparent. This can happen for any number of modelling >> > reasons (so I'm told) but the net effect is that when a 3DS object is >> > loaded with such a material applied, the stateset creation for the 3DS >> > geometry omits to add the GL_BLEND attribute as neither of the conditions >> > that it currently tests for are satisfied under this scenario. >> > >> > However, one thing that is apparently an indication of transparency/alpha >> > information that we do make use of when modelling, but that the 3DS reader >> > omits to test, is that we assign to the transparent texture to the >> > opacity_map of the 3DS material structure. >> > >> > Now, having discussed with our modellers the theory behind the opacity >> > map, it seems that it is safe to say that if an opacity map is specified, >> > then the reader should really apply the GL_BLEND attribute as it is an >> > indication of some form of blending being required between materials. >> > >> > With this in mind, I have made a minor change to the function >> > createStateSet below, from the ReaderWriter3DS.cpp file, that checks for >> > an opacity map having been specified, and in such a scenario the GL_BLEND >> > attribute is applied to the geometry. This fixed our issue, and thought it >> > might be helpful to others. >> > >> > Kind regards >> > >> > Neil Hughes. >> > >> > osg::StateSet* >> > ReaderWriter3DS::ReaderObject::createStateSet(Lib3dsMaterial *mat, const >> > osgDB::ReaderWriter::Options* options) >> > { >> > if (mat==NULL) return NULL; >> > >> > osg::StateSet* stateset = new osg::StateSet; >> > >> > osg::Material* material = new osg::Material; >> > >> > float transparency = mat->transparency; >> > float alpha = 1.0f-transparency; >> > >> > osg::Vec4 >> > ambient(mat->ambient[0],mat->ambient[1],mat->ambient[2],alpha); >> > osg::Vec4 >> > diffuse(mat->diffuse[0],mat->diffuse[1],mat->diffuse[2],alpha); >> > osg::Vec4 >> > specular(mat->specular[0],mat->specular[1],mat->specular[2],alpha); >> > specular *= mat->shin_strength; >> > >> > float shininess = mat->shininess; >> > material->setName(mat->name); >> > material->setAmbient(osg::Material::FRONT_AND_BACK,ambient); >> > material->setDiffuse(osg::Material::FRONT_AND_BACK,diffuse); >> > material->setSpecular(osg::Material::FRONT_AND_BACK,specular); >> > material->setShininess(osg::Material::FRONT_AND_BACK,shininess*128.0f); >> > >> > stateset->setAttribute(material); >> > >> > bool textureTransparancy=false; >> > osg::Texture2D* texture1_map = >> > createTexture(&(mat->texture1_map),"texture1_map",textureTransparancy, >> > options); >> > if (texture1_map) >> > { >> > >> > stateset->setTextureAttributeAndModes(0,texture1_map,osg::StateAttribute::ON); >> > >> > if (!textureTransparancy) >> > { >> > // from an email from Eric Hamil, September 30, 2003. >> > // According to the 3DS spec, and other >> > // software (like Max, Lightwave, and Deep Exploration) a 3DS >> > material that has >> > // a non-white diffuse base color and a 100% opaque bitmap >> > texture, will show the >> > // texture with no influence from the base color. >> > >> > // so we'll override material back to white. >> > // and no longer require the decal hack below... >> > #if 0 >> > // Eric orignal fallback >> > osg::Vec4 white(1.0f,1.0f,1.0f,alpha); >> > material->setAmbient(osg::Material::FRONT_AND_BACK,white); >> > material->setDiffuse(osg::Material::FRONT_AND_BACK,white); >> > material->setSpecular(osg::Material::FRONT_AND_BACK,white); >> > #else >> > // try alternative to avoid staturating with white >> > // setting white as per OpenGL defaults. >> > >> > material->setAmbient(osg::Material::FRONT_AND_BACK,osg::Vec4(0.2f,0.2f,0.2f,alpha)); >> > >> > material->setDiffuse(osg::Material::FRONT_AND_BACK,osg::Vec4(0.8f,0.8f,0.8f,alpha)); >> > >> > material->setSpecular(osg::Material::FRONT_AND_BACK,osg::Vec4(0.0f,0.0f,0.0f,alpha)); >> > #endif >> > } >> > >> > // no longer required... >> > // bool decal = false; >> > // >> > // // not sure exactly how to interpret what is best for .3ds >> > // // but the default text env MODULATE doesn't work well, and >> > // // DECAL seems to work better. >> > // osg::TexEnv* texenv = new osg::TexEnv; >> > // if (decal) >> > // { >> > // texenv->setMode(osg::TexEnv::DECAL); >> > // } >> > // else >> > // { >> > // texenv->setMode(osg::TexEnv::MODULATE); >> > // } >> > // stateset->setTextureAttribute(0,texenv); >> > } >> > >> > //if (transparency>0.0f || textureTransparancy) >> > if (transparency>0.0f || textureTransparancy || >> > mat->opacity_map.flags!=0) >> > { >> > stateset->setMode(GL_BLEND,osg::StateAttribute::ON); >> > stateset->setRenderingHint(osg::StateSet::TRANSPARENT_BIN); >> > } >> > >> > /* >> > osg::ref_ptr<osg::Texture> texture1_mask = >> > createTexture(&(mat->texture1_mask),"texture1_mask",textureTransparancy); >> > osg::ref_ptr<osg::Texture> texture2_map = >> > createTexture(&(mat->texture2_map),"texture2_map",textureTransparancy); >> > osg::ref_ptr<osg::Texture> texture2_mask = >> > createTexture(&(mat->texture2_mask),"texture2_mask",textureTransparancy); >> > osg::ref_ptr<osg::Texture> opacity_map = >> > createTexture(&(mat->opacity_map),"opacity_map",textureTransparancy); >> > osg::ref_ptr<osg::Texture> opacity_mask = >> > createTexture(&(mat->opacity_mask),"opacity_mask",textureTransparancy); >> > osg::ref_ptr<osg::Texture> bump_map = >> > createTexture(&(mat->bump_map),"bump_map",textureTransparancy); >> > osg::ref_ptr<osg::Texture> bump_mask = >> > createTexture(&(mat->bump_mask),"bump_mask",textureTransparancy); >> > osg::ref_ptr<osg::Texture> specular_map = >> > createTexture(&(mat->specular_map),"specular_map",textureTransparancy); >> > osg::ref_ptr<osg::Texture> specular_mask = >> > createTexture(&(mat->specular_mask),"specular_mask",textureTransparancy); >> > osg::ref_ptr<osg::Texture> shininess_map = >> > createTexture(&(mat->shininess_map),"shininess_map",textureTransparancy); >> > osg::ref_ptr<osg::Texture> shininess_mask = >> > createTexture(&(mat->shininess_mask),"shininess_mask",textureTransparancy); >> > osg::ref_ptr<osg::Texture> self_illum_map = >> > createTexture(&(mat->self_illum_map),"self_illum_map",textureTransparancy); >> > osg::ref_ptr<osg::Texture> self_illum_mask = >> > createTexture(&(mat->self_illum_mask),"self_illum_mask",textureTransparancy); >> > osg::ref_ptr<osg::Texture> reflection_map = >> > createTexture(&(mat->reflection_map),"reflection_map",textureTransparancy); >> > osg::ref_ptr<osg::Texture> reflection_mask = >> > createTexture(&(mat->reflection_mask),"reflection_mask",textureTransparancy); >> > */ >> > return stateset; >> > } >> > >> > >> > >> > >> > >> > >> > >> > >> > >> > >> > _______________________________________________ >> > osg-submissions mailing list >> > [email protected] >> > http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org >> > >> _______________________________________________ >> osg-submissions mailing list >> [email protected] >> http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org > _______________________________________________ osg-submissions mailing list [email protected] http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org
