From 7bea5842faf315475bb955813587a8ad9b867033 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Mon, 29 Mar 2004 14:40:03 +0000 Subject: [PATCH] Added support for generating polygonal tiles --- src/osgTerrain/DataSet.cpp | 160 +++++++++++++++++++++++++++++++++---- 1 file changed, 146 insertions(+), 14 deletions(-) diff --git a/src/osgTerrain/DataSet.cpp b/src/osgTerrain/DataSet.cpp index 7e994df65..4c85a2912 100644 --- a/src/osgTerrain/DataSet.cpp +++ b/src/osgTerrain/DataSet.cpp @@ -18,6 +18,8 @@ #include #include +#include + #include #include #include @@ -1788,28 +1790,158 @@ osg::ShapeDrawable* DataSet::DestinationTile::createDrawableHeightField() osg::Geometry* DataSet::DestinationTile::createDrawablePolygonal() { - std::cout<<"--------- DataSet::DestinationTile::createSceneGeometry() ------------- "<_heightField.valid(); - - if (!heightFieldPresent) + osg::ref_ptr grid = 0; + + if (_terrain.valid() && _terrain->_heightField.valid()) { std::cout<<"--- Have terrain build tile ----"<_heightField.get(); - - osg::Geometry* geometry = new osg::Geometry; - - return geometry; - + grid = _terrain->_heightField.get(); } - else + else + { + grid = new osg::HeightField; + grid->allocate(2,2); + grid->setOrigin(osg::Vec3(_extents.xMin(),_extents.yMin(),0.0f)); + grid->setXInterval(_extents.xMax()-_extents.xMin()); + grid->setYInterval(_extents.yMax()-_extents.yMin()); + } + + if (!grid) { std::cout<<"**** No terrain to build tile from use flat terrain fallback ****"<getNumColumns(); + unsigned int numRows = grid->getNumRows(); + unsigned int numVerticesInBody = numColumns*numRows; + unsigned int numVerticesInSkirt = createSkirt ? numColumns*2 + numRows*2 - 4 : 0; + unsigned int numVertices = numVerticesInBody+numVerticesInSkirt; + + osg::Vec3 skirtVector(0.0f,0.0f,-_extents.radius()*0.01f); + + // create the geometry. + osg::Geometry* geometry = new osg::Geometry; + + osg::Vec3Array& v = *(new osg::Vec3Array(numVertices)); + osg::Vec2Array& t = *(new osg::Vec2Array(numVertices)); + osg::UByte4Array& color = *(new osg::UByte4Array(1)); + + color[0].set(255,255,255,255); + + unsigned int vi=0; + unsigned int r,c; + for(r=0;rgetVertex(c,r); + t[vi].x() = (float)(c)/(float)(numColumns); + t[vi].y() = (float)(r)/(float)(numRows); + ++vi; + } + } + + geometry->setVertexArray(&v); + geometry->setColorArray(&color); + geometry->setColorBinding(osg::Geometry::BIND_OVERALL); + geometry->setTexCoordArray(0,&t); + + osg::DrawElementsUShort& drawElements = *(new osg::DrawElementsUShort(GL_TRIANGLES,2*3*(numColumns-1)*(numRows-1))); + geometry->addPrimitiveSet(&drawElements); + int ei=0; + for(r=0;r0) + { + osg::DrawElementsUShort& skirtDrawElements = *(new osg::DrawElementsUShort(GL_QUAD_STRIP,2*numVerticesInSkirt+2)); + geometry->addPrimitiveSet(&skirtDrawElements); + int ei=0; + int firstSkirtVertexIndex = vi; + // create bottom skirt vertices + r=0; + for(c=0;c0;--c) + { + skirtDrawElements[ei++] = (r)*numColumns+c; + skirtDrawElements[ei++] = vi; + v[vi] = v[(r)*numColumns+c]+skirtVector; + t[vi++] = t[(r)*numColumns+c]; + } + // create left skirt vertices + c=0; + for(r=numRows-1;r>0;--r) + { + skirtDrawElements[ei++] = (r)*numColumns+c; + skirtDrawElements[ei++] = vi; + v[vi] = v[(r)*numColumns+c]+skirtVector; + t[vi++] = t[(r)*numColumns+c]; + } + skirtDrawElements[ei++] = 0; + skirtDrawElements[ei++] = firstSkirtVertexIndex; + } + + osgUtil::TriStripVisitor tsv; + tsv.stripify(*geometry); + + return geometry; } void DataSet::DestinationTile::readFrom(CompositeSource* sourceGraph) @@ -2197,7 +2329,7 @@ DataSet::DataSet() _defaultColor.set(0.5f,0.5f,1.0f,1.0f); _databaseType = PagedLOD_DATABASE; - _geometryType = HEIGHT_FIELD; + _geometryType = POLYGONAL; _textureType = COMPRESSED_TEXTURE; }