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 + -
显示快捷键?