//===========================================================================//
// File:	motion.hh                                                           //
// Project: MUNGA           Brick: Math Library                              //
// Contents: Implementation details for the position class                   //
//---------------------------------------------------------------------------//
//   Date    Who  Modification                                               //
// --------  ---  ---------------------------------------------------------- //
// 01/30/95  JMA  Initial coding.                                            //
//---------------------------------------------------------------------------//
// Copyright (C) 1995, Virtual World Entertainment, Inc.                     //
// All Rights reserved worldwide                                             //
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL               //
//===========================================================================//

#pragma once

#include "Stuff.hpp"
#include "Vector3D.hpp"

namespace Stuff {class Motion3D;}

#if !defined(Spew)
	void
		Spew(
			const char* group,
			const Stuff::Motion3D& motion
		);
#endif

namespace Stuff {

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~ Motion3D ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	class Motion3D
	{
	 public:
		Vector3D
			linearMotion;
		Vector3D
			angularMotion;

		static const Motion3D
			Identity;

		//
		// Constructors
		//
		Motion3D()
			{}
		Motion3D(const Motion3D& motion);
		Motion3D(
			const Vector3D& t,
			const Vector3D& q
		)
			{Check_Object(&t); Check_Object(&q); linearMotion = t; angularMotion = q;}

		//
		// Assignment operators
		//
		Motion3D&
			operator=(const Motion3D& p);

		friend bool
			Close_Enough(
				const Motion3D &a1,
				const Motion3D &a2,
				Scalar e=SMALL
			);
		bool
			operator==(const Motion3D& a) const
				{return Close_Enough(*this,a,SMALL);}
		bool
			operator!=(const Motion3D& a) const
				{return !Close_Enough(*this,a,SMALL);}

		//
		// Origin3D motion
		//
		Motion3D&
			AddScaled(
				const Motion3D& source,
				const Motion3D& delta,
				Scalar t
			);

		//
		// Support functions
		//
		#if !defined(Spew)
			friend void
				::Spew(
					const char* group,
					const Motion3D& motion
				);
		#endif
		void
			TestInstance() const;
		static bool
			TestClass();
	};

}

namespace MemoryStreamIO {

	inline Stuff::MemoryStream&
		Read(
			Stuff::MemoryStream* stream,
			Stuff::Motion3D *output
		)
			{return stream->ReadBytes(output, sizeof(*output));}
	inline Stuff::MemoryStream&
		Write(
			Stuff::MemoryStream* stream,
			const Stuff::Motion3D *input
		)
			{return stream->WriteBytes(input, sizeof(*input));}

}
