//
#include "stdafx.h"
#include "Seer.h"
#include "MainFrm.h"
#include "SeerDoc.h"
#include "SeerView.h"
#include "CoordinateAxis.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#pragma warning(disable:4244)
GLfloat ambientLight[] = { 0.3f, 0.3f,0.3f, 1.0f };
GLfloat diffuseLight[] = { 0.7f, 0.7f,0.7f, 1.0f };
GLfloat lightPos[] = {-50.0f, 50.0f,100.0f, 1.0f };
/
// CSeerView
IMPLEMENT_DYNCREATE(CSeerView, CView)
BEGIN_MESSAGE_MAP(CSeerView, CView)
// System Message
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_SIZE()
ON_WM_TIMER()
ON_WM_ERASEBKGND()
ON_WM_PAINT()
// Hardware Operation
ON_WM_MOUSEMOVE()
ON_WM_KEYDOWN()
ON_WM_LBUTTONDOWN()
ON_WM_RBUTTONDOWN()
// Menu Command
ON_COMMAND(ID_SELECT, OnSelect)
ON_UPDATE_COMMAND_UI(ID_SELECT, OnUpdateSelect)
ON_COMMAND(ID_PAN, OnPan)
ON_COMMAND(ID_ROTATE, OnRotate)
ON_UPDATE_COMMAND_UI(ID_PAN, OnUpdatePan)
ON_UPDATE_COMMAND_UI(ID_ROTATE, OnUpdateRotate)
ON_COMMAND(ID_X_VIEW, OnXView)
ON_COMMAND(ID_Y_VIEW, OnYView)
ON_COMMAND(ID_Z_VIEW, OnZView)
ON_COMMAND(ID_FREE_VIEW, OnFreeView)
ON_UPDATE_COMMAND_UI(ID_X_VIEW, OnUpdateXView)
ON_UPDATE_COMMAND_UI(ID_Y_VIEW, OnUpdateYView)
ON_UPDATE_COMMAND_UI(ID_Z_VIEW, OnUpdateZView)
ON_UPDATE_COMMAND_UI(ID_FREE_VIEW, OnUpdateFreeView)
//
ON_COMMAND(ID_ORTHO, OnOrtho)
ON_UPDATE_COMMAND_UI(ID_ORTHO, OnUpdateOrtho)
ON_COMMAND(ID_PERSPECTIVE, OnPerspective)
ON_UPDATE_COMMAND_UI(ID_PERSPECTIVE, OnUpdatePerspective)
ON_COMMAND(ID_SHOW_COORDINATE_AXIS, OnShowCoordinateAxis)
ON_UPDATE_COMMAND_UI(ID_SHOW_COORDINATE_AXIS, OnUpdateShowCoordinateAxis)
ON_WM_SETCURSOR()
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
ON_WM_MOUSEWHEEL()
ON_COMMAND(ID_SETTING_MESH, &CSeerView::OnMesh)
END_MESSAGE_MAP()
/
// CSeerView construction/destruction
CSeerView::CSeerView()
{
m_hGLContext = NULL;
m_GLPixelIndex = 0;
m_OperaMode = SELECT;
m_ViewMode = FREE_VIEW;
m_bShowAxis = TRUE;
m_RotateAxis = AXIS_Z;
m_ObserveMode = PERSPECTIVE;
m_xEyeCoord = 10.0;
m_yEyeCoord = 10.0;
m_zEyeCoord = 10.0;
m_OrthoDis = 10.0;//
m_PerspectiveiDis = 10.0;//
m_LineWidth = 0.05;
m_XYPlane = FALSE;
m_YZPlane = FALSE;
m_XZPlane = FALSE;
}
CSeerView::~CSeerView()
{
}
BOOL CSeerView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS);
return CView::PreCreateWindow(cs);
}
/
// CSeerView drawing
void CSeerView::OnDraw(CDC* pDC)
{
CSeerDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
}
/
// CSeerView printing
BOOL CSeerView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CSeerView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CSeerView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/
// CSeerView diagnostics
#ifdef _DEBUG
void CSeerView::AssertValid() const
{
CView::AssertValid();
}
void CSeerView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CSeerDoc* CSeerView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSeerDoc)));
return (CSeerDoc*)m_pDocument;
}
#endif //_DEBUG
/
// CSeerView message handlers
BOOL CSeerView::SetWindowPixelFormat(HDC hDC)
{
PIXELFORMATDESCRIPTOR pixelDesc;
pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pixelDesc.nVersion = 1;
pixelDesc.dwFlags =PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL |
PFD_STEREO_DONTCARE|
PFD_DOUBLEBUFFER;
pixelDesc.iPixelType = PFD_TYPE_RGBA;
pixelDesc.cColorBits = 32;
pixelDesc.cRedBits = 8;
pixelDesc.cRedShift = 16;
pixelDesc.cGreenBits =8;
pixelDesc.cGreenShift =8;
pixelDesc.cBlueBits = 8;
pixelDesc.cBlueShift = 0;
pixelDesc.cAlphaBits = 0;
pixelDesc.cAlphaShift = 0;
pixelDesc.cAccumBits = 64;
pixelDesc.cAccumRedBits = 16;
pixelDesc.cAccumGreenBits = 16;
pixelDesc.cAccumBlueBits = 16;
pixelDesc.cAccumAlphaBits = 0;
pixelDesc.cDepthBits = 32;
pixelDesc.cStencilBits = 8;
pixelDesc.cAuxBuffers = 0;
pixelDesc.iLayerType = PFD_MAIN_PLANE;
pixelDesc.bReserved = 0;
pixelDesc.dwLayerMask = 0;
pixelDesc.dwVisibleMask = 0;
pixelDesc.dwDamageMask = 0;
m_GLPixelIndex = ChoosePixelFormat( hDC, &pixelDesc);
if ( m_GLPixelIndex == 0 )
{
m_GLPixelIndex = 1;
if ( DescribePixelFormat(hDC, m_GLPixelIndex, sizeof(PIXELFORMATDESCRIPTOR), &pixelDesc) == 0 )
{
return FALSE;
}
}
if ( SetPixelFormat( hDC, m_GLPixelIndex, &pixelDesc) == FALSE )
{
return FALSE;
}
return TRUE;
}
int CSeerView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
HWND hWnd = GetSafeHwnd();
HDC hDC = ::GetDC(hWnd);
if (SetWindowPixelFormat(hDC)==FALSE)
return 0;
if (CreateViewGLContext(hDC)==FALSE)
return 0;
SetTimer(0,100,NULL);
return 0;
}
BOOL CSeerView::CreateViewGLContext(HDC hDC)
{
m_hGLContext = wglCreateContext(hDC);
if (m_hGLContext == NULL)
return FALSE;
if ( wglMakeCurrent(hDC, m_hGLContext) == FALSE )
return FALSE;
return TRUE;
}
void CSeerView::OnDestroy()
{
if( wglGetCurrentContext() != NULL ) wglMakeCurrent(NULL, NULL) ;
if ( m_hGLContext !=NULL )
{
wglDeleteContext(m_hGLContext);
m_hGLContext = NULL;
}
CView::OnDestroy();
}
void CSeerView::OnSize(UINT nType, int cx, int cy)
{
// CView::OnSize(nType, cx, cy);
/*
this->ShowWindow(SW_MAXIMIZE);
CWnd *psheet = this->GetWindow(GW_CHILD);//m_messageSheet是resultview的唯一顶层子窗口
if(psheet != NULL){
CRect rect;
this->GetWindowRect(&rect);
psheet->ScreenToClient(&rect);
psheet->SetWindowPos(NULL, 0, 0, rect.Width() , rect.Height() ,
SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE);
CWnd *ptab = this->m_sheet.GetTabControl();
if(ptab != NULL){
ptab->ScreenToClient(&rect);
ptab->SetWindowPos(NULL, 0, 0, rect.Width(), rect.Height(),
SWP_NOZORDER | SWP_NOACTIVATE);
//让PropertySheet自动调整page的大小
this->m_sheet.SetActivePage(this->m_sheet.GetActiveIndex());
}
}
*/
GLdouble aspect;
m_ClientWidth = cx;
m_ClientHeight = cy;
if( cy == 0 )
aspect = (GLdouble)m_ClientWidth;
else
aspect = (GLdouble)m_ClientWidth / (GLdouble)m_ClientHeight;
m_WHRatio = aspect;
glViewport(0, 0, m_ClientWidth, m_ClientHeight);
InitOpenGL();
}
void CSeerView::OnTimer(UINT nIDEvent)
{
CView::OnTimer(nIDEvent);
}
BOOL CSeerView::OnEraseBkgnd(CDC* pDC)
{
return FALSE;
}
- Operation Mode -/
void CSeerView::OnPan()
{
m_OperaMode = PAN;
}
void CSeerView::OnUpdatePan(CCmdUI* pCmdUI)
{
// Pan在Perspective和Ortho,以及所有Perspective下所有视角模式下都开启
pCmdUI->SetCheck( m_OperaMode == PAN );
}
void CSeerView::OnRotate()
{
m_OperaMode = ROTATE;
}
void CSeerView::OnUpdateRotate(CCmdUI* pCmdUI)
{
// Rotate只在Perspective:Free-View视角模式下开启
pCmdUI->Enable( m_ObserveMode==PERSPECTIVE && m_ViewMode==FREE_VIEW );
pCmdUI->SetCheck( m_OperaMode==ROTATE && m_ViewMode==FREE_VIEW && m_ObserveMode==PERSPECTIVE );
}
void CSeerView::OnSelect()
{
m_OperaMode = SELECT;
}
void CSeerView::OnUpdateSelect(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck( m_OperaMode == SELECT );
//pCmdUI->Enable(m_ViewMode==FREE_VIEW);
}
//
void CSeerView::OnMouseMove(UINT nFlags, CPoint point)
{
DisplayWorldCoord(point);
if( nFlags == MK_LBUTTON )
{
float dx;
float dy;
if( m_ObserveMode == ORTHO )
{
dx = (point.x - m_OldPoint.x) * 2 * m_OrthoDis * m_WHRatio/ m_ClientWidth;
dy = (point.y - m_OldPoint.y) * 2 * m_OrthoDis / m_ClientHeight;
}
else // if( m_ObserveMode == PERSPECTIVE )
{
dx = (point.x - m_OldPoint.x) * m_PerspectiveiDis * m_WHRatio/ m_ClientWidth;
dy = (point.y - m_OldPoint.y) * m_PerspectiveiDis / m_ClientHeight;
}
//dx = (point.x - m_OldPoint.x) / 100.0;
//dy = (point.y - m_OldPoint.y) / 100.0;
switch(m_OperaMode)
{
case PAN:
// Pan
//m_Camera.Move( dx/100.0, -dy/100.0, 0);
m_Camera.Move( dx, -dy, 0);
break;
case ROTATE:
// Rotate
// 非自由模式禁用转动
if( m_ViewMode == FREE_VIEW ) m_Scene.RotateRoundAxis( dx, m_RotateAxis);
break;
}
m_OldPoint = point;
Invalidate();
}
CView::OnMouseMove(nFlags, point);
}
BOOL CSeerView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
float extent = 0.0;
BOOL mark = zDelta>0? 1:-1;
if( nFlags == MK_CONTROL ) extent = 0.1f * mark;
else extent = 1.0f * mark;
// 四种视图都会做相同的事情
if( m_OperaMode == PAN && m_ObserveMode == PERSPECTIVE ) m_Camera.Move(0, 0, extent);
// Ortho模式改变距离大小,目前只开放Z-View视图
if( m_ObserveMode == ORTHO )
{
m_OrthoDis += extent;
if( m_OrthoDis <= 1.0 ) m_OrthoDis = 1.0;
}
Invalidate();
return CView::OnMouseWheel(nFlags, zDelta, pt);
}
void CSeerView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
//if( nChar == VK_TAB && m_OperaMode == ROTATE )
// m_RotateAxis = (m_RotateAxis+1) % 3;
//if( m_OperaMode == PAN )
//{
// if( nChar == VK_DOWN ) m_Camera.Move( 0.0,-0.1, 0);
// if( nChar == VK_UP ) m_Camera.Move( 0.0, 0.1, 0);
// Invalidate();
//}
switch(nChar)
{
case VK_UP:
if( m_OperaMode == PAN ) m_Camera.Move( 0.0, 0.1, 0);
Invalidate();
break;
case VK_DOWN:
if( m_OperaMode == PAN ) m_Camera.Move( 0.0,-0.1, 0);
Invalidate();
break;
case VK_LEFT:
if( m_OperaMode == PAN ) m_Camera.Move(-0.1, 0.0, 0);
Invalidate();
break;
case VK_RIGHT:
if( m_OperaMode == PAN ) m_Camera.Move( 0.1, 0.0, 0);
Invalidate();
break;
case VK_TAB:
if( nChar == VK_TAB && m_OperaMode == ROTATE ) m_RotateAxis = (m_RotateAxis+1) % 3;
break;
default:
break;
}
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CSeerView::OnLButtonDown(UINT nFlags, CPoint point)
{
m_OldPoint = point;
UINT xPos = point.x;// horizontal position of cursor
WORD yPos = point.y;// vertical position of cursor
// Render in selection mode and display results
/*if(m_bSelection == TRUE)
{
ProcessSelection(xPos, yPos);
}*/
CView::OnLButtonDown(nFlags, point);
}
void CSeerView::OnRButtonDown(UINT nFlags, CPoint point)
{
m_OldPoint = point;
HCURSOR hCursor = NULL;
CWinApp *cWinApp = AfxGetApp ();
if(m_OperaMode == PAN)
{
hCursor = cWinApp->LoadCursor (IDC_CUR_ZOOM);
::SetCursor(hCursor);
}
CView::OnRButtonDown(nFlags, point);
}
void CSeerView::OnPaint()
{
CPaintDC dc(this);
glLoadIdentity();
glClearColor(0.0,0.0,0.0,1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
SetObserveMode();
SetViewMode();
SetMesh();
// drawing the coodinate axis.
if(m_bShowAxis)
{
glDisable(GL_DEPTH_TEST);
CCoordinateAxis(2,2,2).Display();
glEnable(GL_DEPTH_TEST);
}
RenderScene();
SwapBuffers(dc.m_ps.hdc);
}
void CSeerView::OnOrtho()
{
m_ObserveMode = ORTHO;
m_Scene.m_TransferMatrix.EMatrix();
m_Camera.m_TransferMatrix.EMatrix();
// 缺省设置,目前只开放此项
m_ViewMode = Z_VIEW;
m_OperaMode = PAN;
Invalidate();
}
void CSeerView::OnPerspective()
{
m_ObserveMode = PERSPECTIVE;
Invalidate();
}
void CSeerView::OnUpdateOrtho(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck( m_ObserveMode == ORTHO );
}
void CSeerView::OnUpdatePerspective(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck( m_ObserveMode == PERSPECTIVE );
}
void CSeerView::InitOpenGL()
{
// initialization of OpenGL
glLineWidth(m_LineWidth);
glEnable(GL_LINE_SMOOTH);
glFrontFace(GL_CW);
glEnable(GL_CULL_FACE);
glCullFace(GL_FRONT);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT_AND_BACK,GL_DIFFUSE);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
glEnable(GL_NORMALIZE);
}
void CSeerView::OnXView()
{
m_ViewMode = X_VIEW;
if( m_OperaMode == ROTATE ) m_OperaMode = SELECT;
m_Scene.m_TransferMatrix.EMatrix();
m_Camera.m_TransferMatrix.EMatrix();
Invalidate();
}
void CSeerView::OnYView()
{
m_ViewMode = Y_VIEW;
if( m_OperaMode == ROTATE ) m_OperaMode = SELECT;
m_Scene.m_TransferMatrix.EMatrix();
m_Camera.m_TransferMatrix.EMatrix();
Invalidate();
}
void CSeerView::OnZView()
{
m_ViewMode = Z_VIEW;
if( m_OperaMode == ROTATE ) m_OperaMode = SELECT;
m_Scene.m_TransferMatrix.EMatrix();
m_Camera.m_TransferMatrix.EMatrix();
Invalidate();
}
void CSeerView::OnFreeView()
{
m_ViewMode = FREE_VIEW;
m_Scene.m_TransferMatrix.EMatrix();
m_Camera.m_TransferMatrix.EMatrix();
Invalidate();
}
void CSeerView::OnShowCoordinateAxis()
{
m_bShowAxis = !m_bShowAxis;
Invalidate();
}
void CSeerView::OnUpdateXView(CCmdUI* pCmdUI)
{
pCmdUI->Enable( m_ObserveMode == PERSPECTIVE );
pCmdUI->SetCheck( m_ViewMode == X_VIEW && m_ObserveMode == PERSPECTIVE );
}
void CSeerView::OnUpdateYView(CCmdUI* pCmdUI)
{
pCmdUI->Enable( m_ObserveMode == PERSPECTIVE );
pCmdUI->SetCheck( m_ViewMode == Y_VIEW && m_ObserveMode == PERSPECTIVE );
}
void CSeerView::OnUpdateZView(CCmdUI* pCmdUI)
{
pCmdUI->Enable( m_ObserveMode == PERSPECTIVE );
pCmdUI->SetCheck( m_ViewMode == Z_VIEW && m_ObserveMode == PERSPECTIVE );
}
void CSeerView::OnUpdateFreeView(CCmdUI* pCmdUI)
{
pCmdUI->Enable( m_ObserveMode == PERSPECTIVE );
pCmdUI->SetCheck( m_ViewMode == FREE_VIEW && m_ObserveMode == PERSPECTIVE );
}
void CSeerView::SetViewMode()
{
glMatrixMode(GL_MODELVIEW);
m_Camera.Apply();
switch(m_ViewMode)
{
case X_VIEW:
gluLookAt(10,0,0,0,0,0,0,0,1);
break;
case Y_VIEW:
gluLookAt(0,10,0,0,0,0,0,0,1);
break;
case Z_VIEW:
gluLookAt(0,0,10,0,0,0,0,1,0);
break;
case FREE_VIEW:
// 初始化视角angle
gluLookAt(m_xEyeCoord,m_yEyeCoord,m_zEyeCoord, 0,0,0, 0,0,1);
break;
}
m_Scene.Apply();
}
void CSeerView::SetObserveMode()
{
if( m_ObserveMode == PERSPECTIVE )
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45, m_WHRatio, 1, 1000);
glMatrixMode(GL_MODELVIEW);
}
else if( m_ObserveMode == ORTHO )
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho( -m_WHRatio*m_OrthoDis, m_WHRatio*m_OrthoDis, -m_OrthoDis, m_OrthoDis, -100, 100);
glMatrixMode(GL_MODELVIEW);
}
else
{
// TODO:观察模式发生错误
}
}
void CSeerView::OnUpdateShowCoordinateAxis(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_bShowAxis);
}
void CSeerView::ProcessPlanet(GLuint *pSelectBuff)
{
int id,count;
char cMessage[64];
// How many names on the name stack
count = pSelectBuff[0];
// Bottom of the name stack
id = pSelectBuff[3];
}
// Process the selection, which is triggered by a right mouse
// click at (xPos, yPos).
#define BUFFER_LENGTH 64
void CSeerView::ProcessSelection(int xPos, int yPos)
{
// Space for selection buffer
GLuint selectBuff[BUFFER_LENGTH];
// Hit counter and viewport storeage
GLint hits, viewport[4];
// Setup selection buffer
glSelectBuffer(BUFFER_LENGTH, selectBuff);
// Get the viewport
glGetIntegerv(GL_VIEWPORT, viewport);
// Switch to projection and save the matrix
glMatrixMode(GL_PROJECTION);
glPushMatrix();
// Change render mode
glRenderMode(GL_SELECT);
// Establish new clipping volume to be unit cube around
// mouse cursor point (xPos, yPos) and extending two pixels
// in the vertical and horzontal direction
glLoadIdentity();
// Since OpenGL measures
// window coordinates starting at the bottom of the window, and Windows
// measures starting at the top, we need to account for this by
// subtracting the y coordinate from the height of the window. This has
// the effect of reversing the coordinate system (y starts at top)
gluPickMatrix(xPos, viewport[3] - yPos, 2,2, viewport);
// Apply perspective matrix
gluPerspective(45.0f, m_WHRatio, 1.0, 425.0);
// Draw the scene
RenderScene();
// Collect the hits
hits = glRenderMode(GL_RENDER);
// If a single hit occured, display the info.
if(hits == 1)
ProcessPlanet(selectBuff);
// Restore the projection matrix
glMatrixMode(GL_PROJECTION);
glPopMatrix();
// Go back to modelview for normal rendering
glMatrixMode(GL_MODELVIEW);
}
BOOL CSeerView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if(nHitTest != HTCLIENT)
{
return CView::OnSetCursor(pWnd, nHitTest, message);
}
HCURSOR hCursor = NULL;
CWinApp *cWinApp = AfxGetApp();
switch(m_OperaMode)
{
case ROTATE:
hCursor = LoadCursor(NULL, IDC_SIZEWE);
break;
case PAN:
hCursor = LoadCursor(NULL, IDC_SIZEALL);
break;
case SELECT:
hCursor = LoadCursor(NULL, IDC_HAND);
break;
default:
hCursor = LoadCursor(NULL, IDC_HAND);
break;
}
//DWORD error = GetLastError();
if( hCursor ) SetCursor(hCursor);
return TRUE;
}
void CSeerView::DisplayWorldCoord(CPoint point)
{
// Display the world coordinates on the status bar
char buf[80];
float x = point.x;
float y = point.y;
CMainFrame* pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
ASSERT(pFrame);
CStatusBar* pStatus = &pFrame->m_wndStatusBar;
ASSERT(pStatus);
sprintf(buf, "(X=%5.2f,Y=%5.2f) / OrthoDist=%5.2f", x, y, m_OrthoDis);
pStatus->SetPaneText(1, buf, TRUE);
// memset(buf, 0, 80);
// sprintf(buf, "Width/Height=%5.2f\n", m_WHRatio);
// pStatus->SetPaneText(2, buf, TRUE);
pStatus->Invalidate();
}
void CSeerView::RenderScene()
{
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glInitNames();
glPushName(0);
glColor3ub(255, 255, 255);
//
// Archievement: Draw the Bridge
// Author: HanXiong
// Time: 2013.9.8
//
//
glPushMatrix();
glBegin(GL_QUAD_STRIP);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(-0.5f, 0.5f, 0.5f);
glVertex3f(-0.5f, -0.5f, 0.5f);
glVertex3f(0.5f, 0.5f, 0.5f);
glVertex3f(0.5f, -0.5f, 0.5f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(0.5f, 0.5f, -0.5f);
glVertex3f(0.5f, -0.5f, -0.5f);
glVertex3f(-0.5f, 0.5f, -0.5f);
glVertex3f(-0.5f, -0.5f, -0.5f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(-0.5f, 0.5f, 0.5f);
glVertex3f(-0.5f, -0.5f, 0.5f);
glEnd();
glBegin(GL_QUADS);
glColor3f(1.0f, 0.0f, 1.0f);
glVertex3f(-0.5f, 0.5f, 0.5f);
glVertex3f(0.5f, 0.5f, 0.5f);
glVertex3f(0.5f, 0.5f, -0.5f);
glVertex3f(-0.5f, 0.5f, -0.5f);
glEnd();
glBegin(GL_QUADS);
glColor3f(0.0f, 1.0f, 1.0f);
glVertex3f(-0.5f, -0.5f, 0.5f);
glVertex3f(0.5f, -0.5f, 0.5f);
glVertex3f(0.5f, -0.5f, -0.5f);
glVertex3f(-0.5f, -0.5f, -0.5f);
glEnd();
glBegin(GL_LINES);
glVertex3f(-1.0, 0.0, 0.0);
glVertex3f(-1.0,-1.0, 0.0);
glVertex3f(-1.0,-0.5, 0.0);
glVertex3f(-1.0,-1.5, 0.0);
glEnd();
glPopMatrix();
//we should use this to avoid the flash on the screen.
glFlush();
}
void CSeerView::DisplayCtrlPoint()
{
glPointSize(5.0);
glColor3f(1.0,0.0,0.0);
glBegin(GL_POINTS);
for (int i=0; i<4; i++ )
{
for (int j=0; j<4; j++)
{
//glVertex3d(points2[i][j][0], points2[i][j][1], points2[i][j][2]);
}
}
glEnd();
}
void CSeerView::DrawCurve(GLfloat *pArray)
{
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, pArray);
glEnable(GL_MAP2_VERTEX_3);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_FLAT);
glColor3f(1.0,1.0,1.0);
glMapGrid2f(8, 0.0, 1.0, 8, 0.0, 1.0);
glEvalMesh2(GL_FILL, 0, 8, 0, 8);
DisplayCtrlPoint();
}
void CSeerView::OnMesh()
{
m_MeshSet.DoModal();
m_XYPlane = m_MeshSet.m_XYPlane;
Invalidate();
}
void CSeerView::SetMesh()
{
int i;
int count = 10;
float density = 1.0;
if( m_XYPlane )
{
glColor3f(1.0, 1.0, 1.0);
glBegin(GL_LINES);
for (i=-count; i<=count; i++ )
{
glVertex3f( density*i,-count*density, 0.0);
glVertex3f( density*i, count*density, 0.0);
}
for (i=-count; i<=count; i++)
{
glVertex3f(-count*density, density*i, 0.0);
glVertex3f( count*density, density*i, 0.0);
}
glEnd();
}
//if( m_YZPlane )
//{
// glColor3f(1.0, 1.0, 1.0);
// glBegin(GL_LINES);
// for (i=-count; i<=count; i++ )
// {
// glVertex3f( 0.0, density*i,-count*density);
// glVertex3f( 0.0, density*i, count*density);
// }
// for (i=-count; i<=count; i++)
// {
// glVertex3f( 0.0, -count*density, density*i);
// glVertex3f( 0.0, count*density, density*i);
// }
// glEnd();
//}
//if( m_XZPlane )
//{
// glColor3f(1.0, 1.0, 1.0);
// glBegin(GL_LINES);
// for (i=-count; i<=count; i++ )
// {
// glVertex3f( density*i, 0.0,-count*density);
// glVertex3f( density*i, 0.0, count*density);
// }
// for (i=-count; i<=count; i++)
// {
// glVertex3f(-count*density, 0.0, density*i);
// glVertex3f( count*density, 0.0, density*i);
// }
// glEnd();
//}
}
//
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
/
#undef APSTUDIO_READONLY_SYMBOLS
/
// 中文(中华人民共和国) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32
/
//
// Dialog
//
IDD_DIALOG_MESH DIALOGEX 0, 0, 229, 133
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Mesh Set"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "确定",IDOK,163,15,50,14
PUSHBUTTON "取消",IDCANCEL,163,35,50,14
GROUPBOX "Others",IDC_STATIC,7,88,213,36
CONTROL "XY-Plane",IDC_CHECK_XY_PLANE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,20,45,10
CONTROL "YZ-Plane",IDC_CHECK_YZ_PLANE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,39,45,10
CONTROL "XZ-Plane",IDC_CHECK_XZ_PLANE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,58,45,10
GROUPBOX "Planes",IDC_STATIC,7,7,147,74
EDITTEXT IDC_EDIT_LINEWIDTH,113,100,42,14,ES_AUTOHSCROLL
EDITTEXT IDC_EDIT_COLOR,35,101,42,14,ES_AUTOHSCROLL
LTEXT "Color",IDC_STATIC,15,104,18,8
LTEXT "Width",IDC_STATIC,87,104,20,8
CONTROL "Dotted",IDC_CHECK_DOTTED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,168,102,37,10
EDITTEXT IDC_EDIT_XYDENSITY,97,18,40,14,ES_AUTOHSCROLL
LTEXT "Density",IDC_STATIC,67,21,24,8
EDITTEXT IDC_EDIT_YZDENSITY,97,37,40,14,ES_AUTOHSCROLL
LTEXT "Density",IDC_STATIC,67,40,24,8
EDITTEXT IDC_EDIT_XZDENSITY,97,57,40,14,ES_AUTOHSCROLL
LTEXT "Density",IDC_STATIC,67,59,24,8
END
/
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
IDD_DIALOG_MESH, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 222
TOPMARGIN, 7
BOTTOMMARGIN, 126
END
END
#endif // APSTUDIO_INVOKED
#endif // 中文(中华人民共和国) resources
/
/
// 英语(美国) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32
/
//
// Dialog
//
IDD_ABOUTBOX DIALOGEX 0, 0, 235, 63
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "About"
FONT 8, "MS Sans Serif", 0, 0, 0x0
BEGIN
ICON IDR_MAINFRAME,IDC_STATIC,11,17,20,20
LTEXT "MFC OpenGL Demo Version 1.0",IDC_STATIC,46,24,119,8,SS_NOPREFIX
DEFPUSHBUTTON "OK",IDOK,178,7,50,14,WS_GROUP
END
/
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
IDD_ABOUTBOX, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 228
TOPMARGIN, 7
BOTTOMMARGIN, 56
END
END
#endif // APSTUDIO_INVOKED
#ifdef APSTUDIO_INVOKED
/
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"#define _AFX_NO_SPLITTER_RESOURCES\r\n"
"#define _AFX_NO_OLE_RESOURCES\r\n"
"#define _AFX_NO_TRACKER_RESOURCES\r\n"
"#define _AFX_NO_PROPERTY_RESOURCES\r\n"
"\r\n"
"#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"
"#ifdef _WIN32\r\n"
"LANGUAGE 9, 1\r\n"
"#pragma code_page(1252)\r\n"
"#endif //_WIN32\r\n"
"#include ""res\\Seer.rc2"" // non-Microsoft Visual C++ edited resources\r\n"
"#include ""afxres.rc"" // Standard components\r\n"
"#include ""afxprint.rc"" // printing/print preview resources\r\n"
"#endif\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDR_MAINFRAME ICON "res\\Seer.ico"
IDR_MFCGLTYPE ICON "res\\SeerDoc.ico"
/
//
// Bitmap
//
IDR_MAINFRAME BITMAP "res\\Toolbar.bmp"
IDR_COMMANDBAR BITMAP "res\\CommandBar.bmp"
/
//
// Toolbar
//
IDR_MAINFRAME TOOLBAR 16, 15
BEGIN
BUTTON ID_FILE_NEW
BUTTON ID_FILE_OPEN
BUTTON ID_FILE_SAVE
SEPARATOR
BUTTON ID_EDIT_CUT
BUTTON ID_EDIT_COPY
BUTTON ID_EDIT_PASTE
SEPARATOR
BUTTON ID_FILE_PRINT
SEPARATOR
BUTTON ID_APP_ABOUT
END
IDR_COMMANDBAR TOOLBAR 16, 16
BEGIN
BUTTON ID_SELECT
BUTTON ID_ROTATE
BUTTON ID_PAN
SEPARATOR
BUTTON ID_FREE_VIEW
BUTTON ID_X_VIEW
BUTTON ID_Y_VIEW
BUTTON ID_Z_VIEW
END
/
//
// Menu
//
IDR_MAINFRAME MENU
BEGIN
POPUP "&File"
BEGIN
MENUITEM "&New\tCtrl+N", ID_FILE_NEW
MENUITEM "&Open...\tCtrl+O", ID_FILE_OPEN
MENUITEM SEPARATOR
MENUITEM "P&rint Setup...", ID_FILE_PRINT_SETUP
MENUITEM SEPARATOR
MENUITEM "Recent File", ID_FILE_MRU_FILE1, GRAYED
MENUITEM SEPARATOR
MENUITEM "E&xit", ID_APP_EXIT
END
POPUP "&View"
BEGIN
MENUITEM "&Toolbar", ID_VIEW_TOOLBAR
MENUITEM "&Status Bar", ID_VIEW_STATUS_BAR
END
POPUP "&Help"
BEGIN
MENUITEM "&About", ID_APP_ABOUT
END
END
IDR_COMMANDMENU MENU
BEGIN
POPUP "&File"
BEGIN
MENUITEM "&New\tCtrl+N", ID_FILE_NEW
MENUITEM "&Open...\tCtrl+O", ID_FILE_OPEN
MENUITEM "&Close", ID_FILE_CLOSE
MENUITEM "&Save\tCtrl+S", ID_FILE_SAVE
MENUITEM "Save &As...", ID_FILE_SAVE_AS
MENUITEM SEPARATOR
MENUITEM "&Print...\tCtrl+P", ID_FILE_PRINT
MENUITEM "Print Pre&view", ID_FILE_PRINT_PREVIEW
MENUITEM "P&rint Setup...", ID_FILE_PRINT_SETUP
MENUITEM SEPARATOR
MENUITEM "Recent File", ID_FILE_MRU_FILE1, GRAYED
MENUITEM SEPARATOR
MENUITEM "E&xit", ID_APP_EXIT
END
POPUP "&Edit"
BEGIN
MENUITEM "&Undo\tCtrl+Z", ID_EDIT_UNDO
MENUITEM SEPARATOR
MENUITEM "Cu&t\tCtrl+X", ID_EDIT_CUT
MENUITEM "&Copy\tCtrl+C", ID_EDIT_COPY
MENUITEM "&Paste\tCtrl+V", ID_EDIT_PASTE
END
POPUP "&View"
BEGIN
MENUITEM "&Toolbar", ID_VIEW_TOOLBAR
MENUITEM "&Status Bar", ID_VIEW_STATUS_BAR
END
POPUP "&Setting"
BEGIN
POPUP "Angle"
BEGIN
MENUITEM "&X-View", ID_X_VIEW
MENUITEM "&Y-View", ID_Y_VIEW
MENUITEM "&Z-View", ID_Z_VIEW
MENUITEM "&Free View", ID_FREE_VIEW
MENUITEM SEPARATOR
MENUITEM "Input Value", ID_ANGLE_INPUTVALUE
END
POPUP "Action Mode"
BEGIN
MENUITEM "&Select", ID_SELECT
MENUITEM "&Pan", ID_PAN
MENUITEM "&Rotate", ID_ROTATE
END
MENUITEM "&Show/Hide Axis", ID_SHOW_COORDINATE_AXIS
MENUITEM "Mesh", ID_SETTING_MESH
MENUITEM SEPARATOR
MENUITEM "&Ortho", ID_ORTHO
MENUITEM "&Perspective", ID_PERSPECTIVE
END
POPUP "&Window"
BEGIN
MENUITEM "&New Window", ID_WINDOW_NEW
MENUITEM "&Cascade", ID_WINDOW_CASCADE
MENUITEM "&Tile", ID_WINDOW_TILE_HORZ
MENUITEM "&Arrange Icons", ID_WINDOW_ARRANGE
END
POPUP "&Help"
BEGIN
MENUITEM "&About", ID_APP_ABOUT
END
END
/
//
// Accelerator
//
IDR_MAINFRAME ACCELERATORS
BEGIN
"N", ID_FILE_NEW, VIRTKEY, CONTROL
"O", ID_FILE_OPEN, VIRTKEY, CONTROL
"S", ID_FILE_SAVE, VIRTKEY, CONTROL
"P", ID_FILE_PRINT, VIRTKEY, CONTROL
"Z", ID_EDIT_UNDO, VIRTKEY, CONTROL
"X", ID_EDIT_CUT, VIRTKEY, CONTROL
"C", ID_EDIT_COPY, VIRTKEY, CONTROL
"V", ID_EDIT_PASTE, VIRTKEY, CONTROL
VK_BACK, ID_EDIT_UNDO, VIRTKEY, ALT
VK_DELETE, ID_EDIT_CUT, VIRTKEY, SHIFT
VK_INSERT, ID_EDIT_COPY, VIRTKEY, CONTROL
VK_INSERT, ID_EDIT_PASTE, VIRTKEY, SHIFT
VK_F6, ID_NEXT_PANE, VIRTKEY
VK_F6, ID_PREV_PANE, VIRTKEY, SHIFT
END
/
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,1
PRODUCTVERSION 1,0,0,1
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904B0"
BEGIN
VALUE "FileDescription", "Seer MFC Application"
VALUE "FileVersion", "1, 0, 0, 1"
VALUE "InternalName", "Seer"
VALUE "LegalCopyright", "Copyright (C) 2000"
VALUE "OriginalFilename", "Seer.EXE"
VALUE "ProductName", "Seer Application"
VALUE "ProductVersion", "1, 0, 0, 1"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
/
//
// Cursor
//
IDC_CUR_ZOOM CURSOR "res\\cur_zoom.cur"
IDC_CUR_MOVE CURSOR "res\\cur_move.cur"
IDC_CUR_ROTATE CURSOR "res\\cur_rotate.cur"
IDC_CUR_SELECT CURSOR "res\\cur_select.cur"
/
//
// String Table
//
STRINGTABLE
BEGIN
IDR_MAINFRAME "Seer"
IDR_MFCGLTYPE "\nSeer\nSeer\n\n\nSeer.Document\nSeer Document"
END
STRINGTABLE
BEGIN
AFX_IDS_APP_TITLE "Seer"
AFX_IDS_IDLEMESSAGE "Ready"
END
STRINGTABLE
BEGIN
ID_INDICATOR_EXT "EXT"
ID_INDICATOR_CAPS "CAP"
ID_INDICATOR_NUM "NUM"
ID_INDICATOR_SCRL "SCRL"
ID_INDICATOR_OVR "OVR"
ID_INDICATOR_REC "REC"
END
STRINGTABLE
BEGIN
ID_FILE_NEW "Create a new document\nNew"
ID_FILE_OPEN "Open an existing document\nOpen"
ID_FILE_CLOSE "Close the active document\nClose"
ID_FILE_SAVE "Save the active document\nSave"
ID_FILE_SAVE_AS "Save the active document with a new name\nSave As"
ID_FILE_PAGE_SETUP "Change the printing options\nPage Setup"
ID_FILE_PRINT_SETUP "Change the printer and printing options\nPrint Setup"
ID_FILE_PRINT "Print the active document\nPrint"
ID_FILE_PRINT_PREVIEW "Display full pages\nPrint Preview"
END
STRINGTABLE
BEGIN
ID_APP_ABOUT "Display program information, version number and copyright\nAbout"
ID_APP_EXIT "Quit the application; prompts to save documents\nExit"
END
STRINGTABLE
BEGIN
ID_FILE_MRU_FILE1 "Open this document"
ID_FILE_MRU_FILE2 "Open this document"
ID_FILE_MRU_FILE3 "Open this document"
ID_FILE_MRU_FILE4 "Open this document"
ID_FILE_MRU_FILE5 "Open this document"
ID_FILE_MRU_FILE6 "Open this document"
ID_FILE_MRU_FILE7 "Open this document"
ID_FILE_MRU_FILE8 "Open this document"
ID_FILE_MRU_FILE9 "Open this document"
ID_FILE_MRU_FILE10 "Open this document"
ID_FILE_MRU_FILE11 "Open this document"
ID_FILE_MRU_FILE12 "Open this document"
ID_FILE_MRU_FILE13 "Open this document"
ID_FILE_MRU_FILE14 "Open this document"
ID_FILE_MRU_FILE15 "Open this document"
ID_FILE_MRU_FILE16 "Open this document"
END
STRINGTABLE
BEGIN
ID_NEXT_PANE "Switch to the next window pane\nNext Pane"
ID_PREV_PANE "Switch back to the previous window pane\nPrevious Pane"
END
STRINGTABLE
BEGIN
ID_WINDOW_NEW "Open another window for the active document\nNew Window"
ID_WINDOW_ARRANGE "Arrange icons at the bottom of the window\nArrange Icons"
ID_WINDOW_CASCADE "Arrange windows so they overlap\nCascade Windows"
ID_WINDOW_TILE_HORZ "Arrange windows as non-overlapping tiles\nTile Windows"
ID_WINDOW_TILE_VERT "Arrange windows as non-overlapping tiles\nTile Windows"
ID_WINDOW_SPLIT "Split the active window into panes\nSplit"
END
STRINGTABLE
BEGIN
ID_EDIT_CLEAR "Erase the selection\nErase"
ID_EDIT_CLEAR_ALL "Erase everything\nErase All"
ID_EDIT_COPY "Copy the selection and put it on the Clipboard\nCopy"
ID_EDIT_CUT "Cut the selection and put it on the Clipboard\nCut"
ID_EDIT_FIND "Find the specified text\nFind"
ID_EDIT_PASTE "Insert Clipboard contents\nPaste"
ID_EDIT_REPEAT "Repeat the last action\nRepeat"
ID_EDIT_REPLACE "Replace specific text with different text\nReplace"
ID_EDIT_SELECT_ALL "Select the entire document\nSelect All"
ID_EDIT_UNDO "Undo the last action\nUndo"
ID_EDIT_REDO "Redo the previously undone action\nRedo"
END
STRINGTABLE
BEGIN
ID_VIEW_TOOLBAR "Show or hide the toolbar\nToggle ToolBar"
ID_VIEW_STATUS_BAR "Show or hide the status bar\nToggle StatusBar"
END
STRINGTABLE
BEGIN
AFX_IDS_SCSIZE "Change the window size"
AFX_IDS_SCMOVE "Change the window position"
AFX_IDS_SCMINIMIZE "Reduce the window to an icon"
AFX_IDS_SCMAXIMIZE "Enlarge the window to full size"
AFX_IDS_SCNEXTWINDOW "Switch to the next document window"
AFX_IDS_SCPREVWINDOW "Switch to the previous document window"
AFX_IDS_SCCLOSE "Close the active window and prompts to save the documents"
END
STRINGTABLE
BEGIN
AFX_IDS_SCRESTORE "Restore the window to normal size"
AFX_IDS_SCTASKLIST "Activate Task List"
AFX_IDS_MDICHILD "Activate this window"
END
STRINGTABLE
BEGIN
AFX_IDS_PREVIEW_CLOSE "Close print preview mode\nCancel Preview"
END
STRINGTABLE
BEGIN
ID_PAN "Pan"
ID_SELECT "Select"
ID_ROTATE "Rotate"
ID_ORTHO "Ortho Mode\nOrtho"
ID_PERSPECTIVE "Perspective Mode\nPerspective"
ID_X_VIEW "X-View"
ID_Y_VIEW "Y-View"
ID_Z_VIEW "Z-View"
ID_FREE_VIEW "Free view"
END
STRINGTABLE
BEGIN
ID_SHOW_COORDINATE_AXIS "Show/Close Coordinate"
END
#endif // 英语(美国) resources
/
#ifndef APSTUDIO_INVOKED
/
//
// Generated from the TEXTINCLUDE 3 resource.
//
#define _AFX_NO_SPLITTER_RESOURCES
#define _AFX_NO_OLE_RESOURCES
#define _AFX_NO_TRACKER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE 9, 1
#pragma code_page(1252)
#endif //_WIN32
#include "res\Seer.rc2" // non-Microsoft Visual C++ edited resources
#include "afxres.rc" // Standard components
#include "afxprint.rc" // printing/print preview resources
#endif
/
#endif // not APSTUDIO_INVOKED