/* osgEarth - Geospatial SDK for OpenSceneGraph
* Copyright 2008-2012 Pelican Mapping
* MIT License
*/
#ifndef OSGEARTH_CESIUM_PREPARE_RENDER_RESOURCES_H
#define OSGEARTH_CESIUM_PREPARE_RENDER_RESOURCES_H

// Include Material.h to avoid issues with OPAQUE definition from Windows.h when Tileset.h is included
#include <CesiumGltf/Material.h>
#include <Cesium3DTilesSelection/Tileset.h>

#include <osgEarth/Notify>
#include <osg/Node>

namespace osgEarth {
    namespace Cesium
    {
        using namespace osgEarth;

        class LoadThreadResult
        {
        public:
            LoadThreadResult();
            ~LoadThreadResult();
            osg::ref_ptr< osg::Node > node;
        };

        class MainThreadResult
        {
        public:
            MainThreadResult();
            ~MainThreadResult();
            osg::ref_ptr< osg::Node > node;
        };
        

        class LoadRasterThreadResult
        {
        public:
            LoadRasterThreadResult();
            ~LoadRasterThreadResult();
            osg::ref_ptr< osg::Image > image;
        };

        class LoadRasterMainThreadResult
        {
        public:
            LoadRasterMainThreadResult();
            ~LoadRasterMainThreadResult();
            osg::ref_ptr< osg::Image > image;
        };

        class PrepareRendererResources : public Cesium3DTilesSelection::IPrepareRendererResources
        {
            virtual CesiumAsync::Future<Cesium3DTilesSelection::TileLoadResultAndRenderResources>
                prepareInLoadThread(
                    const CesiumAsync::AsyncSystem& asyncSystem,
                    Cesium3DTilesSelection::TileLoadResult&& tileLoadResult,
                    const glm::dmat4& transform,
                    const std::any& rendererOptions);

            virtual void* prepareInMainThread(Cesium3DTilesSelection::Tile& tile, void* pLoadThreadResult);

            virtual void free(
                Cesium3DTilesSelection::Tile& tile,
                void* pLoadThreadResult,
                void* pMainThreadResult) noexcept;

            virtual void* prepareRasterInLoadThread(
                CesiumGltf::ImageCesium& image,
                const std::any& rendererOptions);

            virtual void* prepareRasterInMainThread(
                CesiumRasterOverlays::RasterOverlayTile& rasterTile,
                void* pLoadThreadResult);

            virtual void freeRaster(
                const CesiumRasterOverlays::RasterOverlayTile& rasterTile,
                void* pLoadThreadResult,
                void* pMainThreadResult) noexcept;

            virtual void attachRasterInMainThread(
                const Cesium3DTilesSelection::Tile& tile,
                int32_t overlayTextureCoordinateID,
                const CesiumRasterOverlays::RasterOverlayTile& rasterTile,
                void* pMainThreadRendererResources,
                const glm::dvec2& translation,
                const glm::dvec2& scale);

            virtual void detachRasterInMainThread(
                const Cesium3DTilesSelection::Tile& tile,
                int32_t overlayTextureCoordinateID,
                const CesiumRasterOverlays::RasterOverlayTile& rasterTile,
                void* pMainThreadRendererResources) noexcept;
        };
    }
}


#endif
