/* camera.h */


/* ----------------- typedefs -------------- */
#ifndef _TYPEDEFS_CAMERA_H_
#define _TYPEDEFS_CAMERA_H_

/* camera struct */
typedef struct t_CameraLlorca {
    /* intrinsic parameters */
    double fx;
    double fy;
    double cx;
    double cy;
    /* distortion parameters */
    double k0; /* radial 1 */
    double k1; /* radial 2 */
    double k2; /* tangential 1 */
    double k3; /* tangential 2 */
    /* extrinsic parameters wrt world */
    double ax; /* pitch angle */
    double ay; /* yaw angle */
    double az; /* roll angle */
    double rxx; /* rotation r11 */
    double rxy; /* rotation r12 */
    double rxz; /* rotation r13 */
    double ryx; /* rotation r21 */
    double ryy; /* rotation r22 */
    double ryz; /* rotation r23 */
    double rzx; /* rotation r31 */
    double rzy; /* rotation r32 */
    double rzz; /* rotation r33 */
    double tx; /* lateral displacement */
    double ty; /* camera height */
    double tz; /* longitudinal displacement */
} t_CameraLlorca;


#endif
/* -------------- end typedefs ------------- */

#ifdef _CAMERA_

void InitializeCamera(double /*  _fx */, double /*  _fy */, double /*  _cx */, double /*  _cy */,
        double /*  _k0 */, double /*  _k1 */, double /*  _k2 */, double /*  _k3 */,
        double /*  _ax */, double /*  _ay */, double /*  _az */,
        double /*  _tx */, double /*  _ty */, double /*  _tz */,
        t_CameraLlorca */* camera */);

void World2Cam(t_CameraLlorca * /* camera */, double /* xw */, double /* yw */, double /* zw */,
        double */* xc */, double */* yc */, double */* zc */);
void Cam2Img(t_CameraLlorca */* camera */, double /* xc */, double /* yc */, double /* zc */,
        int */* xi */, int */* yi */);
void World2Img(t_CameraLlorca *camera, double xw, double yw, double zw,
        int *xi, int *yi);

void Img2Cam(t_CameraLlorca */* camera */, double /* xi */, double /* yi */, double */* xc */, double */* yc */);
void Cam2WorldX(t_CameraLlorca */* camera */, double /* xc */, double /* yc */, double /* xw */,
        double */* yw */, double */* zw */);
void Cam2WorldY(t_CameraLlorca */* camera */, double /* xc */, double /* yc */, double /* yw */,
        double */* xw */, double */* zw */);
void Cam2WorldZ(t_CameraLlorca */* camera */, double /* xc */, double /* yc */, double /* zw */,
        double */* xw */, double */* yw */);
void Img2WorldX(t_CameraLlorca */* camera */, double /* xi */, double /* yi */, double /* xw */,
        double */* yw */, double */* zw */);
void Img2WorldY(t_CameraLlorca */* camera */, double /* xi */, double /* yi */, double /* yw */,
        double */* xw */, double */* zw */);
void Img2WorldZ(t_CameraLlorca */* camera */, double /* xi */, double /* yi */, double /* zw */,
        double */* xw */, double */* yw */);



#else

extern void InitializeCamera(double /* _fx */, double /* _fy */, double /* _cx */, double /* _cy */,
        double /* _k0 */, double /* _k1 */, double /* _k2 */, double /* _k3 */,
        double /* _ax */, double /* _ay */, double /* _az */,
        double /* _tx */, double /* _ty */, double /* _tz */,
        t_CameraLlorca */* camera */);

extern void World2Cam(t_CameraLlorca * /* camera */, double /* xw */, double /* yw */, double /* zw */,
        double */* xc */, double */* yc */, double */* zc */);
extern void Cam2Img(t_CameraLlorca */* camera */, double /* xc */, double /* yc */, double /* zc */,
        int */* xi */, int */* yi */);
extern void World2Img(t_CameraLlorca *camera, double xw, double yw, double zw,
        int *xi, int *yi);


extern void Img2Cam(t_CameraLlorca */* camera */, double /* xi */, double /* yi */, double */* xc */, double */* yc */);
extern void Cam2WorldX(t_CameraLlorca */* camera */, double /* xc */, double /* yc */, double /* xw */,
        double */* yw */, double */* zw */);
extern void Cam2WorldY(t_CameraLlorca */* camera */, double /* xc */, double /* yc */, double /* yw */,
        double */* xw */, double */* zw */);
extern void Cam2WorldZ(t_CameraLlorca */* camera */, double /* xc */, double /* yc */, double /* zw */,
        double */* xw */, double */* yw */);
extern void Img2WorldX(t_CameraLlorca */* camera */, double /* xi */, double /* yi */, double /* xw */,
        double */* yw */, double */* zw */);
extern void Img2WorldY(t_CameraLlorca */* camera */, double /* xi */, double /* yi */, double /* yw */,
        double */* xw */, double */* zw */);
extern void Img2WorldZ(t_CameraLlorca */* camera */, double /* xi */, double /* yi */, double /* zw */,
        double */* xw */, double */* yw */);


#endif
