3DEDITORVIEW.CPP
Upload User: nthssl
Upload Date: 2022-04-05
Package Size: 25357k
Code Size: 42k
Category:

OpenCV

Development Platform:

Visual C++

  1. // 3DEditorView.cpp : implementation of the CMy3DEditorView class
  2. //
  3. #include "stdafx.h"
  4. #include "3DEditor.h"
  5. #include "MainFrm.h"
  6. #include "3DEditorDoc.h"
  7. #include "3DEditorView.h"
  8. #include "DlgMapping.h"
  9. #include "DlgProperties.h"
  10. #include "DlgMaterial.h"
  11. #include "DlgRayTrace.h"
  12. #include "mmsystem.h"
  13. #ifdef _DEBUG
  14. #define new DEBUG_NEW
  15. #undef THIS_FILE
  16. static char THIS_FILE[] = __FILE__;
  17. #endif
  18. extern CStatusBar *statbar;
  19. /////////////////////////////////////////////////////////////////////////////
  20. // CMy3DEditorView
  21. IMPLEMENT_DYNCREATE(CMy3DEditorView, CView)
  22. BEGIN_MESSAGE_MAP(CMy3DEditorView, CView)
  23. //{{AFX_MSG_MAP(CMy3DEditorView)
  24. ON_WM_CREATE()
  25. ON_WM_DESTROY()
  26. ON_WM_SIZE()
  27. ON_COMMAND(ID_VIEW_VIEWALL, OnViewViewall)
  28. ON_COMMAND(ID_VIEW_CAMERA_NEXT, OnViewCameraNext)
  29. ON_UPDATE_COMMAND_UI(ID_VIEW_CAMERA_NEXT, OnUpdateViewCameraNext)
  30. ON_COMMAND(ID_VIEW_CAMERA_PREVIOUS, OnViewCameraPrevious)
  31. ON_UPDATE_COMMAND_UI(ID_VIEW_CAMERA_PREVIOUS, OnUpdateViewCameraPrevious)
  32. ON_UPDATE_COMMAND_UI(ID_VIEW_VIEWALL, OnUpdateViewViewall)
  33. ON_COMMAND(ID_EDIT_CAMERA_RESET, OnEditCameraReset)
  34. ON_UPDATE_COMMAND_UI(ID_EDIT_CAMERA_RESET, OnUpdateEditCameraReset)
  35. ON_COMMAND(IDM_FLAT, OnFlat)
  36. ON_UPDATE_COMMAND_UI(IDM_FLAT, OnUpdateFlat)
  37. ON_COMMAND(IDM_GOURAUND, OnGouraund)
  38. ON_UPDATE_COMMAND_UI(IDM_GOURAUND, OnUpdateGouraund)
  39. ON_COMMAND(IDM_POINTS, OnPoints)
  40. ON_UPDATE_COMMAND_UI(IDM_POINTS, OnUpdatePoints)
  41. ON_COMMAND(IDM_SHADED, OnShaded)
  42. ON_UPDATE_COMMAND_UI(IDM_SHADED, OnUpdateShaded)
  43. ON_COMMAND(IDM_TEXTURED, OnTextured)
  44. ON_UPDATE_COMMAND_UI(IDM_TEXTURED, OnUpdateTextured)
  45. ON_COMMAND(IDM_WIREFRAME, OnWireframe)
  46. ON_UPDATE_COMMAND_UI(IDM_WIREFRAME, OnUpdateWireframe)
  47. ON_WM_LBUTTONDOWN()
  48. ON_WM_LBUTTONUP()
  49. ON_COMMAND(ID_LOOKAT, OnLookat)
  50. ON_WM_MOUSEMOVE()
  51. ON_WM_MOUSEWHEEL()
  52. ON_COMMAND(ID_PAN, OnPan)
  53. ON_WM_RBUTTONDOWN()
  54. ON_COMMAND(ID_SELECT, OnSelect)
  55. ON_WM_TIMER()
  56. ON_UPDATE_COMMAND_UI(ID_DOLLY, OnUpdateDolly)
  57. ON_UPDATE_COMMAND_UI(ID_LOOKAT, OnUpdateLookat)
  58. ON_UPDATE_COMMAND_UI(ID_PAN, OnUpdatePan)
  59. ON_UPDATE_COMMAND_UI(ID_SELECT, OnUpdateSelect)
  60. ON_COMMAND(ID_ELEMEMTMODE, OnElememtmode)
  61. ON_UPDATE_COMMAND_UI(ID_ELEMEMTMODE, OnUpdateElememtmode)
  62. ON_COMMAND(ID_MATERIALMODE, OnMaterialmode)
  63. ON_UPDATE_COMMAND_UI(ID_MATERIALMODE, OnUpdateMaterialmode)
  64. ON_COMMAND(ID_DOLLY, OnDolly)
  65. ON_COMMAND(ID_TILT, OnTilt)
  66. ON_UPDATE_COMMAND_UI(ID_TILT, OnUpdateTilt)
  67. ON_COMMAND(ID_RAYTRACE, OnRaytrace)
  68. ON_UPDATE_COMMAND_UI(ID_RAYTRACE, OnUpdateRaytrace)
  69. ON_WM_CHAR()
  70. ON_COMMAND(ID_CAPTURE_IMAGE, OnCaptureImage)
  71. ON_COMMAND(ID_CAPTURE_MOVIE, OnCaptureMovie)
  72. ON_UPDATE_COMMAND_UI(ID_CAPTURE_MOVIE, OnUpdateCaptureMovie)
  73. ON_COMMAND(ID_CAPTURE_RECORD, OnCaptureRecord)
  74. ON_UPDATE_COMMAND_UI(ID_CAPTURE_RECORD, OnUpdateCaptureRecord)
  75. ON_COMMAND(ID_CAPTURE_PAUSE, OnCapturePause)
  76. ON_UPDATE_COMMAND_UI(ID_CAPTURE_PAUSE, OnUpdateCapturePause)
  77. ON_COMMAND(ID_CAPTURE_STOP, OnCaptureStop)
  78. ON_UPDATE_COMMAND_UI(ID_CAPTURE_STOP, OnUpdateCaptureStop)
  79. ON_WM_ERASEBKGND()
  80. //}}AFX_MSG_MAP
  81. // Standard printing commands
  82. ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
  83. ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
  84. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
  85. END_MESSAGE_MAP()
  86. /////////////////////////////////////////////////////////////////////////////
  87. // CMy3DEditorView construction/destruction
  88. CMy3DEditorView::CMy3DEditorView()
  89. {
  90. // TODO: add construction code here
  91. lbut=0;
  92. polymode=3;
  93. shademode=1;
  94. dtimer=0;
  95. cammode=0;
  96. cur_cam=-1;
  97. lastviewUp.Vec(0,0,1);
  98. movieCapture=NULL;
  99. recording=false;
  100. }
  101. CMy3DEditorView::~CMy3DEditorView()
  102. {
  103. }
  104. BOOL CMy3DEditorView::PreCreateWindow(CREATESTRUCT& cs)
  105. {
  106. // TODO: Modify the Window class or styles here by modifying
  107. //  the CREATESTRUCT cs
  108. //设置窗口类型
  109. cs.style |=WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
  110. return CView::PreCreateWindow(cs);
  111. }
  112. /////////////////////////////////////////////////////////////////////////////
  113. // CMy3DEditorView drawing
  114. void CMy3DEditorView::OnDraw(CDC* pDC)
  115. {
  116. CMy3DEditorDoc* pDoc = GetDocument();
  117. ASSERT_VALID(pDoc);
  118. // TODO: add draw code for native data here
  119. if(pDC->IsPrinting())
  120. {
  121.  // 将内存DC中的内容绘制到打印DC 
  122.  CRect      drawRect;
  123.  int        cx, cy;
  124.  m_MemImageDC.GetMemorySize(&cx, &cy);
  125.  drawRect.SetRect(150, 200, 150 + cx*2 , 200 + cy*2);
  126.          pDC->DPtoLP(&drawRect);
  127.  m_MemImageDC.CopyDataToDC(pDC, drawRect);
  128. }
  129. else // 在当前的DC中绘制OpenGL图像
  130. {
  131. wglMakeCurrent( pDC->m_hDC, m_hRC );
  132. glClearColor( pDoc->background.x, pDoc->background.y, pDoc->background.z, 1.0 );
  133. if (pDoc->inuse==0)
  134. DrawScene(pDC);
  135. else 
  136. {
  137. glDrawBuffer(GL_FRONT);
  138. glClear( GL_COLOR_BUFFER_BIT );
  139. glFinish();
  140. }
  141. wglMakeCurrent( 0, 0 );
  142. // 准备内存DC 
  143. CRect rect;
  144. GetClientRect(&rect);
  145.     m_MemImageDC.SetMemorySize(rect.Width(), rect.Height());
  146. // 将当前的DC的图像数据拷贝到内存中
  147. m_MemImageDC.CopyDataFromDC(pDC, rect);
  148. }
  149. }
  150. /////////////////////////////////////////////////////////////////////////////
  151. // CMy3DEditorView printing
  152. BOOL CMy3DEditorView::OnPreparePrinting(CPrintInfo* pInfo)
  153. {
  154. // default preparation
  155. return DoPreparePrinting(pInfo);
  156. }
  157. void CMy3DEditorView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  158. {
  159. // TODO: add extra initialization before printing
  160. }
  161. void CMy3DEditorView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  162. {
  163. // TODO: add cleanup after printing
  164. }
  165. /////////////////////////////////////////////////////////////////////////////
  166. // CMy3DEditorView diagnostics
  167. #ifdef _DEBUG
  168. void CMy3DEditorView::AssertValid() const
  169. {
  170. CView::AssertValid();
  171. }
  172. void CMy3DEditorView::Dump(CDumpContext& dc) const
  173. {
  174. CView::Dump(dc);
  175. }
  176. CMy3DEditorDoc* CMy3DEditorView::GetDocument() // non-debug version is inline
  177. {
  178. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMy3DEditorDoc)));
  179. return (CMy3DEditorDoc*)m_pDocument;
  180. }
  181. #endif //_DEBUG
  182. /////////////////////////////////////////////////////////////////////////////
  183. // CMy3DEditorView message handlers
  184. int CMy3DEditorView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  185. {
  186. if (CView::OnCreate(lpCreateStruct) == -1)
  187. return -1;
  188. // TODO: Add your specialized creation code here
  189. CreateOpenGL();
  190. return 0;
  191. }
  192. void CMy3DEditorView::OnDestroy() 
  193. {
  194. CView::OnDestroy();
  195. // TODO: Add your message handler code here
  196. DestroyOpenGL();
  197. }
  198. void CMy3DEditorView::OnSize(UINT nType, int cx, int cy) 
  199. {
  200. CView::OnSize(nType, cx, cy);
  201. // TODO: Add your message handler code here
  202.     CDC *dc = GetDC();
  203. wglMakeCurrent( dc->m_hDC, m_hRC );
  204.     glViewport(0, 0, cx, cy);
  205. wglMakeCurrent( NULL, NULL );
  206. ReleaseDC(dc);
  207. if (cy==0)
  208. {
  209. cy=1;
  210. aspect=1.0;
  211. }
  212. else aspect=(GLfloat)cx/cy;
  213. }
  214. int CMy3DEditorView::CreateOpenGL()
  215. {
  216. CDC *dc = GetDC();
  217. HDC hDC = dc->GetSafeHdc();
  218. PIXELFORMATDESCRIPTOR pfd = { 
  219.     sizeof(PIXELFORMATDESCRIPTOR),    // pfd结构的大小 
  220.     1,                                // 版本号 
  221.     PFD_DRAW_TO_WINDOW |              // 支持在窗口中绘图 
  222.     PFD_SUPPORT_OPENGL |              // 支持 OpenGL 
  223.     PFD_DOUBLEBUFFER,                 // 双缓存模式 
  224.     PFD_TYPE_RGBA,                    // RGBA 颜色模式 
  225.     24,                               // 24 位颜色深度 
  226.     0, 0, 0, 0, 0, 0,                 // 忽略颜色位 
  227.     0,                                // 没有非透明度缓存 
  228.     0,                                // 忽略移位位 
  229.     0,                                // 无累加缓存 
  230.     0, 0, 0, 0,                       // 忽略累加位 
  231.     32,                               // 32 位深度缓存     
  232.     0,                                // 无模板缓存 
  233.     0,                                // 无辅助缓存 
  234.     PFD_MAIN_PLANE,                   // 主层 
  235.     0,                                // 保留 
  236.     0, 0, 0                           // 忽略层,可见性和损毁掩模 
  237. }; 
  238. int pixelformat;
  239. pixelformat = ::ChoosePixelFormat(hDC, &pfd);//选择像素格式
  240. ::SetPixelFormat(hDC, pixelformat, &pfd); //设置像素格式
  241. if(pfd.dwFlags & PFD_NEED_PALETTE)
  242. SetLogicalPalette(); //设置逻辑调色板
  243.     m_hRC = wglCreateContext( hDC );
  244.     wglMakeCurrent( hDC, m_hRC );
  245.     glClearDepth( 1.0 );
  246.     glDepthFunc(GL_LEQUAL);
  247. glPointSize(2.0);
  248. glLineWidth(1.0);
  249. glCullFace(GL_BACK);
  250.     glPixelStorei(GL_UNPACK_ALIGNMENT,1);
  251. glPixelStorei(GL_PACK_ALIGNMENT,1);
  252.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
  253.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
  254. glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
  255.     wglMakeCurrent( 0, 0 );
  256. ReleaseDC(dc);
  257. return 0;
  258. }
  259. /////////////////////////////////////////////////////////////////////
  260. //                   设置逻辑调色板
  261. //////////////////////////////////////////////////////////////////////
  262. void CMy3DEditorView::SetLogicalPalette(void)
  263. {
  264.     struct
  265.     {
  266.         WORD Version;
  267.         WORD NumberOfEntries;
  268.         PALETTEENTRY aEntries[256];
  269.     } logicalPalette = { 0x300, 256 };
  270. BYTE reds[] = {0, 36, 72, 109, 145, 182, 218, 255};
  271. BYTE greens[] = {0, 36, 72, 109, 145, 182, 218, 255};
  272. BYTE blues[] = {0, 85, 170, 255};
  273.     for (int colorNum=0; colorNum<256; ++colorNum)
  274.     {
  275.         logicalPalette.aEntries[colorNum].peRed =
  276.             reds[colorNum & 0x07];
  277.         logicalPalette.aEntries[colorNum].peGreen =
  278.             greens[(colorNum >> 0x03) & 0x07];
  279.         logicalPalette.aEntries[colorNum].peBlue =
  280.             blues[(colorNum >> 0x06) & 0x03];
  281.         logicalPalette.aEntries[colorNum].peFlags = 0;
  282.     }
  283.     m_hPalette = CreatePalette ((LOGPALETTE*)&logicalPalette);
  284. }
  285. void CMy3DEditorView::DestroyOpenGL()
  286. {
  287. wglMakeCurrent(NULL, NULL);
  288. if (m_hRC)
  289. wglDeleteContext(m_hRC);
  290. if (m_hPalette)
  291.     DeleteObject(m_hPalette);
  292. m_hRC=0;
  293. }
  294. void DrawBBox(object *o)
  295. {
  296. glBegin(GL_LINES);
  297. glVertex3f(o->bbox1.x,o->bbox1.y,o->bbox1.z);
  298. glVertex3f(o->bbox1.x,o->bbox1.y,o->bbox2.z);
  299. glVertex3f(o->bbox1.x,o->bbox1.y,o->bbox1.z);
  300. glVertex3f(o->bbox1.x,o->bbox2.y,o->bbox1.z);
  301. glVertex3f(o->bbox1.x,o->bbox1.y,o->bbox1.z);
  302. glVertex3f(o->bbox2.x,o->bbox1.y,o->bbox1.z);
  303. glVertex3f(o->bbox2.x,o->bbox2.y,o->bbox2.z);
  304. glVertex3f(o->bbox2.x,o->bbox2.y,o->bbox1.z);
  305. glVertex3f(o->bbox2.x,o->bbox2.y,o->bbox2.z);
  306. glVertex3f(o->bbox2.x,o->bbox1.y,o->bbox2.z);
  307. glVertex3f(o->bbox2.x,o->bbox2.y,o->bbox2.z);
  308. glVertex3f(o->bbox1.x,o->bbox2.y,o->bbox2.z);
  309. glVertex3f(o->bbox1.x,o->bbox1.y,o->bbox2.z);
  310. glVertex3f(o->bbox2.x,o->bbox1.y,o->bbox2.z);
  311. glVertex3f(o->bbox2.x,o->bbox1.y,o->bbox2.z);
  312. glVertex3f(o->bbox2.x,o->bbox1.y,o->bbox1.z);
  313. glVertex3f(o->bbox2.x,o->bbox1.y,o->bbox1.z);
  314. glVertex3f(o->bbox2.x,o->bbox2.y,o->bbox1.z);
  315. glVertex3f(o->bbox2.x,o->bbox2.y,o->bbox1.z);
  316. glVertex3f(o->bbox1.x,o->bbox2.y,o->bbox1.z);
  317. glVertex3f(o->bbox1.x,o->bbox2.y,o->bbox1.z);
  318. glVertex3f(o->bbox1.x,o->bbox2.y,o->bbox2.z);
  319. glVertex3f(o->bbox1.x,o->bbox2.y,o->bbox2.z);
  320. glVertex3f(o->bbox1.x,o->bbox1.y,o->bbox2.z);
  321. glEnd();
  322. }
  323. void CMy3DEditorView::DrawScene(CDC* cDC)
  324. {
  325. CMy3DEditorDoc* pDoc = GetDocument();
  326.     glDrawBuffer(GL_BACK);
  327. glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  328. float f[4]={0,0,0,1};
  329. glDisable(GL_POINT_SMOOTH);
  330. glDisable(GL_LINE_SMOOTH);
  331. glDisable(GL_BLEND);
  332. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,pDoc->textinterp?GL_LINEAR:GL_NEAREST);
  333. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,pDoc->textinterp?GL_LINEAR:GL_NEAREST);
  334. if (pDoc->backface)
  335. glEnable(GL_CULL_FACE);
  336. else
  337. glDisable(GL_CULL_FACE);
  338. if (shademode)
  339. glShadeModel(GL_SMOOTH);
  340.     else 
  341. glShadeModel(GL_FLAT);
  342. //    if (dither)
  343.         glEnable(GL_DITHER);
  344. //    else glDisable(GL_DITHER);
  345.     if (polymode)
  346.         if (polymode==1)
  347.            glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
  348.         else 
  349. glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
  350.     else 
  351. glPolygonMode(GL_FRONT_AND_BACK,GL_POINT);
  352. if (polymode==3)
  353. {
  354. glEnable(GL_TEXTURE_2D);
  355. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,pDoc->textinterp?GL_LINEAR:GL_NEAREST);
  356. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,pDoc->textinterp?GL_LINEAR:GL_NEAREST);
  357. }
  358. else
  359. glDisable(GL_TEXTURE_2D);
  360. glMatrixMode( GL_PROJECTION );
  361. glLoadIdentity();
  362. gluPerspective(cam.theta, aspect, nearplane, farplane);
  363. glMatrixMode( GL_MODELVIEW );
  364. glLoadIdentity();
  365. glMultMatrixf((float *)&cam.mat_t);
  366. glTranslatef(-cam.Vp.x,-cam.Vp.y,-cam.Vp.z);
  367. glEnable(GL_DEPTH_TEST);
  368. if (polymode>1)
  369. {
  370. glEnable(GL_LIGHTING);
  371. glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,1);
  372. int i;
  373. f[0]=pDoc->amblight.x;
  374. f[1]=pDoc->amblight.y;
  375. f[2]=pDoc->amblight.z;
  376. glLightModelfv(GL_LIGHT_MODEL_AMBIENT,f);
  377. if (pDoc->headlight==1)
  378. {
  379. glDisable(GL_LIGHT2);
  380. glDisable(GL_LIGHT3);
  381. glDisable(GL_LIGHT4);
  382. glDisable(GL_LIGHT5);
  383. glDisable(GL_LIGHT6);
  384. glDisable(GL_LIGHT7);
  385. glEnable(GL_LIGHT1);
  386. f[0]=(float)cam.Vp.x;
  387. f[1]=(float)cam.Vp.y;
  388. f[2]=(float)cam.Vp.z;
  389. glLightfv(GL_LIGHT1,GL_POSITION,f);
  390. f[0]=f[1]=f[2]=1.0;
  391. glLightfv(GL_LIGHT1,GL_DIFFUSE,f);
  392. glLightfv(GL_LIGHT1,GL_SPECULAR,f);
  393. glLightf(GL_LIGHT1,GL_SPOT_CUTOFF,180);
  394. }
  395. else 
  396. if (pDoc->headlight==-1)
  397. {
  398. glDisable(GL_LIGHTING);
  399. }
  400. else
  401. {
  402. light *l;
  403. int ml;
  404. glDisable(GL_LIGHT1);
  405. glGetIntegerv(GL_MAX_LIGHTS,&ml);
  406. if (--ml>pDoc->nlights)
  407. ml=pDoc->nlights;
  408. for( i=0;i<ml;i++ )
  409. {
  410. l=&pDoc->lightlib[i];
  411. glEnable(GL_LIGHT1+i);
  412. f[0]=l->pos.x;
  413. f[1]=l->pos.y;
  414. f[2]=l->pos.z;
  415. glLightfv(GL_LIGHT1+i,GL_POSITION,f);
  416. f[0]=l->color.x;
  417. f[1]=l->color.y;
  418. f[2]=l->color.z;
  419. glLightfv(GL_LIGHT1+i,GL_DIFFUSE,f);
  420. glLightfv(GL_LIGHT1+i,GL_SPECULAR,f);
  421. if (l->type==1)
  422. {
  423. glLightfv(GL_LIGHT1+i,GL_SPOT_DIRECTION,&l->dir.x);
  424. glLightf(GL_LIGHT1+i,GL_SPOT_CUTOFF,(float)(Degrees(acos(l->falloff))));
  425. }
  426. else glLightf(GL_LIGHT1+i,GL_SPOT_CUTOFF,180);
  427. }
  428. }
  429. }
  430. else
  431. {
  432. glColor3f(1-pDoc->background.x,1-pDoc->background.y,1-pDoc->background.z);
  433. glDisable(GL_LIGHTING);
  434. }
  435. if (pDoc->fog)
  436. {
  437. glEnable(GL_FOG);
  438. glFogi( GL_FOG_MODE, GL_LINEAR );
  439. glFogf( GL_FOG_START  , 0);
  440. glFogf( GL_FOG_END  , pDoc->bboxdiag/4);
  441. f[0]=pDoc->background.x;
  442. f[1]=pDoc->background.y;
  443. f[2]=pDoc->background.z;
  444. glFogfv( GL_FOG_COLOR ,f );
  445. }
  446. else glDisable(GL_FOG);
  447. object *o=pDoc->obj0;
  448. while( o )
  449. {
  450. DrawObject(o);
  451. glFlush();
  452. o=(object *)o->next;
  453. }
  454. glDepthMask(GL_FALSE);
  455. if (pDoc->selobj)
  456. {
  457. glLineWidth(2.0);
  458. glTexImage2D(GL_TEXTURE_2D,0,3,0,0,0,GL_RGB,GL_UNSIGNED_BYTE,0);
  459. glDisable(GL_TEXTURE_2D);
  460. glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
  461. glShadeModel(GL_FLAT);
  462. glDisable(GL_LIGHTING);
  463. glDisable(GL_CULL_FACE);
  464. glColor3f(1.0f,1.0f,1.0f);
  465. int i;
  466. if (pDoc->selface==-1)
  467. DrawBBox(pDoc->selobj);
  468. else
  469. {
  470. for( i=0;i<pDoc->selobj->nf;i++ )
  471. if (pDoc->selobj->ft[i])
  472. pDoc->selobj->ft[i]->flag=1;
  473. ftlist *e=pDoc->selobj->ft[pDoc->selobj->elem[pDoc->selface].elem];
  474. e->flag=0;
  475. DrawElement(e);
  476. }
  477. glLineWidth(1.0);
  478. }
  479. if (pDoc->dlgmap)
  480. {
  481. DlgMapping *d=(DlgMapping *)pDoc->dlgmap;
  482. if (d->obj && d->vsel!=-1)
  483. {
  484. glColor3f(1.0f,0.2f,0.2f);
  485. glPointSize(10.0);
  486. glBegin(GL_POINTS);
  487. if (d->obj->vt[d->vsel])
  488. glVertex3fv((float *)&d->obj->vt[d->vsel]->pos);
  489. glEnd();
  490. glPointSize(2.0);
  491. }
  492. }
  493. glDepthMask(GL_TRUE);
  494. if (movieCapture != NULL && recording)
  495. {
  496. movieCapture->captureFrame();
  497. glPushMatrix();
  498.         glColor4f(1, 0, 0, 1);
  499. RECT rect;
  500.     GetClientRect(&rect);
  501. int x=(rect.right - MovieSize_X) / 2 - 1;
  502. int y =(rect.bottom - MovieSize_Y) / 2 - 1;
  503. int w=MovieSize_X + 1;
  504. int h=MovieSize_Y + 1;
  505. glBegin(GL_LINE_LOOP);
  506. glVertex3f(x, y, 0);
  507. glVertex3f(x + w, y, 0);
  508. glVertex3f(x + w, y + h, 0);
  509. glVertex3f(x, y + h, 0);
  510.         glEnd();
  511.  
  512.         glPopMatrix();
  513. }
  514. glFinish();
  515.     SwapBuffers(cDC->m_hDC);
  516. }
  517. void CMy3DEditorView::DrawObject(object *obj)
  518. {
  519. CMy3DEditorDoc* pDoc = GetDocument();
  520. ASSERT_VALID(pDoc);
  521. int f=0;
  522. pDoc->SelectMaterial(pDoc->matlib,last_mat=0);
  523. ftlist **ft=obj->ft;
  524. switch (polymode)
  525. {
  526. case 2:
  527. glBegin(GL_TRIANGLES);
  528. if (shademode)
  529. for( f=0;f<obj->nf;f++ )
  530. if (ft[f])
  531. {
  532. if (ft[f]->material!=last_mat)
  533. {
  534. glEnd();
  535. pDoc->SelectMaterial(&pDoc->matlib[last_mat=ft[f]->material],polymode==3);
  536. glBegin(GL_TRIANGLES);
  537. }
  538.  glNormal3fv((float *)&ft[f]->lv[0]->normal);
  539.    glVertex3fv((float *)&ft[f]->lv[0]->pos);
  540.  glNormal3fv((float *)&ft[f]->lv[1]->normal);
  541.    glVertex3fv((float *)&ft[f]->lv[1]->pos);
  542.  glNormal3fv((float *)&ft[f]->lv[2]->normal);
  543.    glVertex3fv((float *)&ft[f]->lv[2]->pos);
  544. }
  545. else ;
  546. else
  547. for( f=0;f<obj->nf;f++ )
  548. if (ft[f])
  549. {
  550. if (ft[f]->material!=last_mat)
  551. {
  552. glEnd();
  553. pDoc->SelectMaterial(&pDoc->matlib[last_mat=ft[f]->material],polymode==3);
  554. glBegin(GL_TRIANGLES);
  555. }
  556. glNormal3fv((float *)&ft[f]->normal);
  557. glVertex3fv((float *)&ft[f]->lv[0]->pos);
  558. glVertex3fv((float *)&ft[f]->lv[1]->pos);
  559. glVertex3fv((float *)&ft[f]->lv[2]->pos);
  560. }
  561. glEnd();
  562. break;
  563. case 3:
  564. {
  565.  float uv[2];
  566. glBegin(GL_TRIANGLES);
  567. if (shademode)
  568. for( f=0;f<obj->nf;f++ )
  569. if (ft[f])
  570. {
  571. if (ft[f]->material!=last_mat)
  572. {
  573. glEnd();
  574. pDoc->SelectMaterial(&pDoc->matlib[last_mat=ft[f]->material],polymode==3);
  575. glBegin(GL_TRIANGLES);
  576. }
  577.  uv[0]=ft[f]->lv[0]->tx[0];
  578.  uv[1]=ft[f]->lv[0]->tx[1];
  579.  pDoc->calc_uv(uv[0], uv[1], &(pDoc->matlib[last_mat].map_texture1));
  580.  glNormal3fv((float *)&ft[f]->lv[0]->normal);
  581.  glTexCoord2fv(uv);
  582.    glVertex3fv((float *)&ft[f]->lv[0]->pos);
  583.  uv[0]=ft[f]->lv[1]->tx[0];
  584.  uv[1]=ft[f]->lv[1]->tx[1];
  585.  pDoc->calc_uv(uv[0], uv[1], &(pDoc->matlib[last_mat].map_texture1));
  586.  glNormal3fv((float *)&ft[f]->lv[1]->normal);
  587.  glTexCoord2fv(uv);
  588.    glVertex3fv((float *)&ft[f]->lv[1]->pos);
  589.  uv[0]=ft[f]->lv[2]->tx[0];
  590.  uv[1]=ft[f]->lv[2]->tx[1];
  591.  pDoc->calc_uv(uv[0], uv[1], &(pDoc->matlib[last_mat].map_texture1));
  592.  glNormal3fv((float *)&ft[f]->lv[2]->normal);
  593.  glTexCoord2fv(uv);
  594.    glVertex3fv((float *)&ft[f]->lv[2]->pos);
  595. }
  596. else ;
  597. else
  598. for( f=0;f<obj->nf;f++ )
  599. if (ft[f])
  600. {
  601. if (ft[f]->material!=last_mat)
  602. {
  603. glEnd();
  604. pDoc->SelectMaterial(&pDoc->matlib[last_mat=ft[f]->material],polymode==3);
  605. glBegin(GL_TRIANGLES);
  606. }
  607. glNormal3fv((float *)&ft[f]->normal);
  608. uv[0]=ft[f]->lv[0]->tx[0];
  609. uv[1]=ft[f]->lv[0]->tx[1];
  610. pDoc->calc_uv(uv[0], uv[1], &(pDoc->matlib[last_mat].map_texture1));
  611. glTexCoord2fv(uv);
  612. glVertex3fv((float *)&ft[f]->lv[0]->pos);
  613. uv[0]=ft[f]->lv[1]->tx[0];
  614. uv[1]=ft[f]->lv[1]->tx[1];
  615. pDoc->calc_uv(uv[0], uv[1], &(pDoc->matlib[last_mat].map_texture1));
  616. glTexCoord2fv(uv);
  617. glVertex3fv((float *)&ft[f]->lv[1]->pos);
  618. uv[0]=ft[f]->lv[2]->tx[0];
  619. uv[1]=ft[f]->lv[2]->tx[1];
  620. pDoc->calc_uv(uv[0], uv[1], &(pDoc->matlib[last_mat].map_texture1));
  621. glTexCoord2fv(uv);
  622. glVertex3fv((float *)&ft[f]->lv[2]->pos);
  623. }
  624. glEnd();
  625. }
  626. break;
  627. case 0:
  628. glBegin(GL_POINTS);
  629. for( f=0;f<obj->nv;f++ )
  630. if (obj->vt[f])
  631. glVertex3fv((float *)&obj->vt[f]->pos);
  632. glEnd();
  633. break;
  634. case 1:
  635. glBegin(GL_TRIANGLES);
  636. for( f=0;f<obj->nf;f++ )
  637. if (ft[f])
  638. {
  639. glVertex3fv((float *)&ft[f]->lv[0]->pos);
  640. glVertex3fv((float *)&ft[f]->lv[1]->pos);
  641. glVertex3fv((float *)&ft[f]->lv[2]->pos);
  642. }
  643. glEnd();
  644. break;
  645. }
  646. }
  647. void CMy3DEditorView::DrawElement(ftlist *node)
  648. {
  649. unsigned short i;
  650. glBegin(GL_TRIANGLES);
  651. glVertex3fv(&node->lv[0]->pos.x);
  652. glVertex3fv(&node->lv[1]->pos.x);
  653. glVertex3fv(&node->lv[2]->pos.x);
  654. glEnd();
  655. for( i=0;i<3;i++ )
  656. if (node->lf[i])
  657. if (node->lf[i]->flag)
  658. {
  659. node->lf[i]->flag=0;
  660. DrawElement(node->lf[i]);
  661. }
  662. }
  663. void CMy3DEditorView::LookAt(vector& vp,vector& lp)
  664. {
  665. CMy3DEditorDoc* pDoc = GetDocument();
  666. vector U,N;
  667. cam.Vp=vp;
  668. cam.Lp=lp;
  669. cam.theta=45.0;
  670. N=lp-vp;
  671. N.Normalize();
  672. U=cam.Up - VecDot(N,cam.Up)*N;
  673. U.Normalize();
  674. cam.Up=U;
  675. cam.CalcSystemVectors();
  676. float d2=(pDoc->bboxC - cam.Vp).Length();
  677. nearplane=d2-pDoc->bboxdiag/2;
  678. farplane=pDoc->bboxdiag/2+d2;
  679. if (nearplane<pDoc->bboxdiag/1000) 
  680. nearplane=pDoc->bboxdiag/1000;
  681. Invalidate(0);
  682. }
  683. void CMy3DEditorView::OnViewViewall() 
  684. {
  685. // TODO: Add your command handler code here
  686. CMy3DEditorDoc* pDoc = GetDocument();
  687. ASSERT_VALID(pDoc);
  688. vector vp;
  689. vp=pDoc->bboxC;
  690. vp.x-=pDoc->bboxdiag;
  691. LookAt(vp,pDoc->bboxC);
  692. }
  693. void CMy3DEditorView::OnUpdateViewViewall(CCmdUI* pCmdUI) 
  694. {
  695. // TODO: Add your command update UI handler code here
  696. CMy3DEditorDoc *pDoc=GetDocument();
  697. pCmdUI->Enable(pDoc->obj0!=0);
  698. }
  699. void CMy3DEditorView::OnViewCameraNext() 
  700. {
  701. // TODO: Add your command handler code here
  702. CMy3DEditorDoc *pDoc=GetDocument();
  703. cur_cam=(cur_cam+1)%GetDocument()->ncamlib;
  704. LookAt(pDoc->camlib[cur_cam].Vp,pDoc->camlib[cur_cam].Lp);
  705. }
  706. void CMy3DEditorView::OnUpdateViewCameraNext(CCmdUI* pCmdUI) 
  707. {
  708. // TODO: Add your command update UI handler code here
  709. pCmdUI->Enable(GetDocument()->ncamlib>1);
  710. }
  711. void CMy3DEditorView::OnViewCameraPrevious() 
  712. {
  713. // TODO: Add your command handler code here
  714. CMy3DEditorDoc *pDoc=GetDocument();
  715. if (cur_cam==0)
  716. cur_cam=GetDocument()->ncamlib-1;
  717. else cur_cam=cur_cam-1;
  718. LookAt(pDoc->camlib[cur_cam].Vp,pDoc->camlib[cur_cam].Lp);
  719. }
  720. void CMy3DEditorView::OnUpdateViewCameraPrevious(CCmdUI* pCmdUI) 
  721. {
  722. // TODO: Add your command update UI handler code here
  723. pCmdUI->Enable(GetDocument()->ncamlib>1);
  724. }
  725. void CMy3DEditorView::OnEditCameraReset() 
  726. {
  727. // TODO: Add your command handler code here
  728. CMy3DEditorDoc *pDoc=GetDocument();
  729. LookAt(pDoc->camlib[cur_cam].Vp,pDoc->camlib[cur_cam].Lp);
  730. }
  731. void CMy3DEditorView::OnUpdateEditCameraReset(CCmdUI* pCmdUI) 
  732. {
  733. // TODO: Add your command update UI handler code here
  734. pCmdUI->Enable(cur_cam!=-1);
  735. }
  736. void CMy3DEditorView::OnFlat() 
  737. {
  738. // TODO: Add your command handler code here
  739. shademode=0;
  740. Invalidate(0);
  741. }
  742. void CMy3DEditorView::OnUpdateFlat(CCmdUI* pCmdUI) 
  743. {
  744. // TODO: Add your command update UI handler code here
  745. pCmdUI->SetRadio(shademode==0);
  746. }
  747. void CMy3DEditorView::OnGouraund() 
  748. {
  749. // TODO: Add your command handler code here
  750. shademode=1;
  751. Invalidate(0);
  752. }
  753. void CMy3DEditorView::OnUpdateGouraund(CCmdUI* pCmdUI) 
  754. {
  755. // TODO: Add your command update UI handler code here
  756. pCmdUI->SetRadio(shademode==1);
  757. }
  758. void CMy3DEditorView::OnPoints() 
  759. {
  760. // TODO: Add your command handler code here
  761. polymode=0;
  762. Invalidate(0);
  763. }
  764. void CMy3DEditorView::OnUpdatePoints(CCmdUI* pCmdUI) 
  765. {
  766. // TODO: Add your command update UI handler code here
  767. pCmdUI->SetRadio(polymode==0);
  768. }
  769. void CMy3DEditorView::OnShaded() 
  770. {
  771. // TODO: Add your command handler code here
  772. polymode=2;
  773. Invalidate(0);
  774. }
  775. void CMy3DEditorView::OnUpdateShaded(CCmdUI* pCmdUI) 
  776. {
  777. // TODO: Add your command update UI handler code here
  778. pCmdUI->SetRadio(polymode==2);
  779. }
  780. void CMy3DEditorView::OnTextured() 
  781. {
  782. // TODO: Add your command handler code here
  783. polymode=3;
  784. Invalidate(0);
  785. }
  786. void CMy3DEditorView::OnUpdateTextured(CCmdUI* pCmdUI) 
  787. {
  788. // TODO: Add your command update UI handler code here
  789. pCmdUI->SetRadio(polymode==3);
  790. }
  791. void CMy3DEditorView::OnWireframe() 
  792. {
  793. // TODO: Add your command handler code here
  794. polymode=1;
  795. Invalidate(0);
  796. }
  797. void CMy3DEditorView::OnUpdateWireframe(CCmdUI* pCmdUI) 
  798. {
  799. // TODO: Add your command update UI handler code here
  800. pCmdUI->SetRadio(polymode==1);
  801. }
  802. void CMy3DEditorView::OnLButtonDown(UINT nFlags, CPoint point) 
  803. {
  804. // TODO: Add your message handler code here and/or call default
  805. CMy3DEditorDoc *pDoc=GetDocument();
  806. if ((nFlags&MK_CONTROL) || (nFlags&MK_SHIFT) ||
  807. (GetAsyncKeyState(VK_MENU)&0x8000) )
  808. {
  809. lbut=1;
  810. mousex = point.x;    
  811. mousey = point.y;
  812. SetCapture();
  813. }
  814. else if (cammode==0)
  815. Select(point,0);
  816. else if (cammode==7)
  817. Select(point,7);
  818. else if (cammode==4)
  819. Select(point,5);
  820. else if (cammode==8)
  821. Select(point,8);
  822. else
  823. {
  824. lbut=1;
  825. mousex = point.x;    
  826. mousey = point.y;
  827. SetCapture();
  828. }
  829. CView::OnLButtonDown(nFlags, point);
  830. }
  831. void CMy3DEditorView::OnLButtonUp(UINT nFlags, CPoint point) 
  832. {
  833. // TODO: Add your message handler code here and/or call default
  834. if (lbut)
  835.    { 
  836. lbut=0;
  837.     ReleaseCapture();
  838.    }
  839. CView::OnLButtonUp(nFlags, point);
  840. }
  841. void CMy3DEditorView::OnLookat() 
  842. {
  843. // TODO: Add your command handler code here
  844. if (cammode==4)
  845. cammode=0;
  846. else cammode=4;
  847. }
  848. void CMy3DEditorView::OnMouseMove(UINT nFlags, CPoint point) 
  849. {
  850. // TODO: Add your message handler code here and/or call default
  851. CMy3DEditorDoc* pDoc = GetDocument();
  852. int cmode;
  853. if (nFlags&MK_CONTROL)
  854. cmode=2;
  855. else if (nFlags&MK_SHIFT)
  856. cmode=3;
  857. else if (GetAsyncKeyState(VK_MENU)&0x8000)
  858. cmode=1;
  859. else if (cammode!=0)
  860. cmode=cammode;
  861. else 
  862. {
  863. mousex=point.x;
  864. mousey=point.y;
  865. return;
  866. }
  867. switch(cmode)
  868. {
  869. case 1: SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR1));
  870. break;
  871. case 2: SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR2));
  872. break;
  873. case 3: SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR3));
  874. break;
  875. case 4: SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR4));
  876. break;
  877. }
  878. if (lbut==1)
  879. {
  880.  vector disp;
  881.  switch(cmode)
  882.  {
  883.  case 1:
  884. disp = ((float)(point.y-mousey)*cam.Y + 
  885.     (float)(mousex-point.x)*cam.X) * pDoc->bboxdiag/1000.0;
  886. break;
  887.  case 2:
  888.  disp = ((float)(mousey-point.y)*cam.Z) * pDoc->bboxdiag/-1000.0f;
  889.  {
  890. CDC *dc = GetDC();
  891. wglMakeCurrent( dc->m_hDC, m_hRC );
  892. vector rot;
  893. rot.Vec(0,0,(mousex-point.x)/5.0f);
  894. cam.rotate(rot);
  895. wglMakeCurrent( 0, 0);
  896. ReleaseDC(dc);
  897.  }
  898.  break;
  899.  case 3:
  900.  {
  901. CDC *dc = GetDC();
  902. wglMakeCurrent( dc->m_hDC, m_hRC );
  903. vector rot;
  904. rot.Vec((point.y-mousey)/10.0f,-(mousex-point.x)/10.0f,0);
  905. cam.rotate(rot);
  906. wglMakeCurrent( 0, 0);
  907. ReleaseDC(dc);
  908. disp.Null();
  909.  }
  910.  break;
  911.  default: disp.Null();
  912.  }
  913.  cam.Vp+=disp;
  914.  cam.Lp+=disp;
  915. float d2=(pDoc->bboxC - cam.Vp).Length();
  916. nearplane=d2-pDoc->bboxdiag/2;
  917. farplane=pDoc->bboxdiag/2+d2;
  918. if (nearplane<pDoc->bboxdiag/1000) 
  919. nearplane=pDoc->bboxdiag/1000;
  920.  
  921.  mousex=point.x;
  922.  mousey=point.y;
  923.  Invalidate(0);
  924. }
  925. CView::OnMouseMove(nFlags, point);
  926. }
  927. BOOL CMy3DEditorView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
  928. {
  929. // TODO: Add your message handler code here and/or call default
  930. CMy3DEditorDoc *pDoc=GetDocument();
  931. if (pDoc->dlgprop)
  932. ((DlgProperties *)pDoc->dlgprop)->step_slider(zDelta/WHEEL_DELTA);
  933. return CView::OnMouseWheel(nFlags, zDelta, pt);
  934. }
  935. void CMy3DEditorView::OnPan() 
  936. {
  937. // TODO: Add your command handler code here
  938. if (cammode==1)
  939. cammode=0;
  940. else cammode=1;
  941. }
  942. void CMy3DEditorView::OnRButtonDown(UINT nFlags, CPoint point) 
  943. {
  944. // TODO: Add your message handler code here and/or call default
  945. CMy3DEditorDoc *pDoc=GetDocument();
  946. if (cammode==4)
  947. Select(point,6);
  948. CView::OnRButtonDown(nFlags, point);
  949. }
  950. void CMy3DEditorView::OnSelect() 
  951. {
  952. // TODO: Add your command handler code here
  953. cammode=0;
  954. }
  955. void CMy3DEditorView::OnTimer(UINT nIDEvent) 
  956. {
  957. // TODO: Add your message handler code here and/or call default
  958. DWORD t0=timeGetTime();
  959. int t=t0-timer;
  960. if (t>dtimer)
  961. t=dtimer;
  962. dtimer-=t;
  963. timer=t0;
  964. if (dtimer==0)
  965. KillTimer(1);
  966. LookAt(cam.Vp+dvp*(float)t,cam.Lp+dlp*(float)t);
  967. CView::OnTimer(nIDEvent);
  968. }
  969. void CMy3DEditorView::OnUpdateDolly(CCmdUI* pCmdUI) 
  970. {
  971. // TODO: Add your command update UI handler code here
  972. pCmdUI->SetRadio(cammode==2);
  973. }
  974. void CMy3DEditorView::OnUpdateLookat(CCmdUI* pCmdUI) 
  975. {
  976. // TODO: Add your command update UI handler code here
  977. pCmdUI->SetRadio(cammode==4);
  978. }
  979. void CMy3DEditorView::OnUpdatePan(CCmdUI* pCmdUI) 
  980. {
  981. // TODO: Add your command update UI handler code here
  982. pCmdUI->SetRadio(cammode==1);
  983. }
  984. void CMy3DEditorView::OnUpdateSelect(CCmdUI* pCmdUI) 
  985. {
  986. // TODO: Add your command update UI handler code here
  987. pCmdUI->SetRadio(cammode==0);
  988. }
  989. LRESULT CMy3DEditorView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
  990. {
  991. // TODO: Add your specialized code here and/or call the base class
  992. if (message==WM_MBUTTONDOWN)
  993. {
  994. CMy3DEditorDoc *pDoc=GetDocument();
  995. CPoint p(lParam);
  996. if (cammode==4)
  997. Select(p,4);
  998. }
  999. else if(message==WM_DISPLAYCHANGE)
  1000. {
  1001. if (wParam<=8)
  1002. AfxMessageBox(IDS_DISPLAY_ERROR,MB_OK|MB_ICONEXCLAMATION);
  1003. else
  1004. {
  1005. DestroyOpenGL();
  1006. CreateOpenGL();
  1007. Invalidate(1);
  1008. }
  1009. }
  1010. return CView::WindowProc(message, wParam, lParam);
  1011. }
  1012. void CMy3DEditorView::Select(CPoint point,int mode)
  1013. {
  1014. char str[256];
  1015. CMy3DEditorDoc *pDoc=GetDocument();
  1016. CDC *pDC=GetDC();
  1017. wglMakeCurrent( pDC->m_hDC, m_hRC );
  1018. glShadeModel(GL_FLAT);
  1019. glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
  1020. if (pDoc->backface && mode!=7)
  1021. glEnable(GL_CULL_FACE);
  1022. else 
  1023. glDisable(GL_CULL_FACE);
  1024. unsigned int intbuf[500];
  1025. glSelectBuffer( 500,intbuf );
  1026. int viewport[4];
  1027. glGetIntegerv(GL_VIEWPORT,viewport);
  1028. glRenderMode(GL_SELECT);
  1029. glInitNames();
  1030. glMatrixMode( GL_PROJECTION );
  1031. glPushMatrix();
  1032. glLoadIdentity();
  1033. gluPickMatrix(point.x,viewport[3]-point.y,1,1,viewport);
  1034. gluPerspective(cam.theta, aspect, nearplane, farplane );
  1035. glMatrixMode( GL_MODELVIEW );
  1036. object *o=pDoc->obj0;
  1037. int f,counto=0;
  1038. while( o )
  1039. {
  1040. glPushName(counto);
  1041. glPushName(-1);
  1042. for( f=0;f<o->nf;f++ )
  1043. if (o->ft[f])
  1044. {
  1045. glLoadName( f );
  1046. glBegin(GL_TRIANGLES);
  1047. glVertex3fv((float *)&o->ft[f]->lv[0]->pos);
  1048. glVertex3fv((float *)&o->ft[f]->lv[1]->pos);
  1049. glVertex3fv((float *)&o->ft[f]->lv[2]->pos);
  1050. glEnd();
  1051. }
  1052. glPopName();
  1053. glPopName();
  1054. counto++;
  1055. o=o->next;
  1056. }
  1057. glPopMatrix();
  1058. glFlush();
  1059. counto=glRenderMode(GL_RENDER);
  1060. if (counto>0)
  1061. {
  1062. int pos=0,selpos=0;
  1063. unsigned int min=-1;
  1064. for( f=0;f<counto;f++ ) 
  1065. {
  1066. if (intbuf[pos+1]<min)
  1067. {
  1068. min=intbuf[pos+1];
  1069. selpos=pos;
  1070. }
  1071. pos+=5;
  1072. }
  1073. o=pDoc->obj0;
  1074. for( f=0;f<(int)intbuf[selpos+3];f++ )
  1075. o=o->next;
  1076. f=intbuf[selpos+4];
  1077. if (mode==4 || mode==5 || mode==6)
  1078. {
  1079. RECT rect;
  1080. GetClientRect(&rect);
  1081. float dist;
  1082. double ipdist=0.5*rect.bottom/TanD(0.5*cam.theta),
  1083. angx=atan((point.x-rect.right/2+0.5)/ipdist),
  1084. angy=-atan((point.y-rect.bottom/2+0.5)/ipdist);
  1085. vector Ro,Rd,vp,lp;
  1086. Ro.Vec(-(float)(sin(angx)*cos(angy)),-(float)(sin(angy)*cos(angx)),(float)(cos(angx)*cos(angy)));
  1087. Rd=Ro*cam.mat;
  1088. Rd.Normalize();
  1089. Rd.Negate();
  1090. Ro=cam.Vp;
  1091. o->ft[f]->ray_intersect(Ro,Rd,lp,dist);
  1092. Rd=cam.Vp-lp;
  1093. Ro=o->ft[f]->normal;
  1094. if (VecDot(Rd,Ro)<0)
  1095. Ro.Negate();
  1096. if (mode==5)
  1097. vp=lp+dist*Ro/2;
  1098. else if (mode==6)
  1099. vp=lp+dist*Ro*2;
  1100. else vp=lp+dist*Ro;
  1101. dtimer=1000;
  1102. dvp=(vp-cam.Vp)/(float)dtimer;
  1103. dlp=(lp-cam.Lp)/(float)dtimer;
  1104. timer=timeGetTime();
  1105. SetTimer(1,30,0);
  1106. }
  1107. else if(mode==8)
  1108. {
  1109. if (pDoc->dlgmat==0)
  1110. {
  1111. pDoc->dlgmat=new DlgMaterial;
  1112. ((DlgMaterial *)pDoc->dlgmat)->doc=pDoc;
  1113. pDoc->dlgmat->Create(IDD_MATERIAL);
  1114. CString s;
  1115. s.LoadString(IDS_MATERIAL);
  1116. sprintf(str,s,pDoc->GetTitle());
  1117. pDoc->dlgmat->SetWindowText(str);
  1118. pDoc->dlgmat->ShowWindow(SW_SHOW);
  1119. }
  1120. ((DlgMaterial *)pDoc->dlgmat)->m_names.SelectString( -1, pDoc->matlib[o->ft[f]->material].name );
  1121. ((DlgMaterial *)pDoc->dlgmat)->OnSelchangeName();
  1122. }
  1123. else if (mode==0 || mode==7)
  1124. {
  1125. if (pDoc->dlgprop==0)
  1126. {
  1127. pDoc->dlgprop=new DlgProperties;
  1128. ((DlgProperties *)pDoc->dlgprop)->doc=pDoc;
  1129. pDoc->dlgprop->Create(IDD_PROPERTIES);
  1130. CString s;
  1131. s.LoadString(IDS_DETAIL);
  1132. sprintf(str,s,pDoc->GetTitle());
  1133. pDoc->dlgprop->SetWindowText(str);
  1134. pDoc->dlgprop->ShowWindow(SW_SHOW);
  1135. }
  1136. ((DlgProperties *)pDoc->dlgprop)->m_obj.SelectString( -1, o->name );
  1137. ((DlgProperties *)pDoc->dlgprop)->OnSelchangeObj();
  1138. if (mode==7)
  1139. {
  1140. ((DlgProperties *)pDoc->dlgprop)->m_elem.SetCurSel( o->ft[f]->group+1 );
  1141. ((DlgProperties *)pDoc->dlgprop)->OnSelchangeElem();
  1142. }
  1143. }
  1144. }
  1145. else if (counto==0 && (mode==0 || mode==7))
  1146. {
  1147. if (pDoc->dlgprop!=0)
  1148. {
  1149. ((DlgProperties *)pDoc->dlgprop)->m_obj.SetCurSel( 0 );
  1150. ((DlgProperties *)pDoc->dlgprop)->OnSelchangeObj();
  1151. }
  1152. else
  1153. {
  1154. pDoc->selobj=0;
  1155. pDoc->selface=-1;
  1156. pDoc->UpdateAllViews(0);
  1157. }
  1158. }
  1159. wglMakeCurrent( NULL, NULL );
  1160. }
  1161. void CMy3DEditorView::OnElememtmode() 
  1162. {
  1163. // TODO: Add your command handler code here
  1164. if (cammode==7)
  1165. cammode=0;
  1166. else cammode=7;
  1167. }
  1168. void CMy3DEditorView::OnUpdateElememtmode(CCmdUI* pCmdUI) 
  1169. {
  1170. // TODO: Add your command update UI handler code here
  1171. pCmdUI->SetCheck(cammode==7);
  1172. }
  1173. void CMy3DEditorView::OnMaterialmode() 
  1174. {
  1175. // TODO: Add your command handler code here
  1176. if (cammode==8)
  1177. cammode=0;
  1178. else cammode=8;
  1179. }
  1180. void CMy3DEditorView::OnUpdateMaterialmode(CCmdUI* pCmdUI) 
  1181. {
  1182. // TODO: Add your command update UI handler code here
  1183. pCmdUI->SetCheck(cammode==8);
  1184. }
  1185. void CMy3DEditorView::OnDolly() 
  1186. {
  1187. // TODO: Add your command handler code here
  1188. if (cammode==2)
  1189. cammode=0;
  1190. else cammode=2;
  1191. }
  1192. void CMy3DEditorView::OnTilt() 
  1193. {
  1194. // TODO: Add your command handler code here
  1195. if (cammode==3)
  1196. cammode=0;
  1197. else cammode=3;
  1198. }
  1199. void CMy3DEditorView::OnUpdateTilt(CCmdUI* pCmdUI) 
  1200. {
  1201. // TODO: Add your command update UI handler code here
  1202. pCmdUI->SetRadio(cammode==3);
  1203. }
  1204. void CMy3DEditorView::OnRaytrace() 
  1205. {
  1206. // TODO: Add your command handler code here
  1207. DlgRayTrace d;
  1208. CMy3DEditorDoc *pDoc=GetDocument();
  1209. if (pDoc->dlgprop)
  1210. ((DlgProperties *)(pDoc->dlgprop))->Close();
  1211. if (pDoc->dlgmat)
  1212. ((DlgMaterial *)(pDoc->dlgmat))->Close();
  1213. d.m_ray_depth=AfxGetApp()->GetProfileInt("RayTrace","RayDepth",3);
  1214. d.m_shadows=AfxGetApp()->GetProfileInt("RayTrace","Shadows",1);
  1215. d.m_antialiase=AfxGetApp()->GetProfileInt("RayTrace","AntiAliase",0);
  1216. d.m_antialiase_factor=AfxGetApp()->GetProfileInt("RayTrace","AntiAliaseFactor",0);
  1217. d.view=AfxGetApp()->GetProfileInt("RayTrace","Resolution", 1);
  1218. GetClientRect(&d.rect);
  1219. d.doc=GetDocument();
  1220. d.cam=&cam;
  1221. if (d.view)
  1222. {
  1223. d.m_res_x=d.rect.right;
  1224. d.m_res_y=d.rect.bottom;
  1225. }
  1226. else
  1227. {
  1228. d.m_res_x=AfxGetApp()->GetProfileInt("RayTrace","ResX",320);
  1229. d.m_res_y=AfxGetApp()->GetProfileInt("RayTrace","ResY",240);
  1230. }
  1231. d.DoModal();
  1232. AfxGetApp()->WriteProfileInt("RayTrace","ResX",d.m_res_x);
  1233. AfxGetApp()->WriteProfileInt("RayTrace","ResY",d.m_res_y);
  1234. AfxGetApp()->WriteProfileInt("RayTrace","RayDepth",d.m_ray_depth);
  1235. AfxGetApp()->WriteProfileInt("RayTrace","Shadows",d.m_shadows);
  1236. AfxGetApp()->WriteProfileInt("RayTrace","Resolution",d.view);
  1237. AfxGetApp()->WriteProfileInt("RayTrace","AntiAliase",d.m_antialiase);
  1238. AfxGetApp()->WriteProfileInt("RayTrace","AntiAliaseFactor",d.m_antialiase_factor);
  1239. }
  1240. void CMy3DEditorView::OnUpdateRaytrace(CCmdUI* pCmdUI) 
  1241. {
  1242. // TODO: Add your command update UI handler code here
  1243. pCmdUI->Enable(GetDocument()->obj0!=0);
  1244. }
  1245. void CMy3DEditorView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
  1246. {
  1247. // TODO: Add your message handler code here and/or call default
  1248. if (nChar == VK_ESCAPE)
  1249. {
  1250. CMainFrame* pFrame = (CMainFrame*) AfxGetMainWnd();
  1251. if(pFrame->m_bFullScreenMode) pFrame->FullScreenModeOff();
  1252. }
  1253. if (nChar ==115) //"S"
  1254. {
  1255. if (movieCapture != NULL)
  1256.         {
  1257.             if (isRecording())
  1258.                 recordPause();
  1259.             else
  1260.                 recordBegin();
  1261.         }
  1262. }
  1263. if (nChar ==112) //"P"
  1264. {
  1265. if (movieCapture != NULL)
  1266.             recordEnd();
  1267. }
  1268. CView::OnChar(nChar, nRepCnt, nFlags);
  1269. }
  1270. void CMy3DEditorView::OnCaptureImage() 
  1271. {
  1272. // TODO: Add your command handler code here
  1273. CString s;
  1274. s.LoadString(IDS_FD_IMAGE);
  1275. CFileDialog fd(FALSE,"jpg",0,OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST,s);
  1276. CDC *dc=GetDC();
  1277. wglMakeCurrent( dc->m_hDC, m_hRC );
  1278. if(fd.DoModal()==IDOK)
  1279. {
  1280. BeginWaitCursor();
  1281. int viewport[4];
  1282. glGetIntegerv(GL_VIEWPORT,viewport);
  1283.         bool success = false;
  1284.         DWORD nFileType=0;
  1285. if(strcmp(fd.GetFileExt(),"jpg")==0) nFileType=1;
  1286. if(strcmp(fd.GetFileExt(),"png")==0) nFileType=2;
  1287. if(strcmp(fd.GetFileExt(),"bmp")==0) nFileType=3;
  1288.         if (nFileType == 1)
  1289.         {
  1290. success = m_imagecapture.CaptureGLBufferToJPEG(fd.GetPathName(),
  1291.                                             viewport[0],viewport[1],
  1292.                                             viewport[2],viewport[3]);
  1293.         }
  1294.         else if (nFileType == 2)
  1295.         {
  1296.           success = m_imagecapture.CaptureGLBufferToPNG(fd.GetPathName(),
  1297.                                             viewport[0],viewport[1],
  1298.                                             viewport[2],viewport[3]);
  1299.         }
  1300.         else if(nFileType==3)
  1301. {
  1302. success=m_imagecapture.CaptureGLBufferToBMP(fd.GetPathName(),
  1303.                                             viewport[0],viewport[1],
  1304.                                             viewport[2],viewport[3]);
  1305. }
  1306. else
  1307.         {
  1308.             // Invalid file extension specified.
  1309.             MessageBox("WTF? Unknown file extension specified for screen capture.n","Error",MB_OK);
  1310.         }
  1311.         if (!success)
  1312.         {
  1313.             char errorMsg[64];
  1314.             if(nFileType == 0)
  1315.                 sprintf(errorMsg, "Specified file extension is not recognized.");
  1316.             else
  1317.                 sprintf(errorMsg, "Could not save image file.");
  1318.             MessageBox(errorMsg, "Error", MB_OK | MB_ICONERROR);
  1319.         }
  1320. EndWaitCursor();
  1321. }
  1322. wglMakeCurrent( 0, 0 );
  1323. ReleaseDC(dc);
  1324. }
  1325. void CMy3DEditorView::OnCaptureMovie() 
  1326. {
  1327. // TODO: Add your command handler code here
  1328. CString s;
  1329. s.LoadString(IDS_FD_MOVIE);
  1330. CFileDialog fd(FALSE,"avi",0,OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST,s);
  1331. CDC *dc=GetDC();
  1332. wglMakeCurrent( dc->m_hDC, m_hRC );
  1333. if(fd.DoModal()==IDOK)
  1334. {
  1335. BeginWaitCursor();
  1336.         DWORD nFileType=0;
  1337. if(strcmp(fd.GetFileExt(),"avi")==0) nFileType=1;
  1338. if(m_DlgCaptureMovie.DoModal()==IDOK)
  1339. {
  1340. if(m_DlgCaptureMovie.Index_area==0)
  1341. {
  1342. MovieSize_X=160;
  1343. MovieSize_Y=120;
  1344. }
  1345. if(m_DlgCaptureMovie.Index_area==1)
  1346. {
  1347. MovieSize_X=320;
  1348. MovieSize_Y=240;
  1349. }
  1350. if(m_DlgCaptureMovie.Index_area==2)
  1351. {
  1352. MovieSize_X=640;
  1353. MovieSize_Y=480;
  1354. }
  1355. if(m_DlgCaptureMovie.Index_area==3)
  1356. {
  1357. MovieSize_X=720;
  1358. MovieSize_Y=480;
  1359. }
  1360. if(m_DlgCaptureMovie.Index_framerate==0)
  1361. {
  1362. MovieFramerate=15.0;
  1363. }
  1364. if(m_DlgCaptureMovie.Index_framerate==1)
  1365. {
  1366. MovieFramerate=24.0;
  1367. }
  1368. if(m_DlgCaptureMovie.Index_framerate==2)
  1369. {
  1370. MovieFramerate=25.0;
  1371. }
  1372. if(m_DlgCaptureMovie.Index_framerate==3)
  1373. {
  1374. MovieFramerate=29.97;
  1375. }
  1376. if(m_DlgCaptureMovie.Index_framerate==4)
  1377. {
  1378. MovieFramerate=30.0;
  1379. }
  1380. }
  1381.         bool success = false;
  1382.         if (nFileType == 1)
  1383.         {
  1384. success = BeginMovieCapture(fd.GetPathName(),
  1385.                                         MovieSize_X,
  1386.                                         MovieSize_Y,
  1387.                                         MovieFramerate);
  1388.         }
  1389. else
  1390.         {
  1391.             // Invalid file extension specified.
  1392.             MessageBox("WTF? Unknown file extension specified for screen capture.n","Error",MB_OK);
  1393.         }
  1394.         if (!success)
  1395.         {
  1396.             char errorMsg[64];
  1397.             if(nFileType == 0)
  1398.                 sprintf(errorMsg, "Specified file extension is not recognized.");
  1399.             else
  1400.                 sprintf(errorMsg, "Could not capture movie.");
  1401.             MessageBox(errorMsg, "Error", MB_OK | MB_ICONERROR);
  1402.         }
  1403. EndWaitCursor();
  1404. }
  1405. wglMakeCurrent( 0, 0 );
  1406. ReleaseDC(dc);
  1407. }
  1408. bool CMy3DEditorView::BeginMovieCapture(CString filename,
  1409.                               int width, int height,
  1410.                               float framerate)
  1411. {
  1412.     movieCapture = new AVICapture();
  1413.     bool success = movieCapture->start(filename, width, height, framerate);
  1414.     if (success)
  1415.         initMovieCapture(movieCapture);
  1416.     else
  1417.         delete movieCapture;
  1418.     
  1419.     return success;
  1420. }
  1421. void CMy3DEditorView::initMovieCapture(AVICapture* mc)
  1422. {
  1423.     if (movieCapture == NULL)
  1424.         movieCapture = mc;
  1425. }
  1426. void CMy3DEditorView::recordBegin()
  1427. {
  1428.     if (movieCapture != NULL)
  1429.         recording = true;
  1430. }
  1431. void CMy3DEditorView::recordPause()
  1432. {
  1433.     recording = false;
  1434. }
  1435. void CMy3DEditorView::recordEnd()
  1436. {
  1437.     if (movieCapture != NULL)
  1438.     {
  1439.         recordPause();
  1440.         movieCapture->end();
  1441.         delete movieCapture;
  1442.         movieCapture = NULL;
  1443.     }
  1444. }
  1445. bool CMy3DEditorView::isRecording()
  1446. {
  1447.     return recording;
  1448. }
  1449. void CMy3DEditorView::OnUpdateCaptureMovie(CCmdUI* pCmdUI) 
  1450. {
  1451. // TODO: Add your command update UI handler code here
  1452. pCmdUI->Enable(movieCapture == NULL);
  1453. }
  1454. void CMy3DEditorView::OnCaptureRecord() 
  1455. {
  1456. // TODO: Add your command handler code here
  1457. recordBegin();
  1458. }
  1459. void CMy3DEditorView::OnUpdateCaptureRecord(CCmdUI* pCmdUI) 
  1460. {
  1461. // TODO: Add your command update UI handler code here
  1462. pCmdUI->Enable(movieCapture != NULL);
  1463. pCmdUI->SetCheck(recording==true);
  1464. }
  1465. void CMy3DEditorView::OnCapturePause() 
  1466. {
  1467. // TODO: Add your command handler code here
  1468. recording=!recording;
  1469. }
  1470. void CMy3DEditorView::OnUpdateCapturePause(CCmdUI* pCmdUI) 
  1471. {
  1472. // TODO: Add your command update UI handler code here
  1473. pCmdUI->Enable(movieCapture != NULL);
  1474. pCmdUI->SetCheck(recording==false);
  1475. }
  1476. void CMy3DEditorView::OnCaptureStop() 
  1477. {
  1478. // TODO: Add your command handler code here
  1479. recordEnd();
  1480. }
  1481. void CMy3DEditorView::OnUpdateCaptureStop(CCmdUI* pCmdUI) 
  1482. {
  1483. // TODO: Add your command update UI handler code here
  1484. pCmdUI->Enable(recording != false);
  1485. }
  1486. BOOL CMy3DEditorView::OnEraseBkgnd(CDC* pDC) 
  1487. {
  1488. // TODO: Add your message handler code here and/or call default
  1489. // 禁止Windows刷新窗口背景,直接返回
  1490. // return CView::OnEraseBkgnd(pDC);
  1491. return true;
  1492. }