Example #1
0
void	MotionHandler(int x, int y)
// Handles mouse motion.
{
	float	dx = x - LastMouseX;
	float	dy = y - LastMouseY;
	LastMouseX = x;
	LastMouseY = y;
	
	if (LeftButton && RightButton) {
		// Translate in the view plane.
		vector	right = ViewerDir.cross(ViewerUp);
		ViewerLoc += right * dx / 3 * Speed + ViewerUp * -dy / 3 * Speed;
		
	} else if (LeftButton) {
		// Rotate the viewer.
		ViewerTheta += -dx / 100;
		while (ViewerTheta < 0) ViewerTheta += 2 * PI;
		while (ViewerTheta >= 2 * PI) ViewerTheta -= 2 * PI;

		ViewerPhi += -dy / 100;
		const float	plimit = PI / 2;
		if (ViewerPhi > plimit) ViewerPhi = plimit;
		if (ViewerPhi < -plimit) ViewerPhi = -plimit;

		ViewerDir = vector(1, 0, 0);
		ViewerUp = vector(0, 1, 0);
		
		ViewerDir = Geometry::Rotate(ViewerTheta, ViewerUp, ViewerDir);
		vector	right = ViewerDir.cross(ViewerUp);
		ViewerDir = Geometry::Rotate(ViewerPhi, right, ViewerDir);
		ViewerUp = Geometry::Rotate(ViewerPhi, right, ViewerUp);
		
	} else if (RightButton) {
		// Translate the viewer.
		vector	right = ViewerDir.cross(ViewerUp);
		ViewerLoc += right * dx / 3 * Speed + ViewerDir * -dy / 3 * Speed;
	}
}
Example #2
0
inline std::pair<vector,vector> basis(const vector& v1)
{
    // see PBRT v2 p63

    vector v2;

    if(std::fabs(v1.x) > std::fabs(v1.y))
    {
        float inv_length = 1.f / std::sqrt(v1.x*v1.x + v1.z*v1.z);

        v2 = vector(-v1.z * inv_length, 0, v1.x * inv_length);
    }
    else
    {
        float inv_length = 1.f / std::sqrt(v1.y*v1.y + v1.z*v1.z);

        v2 = vector(0, v1.z * inv_length, -v1.y * inv_length);
    }

    vector v3 = v1.cross(v2);

    return std::make_pair(v2,v3);
}
Example #3
0
inline vector
cross( const vector& v1, const vector& v2)
{ return v1.cross( v2); }
Example #4
0
inline vector<T,D> cross( const vector<T,D>& left, const vector<T,D>& right ) {
	return left.cross(right);
}