Index: OpenSceneGraph/trunk/src/osgTerrain/GeometryTechnique.cpp
===================================================================
--- OpenSceneGraph/trunk/src/osgTerrain/GeometryTechnique.cpp (revision 9388)
+++ OpenSceneGraph/trunk/src/osgTerrain/GeometryTechnique.cpp (revision 9969)
@@ -417,7 +417,14 @@
 //    bool optimizeOrientations = elevations!=0;
     bool swapOrientation = !(masterLocator->orientationOpenGL());
-    
-    osg::ref_ptr<osg::DrawElementsUInt> elements = new osg::DrawElementsUInt(GL_TRIANGLES);
-    elements->reserve((numRows-1) * (numColumns-1) * 6);
+
+    bool smallTile = numVertices <= 16384;
+
+    // osg::notify(osg::NOTICE)<<"smallTile = "<<smallTile<<std::endl;
+    
+    osg::ref_ptr<osg::DrawElements> elements = smallTile ? 
+        static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_TRIANGLES)) :
+        static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_TRIANGLES));
+        
+    elements->reserveElements((numRows-1) * (numColumns-1) * 6);
 
     geometry->addPrimitiveSet(elements.get());
@@ -464,29 +471,29 @@
                 if (fabsf(e00-e11)<fabsf(e01-e10))
                 {
-                    elements->push_back(i01);
-                    elements->push_back(i00);
-                    elements->push_back(i11);
-
-                    elements->push_back(i00);
-                    elements->push_back(i10);
-                    elements->push_back(i11);
+                    elements->addElement(i01);
+                    elements->addElement(i00);
+                    elements->addElement(i11);
+
+                    elements->addElement(i00);
+                    elements->addElement(i10);
+                    elements->addElement(i11);
                 }
                 else
                 {
-                    elements->push_back(i01);
-                    elements->push_back(i00);
-                    elements->push_back(i10);
-
-                    elements->push_back(i01);
-                    elements->push_back(i10);
-                    elements->push_back(i11);
+                    elements->addElement(i01);
+                    elements->addElement(i00);
+                    elements->addElement(i10);
+
+                    elements->addElement(i01);
+                    elements->addElement(i10);
+                    elements->addElement(i11);
                 }
             }
             else if (numValid==3)
             {
-                if (i00>=0) elements->push_back(i00);
-                if (i01>=0) elements->push_back(i01);
-                if (i11>=0) elements->push_back(i11);
-                if (i10>=0) elements->push_back(i10);
+                if (i00>=0) elements->addElement(i00);
+                if (i01>=0) elements->addElement(i01);
+                if (i11>=0) elements->addElement(i11);
+                if (i10>=0) elements->addElement(i10);
             }
             
@@ -507,5 +514,7 @@
     if (createSkirt)
     {
-        osg::ref_ptr<osg::DrawElementsUShort> skirtDrawElements = new osg::DrawElementsUShort(GL_QUAD_STRIP);
+        osg::ref_ptr<osg::DrawElements> skirtDrawElements = smallTile ? 
+            static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_QUAD_STRIP)) :
+            static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_QUAD_STRIP));
 
         // create bottom skirt vertices
@@ -529,13 +538,15 @@
                 }
                 
-                skirtDrawElements->push_back(orig_i);
-                skirtDrawElements->push_back(new_i);
+                skirtDrawElements->addElement(orig_i);
+                skirtDrawElements->addElement(new_i);
             }
             else
             {
-                if (!skirtDrawElements->empty())
+                if (skirtDrawElements->getNumIndices()!=0)
                 {
                     geometry->addPrimitiveSet(skirtDrawElements.get());
-                    skirtDrawElements = new osg::DrawElementsUShort(GL_QUAD_STRIP);
+                    skirtDrawElements = smallTile ? 
+                        static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_QUAD_STRIP)) :
+                        static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_QUAD_STRIP));
                 }
                 
@@ -543,8 +554,10 @@
         }
 
-        if (!skirtDrawElements->empty())
+        if (skirtDrawElements->getNumIndices()!=0)
         {
             geometry->addPrimitiveSet(skirtDrawElements.get());
-            skirtDrawElements = new osg::DrawElementsUShort(GL_QUAD_STRIP);
+            skirtDrawElements = smallTile ? 
+                        static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_QUAD_STRIP)) :
+                        static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_QUAD_STRIP));
         }
 
@@ -567,13 +580,15 @@
                 }
                 
-                skirtDrawElements->push_back(orig_i);
-                skirtDrawElements->push_back(new_i);
+                skirtDrawElements->addElement(orig_i);
+                skirtDrawElements->addElement(new_i);
             }
             else
             {
-                if (!skirtDrawElements->empty())
+                if (skirtDrawElements->getNumIndices()!=0)
                 {
                     geometry->addPrimitiveSet(skirtDrawElements.get());
-                    skirtDrawElements = new osg::DrawElementsUShort(GL_QUAD_STRIP);
+                    skirtDrawElements = smallTile ? 
+                        static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_QUAD_STRIP)) :
+                        static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_QUAD_STRIP));
                 }
                 
@@ -581,8 +596,10 @@
         }
 
-        if (!skirtDrawElements->empty())
+        if (skirtDrawElements->getNumIndices()!=0)
         {
             geometry->addPrimitiveSet(skirtDrawElements.get());
-            skirtDrawElements = new osg::DrawElementsUShort(GL_QUAD_STRIP);
+            skirtDrawElements = smallTile ? 
+                        static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_QUAD_STRIP)) :
+                        static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_QUAD_STRIP));
         }
 
@@ -605,13 +622,15 @@
                 }
                 
-                skirtDrawElements->push_back(orig_i);
-                skirtDrawElements->push_back(new_i);
+                skirtDrawElements->addElement(orig_i);
+                skirtDrawElements->addElement(new_i);
             }
             else
             {
-                if (!skirtDrawElements->empty())
+                if (skirtDrawElements->getNumIndices()!=0)
                 {
                     geometry->addPrimitiveSet(skirtDrawElements.get());
-                    skirtDrawElements = new osg::DrawElementsUShort(GL_QUAD_STRIP);
+                    skirtDrawElements = smallTile ? 
+                        static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_QUAD_STRIP)) :
+                        static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_QUAD_STRIP));
                 }
                 
@@ -619,8 +638,10 @@
         }
 
-        if (!skirtDrawElements->empty())
+        if (skirtDrawElements->getNumIndices()!=0)
         {
             geometry->addPrimitiveSet(skirtDrawElements.get());
-            skirtDrawElements = new osg::DrawElementsUShort(GL_QUAD_STRIP);
+            skirtDrawElements = smallTile ? 
+                        static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_QUAD_STRIP)) :
+                        static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_QUAD_STRIP));
         }
 
@@ -643,10 +664,10 @@
                 }
                 
-                skirtDrawElements->push_back(orig_i);
-                skirtDrawElements->push_back(new_i);
+                skirtDrawElements->addElement(orig_i);
+                skirtDrawElements->addElement(new_i);
             }
             else
             {
-                if (!skirtDrawElements->empty())
+                if (skirtDrawElements->getNumIndices()!=0)
                 {
                     geometry->addPrimitiveSet(skirtDrawElements.get());
@@ -657,8 +678,10 @@
         }
 
-        if (!skirtDrawElements->empty())
+        if (skirtDrawElements->getNumIndices()!=0)
         {
             geometry->addPrimitiveSet(skirtDrawElements.get());
-            skirtDrawElements = new osg::DrawElementsUShort(GL_QUAD_STRIP);
+            smallTile ? 
+                static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_QUAD_STRIP)) :
+                static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_QUAD_STRIP));
         }
     }
