Hi,

I would like to render a texture onto an .osg model that I have read in.  My 
code works for a primitive sphere but not the model, instead of the texture the 
model colour is changed to a darker grey.  Could anyone tell me what I am doing 
wrong ?

Basically i load the model which is ok I then create a geode pointer which 
points to the model geode and then i set the stateset of the geode to that 
containing the texture information.

I have read something about setting texture coordinates ? i don't do anything 
like this could this be my problem.

Code below

osg::Group *Root;
osg::Geode *mySphereGeode;
osg::ref_ptr<osg::Node> tModel;
osg::Geode* modelGeode;


void createSphere()
{
        const double sphereRadius = 0.5;
        osg::Sphere* mySphere = new osg::Sphere(osg::Vec3d(0,0,0),sphereRadius);
        osg::ShapeDrawable* mySphereDrawable = new osg::ShapeDrawable(mySphere);
        mySphereGeode = new osg::Geode();
        mySphereGeode->addDrawable(mySphereDrawable);
        mySphereGeode->setName("mySphere");
        osg::PositionAttitudeTransform * mySpherePAT = new 
osg::PositionAttitudeTransform(); 
        mySpherePAT->addChild(mySphereGeode);
        Root->addChild(mySpherePAT);
}

void setTexture(osg::Geode *myGeode)
{
        osg::Texture2D* texture = new osg::Texture2D;
        
        texture->setDataVariance(osg::Object::DYNAMIC); 
        texture->setFilter(osg::Texture::MIN_FILTER, 
osg::Texture::LINEAR_MIPMAP_LINEAR);
    texture->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);
    texture->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP);
    texture->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP);
        
        osg::Image* img = osgDB::readImageFile("drillText.tga");
        if (!img)
        {
                //std::cout << " couldn't find texture, quiting." << std::endl;
                //return -1;
        }

        texture->setImage(img);

        osg::StateSet* stateOne = new osg::StateSet();

        // Assign texture unit 0 of our new StateSet to the texture 
        //  we just created and enable the texture.
        
stateOne->setTextureAttributeAndModes(0,texture,osg::StateAttribute::ON);

        //myGeode->setStateSet(stateOne);
        myGeode->setStateSet(stateOne);

}

void loadModel(char* name)
{
        osg::ref_ptr<osg::Node> tModel = osgDB::readNodeFile(name);
        osg::PositionAttitudeTransform* modelPAT = new 
osg::PositionAttitudeTransform();
        tModel->setName(name);

        if(!tModel)
        { 
                //throw std::string("Error! Could not load node file.");
                //return 0;
                
        }
                
        tModel->setDataVariance( osg::Object::STATIC );

        
        modelPAT->setPosition(osg::Vec3d(0, 0, 0));
        modelPAT->addChild(tModel.get());

        Root->addChild(modelPAT);

        GeodeFinder myGeodeFinda;
        Root->accept(myGeodeFinda);
        modelGeode = myGeodeFinda.getGeode(name);


                
}


void main(void)
{
        Root = new osg::Group();

        //createSphere();
        //setTexture(mySphereGeode);

        loadModel("cyl60x10.osg");
        setTexture(modelGeode);


        osgViewer::Viewer viewer;
        viewer.setUpViewInWindow( 50, 50, 768, 768 );
        viewer.setSceneData(Root);

        viewer.run();

}

Any pointers would be greatly appreciated

Thank you!

Cheers,
Craig

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





_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to