diff --git a/examples/osgkeystone/osgkeystone.cpp b/examples/osgkeystone/osgkeystone.cpp index e662c2f6b..f7a34c075 100644 --- a/examples/osgkeystone/osgkeystone.cpp +++ b/examples/osgkeystone/osgkeystone.cpp @@ -400,11 +400,25 @@ struct KeystoneUpdateCallback : public osg::Drawable::UpdateCallback osg::Vec3Array* vertices = dynamic_cast(geometry->getVertexArray()); if (!vertices) return; - _keystone->compute3DPositions(osg::DisplaySettings::instance().get(), (*vertices)[0], (*vertices)[1], (*vertices)[2], (*vertices)[3]); + osg::Vec2Array* texcoords = dynamic_cast(geometry->getTexCoordArray(0)); + if (!texcoords) return; + + osg::Vec3 tl, tr, br, bl; + + _keystone->compute3DPositions(osg::DisplaySettings::instance().get(), tl, tr, br, bl); + + for(unsigned int i=0; isize(); ++i) + { + osg::Vec3& v = (*vertices)[i]; + osg::Vec2& t = (*texcoords)[i]; + v = bl * ((1.0f-t.x())*(1.0f-t.y())) + + br * ((t.x())*(1.0f-t.y())) + + tl * ((1.0f-t.x())*(t.y())) + + tr * ((t.x())*(t.y())); + } geometry->dirtyBound(); } - osg::ref_ptr _keystone; }; @@ -426,20 +440,56 @@ osg::Geometry* createKeystoneDistortionMesh(Keystone* cp) osg::ref_ptr vertices = new osg::Vec3Array; geometry->setVertexArray(vertices.get()); - - unsigned int vi = vertices->size(); - vertices->resize(4); - osg::ref_ptr texcoords = new osg::Vec2Array; geometry->setTexCoordArray(0, texcoords.get()); +#if 1 + unsigned int numRows = 7; + unsigned int numColumns = 7; + unsigned int numVertices = numRows*numColumns; + + vertices->resize(numVertices); + texcoords->resize(numVertices); + + for(unsigned j=0; j(i)/static_cast(numColumns-1), static_cast(j)/static_cast(numRows-1)); + } + } + + osg::ref_ptr elements = new osg::DrawElementsUShort(GL_TRIANGLES); + geometry->addPrimitiveSet(elements.get()); + for(unsigned j=0; jpush_back(vi+numColumns); + elements->push_back(vi); + elements->push_back(vi+1); + + elements->push_back(vi+numColumns); + elements->push_back(vi+1); + elements->push_back(vi+1+numColumns); + } + } + +#else + unsigned int vi = vertices->size(); + vertices->resize(4); + texcoords->push_back(osg::Vec2(0.0f,1.0f)); texcoords->push_back(osg::Vec2(1.0f,1.0f)); texcoords->push_back(osg::Vec2(1.0f,0.0f)); texcoords->push_back(osg::Vec2(0.0f,0.0f)); geometry->addPrimitiveSet(new osg::DrawArrays(GL_QUADS, vi, 4)); - +#endif + geometry->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF); kuc->update(geometry.get());