Ejemplo n.º 1
0
int CEditModel::PickSkeletal( PickSkeletalParam& Pick )
{
	if( !GetSketetalFrame()|| !GetAnimateGroup() )
		return GERROR;

	CCamera* pCamera = CMainWindowTarget::GetInst()->GetCamera();


	CMatrix matView = pCamera->getViewMatrix();
	matView.InvertFast();
	CMatrix matProj = pCamera->getProjectionMatrix();

	CMatrix matViewProj = pCamera->getViewProjectMatrix();

	UINT i = 0,j = 0;
	for( i = 1; i < m_RenderMatrix.GetSkeletalCount(); i++ )
	{
		m_SkeletalPos[i].m_IsSelected = FALSE;

		CMatrix tScaleMat;
		CMatrix	tRotateMat;
		tRotateMat.SetRotateZ(-CMath::half_pi);
		tScaleMat.SetScale(CVector3f(m_SkeletalPos[i].m_Scale));

		if(!m_RenderMatrix.m_pMatrixUnit[i])
			continue;
		CMatrix matrix = m_RenderMatrix.m_pMatrixUnit[i]->GetMATRIX();

		CVector3f PickVer[6];
		CVector3f cur = CVector3f( (float)Pick.m_CurPos.x, (float)Pick.m_CurPos.y, 0);
		float z = FLT_MAX;
		int n1 = 0, n2 = 0;

		for( j = 0; j < 6; j++ )
		{
			PickVer[j] = SklPos[j];
			PickVer[j].FastMultiply(tScaleMat*tRotateMat*matrix );

			//z = min( PickVer[j].z, z );//求出这个点的zubffer以便于之后选择离屏幕最近的那根骨骼
		}

		CVector3f v;
		v.x = ( cur.x/Pick.m_Size.x - 1 ) / matProj._11;
		v.y = -( cur.y/Pick.m_Size.y - 1 ) / matProj._22;
		v.z = 1.0f;
		

		CVector3f vPickRayDir,vPickRayOrig;
		vPickRayDir.x = v.x*matView._11 + v.y*matView._21 + v.z*matView._31;
		vPickRayDir.y = v.x*matView._12 + v.y*matView._22 + v.z*matView._32;
		vPickRayDir.z = v.x*matView._13 + v.y*matView._23 + v.z*matView._33;
		vPickRayOrig.x = matView._41;
		vPickRayOrig.y = matView._42;
		vPickRayOrig.z = matView._43;

		float fu,fv,fd;
		BOOL IsPicked = FALSE;
		for( j = 0; j < 8; j++)
		{
			WORD* ind = SkeletalIndex + j*3;

			IsPicked = CMath::IntersectTri(PickVer[ind[0]],PickVer[ind[1]],PickVer[ind[2]],vPickRayOrig,vPickRayDir,fu,fv,fd);
			if(IsPicked)
				break;
		}

		if( /*z<Pick.m_Z&&*/IsPicked )
		{
			//Pick.m_Z = z;
			Pick.m_SkeletalID = i;
		}
	}

	if( Pick.m_SkeletalID )
	{
		m_SkeletalPos[ Pick.m_SkeletalID ].m_IsSelected = TRUE;
	}
	Pick.m_SkeletalName = GetSketetalFrame()->GetRootSkeletal().GetSkeletalNameByID( Pick.m_SkeletalID );
	DataChange();
	return 0;
}