s045508View.cpp
上传用户:bjzhifu888
上传日期:2013-01-22
资源大小:136k
文件大小:11k
源码类别:

STL

开发平台:

Visual C++

  1. // s045508View.cpp : implementation of the CS045508View class
  2. //
  3. #include "stdafx.h"
  4. #include "s045508.h"
  5. #include "s045508Doc.h"
  6. #include "s045508View.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CS045508View
  14. IMPLEMENT_DYNCREATE(CS045508View, CView)
  15. BEGIN_MESSAGE_MAP(CS045508View, CView)
  16. //{{AFX_MSG_MAP(CS045508View)
  17. ON_WM_CREATE()
  18. ON_WM_DESTROY()
  19. ON_WM_SIZE()
  20. ON_COMMAND(ID_TOOLBAR_xRot_CCW, OnTOOLBARxRotCCW)
  21. ON_COMMAND(ID_TOOLBAR_xRot_CW, OnTOOLBARxRotCW)
  22. ON_COMMAND(ID_TOOLBAR_yRot_CCW, OnTOOLBARyRotCCW)
  23. ON_COMMAND(ID_TOOLBAR_yRot_CW, OnTOOLBARyRotCW)
  24. ON_COMMAND(ID_TOOLBAR_zRot_CCW, OnTOOLBARzRotCCW)
  25. ON_COMMAND(ID_TOOLBAR_zRot_CW, OnTOOLBARzRotCW)
  26. ON_COMMAND(ID_TOOLBAR_XPAN_L, OnToolbarXpanL)
  27. ON_COMMAND(ID_TOOLBAR_XPAN_R, OnToolbarXpanR)
  28. ON_COMMAND(ID_TOOLBAR_YPAN_D, OnToolbarYpanD)
  29. ON_COMMAND(ID_TOOLBAR_YPAN_U, OnToolbarYpanU)
  30. ON_COMMAND(ID_ZOOM_IN, OnZoomIn)
  31. ON_COMMAND(ID_Zoom_Out, OnZoomOut)
  32. ON_COMMAND(ID_SHADE, OnShade)
  33. ON_COMMAND(ID_Wireframe, OnWireframe)
  34. ON_WM_MOUSEWHEEL()
  35. ON_WM_KEYDOWN()
  36. ON_WM_LBUTTONDOWN()
  37. ON_WM_MOUSEMOVE()
  38. ON_WM_LBUTTONUP()
  39. //}}AFX_MSG_MAP
  40. // Standard printing commands
  41. ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
  42. ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
  43. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
  44. END_MESSAGE_MAP()
  45. /////////////////////////////////////////////////////////////////////////////
  46. // CS045508View construction/destruction
  47. CS045508View::CS045508View()
  48. {
  49. // TODO: add construction code here
  50.     m_hRC = 0;
  51.     m_pDC = 0;
  52. xRot=0;
  53. yRot=0;
  54. zRot=0;
  55. xpan=0;
  56. ypan=0;
  57. zpan=0;
  58. ShadeOrWire=0;
  59. }
  60. CS045508View::~CS045508View()
  61. {
  62. }
  63. BOOL CS045508View::PreCreateWindow(CREATESTRUCT& cs)
  64. {
  65. // TODO: Modify the Window class or styles here by modifying
  66. //  the CREATESTRUCT cs
  67. return CView::PreCreateWindow(cs);
  68. }
  69. /////////////////////////////////////////////////////////////////////////////
  70. // CS045508View drawing
  71. void CS045508View::OnDraw(CDC* pDC)
  72. {
  73. CS045508Doc* pDoc = GetDocument();
  74. ASSERT_VALID(pDoc);
  75. // TODO: add draw code for native data here
  76. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  77.     SetupViewingTransform();
  78.     RenderScene();
  79.     SwapBuffers(m_pDC->GetSafeHdc());
  80. }
  81. /////////////////////////////////////////////////////////////////////////////
  82. // CS045508View printing
  83. BOOL CS045508View::OnPreparePrinting(CPrintInfo* pInfo)
  84. {
  85. // default preparation
  86. return DoPreparePrinting(pInfo);
  87. }
  88. void CS045508View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  89. {
  90. // TODO: add extra initialization before printing
  91. }
  92. void CS045508View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  93. {
  94. // TODO: add cleanup after printing
  95. }
  96. /////////////////////////////////////////////////////////////////////////////
  97. // CS045508View diagnostics
  98. #ifdef _DEBUG
  99. void CS045508View::AssertValid() const
  100. {
  101. CView::AssertValid();
  102. }
  103. void CS045508View::Dump(CDumpContext& dc) const
  104. {
  105. CView::Dump(dc);
  106. }
  107. CS045508Doc* CS045508View::GetDocument() // non-debug version is inline
  108. {
  109. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CS045508Doc)));
  110. return (CS045508Doc*)m_pDocument;
  111. }
  112. #endif //_DEBUG
  113. /////////////////////////////////////////////////////////////////////////////
  114. // CS045508View message handlers
  115. BOOL CS045508View::InitializeOpenGL()
  116. {
  117.      m_pDC = new CClientDC(this);     //CDC
  118. if (m_pDC == NULL) return FALSE;
  119. if (!SetupPixelFormat()) return FALSE;
  120. m_hRC =::wglCreateContext(m_pDC->GetSafeHdc());  //HGLRC
  121. if ((m_hRC) == 0) return FALSE;
  122. if (!(::wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC))) return FALSE;  //connection between CDC and HGLRC
  123.     
  124. return TRUE;
  125. }
  126. int CS045508View::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  127. {
  128. if (CView::OnCreate(lpCreateStruct) == -1)
  129. return -1;
  130. // TODO: Add your specialized creation code here
  131. InitializeOpenGL();
  132.     glClearColor(0.0f,0.0f,0.0f,0.0f);
  133.     glEnable(GL_DEPTH_TEST);
  134.     Material();
  135.     Lighting();
  136. return 0;
  137. }
  138. void CS045508View::OnDestroy() 
  139. {
  140. CView::OnDestroy();
  141. // TODO: Add your message handler code here
  142. ::wglMakeCurrent(0, 0);   // to remove the connection between the CDC and HGLRC
  143. ::wglDeleteContext(m_hRC);
  144. if (m_pDC) delete m_pDC;  //to free the CDC and HGLRC variables
  145. }
  146. void CS045508View::OnSize(UINT nType, int cx, int cy) 
  147. {
  148. CView::OnSize(nType, cx, cy);
  149. // TODO: Add your message handler code here
  150. glViewport(0, 0, cx, cy);
  151. SetupViewingFrustum((double)cx/(double)cy);
  152. if (cx <= 0 || cy <= 0) return;
  153. }
  154. BOOL CS045508View::SetupPixelFormat()
  155. {
  156. static PIXELFORMATDESCRIPTOR pfd =
  157. {
  158. sizeof(PIXELFORMATDESCRIPTOR), // Size of this pfd
  159. 1, // Version number
  160. PFD_DRAW_TO_WINDOW | // Support window
  161. PFD_SUPPORT_OPENGL | // Support OpenGL
  162. PFD_DOUBLEBUFFER, // Double buffered
  163. PFD_TYPE_RGBA, // RGBA type
  164. 24, // 24-bit color depth
  165. 0, 0, 0, 0, 0, 0, // Color bits ignored
  166. 0, // No alpha buffer
  167. 0, // Shift bit ignored
  168. 0, // No accumulation buffer
  169. 0, 0, 0, 0, // Accum bits ignored
  170. 16, // 16-bit z-buffer
  171. 0, // No stencil buffer
  172. 0, // No auxiliary buffer
  173. PFD_MAIN_PLANE, // Main layer
  174. 0, // Reserved
  175. 0, 0, 0 // Layer masks ignored
  176. };
  177. int pixelformat;
  178. if ((pixelformat = ::ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd)) == 0)
  179. return FALSE;
  180. if (!(::SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd)))
  181. return FALSE;
  182. return TRUE;
  183. }
  184. //setup view port
  185. BOOL CS045508View::SetupViewingFrustum(double aspect) 
  186. {
  187. glMatrixMode(GL_PROJECTION);
  188. glLoadIdentity();
  189.  gluPerspective(45.0, aspect, 1, 100.0);
  190. return TRUE;
  191. }
  192. BOOL CS045508View::SetupViewingTransform()
  193. {
  194. glMatrixMode(GL_MODELVIEW);
  195. glLoadIdentity();
  196. gluLookAt(xpan, ypan, 10.0+zpan,
  197.   xpan, ypan, 0.0,
  198.       0.0, 2.0, 0.0);  //pan
  199.     glRotatef(yRot, 0, 1, 0);  //rotate 
  200. glRotatef(zRot, 0, 0, 1);
  201. glRotatef(xRot, 1, 0, 0);
  202. return TRUE;
  203. }
  204. //creat texture
  205. BOOL CS045508View::Lighting() 
  206. {
  207. glEnable(GL_LIGHTING);
  208. glEnable(GL_LIGHT0);
  209. glEnable(GL_NORMALIZE);
  210. GLfloat light_position[] = {100, 100, 100, 0};
  211. GLfloat light_diffuse[] = {1, 1, 1, 1};
  212. GLfloat light_specular[] = {1,1,1,1};
  213. glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  214. glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
  215. glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
  216. return TRUE;
  217. }
  218. BOOL CS045508View::Material() 
  219. {
  220. GLfloat mat_diffuse[] = {0, 1, 0.8f, 1};
  221. GLfloat mat_specular[] = {0, 0, 1, 1};
  222. glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
  223. glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
  224. return TRUE;
  225. }
  226. //Draw 3D object
  227. BOOL CS045508View::RenderScene() 
  228. {
  229. CS045508Doc *pDoc = GetDocument(); 
  230.     
  231.     int n,p;
  232. n=pDoc->ncon;
  233. p=3;
  234.               
  235. if (pDoc->NormalArray.GetSize() > 0 && pDoc->VertexArray.GetSize() > 0)
  236. {
  237. int i=0;
  238. glShadeModel(GL_FLAT);
  239. if(ShadeOrWire==0){
  240. glEnable(GL_LIGHTING);
  241. glBegin(GL_TRIANGLES);}
  242.   
  243. if(ShadeOrWire==1){
  244. glDisable(GL_LIGHTING);
  245. glBegin(GL_LINE_STRIP);}
  246.   for (i=1;i<n;i++){
  247.            
  248.    glNormal3f(pDoc->NormalArray[i].x, pDoc->NormalArray[i].y,
  249.   pDoc->NormalArray[i].z);
  250.  
  251.    glVertex3f(pDoc->VertexArray[p].x, pDoc->VertexArray[p].y,
  252.     pDoc->VertexArray[p].z);
  253.    
  254. glVertex3f(pDoc->VertexArray[p+1].x, pDoc->VertexArray[p+1].y,
  255.   pDoc->VertexArray[p+1].z);
  256.    glVertex3f(pDoc->VertexArray[p+2].x, pDoc->VertexArray[p+2].y,
  257.    pDoc->VertexArray[p+2].z); 
  258. p=p+3;  //p+3 when i+1  as 3 vertex vs 1 normal vector
  259.   }
  260.       glEnd();
  261. }
  262. return TRUE;
  263. }
  264. //followings are rotation,panning, zooming and shading/wire-frame variables
  265. void CS045508View::OnTOOLBARxRotCCW() 
  266. {
  267. // TODO: Add your command handler code here
  268. xRot += 5;
  269. InvalidateRect(0, FALSE);
  270. }
  271. void CS045508View::OnTOOLBARxRotCW() 
  272. {
  273. // TODO: Add your command handler code here
  274. xRot -= 5;
  275. InvalidateRect(0, FALSE);
  276. }
  277. void CS045508View::OnTOOLBARyRotCCW() 
  278. {
  279. // TODO: Add your command handler code here
  280. yRot += 5;
  281. InvalidateRect(0, FALSE);
  282. }
  283. void CS045508View::OnTOOLBARyRotCW() 
  284. {
  285. // TODO: Add your command handler code here
  286. yRot -= 5;
  287. InvalidateRect(0, FALSE);
  288. }
  289. void CS045508View::OnTOOLBARzRotCCW() 
  290. {
  291. // TODO: Add your command handler code here
  292. zRot += 5;
  293. InvalidateRect(0, FALSE);
  294. }
  295. void CS045508View::OnTOOLBARzRotCW() 
  296. {
  297. // TODO: Add your command handler code here
  298. zRot -= 5;
  299. InvalidateRect(0, FALSE);
  300. }
  301. void CS045508View::OnToolbarXpanL() 
  302. {
  303. // TODO: Add your command handler code here
  304. xpan+=1;
  305. InvalidateRect(0, FALSE);
  306. }
  307. void CS045508View::OnToolbarXpanR() 
  308. {
  309. // TODO: Add your command handler code here
  310. xpan-=1;
  311. InvalidateRect(0, FALSE);
  312. }
  313. void CS045508View::OnToolbarYpanD() 
  314. {
  315. // TODO: Add your command handler code here
  316. ypan+=1;
  317. InvalidateRect(0, FALSE);
  318. }
  319. void CS045508View::OnToolbarYpanU() 
  320. {
  321. // TODO: Add your command handler code here
  322. ypan-=1;
  323. InvalidateRect(0, FALSE);
  324. }
  325. void CS045508View::OnZoomIn() 
  326. {
  327. // TODO: Add your command handler code here
  328. zpan-=1;
  329. InvalidateRect(0, FALSE);
  330. }
  331. void CS045508View::OnZoomOut() 
  332. {
  333. // TODO: Add your command handler code here
  334. zpan+=1;
  335. InvalidateRect(0, FALSE);
  336. }
  337. void CS045508View::OnShade() 
  338. {
  339. // TODO: Add your command handler code here
  340. ShadeOrWire=0;
  341. InvalidateRect(0, FALSE);
  342. }
  343. void CS045508View::OnWireframe() 
  344. {
  345. // TODO: Add your command handler code here
  346. ShadeOrWire=1;
  347. InvalidateRect(0, FALSE);
  348. }
  349. //MouseWheel ZOOMMING FUNCTION
  350. BOOL CS045508View::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
  351. {
  352. zpan+=(zDelta/60);
  353.     InvalidateRect(0, FALSE);
  354. return CView::OnMouseWheel(nFlags, zDelta, pt);
  355. }
  356. //Direction Key Panning Function
  357. void CS045508View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
  358. {
  359. // TODO: Add your message handler code here and/or call default
  360.     switch(nChar){
  361. case VK_UP:
  362. ypan-=1;
  363. break;
  364. case VK_DOWN:
  365. ypan+=1;
  366. break;
  367. case VK_LEFT:
  368. xpan+=1;
  369. break;
  370. case VK_RIGHT:
  371. xpan-=1;
  372. break;
  373. default: break;
  374. }
  375. InvalidateRect(0, FALSE);
  376. CView::OnKeyDown(nChar, nRepCnt, nFlags);
  377. }
  378. //Mouse left button pressed
  379. void CS045508View::OnLButtonDown(UINT nFlags, CPoint point) 
  380. {
  381. // TODO: Add your message handler code here and/or call default
  382.  m_LeftDownPos = point;
  383. mouse=1;
  384.      InvalidateRect(0, FALSE);
  385. CView::OnLButtonDown(nFlags, point);
  386. }
  387. //mouse move rotation
  388. void CS045508View::OnMouseMove(UINT nFlags, CPoint point) 
  389. {
  390. // TODO: Add your message handler code here and/or call default
  391. if (mouse==1){
  392. xRot += (float)(point.y - m_LeftDownPos.y) / 3.0f;
  393.     yRot += (float)(point.x - m_LeftDownPos.x) / 3.0f;
  394.     m_LeftDownPos = point; 
  395.   
  396.     InvalidateRect(0, FALSE);
  397. }
  398. CView::OnMouseMove(nFlags, point);
  399. }
  400. //mouse left button released 
  401. void CS045508View::OnLButtonUp(UINT nFlags, CPoint point) 
  402. {
  403. // TODO: Add your message handler code here and/or call default
  404. mouse=0;
  405.     InvalidateRect(0, FALSE);
  406. CView::OnLButtonUp(nFlags, point);
  407. }
  408. void CS045508View::OnInitialUpdate() 
  409. {
  410. CView::OnInitialUpdate();
  411. // TODO: Add your specialized code here and/or call the base class
  412. }