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

📄 triangleview.cpp

📁 详细介绍c++编程
💻 CPP
📖 第 1 页 / 共 5 页
字号:

void CTriangleView::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	InitAnim();
	InitScene();

	CMainFrame *pMainFrame;
	LPANIMATION pAnim = this->GetCurrentAnimation();

	pMainFrame = (CMainFrame*)AfxGetMainWnd();
	
	pMainFrame->SetCurrentView(this);
	pMainFrame->SetRoot();

	CString str;
	str.GetBuffer(20);
	str.Format("%s", pAnim->name);

	pMainFrame->AddGroupString(&str);

	pMainFrame->SetCurrentAnim(&str);

	this->UpdateFrameInfo();
	this->PlaySpeed(UP);

	SetTimer(1, 100, NULL);	
}

void CTriangleView::SetActiveBody(int index)
{
	body_id = index; 
	ManipulateBody(0.0f, 0.0f);
	Invalidate(FALSE);
}

BOOL CTriangleView::PreCreateWindow(CREATESTRUCT& cs)
{
	// Add Window styles required for OpenGL before window is created
	cs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CS_OWNDC);

	return CView::PreCreateWindow(cs);
}

void CTriangleView::OnDraw(CDC* pDC)
{
	// Make the rendering context current
	wglMakeCurrent(m_hDC,m_hRC);

	// Call our external OpenGL code
	GLRenderScene(NULL);
	
	// Swap our scene to the front
	SwapBuffers(m_hDC);

	// Allow other rendering contexts to co-exist
	wglMakeCurrent(m_hDC,NULL);
}

#ifdef _DEBUG
void CTriangleView::AssertValid() const
{
	CView::AssertValid();
}

void CTriangleView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CTriangleDoc* CTriangleView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTriangleDoc)));
	return (CTriangleDoc*)m_pDocument;
}
#endif //_DEBUG

void CTriangleView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	CView::OnKeyDown(nChar, nRepCnt, nFlags);
}

void CTriangleView::OnTimer(UINT nIDEvent) 
{
	LPANIMATION pAnim = this->GetCurrentAnimation();

	if(m_bPlay == TRUE)
	{
		m_iPlayCount++;
		if(m_iPlayCount >= m_iPlaySpeed)
		{
			m_iPlayCount = 0;
			pAnim->m_iCurrentFrame ++;
			if(pAnim->m_iCurrentFrame > pAnim->m_iTotalFrame)
			{
				pAnim->m_iCurrentFrame = 1;
			}

			this->UpdateFrameInfo();
			Invalidate(FALSE);
		}
	}

	CView::OnTimer(nIDEvent);
}

void CTriangleView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	m_bLeftCapture = TRUE;
	m_iLeftCurrentX = point.x;
	m_iLeftCurrentY = point.y;
	m_iLeftOldX = point.x;
	m_iLeftOldY = point.y;
	
	CView::OnLButtonDown(nFlags, point);
}

void CTriangleView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	m_bLeftCapture = FALSE;

	CView::OnLButtonUp(nFlags, point);
}

void CTriangleView::OnRButtonDown(UINT nFlags, CPoint point) 
{
	m_bRightCapture = TRUE;
	m_iRightCurrentX = point.x;
	m_iRightCurrentY = point.y;
	m_iRightOldX = point.x;
	m_iRightOldY = point.y;
	
	CView::OnRButtonDown(nFlags, point);
}

void CTriangleView::OnRButtonUp(UINT nFlags, CPoint point) 
{
	m_bRightCapture = FALSE;
	
	CView::OnRButtonUp(nFlags, point);
}

void CTriangleView::OnMouseMove(UINT nFlags, CPoint point) 
{
	float offsetX;
	float offsetY;
	float offsetZ;

	LPANIMATION pAnim = this->GetCurrentAnimation();
	LPFRAME pFrame = this->GetCurrentFrame(pAnim);

	int WinW, WinH;
	RECT rect;

	this->GetClientRect(&rect);

	WinW = rect.left - rect.right;
	WinH = rect.bottom - rect.top;

	if(WinW < 0)
	{
		WinW = -WinW;
	}

	if(WinH < 0)
	{
		WinH = -WinH;
	}

	if(TRUE == m_bLeftCapture)
	{
		m_iLeftOldX = m_iLeftCurrentX;
		m_iLeftOldY = m_iLeftCurrentY;
		m_iLeftCurrentX = point.x;
		m_iLeftCurrentY = point.y;
		offsetX = (float)(m_iLeftCurrentX - m_iLeftOldX);
		offsetY = (float)(m_iLeftCurrentY - m_iLeftOldY);
		offsetZ = offsetY;

		if(TRUE == m_bConstrainX)
		{
			offsetX = 0.0f;
		}

		if(TRUE == m_bConstrainY)
		{
			offsetY = 0.0f;
		}

		if(TRUE == m_bConstrainZ)
		{
			offsetZ = 0.0f;
		}

		switch(m_iManipulateMode)
		{
		  case TRACKBALL:
			m_vTrackBallOffset[X] += offsetX;
			m_vTrackBallOffset[Y] += offsetY;

			  if(m_vTrackBallOffset[X] >= 360.0f)
			  {
				  m_vTrackBallOffset[X] -= 360.0f;
			  }

			  if(m_vTrackBallOffset[Y] >= 360.0f)
			  {
				  m_vTrackBallOffset[Y] -= 360.0f;
			  }

			  if(m_vTrackBallOffset[X] <= 0.0f)
			  {
				  m_vTrackBallOffset[X] += 360.0f;
			  }

			  if(m_vTrackBallOffset[Y] <= 0.0f)
			  {
				  m_vTrackBallOffset[Y] += 360.0f;
			  }
		  break;

		 case TRANSLATE:
			m_vTranslateOffset[X] += offsetX/50.0f;
			m_vTranslateOffset[Y] += -(offsetY/50.0f);
		 break;

		  case DRIVE:
			m_vTrackBallOffset[Z] += offsetY;
		  break;

		  case SELECTBODY:
			ManipulateBody(offsetX, offsetY);
		  break;

		  case TRANSLATEBODY:
			  this->TranslateBody(offsetY);
		  break;
		}
	}

	if(m_bRightCapture)
	{
		m_iRightOldX = m_iRightCurrentX;
		m_iRightOldY = m_iRightCurrentY;
		m_iRightCurrentX = point.x;
		m_iRightCurrentY = point.y;

		lightangle[X] = (m_iRightCurrentX - WinW/2.0f) * 2.0f * M_PI/WinW;
		lightangle[Y] = (WinH/2.0f - m_iRightCurrentY) * 2.0f * M_PI/WinH;

		lightpos[Y] = sin(lightangle[Y]);
		lightpos[X] = cos(lightangle[Y]) * sin(lightangle[X]);
		lightpos[Z] =  cos(lightangle[Y]) * cos(lightangle[X]);
		lightpos[W] = 0.0f;
		lightchanged[UPDATE_OGL] = GL_TRUE;
		lightchanged[UPDATE_TEX] = GL_TRUE;
	}

	Invalidate(FALSE);
	CView::OnMouseMove(nFlags, point);
}

void CTriangleView::TranslateBody(float Height)
{
	LPANIMATION pAnim = this->GetCurrentAnimation();
	LPFRAME pFrame = this->GetCurrentFrame(pAnim);

	m_fHeight -= (Height/100.0f);

	if(pFrame->m_iFrame == 1)
	{
		pAnim->m_fBaseHeight = m_fHeight;
	}
	pFrame->m_fTranslateY = m_fHeight;
	this->UpdateFrameInfo();
}

void CTriangleView::ManipulateBody(float offsetX, float offsetY)
{
	LPANIMATION pAnim = this->GetCurrentAnimation();
	LPFRAME pFrame = this->GetCurrentFrame(pAnim);

	float tempX;
	float tempY;

	this->GetMotionBody(pFrame, body_id, &tempX, &tempY);

	tempX += offsetX;
	tempY -= offsetY;

	this->SetMotionBody(pFrame, body_id, tempX, tempY);

	this->UpdateFrameInfo();
}

void CTriangleView::OnTrackballmode() 
{
	m_iManipulateMode = TRACKBALL;	
}

void CTriangleView::OnUpdateTrackballmode(CCmdUI* pCmdUI) 
{
	if(m_iManipulateMode == TRACKBALL)
	{
		pCmdUI->SetCheck(TRUE);
	}else
	{
		pCmdUI->SetCheck(FALSE);
	}
}

void CTriangleView::OnTranslatemode() 
{
	m_iManipulateMode = TRANSLATE;	
}

void CTriangleView::OnUpdateTranslatemode(CCmdUI* pCmdUI) 
{
	if(m_iManipulateMode == TRANSLATE)
	{
		pCmdUI->SetCheck(TRUE);
	}else
	{
		pCmdUI->SetCheck(FALSE);
	}	
}

void CTriangleView::OnDrivemode() 
{
	m_iManipulateMode = DRIVE;	
}

void CTriangleView::OnUpdateDrivemode(CCmdUI* pCmdUI) 
{
	if(m_iManipulateMode == DRIVE)
	{
		pCmdUI->SetCheck(TRUE);
	}else
	{
		pCmdUI->SetCheck(FALSE);
	}
}

void CTriangleView::OnSelectbodymode() 
{
	m_iManipulateMode = SELECTBODY;		
}

void CTriangleView::OnUpdateSelectbodymode(CCmdUI* pCmdUI) 
{
	if(m_iManipulateMode == SELECTBODY)
	{
		pCmdUI->SetCheck(TRUE);
	}else
	{
		pCmdUI->SetCheck(FALSE);
	}
}

void CTriangleView::OnTranslatebodymode() 
{
	m_iManipulateMode = TRANSLATEBODY;		
}

void CTriangleView::OnUpdateTranslatebodymode(CCmdUI* pCmdUI) 
{
	if(m_iManipulateMode == TRANSLATEBODY)
	{
		pCmdUI->SetCheck(TRUE);
	}else
	{
		pCmdUI->SetCheck(FALSE);
	}
}


void CTriangleView::OnConstrainXmode() 
{
	if(TRUE == m_bConstrainX)
	{
		m_bConstrainX = FALSE;
	}else
	{
		m_bConstrainX = TRUE;
	}
}

void CTriangleView::OnUpdateConstrainXmode(CCmdUI* pCmdUI) 
{
	if(m_iManipulateMode == TRACKBALL ||
		m_iManipulateMode == TRANSLATE ||
		m_iManipulateMode == SELECTBODY)
	{
		pCmdUI->Enable(TRUE);
		if(TRUE == m_bConstrainX)
		{
			pCmdUI->SetCheck(TRUE);
		}else
		{
			pCmdUI->SetCheck(FALSE);
		}
	}else
	{
		pCmdUI->Enable(FALSE);
	}
}

void CTriangleView::OnConstrainYmode() 
{
	if(TRUE == m_bConstrainY)
	{
		m_bConstrainY = FALSE;
	}else
	{
		m_bConstrainY = TRUE;
	}	
}

void CTriangleView::OnUpdateConstrainYmode(CCmdUI* pCmdUI) 
{
	if(m_iManipulateMode == TRACKBALL ||
		m_iManipulateMode == TRANSLATE ||
		m_iManipulateMode == SELECTBODY ||
		m_iManipulateMode == TRANSLATEBODY)
	{
		pCmdUI->Enable(TRUE);
		if(TRUE == m_bConstrainY)
		{
			pCmdUI->SetCheck(TRUE);
		}else
		{
			pCmdUI->SetCheck(FALSE);
		}
	}else
	{
		pCmdUI->Enable(FALSE);
	}
}

void CTriangleView::OnConstrainZmode() 
{
	if(TRUE == m_bConstrainZ)
	{
		m_bConstrainZ = FALSE;
	}else
	{
		m_bConstrainZ = TRUE;
	}		
}

void CTriangleView::OnUpdateConstrainZmode(CCmdUI* pCmdUI) 
{
	if(m_iManipulateMode == DRIVE)
	{
		pCmdUI->Enable(TRUE);
		if(TRUE == m_bConstrainZ)
		{
			pCmdUI->SetCheck(TRUE);
		}else
		{
			pCmdUI->SetCheck(FALSE);
		}
	}else
	{
		pCmdUI->Enable(FALSE);
	}
}

//Frame Management
void CTriangleView::FramePlay(void)
{
	m_bPlay = TRUE;
}

void CTriangleView::FrameStop(void)
{
	m_bPlay = FALSE;
}

void CTriangleView::FrameAddGroup(void)
{
	NameDlg dlg;
	CString sName;
	
	if(dlg.DoModal() == IDOK)
	{
		sName = dlg.m_sName;
	
		this->AddGroup(&sName);
		this->UpdateFrameInfo();
		this->UpdateGroupInfo();

		LPANIMATION pAnim = this->GetCurrentAnimation();
		CMainFrame *pMainFrame;
		pMainFrame = (CMainFrame*)AfxGetMainWnd();
	
		CString str;
		str.GetBuffer(20);
		str.Format("%s", pAnim->name);

		pMainFrame->AddGroupString(&str);
		pMainFrame->SetCurrentAnim(&str);
	}
	Invalidate(FALSE);
}

void CTriangleView::FrameDelGroup(void)
{
	LPANIMATION pAnim = this->GetCurrentAnimation();

	CMainFrame *pMainFrame;
	pMainFrame = (CMainFrame*)AfxGetMainWnd();
	
	CString str;

	if(pAnim->m_iID == 0)
	{
		AfxMessageBox("You can't delete the default group");
	}else
	{
		m_iTotalGroup--;
		if(m_iTotalGroup < 0)
		{
			AfxMessageBox("Frame Management Error Occur");
			return;
		}else
		{
			this->DelGroup(pAnim);
			str.GetBuffer(20);
			str.Format("%s", pAnim->name);

			m_pCurrentAnim = &Anim;
			str.Empty();
			str.GetBuffer(20);
			str.Format("%s", m_pCurrentAnim->name);
			pMainFrame->SetCurrentAnim(&str);
		}
	}
	this->UpdateFrameInfo();
	Invalidate(FALSE);
}

void CTriangleView::FrameAddFrame(void)

⌨️ 快捷键说明

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