#pragma once
#include "Common"

#include <osgEarth/ModelSource>
#include <osgEarth/ObjectIndex>
#include <osgEarth/Containers>
#include <osgEarth/CullingUtils>

#include <string>
#include <vector>
#include <osg/Matrixd>

namespace osgEarth
{
    namespace Buildings
    {
        /**
         * Container object for VRV indirect processor.
         */
        class OSGEARTHBUILDINGS_EXPORT InstancedModelNode : public osg::Node
        {
        public:
            InstancedModelNode();
            InstancedModelNode(const InstancedModelNode& rhs, const osg::CopyOp& copyop);
            InstancedModelNode& operator=(const InstancedModelNode& rhs);

            META_Node(osgEarth::Buildings, InstancedModelNode);

            using MatrixdVector = std::vector<osg::Matrixd>;
            using ObjectIdVector = std::vector<osgEarth::ObjectID>;

            struct Instances
            {
                MatrixdVector matrices;
                ObjectIdVector objectIds;
                float minRange;
                float maxRange;
                unsigned totalCount = 0;
            };

            using MapModelToInstances = osgEarth::vector_map<std::string, Instances>;

            MapModelToInstances _mapModelToInstances;

            LODMethod _lodMethod = LODMethod::CAMERA_DISTANCE;
        };
    }
}