
#ifndef _JL_JLTrackball_H_
#define _JL_JLTrackball_H_

// original code by Gavin Bell
// wrapped in C++ class by Justin Legakis

#include <stdlib.h>
#include <iostream.h>

#include "jllib_include.h"
#include "quaternion.h"


class JLmatrix;


class JLTrackball {

	public:
		enum TrackballType { Full_3D, Y_Up };

	private:
		TrackballType	_type;
		float			_lastx, _lasty;
		float			_lastdx, _lastdy;
		float			_rot_x, _rot_y;
		Quaternion		_spinning_quat;
		Quaternion		_rotation_quat;
		float			_radius;

	public: 
		JLTrackball(TrackballType = Full_3D);
		JLTrackball(const JLTrackball &J) { CopyFrom(J); }
		virtual ~JLTrackball();

		JLTrackball& CopyFrom(const JLTrackball&);
		JLTrackball& operator=(const JLTrackball &J) { return CopyFrom(J); }

		JLTrackball& Reset();
		JLTrackball& Click(float x, float y);
		JLTrackball& Drag(float x, float y);
		JLTrackball& Spin();

		void BuildIncrMatrix(Matrix m) const;
		void BuildIncrMatrix(JLmatrix &m) const;
		void BuildRotationMatrix(Matrix m) const;
		void BuildRotationMatrix(JLmatrix &m) const;

		void SetRot (const Quaternion &q) {_rotation_quat = q;}

	private:
		float _ProjectToSphere(float x, float y);
		void _DoTrackball(float new_x, float new_y);
};

#endif
