Dear all,
I have to create a 3D surface, and then such surface will be modified during
the application with several deformations. I've tried to create a Geometry
object, then I set the VertexArray, and finally inside the render callback I
update such vertex with the new ones. I got some errors during the rendering:
Warning: detected OpenGL error "value not valid" after RenderBin::draw(,)
Does anyone has an idea of such error? In addition, I'm sure the way I am
accessing the vertex is not the right one, anybody knows the best way?
here is the code:
//Create the 3D geometry
-------------------------------------------------------------------------
osg::Vec3Array(m*n));
osg::Vec2Array& t = *(new osg::Vec2Array(m*n));
osg::Vec4Array& col = *(new osg::Vec4Array(1));
col[0][0] = col[0][1] = col[0][2] = col[0][3] = 1.0f;
int index = 0;
for( i = 0; i < m; i++ )
{
for(j = 0; j < n; j++)
{
v[index][0] = i;
v[index][1] = 0;
v[index][2] = j;
t[index][0] = (float)i/(m-1);
t[index][1] = (float)j/(n-1);
index++;
}
}
myGeom = new osg::Geometry;
myGeom->setVertexArray( &v );
myGeom->setTexCoordArray( 0, &t );
myGeom->setColorArray( &col );
myGeom->setColorBinding( osg::Geometry::BIND_OVERALL );
for( i = 0; i < m-1; i++ )
{
osg::DrawElementsUShort* elements = new
osg::DrawElementsUShort(osg::PrimitiveSet::TRIANGLE_STRIP);
elements->reserve(m*2);
for( j = 0; j < n; j++ )
{
elements->push_back((i+0)*n+j);
elements->push_back((i+1)*n+j);
}
myGeom->addPrimitiveSet(elements);
}
osg::Texture2D *tex = new osg::Texture2D;
tex->setImage(osgDB::readImageFile("Images/breast.png"));
osg::StateSet *dstate = new osg::StateSet;
dstate->setMode( GL_LIGHTING, osg::StateAttribute::OFF );
dstate->setTextureAttributeAndModes(0, tex, osg::StateAttribute::ON );
dstate->setTextureAttribute(0, new osg::TexEnv );
myGeom->setStateSet( dstate );
osg::Geode *geode = new osg::Geode;
geode->addDrawable( myGeom );
-------------------------------------------------------
//Accessing the elements
-------------------------------------------
osg::Vec3Array *test = dynamic_cast(myGeom->getVertexArray());
for(int i = 0; i < numVertex; i++)
{
NxMat34 pose = listShapes.at(i)->shape->getGlobalPose();
osg::Vec3f trans = osg::Vec3(pose.t.x,pose.t.y,pose.t.z);
test->at(i) = trans;
}
myGeom->dirtyDisplayList();
myGeom->dirtyBound();
--------------------------------------------
thank you very much for your help!!!
Crisalix.
_________________________________________________________________
Express yourself instantly with MSN Messenger! Download today it's FREE!
http://messenger.msn.click-url.com/go/onm00200471ave/direct/01/
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org