Hi,

I'ld like to have the triangles in the code below drawn colored on both sides. 
As the normals are pointing towards the triangles one side gets painted black, 
even though osg::Material::FRONT_AND_BACK is specified.
Do you have an idea how I can achieve this?

Thank you!

Cheers,
Matthias

// Forum problem. Add < in the include lines.

#include osg/Geode>
#include osg/Geometry>
#include osg/Material>
#include osg/Vec3>
#include osgViewer/Viewer>

osg::Node* createScene()
{
    osg::Geode* geode = new osg::Geode();

    osg::ref_ptr<osg::Vec3Array> shared_normals = new osg::Vec3Array;
    shared_normals->push_back(osg::Vec3(0.0f,-1.0f,0.0f));

    {
        osg::Geometry* polyGeom = new osg::Geometry();
        
        osg::Vec3 myCoords[] =
        {
            // note in anticlockwise order.
            osg::Vec3(-1.12056, -2.15188e-09, -0.840418),
            osg::Vec3(-0.95165, -2.15188e-09, -0.840418),
            osg::Vec3(-1.11644, 9.18133e-09, -0.716827),

            // note in anticlockwise order.
            osg::Vec3(-0.840418, 9.18133e-09, -0.778623),
            osg::Vec3(-0.622074, 9.18133e-09, -0.613835),
            osg::Vec3(-1.067, 9.18133e-09, -0.609715),
        };
        
        int numCoords = sizeof(myCoords)/sizeof(osg::Vec3);
        
        osg::Vec3Array* vertices = new osg::Vec3Array(numCoords,myCoords);
       
        polyGeom->setVertexArray(vertices);
        
        polyGeom->setNormalArray(shared_normals.get());
        polyGeom->setNormalBinding(osg::Geometry::BIND_OVERALL);
        
        polyGeom->addPrimitiveSet(new 
osg::DrawArrays(osg::PrimitiveSet::TRIANGLES,0,6));
        
        osg::StateSet* stateSet = new osg::StateSet();

        osg::Material* material = new osg::Material;
                material->setColorMode(osg::Material::AMBIENT_AND_DIFFUSE);
                material->setAmbient(osg::Material::FRONT_AND_BACK, 
osg::Vec4(1.0, 0.0, 0.0, 1));
                material->setDiffuse(osg::Material::FRONT_AND_BACK, 
osg::Vec4(1.0, 0.0, 0.0, 1));
                        
                stateSet->setAttribute(material, 
osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);

                stateSet->setMode(GL_LIGHTING, 
osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
                stateSet->setMode(GL_CULL_FACE, 
osg::StateAttribute::OVERRIDE|osg::StateAttribute::OFF);

                polyGeom->setStateSet(stateSet);
              
        geode->addDrawable(polyGeom);
    }
    
    return geode;   
}

int main(int, char **)
{
    osg::Group* root = new osg::Group;
    root->addChild( createScene() );

    osgViewer::Viewer viewer;

    viewer.setSceneData( root );

    return viewer.run();
}

------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=51182#51182





_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to