meshmakerview.cpp

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

CPP
744
字号
// MeshMakerView.cpp : implementation of the CMeshMakerView class
// 

#include "stdafx.h"
#include "MeshMaker.h"
#include "MeshMakerDoc.h"
#include "MeshMakerView.h"
#include "renderer.h"
#include "scene.h"

#include <gl/glaux.h>

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

void refresh() {
	pView->InvalidateRect(NULL);
}

HWND getHWND() {
	return pView->m_hWnd;
}

RECT getClientRect() {
	RECT rect;
	pView->GetClientRect(&rect);
	return rect;
}


CWinThread* startNewThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam) {
	return AfxBeginThread(pfnThreadProc, pParam);
}

/////////////////////////////////////////////////////////////////////////////
// CMeshMakerView

IMPLEMENT_DYNCREATE(CMeshMakerView, CView)

BEGIN_MESSAGE_MAP(CMeshMakerView, CView)
	//{{AFX_MSG_MAP(CMeshMakerView)
	ON_WM_CREATE()
	ON_WM_ERASEBKGND()
	ON_COMMAND(ID_MODELVIEW_ORTHOGRAPHIC, OnModelviewOrthographic)
	ON_UPDATE_COMMAND_UI(ID_MODELVIEW_ORTHOGRAPHIC, OnUpdateModelviewOrthographic)
	ON_COMMAND(ID_MODELVIEW_PERSPECTIVE, OnModelviewPerspective)
	ON_UPDATE_COMMAND_UI(ID_MODELVIEW_PERSPECTIVE, OnUpdateModelviewPerspective)
	ON_WM_SIZE()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_RBUTTONDOWN()
	ON_WM_RBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_COMMAND(ID_RENDERING_SOLID, OnRenderingSolid)
	ON_UPDATE_COMMAND_UI(ID_RENDERING_SOLID, OnUpdateRenderingSolid)
	ON_COMMAND(ID_RENDERING_SOLIDWITHWIREFRAME, OnRenderingSolidwithwireframe)
	ON_UPDATE_COMMAND_UI(ID_RENDERING_SOLIDWITHWIREFRAME, OnUpdateRenderingSolidwithwireframe)
	ON_COMMAND(ID_RENDERING_VERTICES, OnRenderingVertices)
	ON_UPDATE_COMMAND_UI(ID_RENDERING_VERTICES, OnUpdateRenderingVertices)
	ON_COMMAND(ID_RENDERING_WIREFRAME, OnRenderingWireframe)
	ON_UPDATE_COMMAND_UI(ID_RENDERING_WIREFRAME, OnUpdateRenderingWireframe)
	ON_COMMAND(ID_COLORS_BACKGROUND, OnColorsBackground)
	ON_COMMAND(ID_COLORS_EDGESDEFAULTCOLOR, OnColorsEdgesdefaultcolor)
	ON_COMMAND(ID_COLORS_FACESDEFAULTCOLOR, OnColorsFacesdefaultcolor)
	ON_COMMAND(ID_COLORS_VERTICESDEFAULTCOLOR, OnColorsVerticesdefaultcolor)
	ON_COMMAND(ID_MODELVIEW_BACKFACE, OnModelviewBackface)
	ON_UPDATE_COMMAND_UI(ID_MODELVIEW_BACKFACE, OnUpdateModelviewBackface)
	ON_COMMAND(ID_COLORS_HIGHLIGHTALLVERTICES, OnColorsHighlightallvertices)
	ON_COMMAND(ID_COLORS_HIGHLIGHTALLFACES, OnColorsHighlightallfaces)
	ON_COMMAND(ID_COLORS_HIGHLIGHTALLEDGES, OnColorsHighlightalledges)
	ON_UPDATE_COMMAND_UI(ID_COLORS_HIGHLIGHTALLEDGES, OnUpdateColorsHighlightalledges)
	ON_UPDATE_COMMAND_UI(ID_COLORS_HIGHLIGHTALLFACES, OnUpdateColorsHighlightallfaces)
	ON_UPDATE_COMMAND_UI(ID_COLORS_HIGHLIGHTALLVERTICES, OnUpdateColorsHighlightallvertices)
	ON_COMMAND(ID_RENDERING_SHOWLINES, OnRenderingShowlines)
	ON_UPDATE_COMMAND_UI(ID_RENDERING_SHOWLINES, OnUpdateRenderingShowlines)
	ON_MESSAGE(MESH_PROJECTION, OnProjection)
	ON_COMMAND(ID_RENDERING_HIGHLIGHTSONLY, OnRenderingHighlightsonly)
	ON_UPDATE_COMMAND_UI(ID_RENDERING_HIGHLIGHTSONLY, OnUpdateRenderingHighlightsonly)
	ON_MESSAGE(MESH_RESET, OnReset)
	ON_MESSAGE(MESH_ROTATE, OnRotate)
	ON_MESSAGE(MESH_SCALE, OnScale)
	ON_MESSAGE(MESH_TRANSLATE, OnTranslate)
	ON_COMMAND(ID_MODELVIEW_RESET, OnModelviewReset)
	ON_COMMAND(ID_RENDERING_TEXTUREMAPPING, OnRenderingTexturemapping)
	ON_UPDATE_COMMAND_UI(ID_RENDERING_TEXTUREMAPPING, OnUpdateRenderingTexturemapping)
	ON_COMMAND(ID_RENDERING_LOADTEXTUREIMAGE, OnRenderingLoadtextureimage)
	ON_COMMAND(ID_RENDERING_SHOWCYLINDERS, OnRenderingShowcylinders)
	ON_UPDATE_COMMAND_UI(ID_RENDERING_SHOWCYLINDERS, OnUpdateRenderingShowcylinders)
	ON_COMMAND(ID_RENDERING_SHOWSPHERES, OnRenderingShowspheres)
	ON_UPDATE_COMMAND_UI(ID_RENDERING_SHOWSPHERES, OnUpdateRenderingShowspheres)
	ON_COMMAND(ID_RENDERING_SHOWPLATES, OnRenderingShowplates)
	ON_UPDATE_COMMAND_UI(ID_RENDERING_SHOWPLATES, OnUpdateRenderingShowplates)
	//}}AFX_MSG_MAP
	// Standard printing commands
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMeshMakerView construction/destruction

CMeshMakerView::CMeshMakerView()
{
	transformMode = NONE;
	pView = this;
}

CMeshMakerView::~CMeshMakerView()
{
}

BOOL CMeshMakerView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMeshMakerView drawing

void CMeshMakerView::OnDraw(CDC* /*pDC*/)
{
	OnProjection(0, 0);
	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

	render();
}

/////////////////////////////////////////////////////////////////////////////
// CMeshMakerView printing

BOOL CMeshMakerView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CMeshMakerView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CMeshMakerView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CMeshMakerView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CMeshMakerView message handlers

void CMeshMakerView::InitLight()
{
	glMatrixMode(GL_MODELVIEW);
	glPushMatrix();
	
	glLoadIdentity();
	
	int dir[] = { 1, 1, 1, 0};
	glLightiv(GL_LIGHT0, GL_POSITION, dir);
	float diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
	glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
	float ambient[] = {1.0f, 1.0f, 1.0f, 1.0f};
	glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
	glEnable(GL_LIGHT0);
	
	glEnable(GL_LIGHTING);
	
	glPopMatrix();

}

bool CMeshMakerView::bSetupPixelFormat()
{
	static PIXELFORMATDESCRIPTOR pfd =
	{
		sizeof(PIXELFORMATDESCRIPTOR),  // size of this pfd
		1,                              // version number
		PFD_DRAW_TO_WINDOW |            // support window
		  PFD_SUPPORT_OPENGL |          // support OpenGL
		  PFD_DOUBLEBUFFER,             // double buffered
		PFD_TYPE_RGBA,                  // RGBA type
		24,                             // 24-bit color depth
		0, 0, 0, 0, 0, 0,               // color bits ignored
		0,                              // no alpha buffer
		0,                              // shift bit ignored
		0,                              // no accumulation buffer
		0, 0, 0, 0,                     // accum bits ignored
		32,                             // 32-bit z-buffer
		0,                              // no stencil buffer
		0,                              // no auxiliary buffer
		PFD_MAIN_PLANE,                 // main layer
		0,                              // reserved
		0, 0, 0                         // layer masks ignored
	};
	int pixelformat;
	// Choose a pixel format that best matches that described in pfd
	if ( (pixelformat = ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd)) == 0 )
	{
		MessageBox("ChoosePixelFormat failed");
		return FALSE;
	}
	// Set the pixel format for the device xontext
	if (SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd) == FALSE)
	{
		MessageBox("SetPixelFormat failed");
		return FALSE;
	}

	return TRUE;
}

void CMeshMakerView::InitGL()
{
	PIXELFORMATDESCRIPTOR pfd;
	int         n;
	HGLRC       hrc;

    // store the DC
	m_pDC = new CClientDC(this);
	ASSERT(m_pDC != NULL);
	// Select the pixel format
	if (!bSetupPixelFormat()) return;

	n = ::GetPixelFormat(m_pDC->GetSafeHdc());
	::DescribePixelFormat(m_pDC->GetSafeHdc(), n, sizeof(pfd), &pfd);

	//CreateRGBPalette();

	// create the rendering context and make it current
	hrc = wglCreateContext(m_pDC->GetSafeHdc());
	wglMakeCurrent(m_pDC->GetSafeHdc(), hrc);

	//GetClientRect(&m_WndRect);
	glClearDepth(1.0f);
	glEnable(GL_DEPTH_TEST);

}

int CMeshMakerView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
    InitGL();
    InitLight();
	renderer = new Renderer();
	renderer->setMesh(((CMeshMakerDoc*)m_pDocument)->getMesh());
	((CMeshMakerDoc*)m_pDocument)->getMesh()->setRenderer(renderer);;
	scenes = new Scenes(((CMeshMakerDoc*)m_pDocument)->getMesh(), renderer);
	return 0;
}

BOOL CMeshMakerView::OnEraseBkgnd(CDC* /*pDC*/) 
{
	// TODO: Add your message handler code here and/or call default
	
	return TRUE;
}

void CMeshMakerView::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	
	renderer->reset();
}

void CMeshMakerView::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);
	
	renderer->setSize(cx, cy);

	renderer->setProjection();
}


///////////////////////////////////////////////////////////////
//   Rendering

void CMeshMakerView::render()
{
	renderer->render();
	SwapBuffers(wglGetCurrentDC());

	ValidateRect(NULL);
}


///////////////////////////////////////////////////////////////
//   Rendering mode


void CMeshMakerView::OnRenderingSolid() 
{
	renderer->setRenderMode(SOLID);
}

void CMeshMakerView::OnRenderingSolidwithwireframe() 
{
	renderer->setRenderMode(SOLID_AND_WIREFRAME);
}

void CMeshMakerView::OnRenderingVertices() 
{
	renderer->setRenderMode(VERTICES);
}

void CMeshMakerView::OnRenderingWireframe() 
{
	renderer->setRenderMode(WIREFRAME);
}

void CMeshMakerView::OnRenderingHighlightsonly() 
{
	renderer->setRenderMode(HIGHLIGHT_ONLY);
}

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

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

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

void CMeshMakerView::OnUpdateRenderingWireframe(CCmdUI* pCmdUI) 
{
	RENDER_MODE mode;
	renderer->getRenderMode(mode);

⌨️ 快捷键说明

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