Me again,
I've attached a minimal example which illustrates the problem.
It seems the combination
osgUtil::Optimizer::SHARE_DUPLICATE_STATE |
osgUtil::Optimizer::STATIC_OBJECT_DETECTION
causes the both geometries to be rendered as if the define was not set.
If the optimizer is not run the geometries are rendered as expected.
Cheers
Sebastian
Hi,
I've got some code, where I set up a define inside for an
osg::Geometry via
geometry.getOrCreateStateSet()->setDefine("MY_DEFINE")
The geometry is a sibling to another geometry not setting the define.
It works well if I don't run an osg::Optimizer, but running it
effectively removes the define.
Since I don't have the source code at hand, I cannot inspect this
issue right now.
The optimizer is set up to use the SHARE_DUPLICATE_STATE, so I suspect
the problem to be inside the logic which determines if two statesets
are equal.
I'm using OSG 3.3.9 on Windows 7 64bit
cheers
Sebastian
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
#include "osgViewer/Viewer"
#include <osg/PositionAttitudeTransform>
#include <osgDB/ReadFile>
#include <osgUtil/Optimizer>
std::string vert_source =
"void main()\n \
{\n\
gl_Position = ftransform();\n\
}\n\
";
std::string frag_source =
"void main()\n \
{\n\
#pragma import_defines ( TEST_DEFINE )\n\
#ifdef TEST_DEFINE\n\
gl_FragColor = vec4(1,0,0,1);\n\
#else\n\
gl_FragColor = vec4(0,1,0,1);\n\
#endif\n\
}\n\
";
void applyShader(const std::string& vert_source, const std::string&
frag_source, osg::StateSet* ss)
{
osg::Program* program = new osg::Program;
osg::Shader* vertex_shader = new osg::Shader(osg::Shader::VERTEX);
vertex_shader->setShaderSource(vert_source);
osg::Shader* fragment_shader = new osg::Shader(osg::Shader::FRAGMENT);
fragment_shader->setShaderSource(frag_source);
program->addShader(vertex_shader);
program->addShader(fragment_shader);
ss->setAttributeAndModes(program, osg::StateAttribute::ON);
}
int main(int argc, char** argv)
{
osg::ref_ptr<osg::Group> scene_root = new osg::Group;
osgViewer::Viewer viewer;
viewer.getCamera()->setDefaults();
osg::Node* axes = osgDB::readNodeFile("axes.osgt");
if (!axes)
{
std::cout << "Didn't find axes.osgb" << std::endl;
exit(1);
}
osg::PositionAttitudeTransform* pat_1 = new
osg::PositionAttitudeTransform;
osg::PositionAttitudeTransform* pat_2 = new
osg::PositionAttitudeTransform;
pat_1->setPosition(osg::Vec3(-5,0,0));
pat_2->setPosition(osg::Vec3(5,0,0));
pat_1->addChild(axes);
pat_2->addChild(axes);
scene_root->addChild(pat_2);
scene_root->addChild(pat_1);
applyShader(vert_source, frag_source, pat_1->getOrCreateStateSet());
applyShader(vert_source, frag_source, pat_2->getOrCreateStateSet());
pat_2->getOrCreateStateSet()->setDefine("TEST_DEFINE");
osgUtil::Optimizer opt;
opt.optimize(scene_root,
osgUtil::Optimizer::SHARE_DUPLICATE_STATE |
osgUtil::Optimizer::STATIC_OBJECT_DETECTION
);
//opt.optimize(scene_root);
viewer.setSceneData(scene_root);
viewer.setUpViewInWindow(10,10,255,255,0);
viewer.run();
}
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org