
#include "strafe_nav.h"

#include "vec4.h"
#include "matrix.h"
#include "jlmouse.h"

#include "globals.h"
#include "globalstate.h"

Strafe_Nav::Strafe_Nav() {
}

Strafe_Nav::~Strafe_Nav() {
}

Strafe_Nav& Strafe_Nav::CopyFrom(const Strafe_Nav &) {

	cerr << "Error: Strafe_Nav::CopyFrom() called" << endl;
	exit(-1);

	return *this;
}

/*
ostream& operator<<(ostream &co, const Strafe_Nav &W) {

	return co;
}

istream& operator>>(istream &ci, Strafe_Nav &W) {

	return ci;
}
*/

void Strafe_Nav::Navigate(CycleState &CS, JLMouse &M) {

	float x, y;

	M.GetFloatXYGivenViewport(x, y, truly_GS->_x_winsize, truly_GS->_y_winsize);

	Vec4 R = truly_GS->_user.GetCamera().R(); // eyepoint
	Vec4 D = truly_GS->_user.GetCamera().D(); // viewdir

	// map mouse x to turning Left/Right in body coords
	// map mouse y to forward/backward motion in body coords
	Vec4 U = truly_GS->_user.GetCamera().U(); // up dir

	// "Right" is Viewdir x Up
	Vec4 Right;
	Vec4FastCross3 ( Right, D, U ); Right.MakeUnit();

	Vec4 xhat, yhat, zhat;
	CS._plane_cache->getHats (xhat, yhat, zhat);
	R += x * truly_GS->_translational_velocity * xhat + y * truly_GS->_translational_velocity * yhat;

	truly_GS->_user.GetCamera().Set(R, D);
}


