meshmakerview.cpp

来自「finite element mesh 参数化有限元网格划分」· C++ 代码 · 共 744 行 · 第 1/2 页

CPP
744
字号
	pCmdUI->SetCheck(mode == WIREFRAME);
	pCmdUI->Enable();
}

void CMeshMakerView::OnUpdateRenderingHighlightsonly(CCmdUI* pCmdUI) 
{
	RENDER_MODE mode;
	renderer->getRenderMode(mode);
	pCmdUI->SetCheck(mode == HIGHLIGHT_ONLY);
	pCmdUI->Enable();
}


void CMeshMakerView::OnRenderingShowlines() 
{
	bool showLines;
	renderer->getLineDrawing(showLines);
	renderer->setLineDrawing(!showLines);
}

void CMeshMakerView::OnUpdateRenderingShowlines(CCmdUI* pCmdUI) 
{
	bool showLines;
	renderer->getLineDrawing(showLines);
	pCmdUI->SetCheck(showLines);
	pCmdUI->Enable();
}

void CMeshMakerView::OnRenderingShowcylinders() 
{
	bool showCylinders;
	renderer->getCylinderDrawing(showCylinders);
	renderer->setCylinderDrawing(!showCylinders);
}

void CMeshMakerView::OnUpdateRenderingShowcylinders(CCmdUI* pCmdUI) 
{
	bool showCylinders;
	renderer->getCylinderDrawing(showCylinders);
	pCmdUI->SetCheck(showCylinders);
	pCmdUI->Enable();
}

void CMeshMakerView::OnRenderingShowspheres() 
{
	bool showSpheres;
	renderer->getSphereDrawing(showSpheres);
	renderer->setSphereDrawing(!showSpheres);
}

void CMeshMakerView::OnUpdateRenderingShowspheres(CCmdUI* pCmdUI) 
{
	bool showSpheres;
	renderer->getSphereDrawing(showSpheres);
	pCmdUI->SetCheck(showSpheres);
	pCmdUI->Enable();
}

void CMeshMakerView::OnRenderingShowplates() 
{
	bool showPlates;
	renderer->getPlateDrawing(showPlates);
	renderer->setPlateDrawing(!showPlates);
}

void CMeshMakerView::OnUpdateRenderingShowplates(CCmdUI* pCmdUI) 
{
	bool showPlates;
	renderer->getPlateDrawing(showPlates);
	pCmdUI->SetCheck(showPlates);
	pCmdUI->Enable();
}

///////////////////////////////////////////////////////////////
//   Perspective / Orthographic view


void CMeshMakerView::OnModelviewOrthographic() 
{
	renderer->setPerspective( false);
}

void CMeshMakerView::OnModelviewPerspective() 
{
	renderer->setPerspective(true);
}

void CMeshMakerView::OnUpdateModelviewOrthographic(CCmdUI* pCmdUI) 
{
	bool perspective;
	renderer->getPerspective(perspective);
	pCmdUI->SetCheck(!perspective);
	pCmdUI->Enable();
}

void CMeshMakerView::OnUpdateModelviewPerspective(CCmdUI* pCmdUI) 
{
	bool perspective;
	renderer->getPerspective(perspective);
	pCmdUI->SetCheck(perspective);
	pCmdUI->Enable();
}

///////////////////////////////////////////////////////////////
//   Backface culling


void CMeshMakerView::OnModelviewBackface() 
{
	bool backFaceRemoval;
	renderer->getBackfaceCulling(backFaceRemoval);
	renderer->setBackfaceCulling(!backFaceRemoval);
}

void CMeshMakerView::OnUpdateModelviewBackface(CCmdUI* pCmdUI) 
{
	bool backFaceRemoval;
	renderer->getBackfaceCulling(backFaceRemoval);
	pCmdUI->SetCheck(backFaceRemoval);
	pCmdUI->Enable();
}

///////////////////////////////////////////////////////////////
//   Mouse interaction / transformations


void CMeshMakerView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	if (!renderer->interactionEnabled) return;

	SetCapture();
	x = point.x;
	y = point.y;
	transformMode = (nFlags & MK_RBUTTON) ? TRANSLATE : ROTATE;

	SetCursor(AfxGetApp()->LoadStandardCursor((transformMode == TRANSLATE) ? IDC_SIZEALL : IDC_ARROW));
	if (renderer->inPickingMode) {
		
		GLuint selectBuf[512];
		GLint hits, viewport[4];
		glGetIntegerv(GL_VIEWPORT, viewport);
		
		float matrix[16];
		glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
		glGetFloatv(GL_PROJECTION_MATRIX, matrix);

		glSelectBuffer(512, selectBuf);
		glRenderMode(GL_SELECT);
		
		glInitNames();
		glPushName((GLuint)-1);
		
		glMatrixMode(GL_PROJECTION);
		glLoadIdentity();
		gluPickMatrix((GLdouble)x, (GLdouble)(viewport[3]-y), 9.0, 9.0, viewport);

		renderer->setProjection();
		renderer->render(true); // wireframe/render, selection mode
		glFlush();
		
		hits = glRenderMode(GL_RENDER);

		renderer->processSelection(hits, selectBuf);
	}
}

void CMeshMakerView::OnLButtonUp(UINT /*nFlags*/, CPoint /*point*/) 
{
	ReleaseCapture();
}

void CMeshMakerView::OnRButtonDown(UINT nFlags, CPoint point) 
{
	SetCapture();
	x = point.x;
	y = point.y;
	transformMode = (nFlags & MK_LBUTTON) ? TRANSLATE : SCALE;

	SetCursor(AfxGetApp()->LoadStandardCursor((transformMode == TRANSLATE) ?
																						IDC_SIZEALL : IDC_SIZENS));
}

void CMeshMakerView::OnRButtonUp(UINT /*nFlags*/, CPoint /*point*/) 
{
	ReleaseCapture();
}

void CMeshMakerView::OnMouseMove(UINT /*nFlags*/, CPoint point) 
{
	if(GetCapture() != this)
		return;

	float angle;
	int dx, dy;

	switch(transformMode) {
	case ROTATE:
		dx = (int)point.x - x;
		dy = (int)point.y - y;
		angle = (float)sqrt((float)(dx * dx + dy * dy));
		renderer->screen_rotate(angle, dy, dx, 0);
		//renderer->screen_rotate((int)point.x - x, (int)point.y - y);
		break;

	case TRANSLATE:
		renderer->screen_translate((int)point.x - x, (int)point.y - y);
		break;

	case SCALE:
		renderer->screen_scale((int)point.y - y);
		break;
	}

	x = point.x;
	y = point.y;

}

LRESULT CMeshMakerView::OnRotate(WPARAM wParam, LPARAM /*lParam*/) {
	rotate_params *params = (rotate_params*)wParam;
	renderer->screen_rotate(params->angle, params->dx, params->dy, params->dz);
	delete params;
	return 1;
}

LRESULT CMeshMakerView::OnTranslate(WPARAM wParam, LPARAM /*lParam*/) {
	translate_params *params = (translate_params*)wParam;
	renderer->screen_translate(params->dx, params->dy, params->dz);
	delete params;
	return 1;
}

LRESULT CMeshMakerView::OnScale(WPARAM wParam, LPARAM /*lParam*/) {
	renderer->screen_scale((int)wParam);
	return 1;
}


///////////////////////////////////////////////////////////////
//   Colors


void CMeshMakerView::OnColorsBackground() 
{
	CColorDialog colorDlg;
	if (colorDlg.DoModal()==IDOK)
		renderer->setBgColor(colorDlg.GetColor());
}

void CMeshMakerView::OnColorsVerticesdefaultcolor() 
{
	CColorDialog colorDlg;
	if (colorDlg.DoModal()==IDOK)
		renderer->setVerticesDefaultColor(colorDlg.GetColor());
}

void CMeshMakerView::OnColorsEdgesdefaultcolor() 
{
	CColorDialog colorDlg;
	if (colorDlg.DoModal()==IDOK)
		renderer->setEdgesDefaultColor(colorDlg.GetColor());
}

void CMeshMakerView::OnColorsFacesdefaultcolor() 
{
	CColorDialog colorDlg;
	if (colorDlg.DoModal()==IDOK)
		renderer->setFacesDefaultColor(colorDlg.GetColor());
}


///////////////////////////////////////////////////////////////
//   Highlights


void CMeshMakerView::OnColorsHighlightallvertices() 
{	
	bool highlight;
	renderer->getHighlightAllVertices(highlight);
	renderer->highlightAllVertices(!highlight);
}

void CMeshMakerView::OnColorsHighlightalledges() 
{
	bool highlight;
	renderer->getHighlightAllEdges(highlight);
	renderer->highlightAllEdges(!highlight);
}

void CMeshMakerView::OnColorsHighlightallfaces() 
{
	bool highlight;
	renderer->getHighlightAllFaces(highlight);
	renderer->highlightAllFaces(!highlight);
}

void CMeshMakerView::OnUpdateColorsHighlightallvertices(CCmdUI* pCmdUI) 
{
	bool highlight;
	renderer->getHighlightAllVertices(highlight);
	pCmdUI->SetCheck(highlight);
	pCmdUI->Enable();
}

void CMeshMakerView::OnUpdateColorsHighlightalledges(CCmdUI* pCmdUI) 
{
	bool highlight;
	renderer->getHighlightAllEdges(highlight);
	pCmdUI->SetCheck(highlight);
	pCmdUI->Enable();
}

void CMeshMakerView::OnUpdateColorsHighlightallfaces(CCmdUI* pCmdUI) 
{
	bool highlight;
	renderer->getHighlightAllFaces(highlight);
	pCmdUI->SetCheck(highlight);
	pCmdUI->Enable();
}

///////////////////////////////////////////////////////////////
//   texture mapping


void CMeshMakerView::OnRenderingTexturemapping() 
{
	bool textureMapping;
	renderer->getTextureMapping(textureMapping);
	renderer->setTextureMapping(!textureMapping);
}

void CMeshMakerView::OnUpdateRenderingTexturemapping(CCmdUI* pCmdUI) 
{
	bool textureMapping;
	renderer->getTextureMapping(textureMapping);
	pCmdUI->SetCheck(textureMapping);
	pCmdUI->Enable();
}

///////////////////////////////////////////////////////////////
//   misc.


LRESULT CMeshMakerView::OnReset(WPARAM /*wParam*/, LPARAM /*lParam*/)
{
	renderer->reset();
	return 0;
}

LRESULT CMeshMakerView::OnProjection(WPARAM /*wParam*/, LPARAM /*lParam*/) {
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	renderer->setProjection();
	return 0;
}


void CMeshMakerView::OnModelviewReset() 
{
	renderer->resetModel();
	refresh();
}

void CMeshMakerView::OnRenderingLoadtextureimage() 
{
	CFileDialog dlg(TRUE);
	if (dlg.DoModal()==IDOK) {
		renderer->setTextureImage(dlg.GetPathName());
	}
}

⌨️ 快捷键说明

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