Hi Robert,

no unfortunately I'm not using the osgUtil::Optimizer. Following there is the 
complete code.


Code:

#include < osgViewer/Viewer >
#include < osgGA/TrackballManipulator >
#include < osgDB/ReadFile >
#include < osg/Texture2D >
#include < osg/Program >

#include < iostream >
#include < string.h >

const std::string vert = "varying vec4 texCoords;\nvoid main()\n{\ngl_Position 
= ftransform();\ntexCoords = gl_MultiTexCoord0;\n}";
const std::string frag = "varying vec4 texCoords;\nuniform sampler2D 
cDiffTex;\nvoid main(void)\n{\ngl_FragColor = texture2D(cDiffTex, 
texCoords.st);\n}";

int main(int argc, char **argv)
{
osgViewer::Viewer view;
osg::ref_ptr<osg::Group> root(new osg::Group);
osg::ref_ptr<osg::Node> geom1 = new osg::Node;

geom1 = osgDB::readNodeFile("clock.osgt");
///////////////////////////////
osg::StateSet* stateset = geom1->getOrCreateStateSet();

osg::ref_ptr<osg::Program> program = new osg::Program;
osg::ref_ptr<osg::Shader> vertexSource = new osg::Shader(osg::Shader::VERTEX);
osg::ref_ptr<osg::Shader> fragmentSource = new 
osg::Shader(osg::Shader::FRAGMENT);

vertexSource->setShaderSource(vert);
fragmentSource->setShaderSource(frag);

program->addShader(vertexSource);
program->addShader(fragmentSource);

stateset->setAttributeAndModes(program.get());
stateset->setDataVariance(osg::Object::DYNAMIC);

////
osg::ref_ptr<osg::Image> diffuseImage = osgDB::readImageFile(".\\img0.png");
std::cout << " File " << diffuseImage->getFileName() << " " << std::endl; // it 
prints img0
diffuseImage->setDataVariance(osg::Object::DYNAMIC);

osg::ref_ptr<osg::Texture2D> diffuseTex = new osg::Texture2D;
diffuseTex->setDataVariance(osg::Object::DYNAMIC);
diffuseTex->setImage(diffuseImage.get());
diffuseTex->setUnRefImageDataAfterApply(false);

stateset->setTextureAttributeAndModes(0, diffuseTex.get(), 
osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE);

osg::ref_ptr<osg::Uniform> cDiffTex = new 
osg::Uniform(osg::Uniform::SAMPLER_2D, "cDiffTex");
cDiffTex->set(0);
stateset->addUniform(cDiffTex.get());

diffuseImage = osgDB::readImageFile(".\\img1.jpg");
diffuseImage->dirty();
std::cout << " File " << diffuseImage->getFileName() << " " << std::endl;  // 
it prints img1
std::cout << " Tex " << diffuseTex->getImage()->getFileName() << " " << 
std::endl; // it prints img0
// NEED TO TELL TEXTURE TO SET THE IMAGE
//diffuseTex->setImage(diffuseImage);
//std::cout << " Tex " << diffuseTex->getImage()->getFileName() << " " << 
std::endl;
//////////////////////////////

root->addChild(geom1.get());

view.setSceneData(root.get());

view.setCameraManipulator(new osgGA::TrackballManipulator);

view.realize();
while (!view.done())
{
std::cout << " File " << diffuseImage->getFileName() << " " << std::endl; // it 
prints img1
std::cout << " Tex " << diffuseTex->getImage()->getFileName() << " " << 
std::endl;// it prints img0
//diffuseTex->setUnRefImageDataAfterApply(false);

view.frame();
}

return 0;

}




I tried to add diffuseTex->setUnRefImageDataAfterApply(false) but with no 
success.

Cheers,
Fabrizio

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





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

Reply via email to