#ifndef UI_TRACKER_SCENE_H_
#define UI_TRACKER_SCENE_H_
#include <QGLWidget>
#include <QTimer>
#include "ui/tracker/gl.h"
#include "libmv/simple_pipeline/camera_intrinsics.h"
#include "libmv/simple_pipeline/reconstruction.h"
struct Object {
mat4 transform;
QVector<int> tracks;
void position(const libmv::EuclideanReconstruction& reconstruction,
vec3* min, vec3* max) const;
};
class Scene : public QGLWidget {
Q_OBJECT
public:
Scene(libmv::CameraIntrinsics* intrinsics, QGLWidget *shareWidget = 0);
~Scene();
void Load(QString path);
void SetImage(int image);
void Render(int w, int h, int image = -1);
void SetReconstruction(const libmv::EuclideanReconstruction& reconstruction) {
reconstruction_ = reconstruction;
}
public slots:
void select(QVector<int>);
void add();
void link();
void upload();
signals:
void trackChanged(QVector<int> track);
void imageChanged(int image);
void objectChanged();
protected:
void paintGL();
void keyPressEvent(QKeyEvent*);
void keyReleaseEvent(QKeyEvent*);
void mousePressEvent(QMouseEvent*);
void mouseMoveEvent(QMouseEvent*);
void mouseReleaseEvent(QMouseEvent*);
void timerEvent(QTimerEvent*);
private:
void DrawPoint(const libmv::EuclideanPoint& point, QVector<vec3> *points);
void DrawCamera(const libmv::EuclideanCamera& camera, QVector<vec3> *lines);
void DrawObject(const Object& object, QVector<vec3> *quads);
libmv::CameraIntrinsics* intrinsics_;
libmv::EuclideanReconstruction reconstruction_;
QVector<Object> objects_;
GLBuffer bundles_;
GLBuffer cameras_;
GLBuffer cubes_;
QPoint drag_;
bool grab_;
float pitch_, yaw_, speed_;
int walk_, strafe_, jump_;
vec3 position_;
QBasicTimer timer_;
mat4 projection_;
mat4 view_;
QVector<int> selected_tracks_;
int current_image_;
Object* active_object_;
};
#endif