diff --git a/include/osgTerrain/DataSet b/include/osgTerrain/DataSet index 145f5d718..3c8155829 100644 --- a/include/osgTerrain/DataSet +++ b/include/osgTerrain/DataSet @@ -26,10 +26,12 @@ #include +#include + namespace osgTerrain { -class DataSet : public osg::Referenced +class OSGTERRAIN_EXPORT DataSet : public osg::Referenced { public: diff --git a/src/osgTerrain/DataSet.cpp b/src/osgTerrain/DataSet.cpp index 972aa1b4e..ed6c9e578 100644 --- a/src/osgTerrain/DataSet.cpp +++ b/src/osgTerrain/DataSet.cpp @@ -59,13 +59,15 @@ CoordinateSystemType getCoordinateSystemType(const osgTerrain::CoordinateSystem* OGRSpatialReference lhsSR; lhsSR.importFromWkt(&importString); - free(projection_string); - + std::cout<<"getCoordinateSystemType("< n = new osg::Vec3Array(numVertices); // must use ref_ptr so the array isn't removed when smooothvisitor is used float skirtRatio = 0.01f; osg::Matrixd localToWorld; @@ -2030,7 +2031,7 @@ osg::Node* DataSet::DestinationTile::createPolygonal() } // note normal will need rotating. - if (n) (*n)[vi] = grid->getNormal(c,r); + if (n.valid()) (*(n.get()))[vi] = grid->getNormal(c,r); t[vi].x() = (c==numColumns-1)? 1.0f : (float)(c)/(float)(numColumns-1); t[vi].y() = (r==numRows-1)? 1.0f : (float)(r)/(float)(numRows-1); @@ -2042,9 +2043,9 @@ osg::Node* DataSet::DestinationTile::createPolygonal() //geometry->setUseDisplayList(false); geometry->setVertexArray(&v); - if (n) + if (n.valid()) { - geometry->setNormalArray(n); + geometry->setNormalArray(n.get()); geometry->setNormalBinding(osg::Geometry::BIND_PER_VERTEX); } @@ -2091,8 +2092,14 @@ osg::Node* DataSet::DestinationTile::createPolygonal() } } +#if 1 osgUtil::SmoothingVisitor sv; - sv.smooth(*geometry); + sv.smooth(*geometry); // this will replace the normal vector with a new one + + // now we have to reassign the normals back to the orignal pointer. + n = geometry->getNormalArray(); + if (n.valid() && n->size()!=numVertices) n->resize(numVertices); +#endif if (numVerticesInSkirt>0) { @@ -2107,7 +2114,7 @@ osg::Node* DataSet::DestinationTile::createPolygonal() skirtDrawElements[ei++] = (r)*numColumns+c; skirtDrawElements[ei++] = vi; v[vi] = v[(r)*numColumns+c]+skirtVector; - if (n) (*n)[vi] = (*n)[r*numColumns+c]; + if (n.valid()) (*n)[vi] = (*n)[r*numColumns+c]; t[vi++] = t[(r)*numColumns+c]; } // create right skirt vertices @@ -2117,7 +2124,7 @@ osg::Node* DataSet::DestinationTile::createPolygonal() skirtDrawElements[ei++] = (r)*numColumns+c; skirtDrawElements[ei++] = vi; v[vi] = v[(r)*numColumns+c]+skirtVector; - if (n) (*n)[vi] = (*n)[(r)*numColumns+c]; + if (n.valid()) (*n)[vi] = (*n)[(r)*numColumns+c]; t[vi++] = t[(r)*numColumns+c]; } // create top skirt vertices @@ -2127,7 +2134,7 @@ osg::Node* DataSet::DestinationTile::createPolygonal() skirtDrawElements[ei++] = (r)*numColumns+c; skirtDrawElements[ei++] = vi; v[vi] = v[(r)*numColumns+c]+skirtVector; - if (n) (*n)[vi] = (*n)[(r)*numColumns+c]; + if (n.valid()) (*n)[vi] = (*n)[(r)*numColumns+c]; t[vi++] = t[(r)*numColumns+c]; } // create left skirt vertices @@ -2137,12 +2144,19 @@ osg::Node* DataSet::DestinationTile::createPolygonal() skirtDrawElements[ei++] = (r)*numColumns+c; skirtDrawElements[ei++] = vi; v[vi] = v[(r)*numColumns+c]+skirtVector; - if (n) (*n)[vi] = (*n)[(r)*numColumns+c]; + if (n.valid()) (*n)[vi] = (*n)[(r)*numColumns+c]; t[vi++] = t[(r)*numColumns+c]; } skirtDrawElements[ei++] = 0; skirtDrawElements[ei++] = firstSkirtVertexIndex; - } + } + + if (n.valid()) + { + geometry->setNormalArray(n.get()); + geometry->setNormalBinding(osg::Geometry::BIND_PER_VERTEX); + } + #if 0 osgUtil::TriStripVisitor tsv;