/* -*-c++-*- */
/* osgEarth - Geospatial SDK for OpenSceneGraph
* Copyright 2008-2012 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.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*
* 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_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
