/* osgEarth
* Copyright 2025 Pelican Mapping
* MIT License
*/
#pragma once

#include <osgEarth/Export>
#include <osgEarth/GeoCommon>
#include <osg/Image>
#include <osg/Shape>

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

        /**
        * 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);

        osg::Image* convertToR16F(const osg::HeightField* hf) const;

        osg::Image* convertToR32F(const osg::HeightField* hf) const;

    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 = false;
        float _nodata_value = NO_DATA_VALUE;
    };
} }
