void apply(osg::Geometry& geom) { geom.setUseDisplayList(false); if (!_manualVertexAliasing) return; osg::notify(osg::NOTICE)<<"Found geometry "<<&geom<<std::endl; if (geom.getVertexArray()) { setVertexAttrib(geom, _vertexAlias, geom.getVertexArray(), false, osg::Array::BIND_PER_VERTEX); geom.setVertexArray(0); } if (geom.getNormalArray()) { setVertexAttrib(geom, _normalAlias, geom.getNormalArray(), true); geom.setNormalArray(0); } if (geom.getColorArray()) { setVertexAttrib(geom, _colorAlias, geom.getColorArray(), false); geom.setColorArray(0); } if (geom.getSecondaryColorArray()) { setVertexAttrib(geom, _secondaryColorAlias, geom.getSecondaryColorArray(), false); geom.setSecondaryColorArray(0); } if (geom.getFogCoordArray()) { // should we normalize the FogCoord array? Don't think so... setVertexAttrib(geom, _fogCoordAlias, geom.getFogCoordArray(), false); geom.setFogCoordArray(0); } unsigned int maxNumTexCoords = geom.getNumTexCoordArrays(); if (maxNumTexCoords>8) { osg::notify(osg::NOTICE)<<"Warning: Ignoring "<<maxNumTexCoords-8<<" texture coordinate arrays, only 8 are currently supported in vertex attribute conversion code."<<std::endl; maxNumTexCoords = 8; } for(unsigned int i=0; i<maxNumTexCoords; ++i) { if (geom.getTexCoordArray(i)) { setVertexAttrib(geom, _texCoordAlias[i], geom.getTexCoordArray(i), false, osg::Array::BIND_PER_VERTEX); geom.setTexCoordArray(i,0); } else { osg::notify(osg::NOTICE)<<"Found empty TexCoordArray("<<i<<")"<<std::endl; } } }
void ShaderVisitor::apply(osg::Geometry& geometry) { bool needPop = (geometry.getStateSet() != NULL); if (geometry.getStateSet()) { pushRequirements(); applyStateSet(geometry.getStateSet(), geometry); } if (!mRequirements.empty()) { const ShaderRequirements& reqs = mRequirements.back(); if (mAllowedToModifyStateSets) { // make sure that all UV sets are there for (std::map<int, std::string>::const_iterator it = reqs.mTextures.begin(); it != reqs.mTextures.end(); ++it) { if (geometry.getTexCoordArray(it->first) == NULL) geometry.setTexCoordArray(it->first, geometry.getTexCoordArray(0)); } } if (reqs.mTexStageRequiringTangents != -1 && mAllowedToModifyStateSets) { osg::ref_ptr<osgUtil::TangentSpaceGenerator> generator (new osgUtil::TangentSpaceGenerator); generator->generate(&geometry, reqs.mTexStageRequiringTangents); geometry.setTexCoordArray(7, generator->getTangentArray(), osg::Array::BIND_PER_VERTEX); } // TODO: find a better place for the stateset if (reqs.mShaderRequired || mForceShaders) createProgram(reqs, geometry); } if (needPop) popRequirements(); }
void createDAIGeometry( osg::Geometry& geom, int nInstances=1 ) { const float halfDimX( .5 ); const float halfDimZ( .5 ); osg::Vec3Array* v = new osg::Vec3Array; v->resize( 4 ); geom.setVertexArray( v ); // Geometry for a single quad. (*v)[ 0 ] = osg::Vec3( -halfDimX, 0., 0. ); (*v)[ 1 ] = osg::Vec3( halfDimX, 0., 0. ); (*v)[ 2 ] = osg::Vec3( halfDimX, 0., halfDimZ*2.0f ); (*v)[ 3 ] = osg::Vec3( -halfDimX, 0., halfDimZ*2.0f ); // create color array data (each corner of our triangle will have one color component) osg::Vec4Array* pColors = new osg::Vec4Array; pColors->push_back( osg::Vec4( 1.0f, 0.0f, 0.0f, 1.0f ) ); pColors->push_back( osg::Vec4( 0.0f, 1.0f, 0.0f, 1.0f ) ); pColors->push_back( osg::Vec4( 0.0f, 0.0f, 1.0f, 1.0f ) ); pColors->push_back( osg::Vec4( 0.0f, 0.0f, 1.0f, 1.0f ) ); geom.setColorArray( pColors ); // make sure that our geometry is using one color per vertex geom.setColorBinding( osg::Geometry::BIND_PER_VERTEX ); osg::Vec2Array* pTexCoords = new osg::Vec2Array( 4 ); (*pTexCoords)[0].set( 0.0f, 0.0f ); (*pTexCoords)[1].set( 1.0f, 0.0f ); (*pTexCoords)[2].set( 1.0f, 1.0f ); (*pTexCoords)[3].set( 0.0f, 1.0f ); geom.setTexCoordArray( 0, pTexCoords ); // Use the DrawArraysInstanced PrimitiveSet and tell it to draw 1024 instances. geom.addPrimitiveSet( new osg::DrawArrays( GL_QUADS, 0, 4, nInstances ) ); }