

#ifndef __OPENSPACE_MODULE_GLOBEBROWSING___TILEPROVIDER__SPOUTIMAGEPROVIDER___H__
#define __OPENSPACE_MODULE_GLOBEBROWSING___TILEPROVIDER__SPOUTIMAGEPROVIDER___H__

#include <modules/globebrowsing/src/tileprovider/tileprovider.h>

namespace openspace::spout { class SpoutReceiverPropertyProxy; }

namespace openspace::globebrowsing {

class SpoutImageProvider : public TileProvider {
public:
    SpoutImageProvider(const ghoul::Dictionary& dictionary);

    Tile tile(const TileIndex& tileIndex) override final;
    Tile::Status tileStatus(const TileIndex& index) override final;
    TileDepthTransform depthTransform() override final;
    void update() override final;
    void reset() override final;
    int minLevel() override final;
    int maxLevel() override final;
    float noDataValueAsFloat() override final;

    static documentation::Documentation Documentation();

private:
    void internalInitialize() override final;
    void internalDeinitialize() override final;

    std::array<std::unique_ptr<ghoul::opengl::Texture>, 2> tileTexture;
    std::array<GLuint, 2> fbo = { 0, 0 };
    std::array<Tile, 2> tiles;

#ifdef OPENSPACE_HAS_SPOUT
    std::unique_ptr<spout::SpoutReceiverPropertyProxy> spoutReceiver;
#endif

    bool spoutUpdate = false;
};

} // namespace openspace::globebrowsing

#endif // __OPENSPACE_MODULE_GLOBEBROWSING___TILEPROVIDER__SPOUTIMAGEPROVIDER___H__
