+++ /dev/null
-// OpenGLView.cpp : implementation of the COpenGLView class\r
-//\r
-\r
-#include "stdafx.h"\r
-#include "OpenGLView.h"\r
-#include <math.h>\r
-\r
-typedef struct _Point3d\r
-{\r
- double x, y, z;\r
-} Point3d;\r
-\r
-#ifdef _DEBUG\r
-#define new DEBUG_NEW\r
-#undef THIS_FILE\r
-static char THIS_FILE[] = __FILE__;\r
-#endif\r
-\r
-#define vector_length(a) sqrt(a.x*a.x+a.y*a.y+a.z*a.z)\r
-#define scalar_product(a,b) (a.x*b.x+a.y*b.y+a.z*b.z)\r
-#define vector_angle(a,b) (acos(scalar_product(a,b))*180./3.1415926535)\r
-#define vector_product_x(a,b) (a.y*b.z-a.z*b.y)\r
-#define vector_product_y(a,b) (a.z*b.x-a.x*b.z)\r
-#define vector_product_z(a,b) (a.x*b.y-a.y*b.x)\r
-#define vector_product(a,b,c) c.x=vector_product_x(a,b);c.y=vector_product_y(a,b);c.z=vector_product_z(a,b)\r
-#define sub_vector(a,b,c) c.x=a.x-b.x;c.y=a.y-b.y;c.z=a.z-b.z\r
-#define add_vector(a,b,c) c.x=a.x+b.x;c.y=a.y+b.y;c.z=a.z+b.z\r
-\r
-#define normalize_vector(a) {float len;len=(float)vector_length(a);if(len>0){a.x /= len;a.y /= len;a.z /= len;}}\r
-\r
-#define vector_lengthV(a) sqrt(a->x*a->x+a->y*a->y+a->z*a->z)\r
-#define normalize_vectorV(a) {float len;len=(float)vector_lengthV(a);if(len>0){a->x /= len;a->y /= len;a->z /= len;}}\r
-\r
-/////////////////////////////////////////////////////////////////////////////\r
-// COpenGLView\r
-\r
-IMPLEMENT_DYNCREATE(COpenGLView, CView)\r
-\r
-BEGIN_MESSAGE_MAP(COpenGLView, CView)\r
- //{{AFX_MSG_MAP(COpenGLView)\r
- ON_WM_DESTROY()\r
- ON_WM_SIZE()\r
- ON_WM_MOUSEMOVE()\r
- ON_WM_LBUTTONDOWN()\r
- ON_WM_CREATE()\r
- //}}AFX_MSG_MAP\r
- // Standard printing commands\r
- ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)\r
- ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)\r
- ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)\r
-END_MESSAGE_MAP()\r
-\r
-/////////////////////////////////////////////////////////////////////////////\r
-// COpenGLView construction/destruction\r
-\r
-COpenGLView::COpenGLView() : m_pDC(0)\r
-{\r
- InitCameraPosition();\r
-}\r
-\r
-COpenGLView::~COpenGLView()\r
-{\r
-// delete m_pDC;\r
-}\r
-\r
-BOOL COpenGLView::PreCreateWindow(CREATESTRUCT& cs)\r
-{\r
- // OpenGL òðåáóåò íàëè÷èÿ ñòèëåé WS_CLIPCHILDREN è WS_CLIPSIBLINGS\r
- cs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS);\r
-\r
- return CView::PreCreateWindow(cs);\r
-}\r
-\r
-/////////////////////////////////////////////////////////////////////////////\r
-// COpenGLView printing\r
-\r
-BOOL COpenGLView::OnPreparePrinting(CPrintInfo* pInfo)\r
-{\r
- // default preparation\r
- return DoPreparePrinting(pInfo);\r
-}\r
-\r
-void COpenGLView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)\r
-{\r
-}\r
-\r
-void COpenGLView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)\r
-{\r
-}\r
-\r
-/////////////////////////////////////////////////////////////////////////////\r
-// COpenGLView diagnostics\r
-\r
-#ifdef _DEBUG\r
-void COpenGLView::AssertValid() const\r
-{\r
- CView::AssertValid();\r
-}\r
-\r
-void COpenGLView::Dump(CDumpContext& dc) const\r
-{\r
- CView::Dump(dc);\r
-}\r
-\r
-CDocument* COpenGLView::GetDocument() // non-debug version is inline\r
-{\r
- ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDocument)));\r
- return (CDocument*)m_pDocument;\r
-}\r
-#endif //_DEBUG\r
-\r
-/////////////////////////////////////////////////////////////////////////////\r
-// COpenGLView message handlers\r
-\r
-int COpenGLView::InitOpenGL()\r
-{\r
-// Ôîðìèðóåì êîíòåêñò ðàáî÷åé îáëàñòè\r
- m_pDC = new CClientDC(this);\r
- ASSERT(m_pDC != NULL);\r
-\r
-// Ïîëó÷àåì äåñêðèïòîð êîíòåêñòà óñòðîéñòâà\r
- HDC hdc = m_pDC->GetSafeHdc();\r
-\r
-// Óñòàíàâëèâàåì ôîðìàò ïèêñåëåé\r
- if (SetPixelFormat(hdc)==FALSE)\r
- return -1;\r
-\r
-// Ñîçäàåì è äåëàåì òåêóùèì êîíòåêñò âîñïðîèçâåäåíèÿ\r
- if (CreateGLContext(hdc)==FALSE)\r
- return -1;\r
-\r
- return 0;\r
-}\r
-\r
-void COpenGLView::OnDestroy()\r
-{\r
- // Ïîëó÷àåì òåêóùèé êîíòåêñò âîñïðîèçâåäåíèÿ\r
- HGLRC hrc = ::wglGetCurrentContext();\r
-\r
-// Ïåðåä óäàëåíèåì îí íå äîëæåí áûòü òåêóùèì\r
- ::wglMakeCurrent(NULL, NULL);\r
-\r
-// Óäàëÿåì êîíòåêñò âîñïðîèçâåäåíèÿ\r
- if (hrc)\r
- ::wglDeleteContext(hrc);\r
-\r
-// Óäàëÿåì êîíòåêñò ðàáî÷åé îáëàñòè\r
- if (m_pDC)\r
- delete m_pDC;\r
-\r
- CView::OnDestroy();\r
-}\r
-\r
-BOOL COpenGLView::SetPixelFormat(HDC hdc)\r
-{\r
- // Çàïîëíÿåì ïîëÿ ñòðóêòóðû\r
- static PIXELFORMATDESCRIPTOR pfd = {\r
- sizeof(PIXELFORMATDESCRIPTOR), // ðàçìåð ñòðóêòóðû\r
- 1, // íîìåð âåðñèè\r
- PFD_DRAW_TO_WINDOW | // ïîääåðæêà âûâîäà â îêíî\r
- PFD_SUPPORT_OPENGL | // ïîääåðæêà OpenGL\r
- PFD_DOUBLEBUFFER, // äâîéíàÿ áóôåðèçàöèÿ\r
- PFD_TYPE_RGBA, // öâåòà â ðåæèìå RGBA\r
- 24, // 24-ðàçðÿäà íà öâåò\r
- 0, 0, 0, 0, 0, 0, // áèòû öâåòà èãíîðèðóþòñÿ\r
- 0, // íå èñïîëüçóåòñÿ àëüôà ïàðàìåòð\r
- 0, // ñìåùåíèå öâåòîâ èãíîðèðóþòñÿ\r
- 0, // áóôåð àêêóìóëÿòîðà íå èñïîëüçóåòñÿ\r
- 0, 0, 0, 0, // áèòû àêêóìóëÿòîðà èãíîðèðóþòñÿ\r
- 32, // 32-ðàçðÿäíûé áóôåð ãëóáèíû\r
- 0, // áóôåð òðàôàðåòà íå èñïîëüçóåòñÿ\r
- 0, // âñïîìîãàòåëüíûé áóôåð íå èñïîëüçóåòñÿ\r
- PFD_MAIN_PLANE, // îñíîâíîé ñëîé\r
- 0, // çàðåçåðâèðîâàí\r
- 0, 0, 0 // ìàñêè ñëîÿ èãíîðèðóþòñÿ\r
- };\r
-\r
- int pixelFormat;\r
-\r
-// Ïîääåðæèâàåò ëè ñèñòåìà íåîáõîäèìûé ôîðìàò ïèêñåëåé?\r
- if((pixelFormat = ::ChoosePixelFormat(hdc, &pfd)) == 0){\r
- MessageBox("Ñ çàäàííûì ôîðìàòîì ïèêñåëåé ðàáîòàòü íåëüçÿ");\r
- return FALSE;\r
- }\r
-\r
- if (::SetPixelFormat(hdc, pixelFormat, &pfd) == FALSE)\r
- {\r
- MessageBox("Îøèáêà ïðè âûïîëíåíèè SetPixelFormat");\r
- return FALSE;\r
- }\r
-\r
- return TRUE;\r
-}\r
-\r
-BOOL COpenGLView::CreateGLContext(HDC hdc)\r
-{\r
-\r
-// Ñîçäàåì êîíòåêñò âîñïðîèçâåäåíèÿ\r
- if((m_hrc = ::wglCreateContext(hdc)) == NULL)\r
- return FALSE;\r
-\r
-// Äåëàåì êîíòåêñò âîñïðîèçâåäåíèÿ òåêóùèì\r
- if(::wglMakeCurrent(hdc, m_hrc) == FALSE)\r
- return FALSE;\r
-\r
- return TRUE;\r
-}\r
-\r
-void COpenGLView::OnSize(UINT nType, int cx, int cy)\r
-{\r
- CView::OnSize(nType, cx, cy);\r
-\r
- m_width = cx;\r
- m_height = cy;\r
- SetOwnContext();\r
- glViewport(0, 0, cx, cy);\r
-}\r
-\r
-/////////////////////////////////////////////////////////////////////////////\r
-// COpenGLView drawing\r
-\r
-void COpenGLView::OnDraw(CDC* pDC)\r
-{\r
- CDocument* pDoc = GetDocument();\r
- ASSERT_VALID(pDoc);\r
-}\r
-\r
-void COpenGLView::BeginScene()\r
-{\r
- SetOwnContext();\r
- glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);\r
-}\r
-\r
-void COpenGLView::EndScene()\r
-{\r
- Swap();\r
-}\r
-\r
-void COpenGLView::Swap()\r
-{\r
- if (m_pDC)\r
- SwapBuffers(m_pDC->m_hDC);\r
-}\r
-\r
-void COpenGLView::TrackBall(CPoint last, CPoint init, double& angle, double& x, double& y, double& z)\r
-{\r
- Point3d end, start, out;\r
- double sum, len, norm;\r
- double pi = 3.1415926535;\r
-\r
- norm = (double)__min(m_width, m_height);\r
-\r
- start.x = (2*init.x-m_width)/norm;\r
- start.y = (m_height-2.*init.y)/norm;\r
- sum = start.x*start.x + start.y*start.y;\r
- if (sum < 1.) start.z = sqrt(1 - sum);\r
- else start.z = 0.;\r
-\r
- end.x = (2.*last.x-m_width)/norm;\r
- end.y = (m_height-2.*last.y)/norm;\r
- sum = end.x*end.x + end.y*end.y;\r
- if (sum < 1.) end.z = sqrt(1 - sum);\r
- else end.z = 0.;\r
-\r
- ASSERT(vector_length(start)*vector_length(end)>1.0e-30);\r
- angle = scalar_product(start,end)/(vector_length(start)*vector_length(end));\r
-\r
- if (angle<=-1) angle = -0.99999;\r
- if (angle>=1) angle = 0.99999;\r
-\r
- angle = acos(angle)*180./pi;\r
- out.x = vector_product_x(start,end);\r
- out.y = vector_product_y(start,end);\r
- out.z = vector_product_z(start,end);\r
-\r
- len = vector_length(out);\r
- if (len != 0.) {\r
- out.x /= len;\r
- out.y /= len;\r
- out.z /= len;\r
- }\r
-\r
- x = out.x;\r
- y = out.y;\r
- z = out.z;\r
-}\r
-\r
-void COpenGLView::SetOwnContext()\r
-{\r
- if (!m_hrc)\r
- return;\r
-\r
- if (m_pDC) {\r
- delete m_pDC;\r
- m_pDC = NULL;\r
- }\r
-\r
- m_pDC = new CClientDC(this);\r
-\r
- if (wglMakeCurrent(m_pDC->m_hDC, m_hrc))\r
- return;\r
-\r
-//error handler\r
-\r
- return;\r
-}\r
-\r
-void COpenGLView::OnMouseMove(UINT nFlags, CPoint point)\r
-{\r
- SetOwnContext();\r
- if(nFlags & MK_LBUTTON)\r
- {\r
- if(nFlags & MK_SHIFT)\r
- {\r
- /* Track translation */\r
- double x = point.x - m_mousePosition.x;\r
- double y = point.y - m_mousePosition.y;\r
- x /= m_width/2;\r
- y /= m_height/2;\r
- m_translate[0] += x;\r
- m_translate[1] += y;\r
-\r
- m_mousePosition = point;\r
- }\r
- else\r
- {\r
- /* Track rotation */\r
- double x, y, z, angle;\r
-\r
- TrackBall(point, m_mousePosition, angle, x, y, z);\r
- m_mousePosition = point;\r
-\r
- glMatrixMode(GL_MODELVIEW);\r
- glPushMatrix();\r
- glLoadIdentity();\r
- glRotated(angle, x, y, z);\r
- glMultMatrixd(m_rotate);\r
- glGetDoublev(GL_MODELVIEW_MATRIX, m_rotate);\r
- glPopMatrix();\r
- }\r
- }\r
-\r
- DrawScene();\r
-\r
- CView::OnMouseMove(nFlags, point);\r
-}\r
-\r
-void COpenGLView::OnLButtonDown(UINT nFlags, CPoint point)\r
-{\r
- m_mousePosition = point;\r
- CView::OnLButtonDown(nFlags, point);\r
-}\r
-\r
-void COpenGLView::InitCameraPosition()\r
-{\r
- for(int i = 0; i < 16; i++)\r
- m_rotate[i] = GLdouble(i/4 == i%4);\r
- for(i = 0; i < 3; i++)\r
- m_translate[i] = 0;\r
-}\r
-\r
-void COpenGLView::DrawScene(CDC* pDC)\r
-{\r
-}
\ No newline at end of file