From 6deedbf08c188b7a74ffef925da10f84afeac44c Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 1 Oct 2003 21:59:55 +0000 Subject: [PATCH] Added a check against opaque textures, when detected turn the material white as per specs for 3ds. --- src/osgPlugins/lib3ds/ReaderWriter3DS.cpp | 52 ++++++++++++++++------- 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/src/osgPlugins/lib3ds/ReaderWriter3DS.cpp b/src/osgPlugins/lib3ds/ReaderWriter3DS.cpp index 45982da9c..84c9ca610 100644 --- a/src/osgPlugins/lib3ds/ReaderWriter3DS.cpp +++ b/src/osgPlugins/lib3ds/ReaderWriter3DS.cpp @@ -498,6 +498,7 @@ osg::Drawable* ReaderWriter3DS::createDrawable(Lib3dsMesh *m,FaceList& faceLis } // create vertices. + osg::Vec3Array* osg_coords = new osg::Vec3Array(noVertex); geom->setVertexArray(osg_coords); @@ -586,7 +587,12 @@ osg::Drawable* ReaderWriter3DS::createDrawable(Lib3dsMesh *m,FaceList& faceLis geom->setNormalBinding(osg::Geometry::BIND_PER_PRIMITIVE); } + osg::UByte4Array* osg_colors = new osg::UByte4Array(1); + (*osg_colors)[0].set(255,255,255,255); + geom->setColorArray(osg_colors); + geom->setColorBinding(osg::Geometry::BIND_OVERALL); + // create primitives int numIndices = faceList.size()*3; DrawElementsUShort* elements = new osg::DrawElementsUShort(osg::PrimitiveSet::TRIANGLES,numIndices); @@ -687,28 +693,44 @@ osg::StateSet* ReaderWriter3DS::createStateSet(Lib3dsMaterial *mat) stateset->setAttribute(material); - bool decal = false; - //bool decal = true; bool textureTransparancy=false; osg::Texture2D* texture1_map = createTexture(&(mat->texture1_map),"texture1_map",textureTransparancy); if (texture1_map) { stateset->setTextureAttributeAndModes(0,texture1_map,osg::StateAttribute::ON); - // 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); + 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... + 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 - { - texenv->setMode(osg::TexEnv::MODULATE); - } - - stateset->setTextureAttribute(0,texenv); + +// 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)