/* -*-c++-*- */
/* osgEarth - Dynamic map generation toolkit for OpenSceneGraph
* Copyright 2008-2010 Pelican Mapping
* http://osgearth.org
*
* osgEarth is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program.  If not, see <http://www.gnu.org/licenses/>
*/

#ifndef OSGEARTH_IMAGE_TO_HEIGHTFIELD_CONVERTER
#define OSGEARTH_IMAGE_TO_HEIGHTFIELD_CONVERTER 1

#include <osgEarth/Export>

#include <osg/Image>
#include <osg/Shape>

namespace osgEarth
{
  /**
  * Utility class that re-interprets an image as a heightfield and vice-versa.
  */
  class OSGEARTH_EXPORT ImageToHeightFieldConverter
  {
  public:
    ImageToHeightFieldConverter();

    /**
    * Instruct the converter to detect and replace "no data" values. It will
    * try to interpolate the proper value, or fall back on the provided value
    * if the interpolation fails.
    */
    void setRemoveNoDataValues( bool value, float fallback =0.0f );

  public:
    /**
    * Converts an image to a heightfield.
    */
    osg::HeightField* convert(const osg::Image* image ); 
    osg::HeightField* convert(const osg::Image* image, float scaleFactor ); 

    /**
    * Converts a heightfield to an image.
    */
    osg::Image* convert(const osg::HeightField* hf, int pixelSize = 32);

  private:
    osg::HeightField* convert16(const osg::Image* image ) const; 
    osg::HeightField* convert32(const osg::Image* image ) const; 

    osg::Image* convert16(const osg::HeightField* hf ) const;
    osg::Image* convert32(const osg::HeightField* hf ) const;

    bool  _replace_nodata;
    float _nodata_value;
  };
}

#endif //OSGEARTH_IMAGE_TO_HEIGHTFIELD_CONVERTER