MyglDoc.cpp
上传用户:cding2008
上传日期:2007-01-03
资源大小:1812k
文件大小:43k
源码类别:

OpenGL

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // MyglDoc.cpp : implementation of the CMyglDoc class
  3. //
  4. // ModelMagic 3D and 'glOOP' (OpenGL Object Oriented Programming library)
  5. // Copyright (c) Craig Fahrnbach 1997, 1999
  6. //
  7. // OpenGL is a registered trademark of Silicon Graphics
  8. //
  9. //
  10. // This program is provided for educational and personal use only and
  11. // is provided without guarantee or warrantee expressed or implied.
  12. //
  13. // Commercial use is strickly prohibited without written permission
  14. // from ImageWare Development.
  15. //
  16. /////////////////////////////////////////////////////////////////////////////
  17. #include "stdafx.h"
  18. #include "memory.h"
  19. #include "ModelMagic3D.h"
  20. #ifdef _DEBUG
  21. #define new DEBUG_NEW
  22. #undef THIS_FILE
  23. static char THIS_FILE[] = __FILE__;
  24. #endif
  25. /////////////////////////////////////////////////////////////////////////////
  26. // CMyglDoc
  27. IMPLEMENT_DYNCREATE(CMyglDoc, CDocument)
  28. BEGIN_MESSAGE_MAP(CMyglDoc, CDocument)
  29. //{{AFX_MSG_MAP(CMyglDoc)
  30. ON_COMMAND(ID_MATL_SAVE, OnMatlSave)
  31. ON_COMMAND(ID_MATL_OPEN, OnMatlOpen)
  32. ON_COMMAND(ID_OBJECT_OPEN, OnObjectOpen)
  33. ON_COMMAND(ID_OBJECT_SAVE_AS, OnObjectSaveAs)
  34. ON_COMMAND(ID_OBJECT_NEW_CUBE, OnObjectNewCube)
  35. ON_COMMAND(ID_OBJECT_NEW_CONE, OnObjectNewCone)
  36. ON_COMMAND(ID_OBJECT_NEW_CYLINDER, OnObjectNewCylinder)
  37. ON_COMMAND(ID_OBJECT_NEW_CSG, OnObjectNewCSG)
  38. ON_COMMAND(ID_OBJECT_NEW_TORUS, OnObjectNewTorus)
  39. ON_COMMAND(ID_OBJECT_NEW_PLANE, OnObjectNewPlane)
  40. ON_COMMAND(ID_OBJECT_NEW_SPHERE, OnObjectNewSphere)
  41. ON_COMMAND(ID_OBJECT_NEW_TTF, OnObjectNewTTF)
  42. ON_COMMAND(ID_OBJECT_NEW_LATHE, OnObjectNewLathe)
  43. ON_COMMAND(ID_OBJECT_NEW_DISK, OnObjectNewDisk)
  44. ON_COMMAND(ID_OBJECT_NEW_GRID, OnObjectNewGrid)
  45. ON_COMMAND(ID_OBJECT_NEW_TRIANGLE, OnObjectNewTriangle)
  46. ON_COMMAND(ID_SNAP_TO_GRID, OnSnapToGrid)
  47. ON_UPDATE_COMMAND_UI(ID_SNAP_TO_GRID, OnUpdateSnapToGrid)
  48. ON_COMMAND(ID_ANIMATE_FLY, OnAnimateFly)
  49. ON_UPDATE_COMMAND_UI(ID_ANIMATE_FLY, OnUpdateAnimateFly)
  50. ON_COMMAND(ID_KEYFRAME_PLAY, OnKeyframePlay)
  51. ON_COMMAND(ID_KEYFRAME_FIRST, OnKeyframeFirst)
  52. ON_UPDATE_COMMAND_UI(ID_KEYFRAME_FIRST, OnUpdateKeyframeFirst)
  53. ON_COMMAND(ID_KEYFRAME_LAST, OnKeyframeLast)
  54. ON_UPDATE_COMMAND_UI(ID_KEYFRAME_LAST, OnUpdateKeyframeLast)
  55. ON_COMMAND(ID_KEYFRAME_NEXT, OnKeyframeNext)
  56. ON_UPDATE_COMMAND_UI(ID_KEYFRAME_NEXT, OnUpdateKeyframeNext)
  57. ON_UPDATE_COMMAND_UI(ID_KEYFRAME_PLAY, OnUpdateKeyframePlay)
  58. ON_COMMAND(ID_KEYFRAME_PREVIOUS, OnKeyframePrevious)
  59. ON_UPDATE_COMMAND_UI(ID_KEYFRAME_PREVIOUS, OnUpdateKeyframePrevious)
  60. ON_COMMAND(ID_KEYFRAME_RECORD, OnKeyframeRecord)
  61. ON_UPDATE_COMMAND_UI(ID_KEYFRAME_RECORD, OnUpdateKeyframeRecord)
  62. ON_COMMAND(ID_KEYFRAME_UNRECORD, OnKeyframeUnrecord)
  63. ON_UPDATE_COMMAND_UI(ID_KEYFRAME_UNRECORD, OnUpdateKeyframeUnrecord)
  64. ON_COMMAND(ID_TEXTURE_OPEN, OnTextureOpen)
  65. ON_COMMAND(ID_TEXTURE_EDIT, OnTextureEdit)
  66. ON_COMMAND(ID_TEXTURE_REMOVE, OnTextureRemove)
  67. ON_COMMAND(ID_OBJECT_NEW_NURB, OnObjectNewNurb)
  68. ON_COMMAND(ID_OBJECT_NEW_TERRAIN, OnObjectNewTerrain)
  69. ON_COMMAND(ID_SELECT_CAMERA, OnSelectCamera)
  70. ON_UPDATE_COMMAND_UI(ID_SELECT_CAMERA, OnUpdateSelectCamera)
  71. ON_COMMAND(ID_SELECT_PARENT, OnSelectParent)
  72. ON_UPDATE_COMMAND_UI(ID_SELECT_PARENT, OnUpdateSelectParent)
  73. ON_COMMAND(ID_SELECT_CHILD, OnSelectChild)
  74. ON_UPDATE_COMMAND_UI(ID_SELECT_CHILD, OnUpdateSelectChild)
  75. ON_COMMAND(ID_SELECT_OBJECT_AXIS, OnSelectObjectAxis)
  76. ON_UPDATE_COMMAND_UI(ID_SELECT_OBJECT_AXIS, OnUpdateSelectObjectAxis)
  77. ON_COMMAND(ID_SELECT_OBJECT_TEXTURE, OnSelectObjectTexture)
  78. ON_UPDATE_COMMAND_UI(ID_SELECT_OBJECT_TEXTURE, OnUpdateSelectObjectTexture)
  79. ON_COMMAND(ID_SELECT_OBJECT_TEXTURE_AXIS, OnSelectObjectTextureAxis)
  80. ON_UPDATE_COMMAND_UI(ID_SELECT_OBJECT_TEXTURE_AXIS, OnUpdateSelectObjectTextureAxis)
  81. ON_COMMAND(ID_SELECT_OBJECT_EDGES, OnSelectObjectEdges)
  82. ON_UPDATE_COMMAND_UI(ID_SELECT_OBJECT_EDGES, OnUpdateSelectObjectEdges)
  83. ON_COMMAND(ID_SELECT_OBJECT_POINTS, OnSelectObjectPoints)
  84. ON_UPDATE_COMMAND_UI(ID_SELECT_OBJECT_POINTS, OnUpdateSelectObjectPoints)
  85. ON_COMMAND(ID_SELECT_POINTS, OnSelectPoints)
  86. ON_UPDATE_COMMAND_UI(ID_SELECT_POINTS, OnUpdateSelectPoints)
  87. ON_COMMAND(ID_COMMAND_SELECT, OnCommandSelect)
  88. ON_UPDATE_COMMAND_UI(ID_COMMAND_SELECT, OnUpdateCommandSelect)
  89. ON_COMMAND(ID_COMMAND_MOVE, OnCommandMove)
  90. ON_UPDATE_COMMAND_UI(ID_COMMAND_MOVE, OnUpdateCommandMove)
  91. ON_COMMAND(ID_COMMAND_ROTATE, OnCommandRotate)
  92. ON_UPDATE_COMMAND_UI(ID_COMMAND_ROTATE, OnUpdateCommandRotate)
  93. ON_COMMAND(ID_COMMAND_SCALE, OnCommandScale)
  94. ON_UPDATE_COMMAND_UI(ID_COMMAND_SCALE, OnUpdateCommandScale)
  95. ON_COMMAND(ID_COMMAND_PAINT, OnCommandPaint)
  96. ON_UPDATE_COMMAND_UI(ID_COMMAND_PAINT, OnUpdateCommandPaint)
  97. ON_COMMAND(ID_COMMAND_POINTS_CREATE, OnCommandPointsCreate)
  98. ON_UPDATE_COMMAND_UI(ID_COMMAND_POINTS_CREATE, OnUpdateCommandPointsCreate)
  99. ON_COMMAND(ID_COORDINATE_X_AXIS, OnCoordinateXAxis)
  100. ON_UPDATE_COMMAND_UI(ID_COORDINATE_X_AXIS, OnUpdateCoordinateXAxis)
  101. ON_COMMAND(ID_COORDINATE_Y_AXIS, OnCoordinateYAxis)
  102. ON_UPDATE_COMMAND_UI(ID_COORDINATE_Y_AXIS, OnUpdateCoordinateYAxis)
  103. ON_COMMAND(ID_COORDINATE_Z_AXIS, OnCoordinateZAxis)
  104. ON_UPDATE_COMMAND_UI(ID_COORDINATE_Z_AXIS, OnUpdateCoordinateZAxis)
  105. ON_COMMAND(ID_COORDINATE_OBJECT, OnCoordinateObject)
  106. ON_UPDATE_COMMAND_UI(ID_COORDINATE_OBJECT, OnUpdateCoordinateObject)
  107. ON_COMMAND(ID_COORDINATE_WORLD, OnCoordinateWorld)
  108. ON_UPDATE_COMMAND_UI(ID_COORDINATE_WORLD, OnUpdateCoordinateWorld)
  109. ON_COMMAND(ID_OBJECT_NEW_LIGHT, OnObjectNewLight)
  110. ON_COMMAND(ID_OBJECT_NEW_HSPLINE, OnObjectNewHSpline)
  111. ON_COMMAND(ID_OBJECT_NEW_CLOUD, OnObjectNewCloud)
  112. //}}AFX_MSG_MAP
  113. END_MESSAGE_MAP()
  114. // USER defined messages
  115. // #define RDB_NEW_USER_VIEW 1
  116. // ON_MESSAGE( WM_REFRESH_DLG_BAR, OnRefreshDlgBar)
  117. /////////////////////////////////////////////////////////////////////////////
  118. // CMyglDoc construction/destruction
  119. CMyglDoc::CMyglDoc()
  120. {
  121. // Initialize the handles to the printer information
  122. m_hDevNames = NULL;
  123. m_hDevMode = NULL;
  124. // Create a 3D world
  125. m_pWorld = C3dWorld::CreateWorld();
  126. m_dTime = 0.0;
  127. // Set our default states:
  128. // Set our Selection Flags
  129. m_bSelectCamera = FALSE;
  130. m_bSelectParentObj = TRUE;
  131. m_bSelectChildObj = FALSE;
  132. m_bSelectPoint = FALSE;
  133. // Set our Object Selection Flags
  134. m_bSelectObjAxis = FALSE;
  135. m_bSelectObjTexture = FALSE;
  136. m_bSelectObjTextureAxis = FALSE;
  137. m_bSelectObjEdges = FALSE;
  138. m_bSelectObjPoints = FALSE;
  139. // Set our Command Flags
  140. m_bSelect = FALSE;
  141. m_bMove = TRUE;
  142. m_bRotate = FALSE;
  143. m_bScale = FALSE;
  144. m_bPaint = FALSE;
  145. m_bCreatePoints = FALSE;
  146. // Set our model Coordinate flags
  147. m_bUnLockXAxis = TRUE;
  148. m_bUnLockYAxis = TRUE;
  149. m_bUnLockZAxis = TRUE;
  150. m_bObjectCoordinates = FALSE;
  151. m_bWorldCoordinates  = TRUE;
  152. // Misc flags
  153. m_bSnapToGrid = FALSE;
  154. // m_bDisplayPoints;  ** ?? **
  155. }
  156. CMyglDoc::~CMyglDoc()
  157. {
  158. // Free the printer information 
  159. if(m_hDevMode)
  160. GlobalFree(m_hDevMode);
  161. if(m_hDevNames)
  162. GlobalFree(m_hDevNames);
  163. m_pWorld = NULL;
  164. }
  165. /////////////////////////////////////////////////////////////////////////////
  166. // CMyglDoc serialization
  167. void CMyglDoc::Serialize(CArchive& ar)
  168. {
  169. char buf[80];
  170. // Get a pointer to our CMDIFrameWnd
  171. CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
  172. ASSERT_VALID(pFrame);
  173. // Get a pointer to our status bar
  174. CStatusBar* pStatus = &pFrame->m_wndStatusBar;
  175. ASSERT_VALID(pStatus);
  176. // Get a pointer to the first view in the list of views:
  177. POSITION pos = GetFirstViewPosition();
  178. CMyglView* pView = (CMyglView*)GetNextView(pos);
  179. ASSERT_VALID(pView);
  180. if (ar.IsStoring())
  181. {
  182. // Store or save our world document
  183. sprintf(buf, "Saving World data file '%s'n", m_pWorld->m_szName);
  184. pStatus->SetPaneText(0, buf);
  185. m_pWorld->Serialize(ar, &pView->m_Camera);
  186. pStatus->SetPaneText(0, NULL);
  187. }
  188. else
  189. {
  190. // Load or read our world document
  191. sprintf(buf, "Reading World data file '%s'n", m_pWorld->m_szName);
  192. pStatus->SetPaneText(0, buf);
  193. m_pWorld->Serialize(ar, &pView->m_Camera);
  194. pStatus->SetPaneText(0, NULL);
  195. }
  196. }
  197. /////////////////////////////////////////////////////////////////////////////
  198. // CMyglDoc diagnostics
  199. #ifdef _DEBUG
  200. void CMyglDoc::AssertValid() const
  201. {
  202. CDocument::AssertValid();
  203. }
  204. void CMyglDoc::Dump(CDumpContext& dc) const
  205. {
  206. CDocument::Dump(dc);
  207. }
  208. #endif //_DEBUG
  209. /////////////////////////////////////////////////////////////////////////////
  210. // CMyglDoc Methods / Implementation
  211. void CMyglDoc::AddObject(C3dObject* pObject)
  212. {
  213. // Get a pointer to our CMyglView Class
  214. POSITION pos = GetFirstViewPosition();
  215. CMyglView* pFirstView = (CMyglView*)GetNextView(pos);
  216. ASSERT_VALID(pFirstView);
  217. // Bring up the attributes dialog box for the 
  218. // user to edit..
  219. if(pObject->EditAttributes(pFirstView, m_pWorld) ==IDOK)
  220. {
  221. // User selected OK, so add the object to the list
  222. if(m_pWorld->m_pSelectedObj)
  223. m_pWorld->AddObject(pObject, m_pWorld->m_pSelectedObj);
  224. else
  225. m_pWorld->AddObject(pObject, NULL);
  226. // Set the document as modified...
  227. SetModifiedFlag(TRUE);
  228. // Refresh the Tree Control:
  229. CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
  230. ASSERT(pFrame);
  231. if(pFrame->m_wndTreeDlgBar)
  232. pFrame->m_wndTreeDlgBar.InsertObject(pObject);
  233. // Set the object color from the curently selected 
  234. // color dialog bar
  235. if(pFrame->m_wndColorDlgBar.IsWindowEnabled())
  236. // Don't set the color if this object is a Cloud or a Terrain
  237. // object
  238. if(!pObject->IsKindOf( RUNTIME_CLASS (C3dObjectCloud)) &&
  239.    !pObject->IsKindOf( RUNTIME_CLASS (C3dObjectTerrain)))
  240. pObject->SetColor4fv(&pFrame->m_wndColorDlgBar.m_Color);
  241. // Force a repaint of the window
  242. UpdateAllViews(NULL);
  243. }
  244. else
  245. delete pObject;
  246. }
  247. void CMyglDoc::ResetSelectionFlags()
  248. {
  249. m_bSelectCamera = FALSE;
  250. m_bSelectParentObj = FALSE;
  251. m_bSelectChildObj = FALSE;
  252. m_bSelectPoint = FALSE;
  253. m_bSelectObjAxis = FALSE;
  254. m_bSelectObjTexture = FALSE;
  255. m_bSelectObjTextureAxis = FALSE;
  256. m_bSelectObjEdges = FALSE;
  257. m_bSelectObjPoints = FALSE;
  258. m_pWorld->m_bDisplayPoints = FALSE;
  259. }
  260. void CMyglDoc::ResetCommandFlags()
  261. {
  262. m_bSelect = FALSE;
  263. m_bMove = FALSE;
  264. m_bRotate = FALSE;
  265. m_bScale = FALSE;
  266. m_bPaint = FALSE;
  267. m_bCreatePoints = FALSE;
  268. }
  269. void CMyglDoc::UserSelectedAnObject()
  270. {
  271. if(m_bSelectCamera)
  272. // Call the protected OnSelectParent() function
  273. OnSelectParent();
  274. }
  275. /////////////////////////////////////////////////////////////////////////////
  276. // CMyglDoc message commands
  277. BOOL CMyglDoc::OnNewDocument()
  278. {
  279. if (!CDocument::OnNewDocument())
  280. return FALSE;
  281. // TODO: add reinitialization code here
  282. // (SDI documents will reuse this document)
  283. return TRUE;
  284. }
  285. void CMyglDoc::OnCloseDocument() 
  286. {
  287. if(m_pWorld) {
  288. m_pWorld->DeleteWorld();
  289. m_pWorld = NULL;
  290. }
  291. CDocument::OnCloseDocument();
  292. }
  293. void CMyglDoc::SetTitle(LPCTSTR lpszTitle) 
  294. {
  295.  // Set the title of world attached to this doc
  296. // strcpy(&m_pWorld->m_szName[0], lpszTitle);
  297. m_pWorld->m_szName = lpszTitle;
  298. CDocument::SetTitle(lpszTitle);
  299. }
  300. /*
  301. void CMyglDoc::OnFileSaveAs() 
  302. {
  303. // TODO: Add your command handler code here
  304. CFileDialog fileDlg(FALSE, NULL, GetTitle());
  305. fileDlg.m_ofn.lpstrFilter = "World Files (*.wld)*.wldObject Files (*.obj)*.objAll Files (*.*)*.*";
  306. fileDlg.m_ofn.lpstrTitle = "Save As";
  307. int retn = fileDlg.DoModal();
  308. if(retn == IDOK) {
  309. CString szFile = fileDlg.GetFileName();
  310. CString szPath = fileDlg.GetPathName();
  311. CString szFileExt = fileDlg.GetFileExt();
  312. // Save the docuement
  313. OnSaveDocument(szPath);
  314. SetTitle(szFile);
  315. SetModifiedFlag(FALSE);
  316. }
  317. }
  318. */
  319. void CMyglDoc::OnMatlOpen() 
  320. {
  321. CFileDialog fileDlg(TRUE, NULL, NULL);
  322. fileDlg.m_ofn.lpstrFilter = "Material Files (*.mtl)*.mtlObject Files (*.obj)*.objAll Files (*.*)*.*";
  323. fileDlg.m_ofn.lpstrTitle = "Open";
  324. int retn = fileDlg.DoModal();
  325. if(retn == IDOK) {
  326. CString szFile = fileDlg.GetFileName();
  327. CString szPath = fileDlg.GetPathName();
  328. CString szFileExt = fileDlg.GetFileExt();
  329. if(szFileExt.Compare("mtl") == 0) {
  330. m_pWorld->m_MaterialList.LoadMaterials(szPath);
  331. m_pWorld->m_szMatlFile = szPath;
  332. SetModifiedFlag(TRUE);
  333. }
  334. else
  335. AfxMessageBox("Invalid File Extension!  Select files with 'mtl' extension.", MB_OK, NULL);
  336. }
  337. }
  338. void CMyglDoc::OnMatlSave() 
  339. {
  340. CFileDialog fileDlg(FALSE, NULL, m_pWorld->m_szMatlFile);
  341. fileDlg.m_ofn.lpstrFilter = "Material Files (*.mtl)*.mtlObject Files (*.obj)*.objAll Files (*.*)*.*";
  342. fileDlg.m_ofn.lpstrTitle = "Save As";
  343. int retn = fileDlg.DoModal();
  344. if(retn == IDOK) {
  345. CString szFile = fileDlg.GetFileName();
  346. CString szPath = fileDlg.GetPathName();
  347. CString szFileExt = fileDlg.GetFileExt();
  348. if(szFileExt.Compare("mtl") == 0) {
  349. m_pWorld->m_MaterialList.SaveMaterials(szFile);
  350. // SetModifiedFlag(FALSE);
  351. }
  352. else
  353. AfxMessageBox("Invalid File Extension!  Select files with 'mtl' extension.", MB_OK, NULL);
  354. }
  355. }
  356. void CMyglDoc::OnObjectOpen() 
  357. {
  358. C3dObject* pObject;
  359. // Save the pointer to the selected object.  (When
  360. // we open the file save as dialog, CMyglDoc::OnActivateView
  361. // will NULL the currently slected object...)
  362. pObject = m_pWorld->m_pSelectedObj;
  363. // we have an object to save..
  364. CFileDialog fileDlg(TRUE, NULL, NULL);
  365. fileDlg.m_ofn.lpstrFilter = "Object Files (*.obj)*.objAll Files (*.*)*.*";
  366. fileDlg.m_ofn.lpstrTitle = "Open";
  367. int retn = fileDlg.DoModal();
  368. if(retn == IDOK) {
  369. CString szFile = fileDlg.GetFileName();
  370. CString szPath = fileDlg.GetPathName();
  371. CString szFileExt = fileDlg.GetFileExt();
  372. // Restore the worlds selected object..
  373. m_pWorld->m_pSelectedObj = pObject;
  374. if(szFileExt.Compare("obj") == 0) {
  375. C3dObject* pNewObj;
  376. int iType;
  377. pNewObj = C3dObject::LoadObject(szFile, &iType);
  378. if(pNewObj)
  379. {
  380. if(pObject)
  381. m_pWorld->AddObject(pNewObj, pObject);
  382. else
  383. m_pWorld->AddObject(pNewObj, NULL);
  384. // Set the document as modified
  385. SetModifiedFlag(TRUE);
  386. // Refresh the Tree Control:
  387. CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
  388. ASSERT(pFrame);
  389. if(pFrame->m_wndTreeDlgBar)
  390. pFrame->m_wndTreeDlgBar.InsertObject(pNewObj);
  391. // Force a repaint of the window
  392. UpdateAllViews(NULL);
  393. }
  394. }
  395. else
  396. AfxMessageBox("Invalid File Extension!  Select files with 'obj' extension.", MB_OK, NULL);
  397. }
  398. }
  399. void CMyglDoc::OnObjectSaveAs() 
  400. {
  401. C3dObject* pObject;
  402. if(!m_pWorld->m_pSelectedObj) {
  403. AfxMessageBox("Object not Selected. Please select an object and try again.", MB_OK, NULL);
  404. return;
  405. }
  406. // Save the pointer to the selected object.  (When
  407. // we open the file save as dialog, CMyglDoc::OnActivateView
  408. // will NULL the currently slected object...)
  409. pObject = m_pWorld->m_pSelectedObj;
  410. CString szFile;
  411. // load the object name and append file extension
  412. szFile.Format("%s.obj", m_pWorld->m_pSelectedObj->m_szName);
  413. // we have an object to save..
  414. CFileDialog fileDlg(FALSE, NULL, szFile);
  415. fileDlg.m_ofn.lpstrFilter = "Object Files (*.obj)*.objAll Files (*.*)*.*";
  416. fileDlg.m_ofn.lpstrTitle = "Save As";
  417. int retn = fileDlg.DoModal();
  418. if(retn == IDOK) {
  419. szFile = fileDlg.GetFileName();
  420. CString szPath = fileDlg.GetPathName();
  421. CString szFileExt = fileDlg.GetFileExt();
  422. // Restore the worlds selected object..
  423. m_pWorld->m_pSelectedObj = pObject;
  424. if(szFileExt.Compare("obj") == 0) {
  425. pObject->SaveObject(szFile);
  426. }
  427. else
  428. AfxMessageBox("Invalid File Extension!  Select files with 'obj' extension.", MB_OK, NULL);
  429. }
  430. }
  431. void CMyglDoc::OnObjectNewLight() 
  432. {
  433. // Create a light Object
  434. C3dObjectLight* pLight =  new C3dObjectLight;
  435. ASSERT(pLight);
  436. AddObject(pLight);
  437. }
  438. void CMyglDoc::OnObjectNewCloud() 
  439. {
  440. // Create an Object of type Sky
  441. C3dObjectCloud* pObject =  new C3dObjectCloud;
  442. ASSERT(pObject);
  443. AddObject(pObject);
  444. }
  445. void CMyglDoc::OnObjectNewCone() 
  446. {
  447. // Create a shape Object of type Cube
  448. C3dObjectCone* pObject =  new C3dObjectCone;
  449. ASSERT(pObject);
  450. AddObject(pObject);
  451. }
  452. void CMyglDoc::OnObjectNewCSG() 
  453. {
  454. // Create a shape Object of type CSG
  455. C3dObjectCSG* pObject =  new C3dObjectCSG;
  456. ASSERT(pObject);
  457. AddObject(pObject);
  458. }
  459. void CMyglDoc::OnObjectNewCube() 
  460. {
  461. // Create a shape Object of type Cube
  462. C3dObjectCube* pObject =  new C3dObjectCube;
  463. ASSERT(pObject);
  464. AddObject(pObject);
  465. }
  466. void CMyglDoc::OnObjectNewCylinder() 
  467. {
  468. // Create a shape Object of type Cylinder
  469. C3dObjectCylinder* pObject =  new C3dObjectCylinder;
  470. ASSERT(pObject);
  471. AddObject(pObject);
  472. }
  473. void CMyglDoc::OnObjectNewDisk() 
  474. {
  475. // Create an Object of type Disk
  476. C3dObjectDisk* pObject =  new C3dObjectDisk;
  477. ASSERT(pObject);
  478. AddObject(pObject);
  479. }
  480. void CMyglDoc::OnObjectNewGrid() 
  481. {
  482. // Create an Object of type Grid
  483. C3dObjectGrid* pObject =  new C3dObjectGrid;
  484. ASSERT(pObject);
  485. AddObject(pObject);
  486. }
  487. void CMyglDoc::OnObjectNewHSpline() 
  488. {
  489. // Create a shape Object of type h-Spline
  490. C3dObjectHSpline* pObject =  new C3dObjectHSpline;
  491. ASSERT(pObject);
  492. AddObject(pObject);
  493. }
  494. void CMyglDoc::OnObjectNewLathe() 
  495. {
  496. int iNumPoints;
  497. iNumPoints = m_pWorld->m_PointList.GetCount();
  498. if(!iNumPoints) {
  499. AfxMessageBox("Points List does not exist.  Please create some points first and try again.", MB_OK, NULL);
  500. return;
  501. }
  502. if(iNumPoints < 2) {
  503. AfxMessageBox("A minimum of two points are required in the Point List.  Please create more points first and try again.", MB_OK, NULL);
  504. return;
  505. }
  506. // Create a shape Object of type Lathe
  507. C3dObjectLathe* pObject =  new C3dObjectLathe;
  508. ASSERT(pObject);
  509. // Create the lathe objects points array
  510. if(pObject->m_pPointArray->Create(iNumPoints)) {
  511. AfxMessageBox("Could not create memory for lathe object!  Memory low.", MB_OK, NULL);
  512. delete pObject;
  513. return;
  514. }
  515. // Copy our PointsList points/vertices into the 
  516. // lathe objects local list
  517. pObject->m_pPointArray->CopyFromList(&m_pWorld->m_PointList);
  518. // Finished with the point list, so lets delete them
  519. m_pWorld->m_PointList.DeleteAll();
  520. AddObject(pObject);
  521. }
  522. void CMyglDoc::OnObjectNewNurb() 
  523. {
  524. // Create an Object of type NURB
  525. C3dObjectNURB* pObject =  new C3dObjectNURB;
  526. ASSERT(pObject);
  527. AddObject(pObject);
  528. }
  529. void CMyglDoc::OnObjectNewPlane() 
  530. {
  531. // Create an Object of type Plane
  532. C3dObjectPlane* pObject =  new C3dObjectPlane;
  533. ASSERT(pObject);
  534. AddObject(pObject);
  535. }
  536. void CMyglDoc::OnObjectNewSphere() 
  537. {
  538. // Create an Object of type Sphere
  539. C3dObjectSphere* pObject =  new C3dObjectSphere;
  540. ASSERT(pObject);
  541. AddObject(pObject);
  542. }
  543. void CMyglDoc::OnObjectNewTerrain() 
  544. {
  545. // Create an new terrain object
  546. C3dObjectTerrain* pObject =  new C3dObjectTerrain;
  547. ASSERT(pObject);
  548. AddObject(pObject);
  549. }
  550. void CMyglDoc::OnObjectNewTorus() 
  551. {
  552. // Create an Object of type Cube
  553. C3dObjectTorus* pObject =  new C3dObjectTorus;
  554. ASSERT(pObject);
  555. AddObject(pObject);
  556. }
  557. void CMyglDoc::OnObjectNewTriangle() 
  558. {
  559. // Create an Object of type Cube
  560. C3dObjectTriangle* pObject =  new C3dObjectTriangle;
  561. ASSERT(pObject);
  562. AddObject(pObject);
  563. }
  564. void CMyglDoc::OnObjectNewTTF() 
  565. {
  566. // Create an Object of type True Type Font
  567. C3dObjectTTF* pObject =  new C3dObjectTTF;
  568. ASSERT(pObject);
  569. AddObject(pObject);
  570. }
  571. void CMyglDoc::OnSnapToGrid() 
  572. {
  573. if(m_bSnapToGrid)
  574. m_bSnapToGrid = FALSE;
  575. else
  576. m_bSnapToGrid = TRUE;
  577. }
  578. void CMyglDoc::OnUpdateSnapToGrid(CCmdUI* pCmdUI) 
  579. {
  580. if(m_bSnapToGrid)
  581. pCmdUI->SetCheck(TRUE);
  582. else
  583. pCmdUI->SetCheck(FALSE);
  584. }
  585. void CMyglDoc::OnUpdateCommandPointsCreate(CCmdUI* pCmdUI) 
  586. {
  587. if(m_bCreatePoints)
  588. pCmdUI->SetCheck(TRUE);
  589. else
  590. pCmdUI->SetCheck(FALSE);
  591. }
  592. void CMyglDoc::OnAnimateFly() 
  593. {
  594. // Toggle parent/child object selection mode
  595. m_pWorld->m_bFly = !m_pWorld->m_bFly;
  596. }
  597. void CMyglDoc::OnUpdateAnimateFly(CCmdUI* pCmdUI) 
  598. {
  599. if(m_pWorld->m_bFly)
  600. pCmdUI->SetCheck(TRUE);
  601. else
  602. pCmdUI->SetCheck(FALSE);
  603. }
  604. void CMyglDoc::OnKeyframeRecord() 
  605. {
  606. CAnimation* pAnim;
  607. CAnimKeyFrame* pAnimKey;
  608. // Get the 3d World's selected object
  609. C3dObject* pObj = m_pWorld->m_pSelectedObj;
  610. if(pObj)
  611. {
  612. pAnim = pObj->m_AnimList.Find("KeyFrame");
  613. if(!pAnim)
  614. {
  615. // KeyFrame Animation procedure has not beed
  616. // created and attached to the object, so 
  617. // lets create one.
  618. CAnimKeyFrame* pAnimKeyFrame = new CAnimKeyFrame;
  619. ASSERT(pAnimKeyFrame);
  620. // Append to the list of procedures
  621. pObj->m_AnimList.Append(pAnimKeyFrame);
  622. pAnimKey = pAnimKeyFrame;
  623. }
  624. else
  625. pAnimKey = (CAnimKeyFrame*)pAnim;
  626. // Now we have a pointer to our CAnimKeyFrame
  627. // 
  628. // Get a pointer to our applications CMDIFrameWnd
  629. CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
  630. ASSERT(pFrame);
  631. // Get the time from the keyframe tool bar
  632. double dTime = pFrame->m_wndKeyFrameBar.m_fTime;
  633. // Create a new keyframe
  634. pAnimKey->m_pKeyFrameList->AddKeyFrame(dTime, pObj);
  635. }
  636. }
  637. void CMyglDoc::OnUpdateKeyframeRecord(CCmdUI* pCmdUI) 
  638. {
  639. if(m_pWorld->m_pSelectedObj)
  640. pCmdUI->Enable(TRUE);
  641. else
  642. pCmdUI->Enable(FALSE);
  643. }
  644. void CMyglDoc::OnKeyframeUnrecord() 
  645. {
  646. // Get the 3d World's selected object
  647. C3dObject* pObj = m_pWorld->m_pSelectedObj;
  648. if(pObj)
  649. {
  650. // Do we have a KeyFrame Procedure attached to this object?
  651. CAnimKeyFrame* pAnimKey = (CAnimKeyFrame*) pObj->m_AnimList.Find("KeyFrame");
  652. if(pAnimKey)
  653. {
  654. // Get a pointer to our applications CMDIFrameWnd
  655. CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
  656. ASSERT(pFrame);
  657. // Get the time from the keyframe tool bar
  658. double dTime = pFrame->m_wndKeyFrameBar.m_fTime;
  659. // Find the keyframe with the toolbar time value
  660. CKeyFrame* pKey = pAnimKey->m_pKeyFrameList->Find(dTime);
  661. if(pKey)
  662. pAnimKey->m_pKeyFrameList->Delete(pKey);
  663. }
  664. }
  665. }
  666. void CMyglDoc::OnUpdateKeyframeUnrecord(CCmdUI* pCmdUI) 
  667. {
  668. if(m_pWorld->m_pSelectedObj)
  669. {
  670. int iNumKeys;
  671. m_pWorld->m_pSelectedObj->GetKeyFrameList(&iNumKeys);
  672. if(iNumKeys)
  673. {
  674. pCmdUI->Enable(TRUE);
  675. return;
  676. }
  677. }
  678. pCmdUI->Enable(FALSE);
  679. }
  680. void CMyglDoc::OnKeyframePlay() 
  681. {
  682. // TODO: Add your command handler code here
  683. }
  684. void CMyglDoc::OnUpdateKeyframePlay(CCmdUI* pCmdUI) 
  685. {
  686. if(m_pWorld->m_pSelectedObj)
  687. pCmdUI->Enable(TRUE);
  688. else
  689. pCmdUI->Enable(FALSE);
  690. }
  691. void CMyglDoc::OnKeyframeFirst() 
  692. {
  693. if(m_pWorld->m_pSelectedObj)
  694. {
  695. int iNumKeys;
  696. CAnimKeyFrame* pAnimKey = m_pWorld->m_pSelectedObj->GetKeyFrameList(&iNumKeys);
  697. if(pAnimKey && iNumKeys)
  698. {
  699. // Get the first keyframe from the list
  700. CKeyFrame* pKey = (CKeyFrame*)pAnimKey->m_pKeyFrameList->GetHead();
  701. if(pKey)
  702. {
  703. // Get a pointer to our applications CMDIFrameWnd
  704. CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
  705. ASSERT(pFrame);
  706. char buf[10];
  707. sprintf(buf, "%3.1f", pKey->m_dTime);
  708. pFrame->m_wndKeyFrameBar.m_EditBox.SetSel(0, -1, FALSE);
  709. pFrame->m_wndKeyFrameBar.m_EditBox.Cut();
  710. pFrame->m_wndKeyFrameBar.m_EditBox.ReplaceSel(buf, FALSE);
  711. // Set the objects attributes to the keyframe
  712. pKey->SetObjectAttributes(m_pWorld->m_pSelectedObj);
  713. // Force a repaint of all views
  714. UpdateAllViews(NULL);
  715. }
  716. }
  717. }
  718. }
  719. void CMyglDoc::OnUpdateKeyframeFirst(CCmdUI* pCmdUI) 
  720. {
  721. if(m_pWorld->m_pSelectedObj)
  722. {
  723. int iNumKeys;
  724. m_pWorld->m_pSelectedObj->GetKeyFrameList(&iNumKeys);
  725. if(iNumKeys)
  726. {
  727. pCmdUI->Enable(TRUE);
  728. return;
  729. }
  730. }
  731. pCmdUI->Enable(FALSE);
  732. }
  733. void CMyglDoc::OnKeyframePrevious() 
  734. {
  735. if(m_pWorld->m_pSelectedObj)
  736. {
  737. int iNumKeys;
  738. CAnimKeyFrame* pAnimKey = m_pWorld->m_pSelectedObj->GetKeyFrameList(&iNumKeys);
  739. if(pAnimKey && iNumKeys)
  740. {
  741. // Get a pointer to our applications CMDIFrameWnd
  742. CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
  743. ASSERT(pFrame);
  744. // Get the time from the keyframe tool bar
  745. double dTime = pFrame->m_wndKeyFrameBar.m_fTime;
  746. // Find the keyframe with a value smaller, but closest to the
  747. // toolbar time value
  748. CKeyFrame* pKey = pAnimKey->m_pKeyFrameList->FindSmaller(dTime);
  749. if(pKey)
  750. {
  751. char buf[10];
  752. sprintf(buf, "%3.1f", pKey->m_dTime);
  753. pFrame->m_wndKeyFrameBar.m_EditBox.SetSel(0, -1, FALSE);
  754. pFrame->m_wndKeyFrameBar.m_EditBox.Cut();
  755. pFrame->m_wndKeyFrameBar.m_EditBox.ReplaceSel(buf, FALSE);
  756. // Set the objects attributes to the keyframe
  757. pKey->SetObjectAttributes(m_pWorld->m_pSelectedObj);
  758. // Force a repaint of all views
  759. UpdateAllViews(NULL);
  760. }
  761. }
  762. }
  763. }
  764. void CMyglDoc::OnUpdateKeyframePrevious(CCmdUI* pCmdUI) 
  765. {
  766. if(m_pWorld->m_pSelectedObj)
  767. pCmdUI->Enable(TRUE);
  768. else
  769. pCmdUI->Enable(FALSE);
  770. }
  771. void CMyglDoc::OnKeyframeNext() 
  772. {
  773. if(m_pWorld->m_pSelectedObj)
  774. {
  775. int iNumKeys;
  776. CAnimKeyFrame* pAnimKey = m_pWorld->m_pSelectedObj->GetKeyFrameList(&iNumKeys);
  777. if(pAnimKey && iNumKeys)
  778. {
  779. // Get a pointer to our applications CMDIFrameWnd
  780. CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
  781. ASSERT(pFrame);
  782. // Get the time from the keyframe tool bar
  783. double dTime = pFrame->m_wndKeyFrameBar.m_fTime;
  784. // Find the keyframe with a value larger, but closest to the
  785. // toolbar time value
  786. CKeyFrame* pKey = pAnimKey->m_pKeyFrameList->FindLarger(dTime);
  787. if(pKey)
  788. {
  789. char buf[10];
  790. sprintf(buf, "%3.1f", pKey->m_dTime);
  791. pFrame->m_wndKeyFrameBar.m_EditBox.SetSel(0, -1, FALSE);
  792. pFrame->m_wndKeyFrameBar.m_EditBox.Cut();
  793. pFrame->m_wndKeyFrameBar.m_EditBox.ReplaceSel(buf, FALSE);
  794. // Set the objects attributes to the keyframe
  795. pKey->SetObjectAttributes(m_pWorld->m_pSelectedObj);
  796. // Force a repaint of all views
  797. UpdateAllViews(NULL);
  798. }
  799. }
  800. }
  801. }
  802. void CMyglDoc::OnUpdateKeyframeNext(CCmdUI* pCmdUI) 
  803. {
  804. if(m_pWorld->m_pSelectedObj)
  805. {
  806. int iNumKeys;
  807. m_pWorld->m_pSelectedObj->GetKeyFrameList(&iNumKeys);
  808. if(iNumKeys)
  809. {
  810. pCmdUI->Enable(TRUE);
  811. return;
  812. }
  813. }
  814. pCmdUI->Enable(FALSE);
  815. }
  816. void CMyglDoc::OnKeyframeLast() 
  817. {
  818. if(m_pWorld->m_pSelectedObj)
  819. {
  820. int iNumKeys;
  821. CAnimKeyFrame* pAnimKey = m_pWorld->m_pSelectedObj->GetKeyFrameList(&iNumKeys);
  822. if(pAnimKey && iNumKeys)
  823. {
  824. // Get the Last keyframe from the list
  825. CKeyFrame* pKey = (CKeyFrame*)pAnimKey->m_pKeyFrameList->GetTail();
  826. if(pKey)
  827. {
  828. // Get a pointer to our applications CMDIFrameWnd
  829. CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
  830. ASSERT(pFrame);
  831. char buf[10];
  832. sprintf(buf, "%3.1f", pKey->m_dTime);
  833. pFrame->m_wndKeyFrameBar.m_EditBox.SetSel(0, -1, FALSE);
  834. pFrame->m_wndKeyFrameBar.m_EditBox.Cut();
  835. pFrame->m_wndKeyFrameBar.m_EditBox.ReplaceSel(buf, FALSE);
  836. // Set the objects attributes to the keyframe
  837. pKey->SetObjectAttributes(m_pWorld->m_pSelectedObj);
  838. // Force a repaint of all views
  839. UpdateAllViews(NULL);
  840. }
  841. }
  842. }
  843. }
  844. void CMyglDoc::OnUpdateKeyframeLast(CCmdUI* pCmdUI) 
  845. {
  846. if(m_pWorld->m_pSelectedObj)
  847. {
  848. int iNumKeys;
  849. m_pWorld->m_pSelectedObj->GetKeyFrameList(&iNumKeys);
  850. if(iNumKeys)
  851. {
  852. pCmdUI->Enable(TRUE);
  853. return;
  854. }
  855. }
  856. pCmdUI->Enable(FALSE);
  857. }
  858. void CMyglDoc::SetPrinterDeviceDefaults()
  859. {
  860. // Allocate the structure to store the returned printer info
  861. PRINTDLG printDlg;
  862. // Get the printer information
  863. AfxGetApp()->GetPrinterDeviceDefaults(&printDlg);
  864. // Lock the handles to the structures to get pointers
  865. LPDEVNAMES pDevNames = (LPDEVNAMES)::GlobalLock(printDlg.hDevNames);
  866. LPDEVMODE  pDevMode  = (LPDEVMODE)::GlobalLock(printDlg.hDevMode);
  867. // Free the old printer information if it exists
  868. if (m_hDevNames != NULL)
  869. ::GlobalFree(m_hDevNames);
  870. if (m_hDevMode != NULL)
  871. ::GlobalFree(m_hDevMode);
  872.  
  873. // Allocate space for the new printer info structures
  874. m_hDevNames = ::GlobalAlloc(GPTR, ::GlobalSize(printDlg.hDevNames));
  875. m_hDevMode = ::GlobalAlloc(GPTR, ::GlobalSize(printDlg.hDevMode));
  876. // Lock the new handles
  877. LPDEVNAMES m_pDevNames = (LPDEVNAMES)::GlobalLock(m_hDevNames);
  878. LPDEVMODE  m_pDevMode  = (LPDEVMODE)::GlobalLock(m_hDevMode);
  879. // Copy the printer information into the document
  880. memcpy(m_pDevNames, pDevNames,
  881. (size_t)::GlobalSize(printDlg.hDevNames));
  882. memcpy(m_pDevMode, pDevMode,
  883. (size_t)::GlobalSize(printDlg.hDevMode));
  884. // Unlock the handles
  885. ::GlobalUnlock(printDlg.hDevNames);
  886. ::GlobalUnlock(printDlg.hDevMode);
  887. ::GlobalUnlock(m_hDevNames);
  888. ::GlobalUnlock(m_hDevMode);
  889. }
  890. void CMyglDoc::OnTextureOpen() 
  891. {
  892. CFileDialog fileDlg(TRUE, NULL, NULL);
  893. fileDlg.m_ofn.lpstrFilter = "Texture Files (*.bmp)*.bmpDIB Files (*.dib)*.dibAVI Files (*.avi)*.aviAll Files (*.*)*.*";
  894. fileDlg.m_ofn.lpstrTitle = "Open Texture Map";
  895. // Get a pointer to our worlds' selected object
  896. C3dObject* pObj =  m_pWorld->m_pSelectedObj;
  897. if(!pObj)
  898. {
  899. AfxMessageBox("No Object currently selected", MB_OK, 0);
  900. return;
  901. }
  902. int retn = fileDlg.DoModal();
  903. if(retn == IDOK)
  904. {
  905. CString szFile = fileDlg.GetFileName();
  906. CString szPath = fileDlg.GetPathName();
  907. CString szFileExt = fileDlg.GetFileExt();
  908. if(szFileExt.Compare("bmp") == 0 ||
  909.    szFileExt.Compare("dib") == 0 ||
  910.    szFileExt.Compare("avi") == 0)
  911. {
  912. if(pObj->AddTexture(szFile.GetBuffer(128)))
  913. {
  914. // Force a rebuild of the objects display lists
  915. pObj->m_bBuildLists = TRUE;
  916. SetModifiedFlag(TRUE);
  917. // Force a repaint of the window
  918. UpdateAllViews(NULL);
  919. }
  920. else
  921. AfxMessageBox("Could not create Texture map!", MB_OK, NULL);
  922. }
  923. else
  924. AfxMessageBox("Unsupported File Extension!  Select files with either 'bmp' or 'dib' extensions.", MB_OK, NULL);
  925. }
  926. }
  927. void CMyglDoc::OnTextureEdit() 
  928. {
  929. // Get a pointer to our worlds' selected object and
  930. // selected light
  931. C3dObject* pObj =  m_pWorld->m_pSelectedObj;
  932. if(pObj)
  933. {
  934. if(pObj->m_pTexture)
  935. {
  936. CEditTextureDlg textureDlg(pObj->m_pTexture, CWnd::GetActiveWindow());
  937. textureDlg.DoModal();
  938. // Force a repaint of the window
  939. UpdateAllViews(NULL);
  940. }
  941. else
  942. AfxMessageBox("Selected Object has no Bitmap texture to edit!", MB_OK, 0);
  943. }
  944. else
  945. AfxMessageBox("Object not selected!", MB_OK, 0);
  946. }
  947. void CMyglDoc::OnTextureRemove() 
  948. {
  949. // Get a pointer to our worlds' selected object and
  950. // selected light
  951. C3dObject* pObj =  m_pWorld->m_pSelectedObj;
  952. if(pObj)
  953. {
  954. pObj->DeleteTexture();
  955. // Force a repaint of the window
  956. UpdateAllViews(NULL);
  957. }
  958. else
  959. AfxMessageBox("No Object currently selected", MB_OK, 0);
  960. }
  961. void CMyglDoc::OnSelectCamera() 
  962. {
  963. if(m_bSelectCamera)
  964. m_bSelectCamera = FALSE;
  965. else
  966. {
  967. ResetSelectionFlags();
  968. m_bSelectCamera = TRUE;
  969. }
  970. // Get a pointer to our CMDIFrameWnd
  971. CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
  972. ASSERT_VALID(pFrame);
  973. // Post a change message to the Coordinate Dialog Bar.
  974. pFrame->m_wndCoordDlgBar.PostMessage(WM_UPDATECOORDINATEPAGE, 0, 0L);
  975. // Force a repaint of the window
  976. UpdateAllViews(NULL);
  977. }
  978. void CMyglDoc::OnUpdateSelectCamera(CCmdUI* pCmdUI) 
  979. {
  980. if(m_bSelectCamera)
  981. pCmdUI->SetCheck(TRUE);
  982. else
  983. pCmdUI->SetCheck(FALSE);
  984. }
  985. void CMyglDoc::OnSelectParent() 
  986. {
  987. if(m_bSelectParentObj)
  988. m_bSelectParentObj = FALSE;
  989. else
  990. {
  991. ResetSelectionFlags();
  992. m_bSelectParentObj = TRUE;
  993. }
  994. // Get a pointer to our CMDIFrameWnd
  995. CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
  996. ASSERT_VALID(pFrame);
  997. // Post a change message to the Coordinate Dialog Bar.
  998. pFrame->m_wndCoordDlgBar.PostMessage(WM_UPDATECOORDINATEPAGE, 0, 0L);
  999. // Force a repaint of the window
  1000. UpdateAllViews(NULL);
  1001. }
  1002. void CMyglDoc::OnUpdateSelectParent(CCmdUI* pCmdUI) 
  1003. {
  1004. if(m_bSelectParentObj)
  1005. pCmdUI->SetCheck(TRUE);
  1006. else
  1007. pCmdUI->SetCheck(FALSE);
  1008. }
  1009. void CMyglDoc::OnSelectChild() 
  1010. {
  1011. if(m_bSelectChildObj)
  1012. m_bSelectChildObj = FALSE;
  1013. else
  1014. {
  1015. ResetSelectionFlags();
  1016. m_bSelectChildObj = TRUE;
  1017. }
  1018. // Get a pointer to our CMDIFrameWnd
  1019. CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
  1020. ASSERT_VALID(pFrame);
  1021. // Post a change message to the Coordinate Dialog Bar.
  1022. pFrame->m_wndCoordDlgBar.PostMessage(WM_UPDATECOORDINATEPAGE, 0, 0L);
  1023. // Force a repaint of the window
  1024. UpdateAllViews(NULL);
  1025. }
  1026. void CMyglDoc::OnUpdateSelectChild(CCmdUI* pCmdUI) 
  1027. {
  1028. if(m_bSelectChildObj)
  1029. pCmdUI->SetCheck(TRUE);
  1030. else
  1031. pCmdUI->SetCheck(FALSE);
  1032. }
  1033. void CMyglDoc::OnSelectObjectAxis() 
  1034. {
  1035. // Get a pointer to our CMDIFrameWnd
  1036. CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
  1037. ASSERT_VALID(pFrame);
  1038. // Post a change message to the Coordinate Dialog Bar.
  1039. pFrame->m_wndCoordDlgBar.PostMessage(WM_CHANGECOORDINATEPAGE, CP_TRANSLATE, 0L);
  1040. if(m_bSelectObjAxis)
  1041. m_bSelectObjAxis = FALSE;
  1042. else
  1043. {
  1044. ResetSelectionFlags();
  1045. m_bSelectObjAxis = TRUE;
  1046. }
  1047. }
  1048. void CMyglDoc::OnUpdateSelectObjectAxis(CCmdUI* pCmdUI) 
  1049. {
  1050. if(m_bSelectObjAxis)
  1051. pCmdUI->SetCheck(TRUE);
  1052. else
  1053. pCmdUI->SetCheck(FALSE);
  1054. }
  1055. void CMyglDoc::OnSelectObjectTexture() 
  1056. {
  1057. if(m_bSelectObjTexture)
  1058. m_bSelectObjTexture = FALSE;
  1059. else
  1060. {
  1061. ResetSelectionFlags();
  1062. m_bSelectObjTexture = TRUE;
  1063. }
  1064. }
  1065. void CMyglDoc::OnUpdateSelectObjectTexture(CCmdUI* pCmdUI) 
  1066. {
  1067. if(m_bSelectObjTexture)
  1068. pCmdUI->SetCheck(TRUE);
  1069. else
  1070. pCmdUI->SetCheck(FALSE);
  1071. }
  1072. void CMyglDoc::OnSelectObjectTextureAxis() 
  1073. {
  1074. if(m_bSelectObjTextureAxis)
  1075. m_bSelectObjTextureAxis = FALSE;
  1076. else
  1077. {
  1078. ResetSelectionFlags();
  1079. m_bSelectObjTextureAxis = TRUE;
  1080. }
  1081. }
  1082. void CMyglDoc::OnUpdateSelectObjectTextureAxis(CCmdUI* pCmdUI) 
  1083. {
  1084. if(m_bSelectObjTextureAxis)
  1085. pCmdUI->SetCheck(TRUE);
  1086. else
  1087. pCmdUI->SetCheck(FALSE);
  1088. }
  1089. void CMyglDoc::OnSelectObjectEdges() 
  1090. {
  1091. if(m_bSelectObjEdges)
  1092. m_bSelectObjEdges = FALSE;
  1093. else
  1094. {
  1095. ResetSelectionFlags();
  1096. m_bSelectObjEdges = TRUE;
  1097. }
  1098. }
  1099. void CMyglDoc::OnUpdateSelectObjectEdges(CCmdUI* pCmdUI) 
  1100. {
  1101. if(m_bSelectObjEdges)
  1102. pCmdUI->SetCheck(TRUE);
  1103. else
  1104. pCmdUI->SetCheck(FALSE);
  1105. }
  1106. void CMyglDoc::OnSelectObjectPoints() 
  1107. {
  1108. // Get a pointer to our CMDIFrameWnd
  1109. CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
  1110. ASSERT_VALID(pFrame);
  1111. if(m_bSelectObjPoints)
  1112. m_bSelectObjPoints = FALSE;
  1113. else
  1114. {
  1115. ResetSelectionFlags();
  1116. m_bSelectObjPoints = TRUE;
  1117. }
  1118. // Set the display flag in the 3dWorld
  1119. m_pWorld->m_bDisplayPoints = m_bSelectObjPoints;
  1120. // Reset our worlds' selected point.  This will force the 
  1121. // user to select a new object point.
  1122. m_pWorld->m_pSelectedPnt = NULL;
  1123. // Post a change message to the Coordinate Dialog Bar.
  1124. pFrame->m_wndCoordDlgBar.PostMessage(WM_CHANGECOORDINATEPAGE, CP_ORIGIN, 0L);
  1125. // Force a repaint of the window
  1126. UpdateAllViews(NULL);
  1127. }
  1128. void CMyglDoc::OnUpdateSelectObjectPoints(CCmdUI* pCmdUI) 
  1129. {
  1130. if(m_bSelectObjPoints)
  1131. pCmdUI->SetCheck(TRUE);
  1132. else
  1133. pCmdUI->SetCheck(FALSE);
  1134. }
  1135. void CMyglDoc::OnSelectPoints() 
  1136. {
  1137. if(m_bSelectPoint)
  1138. m_bSelectPoint = FALSE;
  1139. else
  1140. {
  1141. ResetSelectionFlags();
  1142. m_bSelectPoint = TRUE;
  1143. }
  1144. // Set the display flag in the 3dWorld
  1145. m_pWorld->m_bDisplayPoints = m_bSelectObjPoints;
  1146. // Reset our worlds' selected point.  This will force the 
  1147. // user to select a new object point.
  1148. m_pWorld->m_pSelectedPnt = NULL;
  1149. // Force a repaint of the window
  1150. UpdateAllViews(NULL);
  1151. }
  1152. void CMyglDoc::OnUpdateSelectPoints(CCmdUI* pCmdUI) 
  1153. {
  1154. if(m_bSelectPoint)
  1155. pCmdUI->SetCheck(TRUE);
  1156. else
  1157. pCmdUI->SetCheck(FALSE);
  1158. }
  1159. void CMyglDoc::OnCommandSelect() 
  1160. {
  1161. if(m_bSelect)
  1162. m_bSelect = FALSE;
  1163. else
  1164. {
  1165. ResetCommandFlags();
  1166. m_bSelect = TRUE;
  1167. }
  1168. }
  1169. void CMyglDoc::OnUpdateCommandSelect(CCmdUI* pCmdUI) 
  1170. {
  1171. if(m_bSelect)
  1172. pCmdUI->SetCheck(TRUE);
  1173. else
  1174. pCmdUI->SetCheck(FALSE);
  1175. }
  1176. void CMyglDoc::OnCommandMove() 
  1177. {
  1178. // Get a pointer to our CMDIFrameWnd
  1179. CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
  1180. ASSERT_VALID(pFrame);
  1181. // Post a change message to the Coordinate Dialog Bar.
  1182. pFrame->m_wndCoordDlgBar.PostMessage(WM_CHANGECOORDINATEPAGE, CP_ORIGIN, 0L);
  1183. if(m_bMove)
  1184. m_bMove = FALSE;
  1185. else
  1186. {
  1187. ResetCommandFlags();
  1188. m_bMove = TRUE;
  1189. }
  1190. }
  1191. void CMyglDoc::OnUpdateCommandMove(CCmdUI* pCmdUI) 
  1192. {
  1193. if(m_bMove)
  1194. pCmdUI->SetCheck(TRUE);
  1195. else
  1196. pCmdUI->SetCheck(FALSE);
  1197. }
  1198. void CMyglDoc::OnCommandRotate() 
  1199. {
  1200. // Get a pointer to our CMDIFrameWnd
  1201. CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
  1202. ASSERT_VALID(pFrame);
  1203. // Post a change message to the Coordinate Dialog Bar.
  1204. pFrame->m_wndCoordDlgBar.PostMessage(WM_CHANGECOORDINATEPAGE, CP_ROTATE, 0L);
  1205. if(m_bRotate)
  1206. m_bRotate = FALSE;
  1207. else
  1208. {
  1209. ResetCommandFlags();
  1210. m_bRotate = TRUE;
  1211. }
  1212. }
  1213. void CMyglDoc::OnUpdateCommandRotate(CCmdUI* pCmdUI) 
  1214. {
  1215. if(m_bRotate)
  1216. pCmdUI->SetCheck(TRUE);
  1217. else
  1218. pCmdUI->SetCheck(FALSE);
  1219. }
  1220. void CMyglDoc::OnCommandScale() 
  1221. {
  1222. // Get a pointer to our CMDIFrameWnd
  1223. CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
  1224. ASSERT_VALID(pFrame);
  1225. // Post a change message to the Coordinate Dialog Bar.
  1226. pFrame->m_wndCoordDlgBar.PostMessage(WM_CHANGECOORDINATEPAGE, CP_SCALE, 0L);
  1227. if(m_bScale)
  1228. m_bScale = FALSE;
  1229. else
  1230. {
  1231. ResetCommandFlags();
  1232. m_bScale = TRUE;
  1233. }
  1234. }
  1235. void CMyglDoc::OnUpdateCommandScale(CCmdUI* pCmdUI) 
  1236. {
  1237. if(m_bScale)
  1238. pCmdUI->SetCheck(TRUE);
  1239. else
  1240. pCmdUI->SetCheck(FALSE);
  1241. }
  1242. void CMyglDoc::OnCommandPaint() 
  1243. {
  1244. OSVERSIONINFO vi;
  1245. if(m_bPaint)
  1246. {
  1247. m_bPaint = FALSE;
  1248. // Restore our cursor to its' default
  1249. ::SetCursor(m_hCursorPrev);
  1250. }
  1251. else
  1252. {
  1253. ResetCommandFlags();
  1254. m_bPaint = TRUE;
  1255. // Get the windows version because we want to use our color cursor if 
  1256. // in Win98/NT.  (Win95 supports only Monochrome cursors..)
  1257. vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  1258. GetVersionEx(&vi);
  1259. // VER_PLATFORM_WIN32_WINDOWS Win32 on Windows 95.
  1260. if (vi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
  1261. m_hPaintCursor = ::LoadCursor(AfxGetInstanceHandle(),
  1262.   MAKEINTRESOURCE(IDC_CURSORPAINT_BW));
  1263. else
  1264. m_hPaintCursor = ::LoadCursor(AfxGetInstanceHandle(),
  1265.   MAKEINTRESOURCE(IDC_CURSORPAINT));
  1266. }
  1267. }
  1268. void CMyglDoc::OnUpdateCommandPaint(CCmdUI* pCmdUI) 
  1269. {
  1270. if(m_bPaint)
  1271. pCmdUI->SetCheck(TRUE);
  1272. else
  1273. pCmdUI->SetCheck(FALSE);
  1274. }
  1275. void CMyglDoc::OnCommandPointsCreate() 
  1276. {
  1277. // Get a pointer to our CMDIFrameWnd
  1278. CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
  1279. ASSERT_VALID(pFrame);
  1280. // Post a change message to the Coordinate Dialog Bar.
  1281. pFrame->m_wndCoordDlgBar.PostMessage(WM_CHANGECOORDINATEPAGE, CP_ORIGIN, 0L);
  1282. if(m_bCreatePoints)
  1283. {
  1284. m_bCreatePoints = FALSE;
  1285. m_pWorld->m_bDisplayPoints = FALSE;
  1286. }
  1287. else
  1288. {
  1289. ResetCommandFlags();
  1290. m_bCreatePoints = TRUE;
  1291. m_pWorld->m_bDisplayPoints = TRUE;
  1292. // Clear the PointList
  1293. m_pWorld->m_PointList.DeleteAll();
  1294. m_pWorld->m_pSelectedPnt = NULL;
  1295. // Force a repaint of the window
  1296. UpdateAllViews(NULL);
  1297. }
  1298. }
  1299. void CMyglDoc::OnCoordinateXAxis() 
  1300. {
  1301. int iIndex; // Index of the toolbar button or separator whose information is to be retrieved
  1302. UINT nID; // Reference to a UINT that is set to the command ID of the button.
  1303. UINT nStyle; // Reference to a UINT that is set to the style of the button.
  1304. int iImage; // Reference to an integer that is set to the index of the button抯 image within the bitmap.
  1305. // Get the index of our bitmap button
  1306. iIndex = 6;
  1307. // Get a pointer to our CMDIFrameWnd
  1308. CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
  1309. ASSERT_VALID(pFrame);
  1310. // Get the toolbar button info
  1311. pFrame->m_wndCommandBar.GetButtonInfo(iIndex, nID, nStyle, iImage);
  1312. // Toggle the flag
  1313. m_bUnLockXAxis = ! m_bUnLockXAxis;
  1314. if(m_bUnLockXAxis)
  1315. // Restore the bitmap image to its original index
  1316. pFrame->m_wndCommandBar.SetButtonInfo(iIndex, nID, nStyle, iIndex);
  1317. else
  1318. // Offset the bitmap image by (3) three
  1319. pFrame->m_wndCommandBar.SetButtonInfo(iIndex, nID, nStyle, iIndex+3);
  1320. }
  1321. void CMyglDoc::OnUpdateCoordinateXAxis(CCmdUI* pCmdUI) 
  1322. {
  1323. if(m_bUnLockXAxis)
  1324. pCmdUI->SetCheck(FALSE);
  1325. else
  1326. pCmdUI->SetCheck(TRUE);
  1327. }
  1328. void CMyglDoc::OnCoordinateYAxis() 
  1329. {
  1330. int iIndex; // Index of the toolbar button or separator whose information is to be retrieved
  1331. UINT nID; // Reference to a UINT that is set to the command ID of the button.
  1332. UINT nStyle; // Reference to a UINT that is set to the style of the button.
  1333. int iImage; // Reference to an integer that is set to the index of the button抯 image within the bitmap.
  1334. // Get the index of our bitmap button
  1335. iIndex = 7;
  1336. // Get a pointer to our CMDIFrameWnd
  1337. CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
  1338. ASSERT_VALID(pFrame);
  1339. // Get the toolbar button info
  1340. pFrame->m_wndCommandBar.GetButtonInfo(iIndex, nID, nStyle, iImage);
  1341. // Toggle the flag
  1342. m_bUnLockYAxis = ! m_bUnLockYAxis;
  1343. if(m_bUnLockYAxis)
  1344. // Restore the bitmap image to its original index
  1345. pFrame->m_wndCommandBar.SetButtonInfo(iIndex, nID, nStyle, iIndex);
  1346. else
  1347. // Offset the bitmap image by (3) three
  1348. pFrame->m_wndCommandBar.SetButtonInfo(iIndex, nID, nStyle, iIndex+3);
  1349. }
  1350. void CMyglDoc::OnUpdateCoordinateYAxis(CCmdUI* pCmdUI) 
  1351. {
  1352. if(m_bUnLockYAxis)
  1353. pCmdUI->SetCheck(FALSE);
  1354. else
  1355. pCmdUI->SetCheck(TRUE);
  1356. }
  1357. void CMyglDoc::OnCoordinateZAxis() 
  1358. {
  1359. int iIndex; // Index of the toolbar button or separator whose information is to be retrieved
  1360. UINT nID; // Reference to a UINT that is set to the command ID of the button.
  1361. UINT nStyle; // Reference to a UINT that is set to the style of the button.
  1362. int iImage; // Reference to an integer that is set to the index of the button抯 image within the bitmap.
  1363. // Get the index of our bitmap button
  1364. iIndex = 8;
  1365. // Get a pointer to our CMDIFrameWnd
  1366. CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
  1367. ASSERT_VALID(pFrame);
  1368. // Get the toolbar button info
  1369. pFrame->m_wndCommandBar.GetButtonInfo(iIndex, nID, nStyle, iImage);
  1370. // Toggle the flag
  1371. m_bUnLockZAxis = ! m_bUnLockZAxis;
  1372. if(m_bUnLockZAxis)
  1373. // Restore the bitmap image to its original index
  1374. pFrame->m_wndCommandBar.SetButtonInfo(iIndex, nID, nStyle, iIndex);
  1375. else
  1376. // Offset the bitmap image by (3) three
  1377. pFrame->m_wndCommandBar.SetButtonInfo(iIndex, nID, nStyle, iIndex+3);
  1378. }
  1379. void CMyglDoc::OnUpdateCoordinateZAxis(CCmdUI* pCmdUI) 
  1380. {
  1381. if(m_bUnLockZAxis)
  1382. pCmdUI->SetCheck(FALSE);
  1383. else
  1384. pCmdUI->SetCheck(TRUE);
  1385. }
  1386. void CMyglDoc::OnCoordinateObject() 
  1387. {
  1388. if(m_bObjectCoordinates)
  1389. m_bObjectCoordinates = FALSE;
  1390. else
  1391. {
  1392. m_bObjectCoordinates = TRUE;
  1393. m_bWorldCoordinates  = FALSE;
  1394. }
  1395. }
  1396. void CMyglDoc::OnUpdateCoordinateObject(CCmdUI* pCmdUI) 
  1397. {
  1398. if(m_bObjectCoordinates)
  1399. pCmdUI->SetCheck(TRUE);
  1400. else
  1401. pCmdUI->SetCheck(FALSE);
  1402. }
  1403. void CMyglDoc::OnCoordinateWorld() 
  1404. {
  1405. if(m_bWorldCoordinates)
  1406. m_bWorldCoordinates = FALSE;
  1407. else
  1408. {
  1409. m_bWorldCoordinates   = TRUE;
  1410. m_bObjectCoordinates  = FALSE;
  1411. }
  1412. }
  1413. void CMyglDoc::OnUpdateCoordinateWorld(CCmdUI* pCmdUI) 
  1414. {
  1415. if(m_bWorldCoordinates)
  1416. pCmdUI->SetCheck(TRUE);
  1417. else
  1418. pCmdUI->SetCheck(FALSE);
  1419. }