#pragma once
#include "Arith_CommonDef.h"
#include "opencv2/opencv.hpp"
#include "PlatformDefine.h"

using std::vector;
using cv::Point2d;
using cv::Point2f;
using cv::Mat;
using cv::Mat_;


// 下视拼接参数控制
struct UPanConfig
{
    bool bUseBA;//开启BA
    bool bOutFrameTile;//输出单帧正射图
    bool bOutGoogleTile;//输出谷歌瓦片
};

// 帧内外方位元素
struct FrameInfo
{
    int nFrmID;//帧编号，唯一ID
    AirCraftInfo craft;
    CamInfo camInfo;
    ServoInfo servoInfo;
    int nEvHeight;//相对高差
    int nWidth;
    int nHeight;
};

// 下视全景图配置
struct UPanInfo
{
    int m_pan_width;
    int m_pan_height;
    float scale;// 比例尺
    float map_shiftX;// 平移X
    float map_shiftY;// 平移Y
};


// 匹配关系网，BA的边
struct Match_Net
{
    int imgNo;                    //! image no. start from 0
    vector<int> relatedImgs;      //! the position index of overlap-image in visitOrder
    vector<vector<Point2d> > PointSet;
};


#define IMG_CACHE_SIZE  (1920 * 1080 * 3)   //图像缓存尺寸
#define FEA_NUM_MAX   500                   // 单帧特征点数量
#define FEA_DES_SIZE 128                    // 特征点描述子尺度

// 帧缓存:按照固定大小设计，便于管理
struct FrameCache
{
    FrameInfo _para;
    GD_VIDEO_FRAME_S _frame_info;
    BYTE8 _data[IMG_CACHE_SIZE];

    SINT32 ptNum;
    cv::KeyPoint _pt[FEA_NUM_MAX];
    FLOAT32 _desp[FEA_NUM_MAX * FEA_DES_SIZE];
    DOUBLE64 H[9];// H矩阵
};



// 前视极坐标范围
struct PoleArea
{
    float left;
    float right;
    float up;
    float bottom;
};

// 扫描范围（-180-180）
struct ScanRange
{
    float Agl0;
    float Agl1;
};

// 前视全景图配置
struct FPanInfo
{
    int m_pan_width;
    int m_pan_height;
    float fAglRes;

    // 大地系范围
    ANGLE32F centerGeo;
    ScanRange stAzRangeGeo;
    ScanRange stPtRangeGeo;
};

// 
// cuda显存资源
struct cuda_Mem
{
    unsigned char* global_cuda_Frame;
    unsigned char* global_cuda_Pan;
    unsigned char* global_cuda_pan_mask;
    double* global_cuda_H_inv_data;
};


// 通用全景图配置
struct GenPanInfo
{
    int m_pan_width;
    int m_pan_height;
};
