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

📄 mtoolmousestatus.cpp

📁 墨香最新私服
💻 CPP
字号:
// ToolMouseStatus.cpp: implementation of the CToolMouseStatus class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
//#include "4DyuchiGXMapEditor.h"
#include "MToolMouseStatus.h"
#include "../4dyuchigrx_common/typedef.h"
#include "../4DyuchiGXGFunc/global.h"

//#include "tool.h"

//extern CTool* g_pTool;


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif


//	¸¶¿ì½º À̺¥Æ®.
#define		MOUSE_NONE					0
#define		MOUSE_ROTATE				1
#define		MOUSE_MOVEHORIZON			2
#define		MOUSE_MOVEVERTICAL			3
#define		MOUSE_ROTATE_WITH_PIVOT		4

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

MToolMouseStatus::MToolMouseStatus()
{

}

MToolMouseStatus::~MToolMouseStatus()
{

}

BOOL MToolMouseStatus::Initialize( I4DyuchiGXGeometry* pGeometry)
{
	mfMoveHorizonStep		=	1.0f;
	mfMoveVerticalStep		=	10.0f;
//	fRotateStep		=	0.2f;	// Shift¿¡ ÀÇÇØ »óŰ¡ ´Þ¶óÁö´Â ȸÀü, À̵¿ ¼Óµµ°ª.
	mfRotateStep		=	0.2f * PI / 180.0f;	// Shift¿¡ ÀÇÇØ »óŰ¡ ´Þ¶óÁö´Â ȸÀü, À̵¿ ¼Óµµ°ª.
	mpGeometry = pGeometry;
	mbDoNotRotate		=	FALSE;

	miMouseX	=	-1;
	miMouseY	=	-1;
	miMouseZ	=	-1;

	miOldMouseX	=	-1;
	miOldMouseY	=	-1;

	mbLButtonDown	=	false;
	mbRButtonDown	=	false;
	mbMButtonDown	=	false;
	mbCtrlDown		=	false;
	mbShiftDown		=	false;		// ½¬ÇÁÆ® ¹öưÀº °í¼Ó À̵¿.

	mdwMouseMode	=	MOUSE_NONE;



	return TRUE;
}
bool MToolMouseStatus::MoveMouse(DWORD dwFlag, int iMouseX, int iMouseY)
{
	if( mpGeometry == 0)
	{
		__asm int 3
		// ·£´õ·¯°¡ ¾ÆÁ÷ ¼³Á¤ ¾È‰ç´Ù.
	}
	if( miMouseX == -1 || miMouseY == -1)
	{
		miOldMouseX	=	iMouseX;
		miOldMouseY	=	iMouseY;
	}
	miMouseX	=	iMouseX;
	miMouseY	=	iMouseY;

	//	ÄÁÆ®·ÑŰ.
	mbCtrlDown	=	false;
	if( dwFlag & MK_CONTROL)
	{
		mbCtrlDown	=	true;
	}
	//	½ÃÇÁƮŰ.
	mbShiftDown	=	false;
	if( dwFlag & MK_SHIFT)
	{
		mbShiftDown	=	true;
//		fMoveHorizonStep		=	5.0f;
//		fMoveVerticalStep		=	50.0f;
//		fRotateStep		=	0.5f;	// Shift¿¡ ÀÇÇØ »óŰ¡ ´Þ¶óÁö´Â ȸÀü, À̵¿ ¼Óµµ°ª.
	}
	else
	{
//		fMoveHorizonStep		=	1.0f;
//		fMoveVerticalStep		=	10.0f;
//		fRotateStep		=	0.2f;	// Shift¿¡ ÀÇÇØ »óŰ¡ ´Þ¶óÁö´Â ȸÀü, À̵¿ ¼Óµµ°ª.
	}
	//	¸¶¿ì½º ¿ÞÂÊ ¹öư.
	mbLButtonDown	=	false;
	if( dwFlag & MK_LBUTTON)
	{
		mbLButtonDown	=	true;
	}
	//	¸¶¿ì½º Áß°£ ¹öư.
	mbMButtonDown	=	false;
	if( dwFlag & MK_MBUTTON)
	{
		mbMButtonDown	=	true;
	}
	//	¸¶¿ì½º ¿À¸¥ÂÊ ¹öư.
	mbRButtonDown	=	false;
	if( dwFlag & MK_RBUTTON)
	{
		mbRButtonDown	=	true;
	}

	// ¸ðµå¿¡ µû¸¥ ½ºÀ§Ä¡, ÇÔ¼ö ÄÝ.
	switch( mdwMouseMode)
	{
		case	MOUSE_NONE:
				miOldMouseX = iMouseX;
				miOldMouseY = iMouseY;
			// ¸¶¿ì½º ¿À¸¥ÂÊ ¹öư¸¸ ´­¸° °æ¿ì.
			// ȸÀü ¸ðµå·Î.
			if( !mbLButtonDown && !mbMButtonDown && mbRButtonDown && !mbCtrlDown && !mbShiftDown)	
			{
				mdwMouseMode = MOUSE_ROTATE;	
			}
			// ¸¶¿ì½º ¿À¸¥ÂÊ ¹öư°ú ÄÁÆ®·ÑÀÌ ´­·ÁÁ³À» °æ¿ì.
			//	¼öÆò À̵¿ ¸ðµå·Î.
			else if( !mbLButtonDown && !mbMButtonDown && mbRButtonDown && mbCtrlDown && !mbShiftDown)	
			{
				mdwMouseMode	=	MOUSE_MOVEHORIZON;
			}
			// ¸¶¿ì½º ¿À¸¥ÂÊ ¹öư°ú ½ÃÇÁÆ®°¡ ´­·ÁÁø °æ¿ì.
			//	¼öÁ÷(³ôÀÌ) À̵¿ ¸ðµå·Î.
			else if( !mbLButtonDown && !mbMButtonDown && mbRButtonDown && !mbCtrlDown && mbShiftDown)	
			{
				mdwMouseMode	=	MOUSE_MOVEVERTICAL;
			}
			// ¸¶¿ì½º ¿À¸¥ÂÊ ¹öư°ú ½ÃÇÁÆ®,ÄÁÆ®·ÑÀÌ µ¿½Ã¿¡ ´­·ÁÁø °æ¿ì.
			//	ÁÖ¾îÁø ÇǺ¿À» Áß½ÉÀ¸·Î ȸÀüÇÑ´Ù.
			else if( !mbLButtonDown && !mbMButtonDown && mbRButtonDown && mbCtrlDown && mbShiftDown)	
			{
				mdwMouseMode	=	MOUSE_ROTATE_WITH_PIVOT;
			}

			return this->MouseNone();
			break;
		case	MOUSE_ROTATE:
			if( mbLButtonDown || mbMButtonDown || !mbRButtonDown || mbCtrlDown || mbShiftDown)	// ¾î¶»°Ôµç »óŰ¡ ´Þ¶óÁö¸é ¸ðµå ÇØÁ¦.
			{
				mdwMouseMode	=	MOUSE_NONE;
			}
			else
			{
				return	this->MouseRotate();
			}

			break;
		case	MOUSE_MOVEHORIZON:
			if( mbLButtonDown || mbMButtonDown || !mbRButtonDown || !mbCtrlDown || mbShiftDown)	// ¾î¶»°Ôµç »óŰ¡ ´Þ¶óÁö¸é ¸ðµå ÇØÁ¦.
			{
				mdwMouseMode	=	MOUSE_NONE;
			}
			else
			{
				return	this->MouseMoveHorizon();
			}
			break;
		case	MOUSE_MOVEVERTICAL:
			if( mbLButtonDown || mbMButtonDown || !mbRButtonDown || mbCtrlDown || !mbShiftDown)	// ¾î¶»°Ôµç »óŰ¡ ´Þ¶óÁö¸é ¸ðµå ÇØÁ¦.
			{
				mdwMouseMode	=	MOUSE_NONE;
			}
			else
			{
				return	this->MouseMoveVertical();
			}
			break;
		case	MOUSE_ROTATE_WITH_PIVOT:
			if( mbLButtonDown || mbMButtonDown || !mbRButtonDown || !mbCtrlDown || !mbShiftDown)	// ¾î¶»°Ôµç »óŰ¡ ´Þ¶óÁö¸é ¸ðµå ÇØÁ¦.
			{
				mdwMouseMode	=	MOUSE_NONE;
			}
			else
			{
				return	this->MouseRotateWithPivot();
			}
			break;
		default:
			break;
	}

return false;
}

bool MToolMouseStatus::MouseNone()
{
	// ¾Æ¹«°Íµµ ¾ÈÇÑ´Ù. -_-;
	return false;
}

bool MToolMouseStatus::MouseRotate()
{
	if( mbDoNotRotate == TRUE)	return true;		// ¸¶¿ì½º ·ÎÅ×ÀÌÆ® ±ÝÁö ¸ðµåÀϰæ¿ì...

	float	x = float(miMouseX - miOldMouseX) * mfRotateStep;
	float	y = float(miMouseY - miOldMouseY) * mfRotateStep;
	VECTOR3	Rotate;
	Rotate.x = -y;
	Rotate.y = x;
	Rotate.z = 0;


	mpGeometry->RotateCameraRad(&Rotate,0);

	miOldMouseX	=	miMouseX;
	miOldMouseY	=	miMouseY;

	return true;
}

bool MToolMouseStatus::MouseRotateWithPivot()
{
	if( mbDoNotRotate == TRUE)	return true;		// ¸¶¿ì½º ·ÎÅ×ÀÌÆ® ±ÝÁö ¸ðµåÀϰæ¿ì...
//	¿©±â

	mRotationPivot.x	=	50.0f;
	mRotationPivot.y	=	0.0f;
	mRotationPivot.z	=	0.0f;


	float	fRotateYaw		=	float(miMouseX - miOldMouseX) * mfRotateStep;
	float	fRotatePitch	=	-1.0f * float(miMouseY - miOldMouseY) * mfRotateStep;
	VECTOR3	Rotate;
	VECTOR3		NewPos, CurrentPos;
	CAMERA_DESC Desc;
	mpGeometry->GetCameraDesc( &Desc, 0);
	CurrentPos	=	Desc.v3From;

	VECTOR3		CameraAngle;
	mpGeometry->GetCameraAngleRad( &CameraAngle, 0);
/*
	if( CameraAngle.x >= (PI-0.01)/2.0f)	// Ä«¸Þ¶ó°¡ ¾Æ·¡¸¦ º¸°í ÀÖÀ» °æ¿ì.
	{
		_asm int 3;
	}
	else if( CameraAngle.x <= -1.0f * (PI-0.01)/2.0f)	// Ä«¸Þ¶ó°¡ ¾Æ·¡¸¦ º¸°í ÀÖÀ» °æ¿ì.
	{
		_asm int 3;
	}
*/
	// ÇǺ¿À» ±âÁØÀ¸·Î À§Ä¡¸¦ ¿Å±â°í,
	RotatePositionWithPivot( &NewPos, &mRotationPivot, &CurrentPos, &CameraAngle, fRotateYaw, fRotatePitch);
	mpGeometry->SetCameraPos( &NewPos, 0);

	// ¸¶¿ì½º¸¦ ·ÎÅ×ÀÌÆ®.	(À§Ä¡ ¿Å±â´Â°Í°úÀÇ ¼ø¼­´Â °ü°è ¾ø´Ù.)
	Rotate.x = fRotatePitch;
	Rotate.y = fRotateYaw;
	Rotate.z = 0;
	mpGeometry->RotateCameraRad(&Rotate,0);

	miOldMouseX	=	miMouseX;
	miOldMouseY	=	miMouseY;

	return true;
}

bool MToolMouseStatus::MouseMoveHorizon()
{
	float	x	=	float(miMouseX - miOldMouseX) * mfMoveHorizonStep * -1.0f;
	float	y	=	float(miMouseY - miOldMouseY) * mfMoveHorizonStep * -1.0f;
	
	VECTOR3	Rot;
	mpGeometry->GetCameraAngleRad(&Rot,0);

	VECTOR3	To;
	To.x	=	(-1 * x * (float)cosf(Rot.y) *10.0f + y * (float)sinf(Rot.y)*10.0f);
	To.y	=	0.0f;
	To.z	=	x * (float)sinf(Rot.y) *10.0f + y * (float)cosf(Rot.y)*10.0f;

	mpGeometry->MoveCamera( &To,0);

	miOldMouseX	=	miMouseX;
	miOldMouseY	=	miMouseY;
						
	return true;
}

bool MToolMouseStatus::MouseMoveVertical()
{
	VECTOR3		To;
	To.x	=	0;
	To.y	=	float(miMouseY - miOldMouseY) * mfMoveVerticalStep * -1;
	To.z	=	0;
	mpGeometry->MoveCamera(&To,0);

	miOldMouseX	=	miMouseX;
	miOldMouseY	=	miMouseY;

	return true;
}


void	MToolMouseStatus::DoNotRotate(void)
{
	mbDoNotRotate	=	TRUE;
}


void	MToolMouseStatus::AllowRotate(void)
{
	mbDoNotRotate	=	FALSE;
}

void	MToolMouseStatus::PushCameraAngleAndPos(DWORD dwStackNum)
{
	CAMERA_DESC		Desc;
	mpGeometry->GetCameraDesc(&Desc,0);
	mpCameraStackPos[dwStackNum]		=	Desc.v3From;
	mpfCameraStackFromTo[dwStackNum]	=	CalcDistance( &(Desc.v3From), &(Desc.v3To));
	mpGeometry->GetCameraAngleRad(&mpCameraStackAngle[dwStackNum],0);
}

void	MToolMouseStatus::PopCameraAngleAndPos(DWORD dwStackNum)
{
	VECTOR3	To	=	mpCameraStackPos[dwStackNum];
	To.z	=	To.z + mpfCameraStackFromTo[dwStackNum];
	VECTOR3 Up;
	Up.x = Up.z = 0;
	Up.y = 1;
		
	float fNear = DEFAULT_NEAR;
	float fFar = DEFAULT_FAR;
	

	mpGeometry->ResetCamera( &(mpCameraStackPos[dwStackNum]),fNear,fFar,DEFAULT_FOV,0);
//	mpGeometry->ResetCamera( &(mpCameraStackPos[dwStackNum]),fNear,5000.0f,DEFAULT_FOV,0);
	mpGeometry->SetCameraAngleRad( &(mpCameraStackAngle[dwStackNum]),0 );
}

void MToolMouseStatus::SetRotationPivot(VECTOR3 *pPivot)
{
	mRotationPivot	=	*pPivot;
}

⌨️ 快捷键说明

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