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 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 ) ); }
nave(int x,int y, int z, int tamaño) { pyramidGeode = new osg::Geode(); pyramidGeometry = new osg::Geometry(); pyramidGeode->addDrawable(pyramidGeometry); osg::Vec3Array* pyramidVertices = new osg::Vec3Array; //0-4 pyramidVertices->push_back( osg::Vec3( x, y, z) ); // front left //1-5 pyramidVertices->push_back( osg::Vec3(tamaño+x, y, z) ); // front right //2-6 pyramidVertices->push_back( osg::Vec3(tamaño+x,tamaño+y, z) ); // back right //3-7 pyramidVertices->push_back( osg::Vec3( x,tamaño+y, z) ); // back left //4-0 pyramidVertices->push_back( osg::Vec3( x, y,tamaño+z) ); // peak //5-1 pyramidVertices->push_back( osg::Vec3(tamaño+x, y,tamaño+z) ); // front right //6-2 pyramidVertices->push_back( osg::Vec3(tamaño+x,tamaño+y,tamaño+z) ); // back right //7-3 pyramidVertices->push_back( osg::Vec3( x,tamaño+y,tamaño+z) ); // back left pyramidGeometry->setVertexArray( pyramidVertices ); osg::DrawElementsUInt* pyramidBase = new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS, 0); pyramidBase->push_back(3); pyramidBase->push_back(2); pyramidBase->push_back(1); pyramidBase->push_back(0); pyramidGeometry->addPrimitiveSet(pyramidBase); osg::DrawElementsUInt* pyramidTop = new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS, 0); pyramidTop->push_back(4); pyramidTop->push_back(5); pyramidTop->push_back(6); pyramidTop->push_back(7); pyramidGeometry->addPrimitiveSet(pyramidTop); //Repeat the same for each of the four sides. Again, vertices are //specified in counter-clockwise order. osg::DrawElementsUInt* pyramidFaceOne = new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS, 0); pyramidFaceOne->push_back(0); pyramidFaceOne->push_back(1); pyramidFaceOne->push_back(5); pyramidFaceOne->push_back(4); pyramidGeometry->addPrimitiveSet(pyramidFaceOne); osg::DrawElementsUInt* pyramidFaceTwo = new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS, 0); pyramidFaceTwo->push_back(1); pyramidFaceTwo->push_back(2); pyramidFaceTwo->push_back(6); pyramidFaceTwo->push_back(5); pyramidGeometry->addPrimitiveSet(pyramidFaceTwo); osg::DrawElementsUInt* pyramidFaceThree = new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS, 0); pyramidFaceThree->push_back(2); pyramidFaceThree->push_back(3); pyramidFaceThree->push_back(7); pyramidFaceThree->push_back(6); pyramidGeometry->addPrimitiveSet(pyramidFaceThree); osg::DrawElementsUInt* pyramidFaceFour = new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS, 0); pyramidFaceFour->push_back(3); pyramidFaceFour->push_back(0); pyramidFaceThree->push_back(4); pyramidFaceFour->push_back(7); pyramidGeometry->addPrimitiveSet(pyramidFaceFour); //Declare and load an array of Vec4 elements to store colors. osg::Vec4Array* colors = new osg::Vec4Array; colors->push_back(osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f) ); //index 0 red colors->push_back(osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f) ); //index 1 green colors->push_back(osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f) ); //index 2 blue colors->push_back(osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f) ); //index 3 white colors->push_back(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f) ); //index 4 red colors->push_back(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f) ); //index 4 red colors->push_back(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f) ); //index 4 red colors->push_back(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f) ); //index 4 red //The next step is to associate the array of colors with the geometry, //assign the color indices created above to the geometry and set the //binding mode to _PER_VERTEX. pyramidGeometry->setColorArray(colors); pyramidGeometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX); };