⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matrix.hpp

📁 机甲指挥官2源代码
💻 HPP
📖 第 1 页 / 共 2 页
字号:
//===========================================================================//
// File:	matrix.hh                                                        //
// Contents: Interface specification for the matrix class                    //
//---------------------------------------------------------------------------//
// Copyright (C) Microsoft Corporation. All rights reserved.                 //
//===========================================================================//

#pragma once

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

namespace Stuff {class Matrix4D;}

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

namespace Stuff {

	class AffineMatrix4D;
	class Origin3D;
	class EulerAngles;
	class YawPitchRoll;
	class Point3D;
	class UnitQuaternion;

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Matrix4D ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	class Matrix4D
	{
	public:
		static const Matrix4D
			Identity;

		Scalar
			entries[16];

		//
		// Constructors
		//
		Matrix4D()
			{}
		Matrix4D&
			BuildIdentity();
		explicit Matrix4D(int)
			{BuildIdentity();}
		Matrix4D(const Matrix4D &matrix)
			{
				Check_Pointer(this); Check_Object(&matrix);
				memcpy(entries, matrix.entries, sizeof(entries));
			}
		explicit Matrix4D(const AffineMatrix4D &m)
			{*this = m;}
		explicit Matrix4D(const Origin3D &p)
			{*this = p;}
		explicit Matrix4D(const EulerAngles &angles)
			{*this = angles;}
		explicit Matrix4D(const YawPitchRoll &angles)
			{*this = angles;}
		explicit Matrix4D(const UnitQuaternion &q)
			{*this = q;}
		explicit Matrix4D(const Point3D &p)
			{*this = p;}

		//
		// Assignment operators
		//
		Matrix4D&
			operator=(const Matrix4D &m)
				{
					Check_Pointer(this); Check_Object(&m);
					memcpy(entries, m.entries, sizeof(m.entries));
					return *this;
				}
		Matrix4D&
			operator=(const AffineMatrix4D &m);
		Matrix4D&
			operator=(const Origin3D &p);
		Matrix4D&
			operator=(const EulerAngles &angles);
		Matrix4D&
			operator=(const YawPitchRoll &angles);
		Matrix4D&
			operator=(const UnitQuaternion &q);
		Matrix4D&
			operator=(const Point3D &p);

		Matrix4D&
			BuildRotation(const EulerAngles &angles);
		Matrix4D&
			BuildRotation(const YawPitchRoll &angles);
		Matrix4D&
			BuildRotation(const UnitQuaternion &q);
		Matrix4D&
			BuildTranslation(const Point3D &p);

		//
		// Comparison operators
		//
		friend bool
			Close_Enough(
				const Matrix4D &m1,
				const Matrix4D &m2,
				Scalar e=SMALL
			);
		bool
			operator==(const Matrix4D& a) const
				{return Close_Enough(*this,a,SMALL);}
		bool
			operator!=(const Matrix4D& a) const
				{return !Close_Enough(*this,a,SMALL);}

		//
		// Index operators
		//
		Scalar&
			operator ()(size_t row,size_t column)
				{
					Check_Pointer(this);
					Verify(static_cast<unsigned>(row) <= W_Axis);
					Verify(static_cast<unsigned>(column) <= W_Axis);
					return entries[(column<<2)+row];
				}
		const Scalar&
			operator ()(size_t row,size_t column) const
				{
					Check_Pointer(this);
					Verify(static_cast<unsigned>(row) <= W_Axis);
					Verify(static_cast<unsigned>(column) <= W_Axis);
					return entries[(column<<2)+row];
				}

		//
		// Matrix4D Multiplication
		//
		Matrix4D&
			Multiply(
				const Matrix4D& Source1,
				const Matrix4D& Source2
			);
		Matrix4D&
			operator *=(const Matrix4D& m)
				{Matrix4D temp(*this); return Multiply(temp,m);}
		Matrix4D&
			Multiply(
				const Matrix4D& Source1,
				const AffineMatrix4D &Source2
			);
		Matrix4D&
			operator *=(const AffineMatrix4D& m)
				{Matrix4D temp(*this); return Multiply(temp,m);}
		inline Matrix4D&
			Multiply(
				const AffineMatrix4D &Source1,
				const Matrix4D& Source2
			)
			{
				Check_Pointer(this);
				Check_Object(&Source1);
				Check_Object(&Source2);

#if USE_ASSEMBLER_CODE
				Scalar *f = entries;
				_asm {
                    mov         edx, Source1.entries
					push        esi
					mov         esi, Source2.entries
					
					mov         eax, f

					fld         dword ptr [edx]			//	s1[0][0]
					fmul        dword ptr [esi]			//	s2[0][0]	M0,1

					fld         dword ptr [edx+010h]	//	s1[0][1]
					fmul        dword ptr [esi+4]		//	s2[1][0]	M0,2
					
					fld         dword ptr [edx+020h]	//	s1[0][2]
					fmul        dword ptr [esi+8]		//	s2[2][0]	M0,3

					fxch		st(2)
					faddp       st(1),st				//				A0,1

					fld         dword ptr [edx+4]		//	s1[1][0]
					fmul        dword ptr [esi]			//	s2[0][0]	M1,1

					fxch		st(2)
					faddp       st(1),st				//				A0,2

					fld         dword ptr [edx+14h]		//	s1[1][1]
					fmul        dword ptr [esi+4]		//	s2[1][0]	M1,2
					
					fxch		st(1)
					fstp        dword ptr [eax]			//	[0][0]		S0

					fld         dword ptr [edx+24h]		//	s1[1][2]
					fmul        dword ptr [esi+8]		//	s2[2][0]	M1,3

					fxch		st(2)
					faddp       st(1),st				//				A1,1

					fld         dword ptr [edx+8]		//	s1[2][0]
					fmul        dword ptr [esi]			//	s2[0][0]	M2,1

					fxch		st(2)
					faddp       st(1),st				//				A1,2

					fld         dword ptr [edx+018h]	//	s1[2][1]
					fmul        dword ptr [esi+4]		//	s2[1][0]	M2,2

					fxch		st(1)
					fstp        dword ptr [eax+4]		//	[1][0]		S1

					fld         dword ptr [edx+28h]		//	s1[2][2]
					fmul        dword ptr [esi+8]		//	s2[2][0]	M2,3
					
					fxch		st(2)
					faddp       st(1),st				//				A2,1

					fld         dword ptr [edx+0ch]		//	s1[3][0]
					fmul        dword ptr [esi]			//	s2[0][0]	M3,1

					fxch		st(2)
					faddp       st(1),st				//				A2,2

					fld         dword ptr [edx+1ch]		//	s1[3][1]
					fmul        dword ptr [esi+4]		//	s2[1][0]	M3,2

					fxch		st(1)
					fstp        dword ptr [eax+8]		//	[2][0]		S2

					fld         dword ptr [edx+2ch]		//	s1[3][2]
					fmul        dword ptr [esi+8]		//	s2[2][0]	M3,3

					fxch		st(2)
					faddp       st(1),st				//				A3,1

//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

					fld         dword ptr [edx]			//	s1[0][0]
					fmul        dword ptr [esi+010h]	//	s2[0][1]	M0,1

					fxch		st(2)
					faddp		st(1),st				//				A3,2

					fld         dword ptr [edx+010h]	//	s1[0][1]
					fmul        dword ptr [esi+014h]	//	s2[1][1]	M0,2

					fxch		st(1)
					fadd        dword ptr [esi+0Ch]		//	s2[3][0]	A3,3
					
					fld         dword ptr [edx+020h]	//	s1[0][2]
					fmul        dword ptr [esi+018h]	//	s2[2][1]	M0,3

					fxch		st(1)
					fstp        dword ptr [eax+0Ch]		//	[3][0]		S3

//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv

					fxch		st(2)
					faddp       st(1),st				//				A0,1

					fld         dword ptr [edx+4]		//	s1[1][0]
					fmul        dword ptr [esi+010h]	//	s2[0][1]	M1,1

					fxch		st(2)
					faddp       st(1),st				//				A0,2

					fld         dword ptr [edx+014h]	//	s1[1][1]
					fmul        dword ptr [esi+014h]	//	s2[1][1]	M1,2
					
					fxch		st(1)
					fstp        dword ptr [eax+010h]	//	[0][1]		S0

					fld         dword ptr [edx+024h]	//	s1[1][2]
					fmul        dword ptr [esi+018h]	//	s2[2][1]	M1,3

					fxch		st(2)
					faddp       st(1),st				//				A1,1

					fld         dword ptr [edx+8]		//	s1[2][0]
					fmul        dword ptr [esi+010h]	//	s2[0][1]	M2,1

					fxch		st(2)
					faddp       st(1),st				//				A1,2

					fld         dword ptr [edx+018h]	//	s1[2][1]
					fmul        dword ptr [esi+014h]	//	s2[1][1]	M2,2

					fxch		st(1)
					fstp        dword ptr [eax+014h]	//	[1][1]		S1

					fld         dword ptr [edx+028h]	//	s1[2][2]
					fmul        dword ptr [esi+018h]	//	s2[2][1]	M2,3
					
					fxch		st(2)
					faddp       st(1),st				//				A2,1

					fld         dword ptr [edx+0ch]		//	s1[3][0]
					fmul        dword ptr [esi+010h]	//	s2[0][1]	M3,1

					fxch		st(2)
					faddp       st(1),st				//				A2,2

					fld         dword ptr [edx+01ch]	//	s1[3][1]
					fmul        dword ptr [esi+014h]	//	s2[1][1]	M3,2

					fxch		st(1)
					fstp        dword ptr [eax+018h]	//	[2][1]		S2

					fld         dword ptr [edx+02ch]	//	s1[3][2]
					fmul        dword ptr [esi+018h]	//	s2[2][1]	M3,3

					fxch		st(2)
					faddp       st(1),st				//				A3,1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -