ChildView.h
上传用户:sesekoo
上传日期:2020-07-18
资源大小:21543k
文件大小:55k
源码类别:

界面编程

开发平台:

Visual C++

  1. // ChildView.h : interface of the CChildView class
  2. //
  3. /////////////////////////////////////////////////////////////////////////////
  4. #if !defined(AFX_CHILDVIEW_H__3C598774_58D7_4703_A198_95CF22226AFC__INCLUDED_)
  5. #define AFX_CHILDVIEW_H__3C598774_58D7_4703_A198_95CF22226AFC__INCLUDED_
  6. #if _MSC_VER > 1000
  7. #pragma once
  8. #endif // _MSC_VER > 1000
  9. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  10. #if (!defined __EXT_CONTROLBAR_TABBED_FEATURES_H)
  11. #include <../Src/ExtControlBarTabbedFeatures.h>
  12. #endif // __EXT_CONTROLBAR_TABBED_FEATURES_H
  13. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  14. #define GL_VIEWS_CAMERA_STATE _T("CameraState")
  15. #define GL_VIEWS_CAMERA_COUNT 10
  16. #define GL_VIEWS_CAMERA_NAME_FMT _T("Camera %d")
  17. #define GL_VIEWS_FOV_COUNT 26
  18. #define GL_VIEWS_FOV_DEF_INDEX 7 // 45 degrees
  19. #define GL_VIEWS_CAMERA_FOV_FMT _T("FOV %2d")
  20. #define GL_VIEWS_CAMERA_DEF_NEAR_PLANE 0.01f
  21. #define GL_VIEWS_CAMERA_DEF_FAR_PLANE 10.0f
  22. #define GL_VIEWS_MIN_VIEW_DX 20
  23. #define GL_VIEWS_MIN_VIEW_DY 20
  24. #define GL_VIEWS_NONAME _T("noname")
  25. #define GL_VIEWS_ROOTNAME _T("root")
  26. #define GL_VIEWS_SQUARE_NAME _T("square")
  27. #define GL_VIEWS_OUTER_SCENE_NAME _T("outer scene")
  28. #define GL_VIEWS_OUTER_SCENE_NAME _T("outer scene")
  29. #define GL_VIEWS_PLANET_EARTH _T("earth")
  30. #define GL_VIEWS_PLANET_MOON _T("moon")
  31. #define GL_VIEWS_WND_AVI_PLAYER _T("avi player window")
  32. #define GL_VIEWS_WND_MIRROR _T("mirror window")
  33. #define GL_VIEWS_WM_RENDER_FRAME_COMPLETE (WM_USER+123)
  34. #define GL_VIEWS_WM_QUERY_VIEW_VISIBILITY (WM_USER+124)
  35. #define GL_VIEWS_WM_RENDER_INITIAL (WM_USER+125)
  36. #define GL_VIEWS_ID_VIEW_DLG_CTRL_ID 0x1234
  37. #define GL_VIEWS_TIMER_ID 0x654
  38. #define GL_VIEWS_TIMER_ELAPSE (1000/30)
  39. #define GL_VIEWS_DRAW_ANIMS
  40. #define GL_VIEWS_TEXTURE_COUNT 9
  41. #define GL_VIEWS_TEXTURE_IDX_CUBE_ORANGE 0
  42. #define GL_VIEWS_TEXTURE_IDX_CUBE_WHITE 1
  43. #define GL_VIEWS_TEXTURE_IDX_RING 2
  44. #define GL_VIEWS_TEXTURE_IDX_BOTTOM_PLANE 3
  45. #define GL_VIEWS_TEXTURE_IDX_WND_AVI_PLAYER 4
  46. #define GL_VIEWS_TEXTURE_IDX_AVI_SURFACE 5
  47. #define GL_VIEWS_TEXTURE_IDX_WND_MIRROR 6
  48. #define GL_VIEWS_TEXTURE_IDX_EARTH 7
  49. #define GL_VIEWS_TEXTURE_IDX_MOON 8
  50. #define GL_VIEWS_TREE_IMG_IDX_GENERIC_OBJ 0
  51. #define GL_VIEWS_TREE_IMG_IDX_ROOT 1
  52. #define GL_VIEWS_TREE_IMG_IDX_MODIFIER_GRP 2
  53. #define GL_VIEWS_TREE_IMG_IDX_MODIFIER_ONE 3
  54. #define GL_VIEWS_TREE_IMG_IDX_CUBE_CENTER 4
  55. #define GL_VIEWS_TREE_IMG_IDX_CUBE_LEAF 5
  56. #define GL_VIEWS_TREE_IMG_IDX_TEXT_OBJ 6
  57. #define GL_VIEWS_TREE_IMG_IDX_WND_MIRROR 7
  58. #define GL_VIEWS_TREE_IMG_IDX_WND_AVI 8
  59. #define GL_VIEWS_TREE_IMG_IDX_OUTER_SCENE 9
  60. #define GL_VIEWS_TREE_IMG_IDX_CAMERA_OBJ 10
  61. #ifdef _DEBUG
  62. #define GL_VIEWS_CHECK_OPENGL_ERROR 
  63. GLenum _gl_errror = glGetError(); 
  64. ASSERT( _gl_errror == GL_NO_ERROR ); 
  65. }
  66. #else
  67. #define GL_VIEWS_CHECK_OPENGL_ERROR 
  68. }
  69. #endif // _DEBUG
  70. #define GL_VIEWS_CAMERA_DEFIDX_MAIN 8
  71. #define GL_VIEWS_CAMERA_DEFIDX_0 9
  72. #define GL_VIEWS_CAMERA_DEFIDX_1 5
  73. typedef gltl::ntraits<GLfloat> _ntr;
  74. typedef gltl::vector3<GLfloat,_ntr> _v3t;
  75. typedef gltl::vector3<GLfloat,_ntr> & _v3rt;
  76. typedef const gltl::vector3<GLfloat,_ntr> & _v3rct;
  77. typedef gltl::vector4<GLfloat,_ntr> _v4t;
  78. typedef gltl::vector4<GLfloat,_ntr> & _v4rt;
  79. typedef const gltl::vector4<GLfloat,_ntr> & _v4rct;
  80. typedef gltl::quaternion<GLfloat,_ntr> _q4t;
  81. typedef gltl::quaternion<GLfloat,_ntr> & _q4rt;
  82. typedef const gltl::quaternion<GLfloat,_ntr> & _q4rct;
  83. typedef gltl::matrix<GLfloat,_ntr> _mt;
  84. typedef gltl::matrix<GLfloat,_ntr> & _mrt;
  85. typedef const gltl::matrix<GLfloat,_ntr> & _mrct;
  86. /////////////////////////////////////////////////////////////////////////////
  87. // C3DFont
  88. class C3DFont
  89. {
  90. bool m_bCreated:1;
  91. GLYPHMETRICSFLOAT m_GMF[256];
  92. GLuint m_nGlListBase;
  93. public:
  94. C3DFont()
  95. : m_bCreated( false )
  96. {
  97. }
  98. C3DFont(
  99. HDC hDC,                    // dc for font creation
  100. int nHeight =               // height of font
  101. -12,
  102. int nWidth =                // average character width
  103. 0,
  104. int nEscapement =           // angle of escapement
  105. 0,
  106. int nOrientation =          // base-line orientation angle
  107. 0,
  108. int fnWeight =              // font weight
  109. FW_BOLD,
  110. DWORD fdwItalic =           // italic attribute option
  111. FALSE,
  112. DWORD fdwUnderline =        // underline attribute option
  113. FALSE,
  114. DWORD fdwStrikeOut =        // strikeout attribute option
  115. FALSE,
  116. DWORD fdwCharSet =          // character set identifier
  117. ANSI_CHARSET,
  118. DWORD fdwOutputPrecision =  // output precision
  119. OUT_TT_PRECIS,
  120. DWORD fdwClipPrecision =    // clipping precision
  121. CLIP_DEFAULT_PRECIS,
  122. DWORD fdwQuality =          // output quality
  123. ANTIALIASED_QUALITY,
  124. DWORD fdwPitchAndFamily =   // pitch and family
  125. FF_DONTCARE|DEFAULT_PITCH,
  126. LPCTSTR lpszFace =          // typeface name
  127. _T("Times New Roman"),
  128. float deviation =           // specifies the maximum chordal deviation from the true outlines
  129. 0.0f,
  130. float extrusion =           // extrusion value in the negative z direction
  131. 0.02f,
  132. int format =                // specifies line segments or polygons in display lists
  133. WGL_FONT_POLYGONS
  134. )
  135. : m_bCreated( false )
  136. {
  137. CreateFont(
  138. hDC,                    // dc for font creation
  139. nHeight,                // height of font
  140. nWidth,                 // average character width
  141. nEscapement,            // angle of escapement
  142. nOrientation,           // base-line orientation angle
  143. fnWeight,               // font weight
  144. fdwItalic,              // italic attribute option
  145. fdwUnderline,           // underline attribute option
  146. fdwStrikeOut,           // strikeout attribute option
  147. fdwCharSet,             // character set identifier
  148. fdwOutputPrecision,     // output precision
  149. fdwClipPrecision,       // clipping precision
  150. fdwQuality,             // output quality
  151. fdwPitchAndFamily,      // pitch and family
  152. lpszFace,               // typeface name
  153. deviation,              // specifies the maximum chordal deviation from the true outlines
  154. extrusion,              // extrusion value in the negative z direction
  155. format                  // specifies line segments or polygons in display lists
  156. );
  157. }
  158. ~C3DFont()
  159. {
  160. DeleteFont();
  161. }
  162. bool CreateFont(
  163. HDC hDC,                    // dc for font creation
  164. int nHeight =               // height of font
  165. -12,
  166. int nWidth =                // average character width
  167. 0,
  168. int nEscapement =           // angle of escapement
  169. 0,
  170. int nOrientation =          // base-line orientation angle
  171. 0,
  172. int fnWeight =              // font weight
  173. FW_BOLD,
  174. DWORD fdwItalic =           // italic attribute option
  175. FALSE,
  176. DWORD fdwUnderline =        // underline attribute option
  177. FALSE,
  178. DWORD fdwStrikeOut =        // strikeout attribute option
  179. FALSE,
  180. DWORD fdwCharSet =          // character set identifier
  181. ANSI_CHARSET,
  182. DWORD fdwOutputPrecision =  // output precision
  183. OUT_TT_PRECIS,
  184. DWORD fdwClipPrecision =    // clipping precision
  185. CLIP_DEFAULT_PRECIS,
  186. DWORD fdwQuality =          // output quality
  187. ANTIALIASED_QUALITY,
  188. DWORD fdwPitchAndFamily =   // pitch and family
  189. FF_DONTCARE|DEFAULT_PITCH,
  190. LPCTSTR lpszFace =          // typeface name
  191. _T("Times New Roman"),
  192. float deviation =           // specifies the maximum chordal deviation from the true outlines
  193. 0.0f,
  194. float extrusion =           // extrusion value in the negative z direction
  195. 0.02f,
  196. int format =                // specifies line segments or polygons in display lists
  197. WGL_FONT_POLYGONS
  198. )
  199. {
  200. DeleteFont();
  201. m_nGlListBase = glGenLists( 256 );
  202. HFONT hFont =
  203. ::CreateFont(
  204. nHeight,            // height of font
  205. nWidth,             // average character width
  206. nEscapement,        // angle of escapement
  207. nOrientation,       // base-line orientation angle
  208. fnWeight,           // font weight
  209. fdwItalic,          // italic attribute option
  210. fdwUnderline,       // underline attribute option
  211. fdwStrikeOut,       // strikeout attribute option
  212. fdwCharSet,         // character set identifier
  213. fdwOutputPrecision, // output precision
  214. fdwClipPrecision,   // clipping precision
  215. fdwQuality,         // output quality
  216. fdwPitchAndFamily,  // pitch and family
  217. lpszFace            // typeface name
  218. );
  219. if( hFont == NULL )
  220. return false;
  221. HFONT hPrevFont = (HFONT)::SelectObject( hDC, hFont );
  222. BOOL bCreated =
  223. ::wglUseFontOutlines(
  224. hDC,                // device context of the outline font
  225. 0,                  // first glyph to be turned into a display list
  226. 255,                // number of glyphs to be turned into display lists
  227. m_nGlListBase,      // specifies the starting display list
  228. deviation,          // specifies the maximum chordal deviation from the true outlines
  229. extrusion,          // extrusion value in the negative z direction
  230. format,             // specifies line segments or polygons in display lists
  231. m_GMF               // address of buffer to receive glyph metric data
  232. );
  233. ::SelectObject( hDC, hPrevFont );
  234. ::DeleteObject( hFont );
  235. m_bCreated = bCreated ? true : false;
  236. return m_bCreated;
  237. }
  238. void DeleteFont()
  239. {
  240. if( !m_bCreated )
  241. return;
  242. ::glDeleteLists( m_nGlListBase, 256 );
  243. m_bCreated = false;
  244. }
  245. bool IsFontCreated() const
  246. {
  247. return m_bCreated;
  248. }
  249. float TextOut(
  250. LPCTSTR sText,
  251. bool bMeasureOnly = false,
  252. bool bCenter = true
  253. )
  254. {
  255. if( !IsFontCreated() )
  256. return 0.0f;
  257. if( sText == NULL || (*sText) == _T('') )
  258. return 0.0f;
  259. float fLength = 0.0f;  // text length
  260. unsigned int nTextChars = (unsigned int) _tcslen( sText );
  261. if( bMeasureOnly || bCenter )
  262. {
  263. for( unsigned int nIndex = 0;
  264. nIndex < nTextChars;
  265. nIndex++
  266. )
  267. fLength += m_GMF[ sText[nIndex] ].gmfCellIncX;
  268. if( fLength == 0.0f )
  269. return 0.0f;
  270. }
  271. if( bMeasureOnly )
  272. return fLength;
  273. if( bCenter )
  274. ::glTranslatef( -fLength / 2.0f, 0.0f, 0.0f ); // center text
  275. ::glPushAttrib( GL_LIST_BIT );
  276. ::glListBase( m_nGlListBase );
  277. ::glCallLists(
  278. nTextChars,
  279. #ifdef _UNICODE
  280. GL_UNSIGNED_SHORT
  281. #else
  282. GL_UNSIGNED_BYTE
  283. #endif
  284. ,
  285. sText
  286. );
  287. ::glPopAttrib();
  288. return fLength;
  289. }
  290. float CharOut(
  291. TCHAR tChar,
  292. bool bMeasureOnly = false,
  293. bool bCenter = true
  294. )
  295. {
  296. if( !IsFontCreated() )
  297. return 0.0f;
  298. if( tChar == _T('') )
  299. return 0.0f;
  300. TCHAR sTextBuffer[2] = { tChar, _T('') };
  301. return TextOut( sTextBuffer, bMeasureOnly, bCenter );
  302. }
  303. float FormatOut(
  304. LPCTSTR sFormatSpec,
  305. ...
  306. )
  307. {
  308. if( !IsFontCreated() )
  309. return 0.0f;
  310. if( sFormatSpec == NULL || (*sFormatSpec) == _T('') )
  311. return 0.0f;
  312. TCHAR sTextBuffer[1024];
  313. va_list _va_p;
  314. va_start( _va_p, sFormatSpec );
  315. __EXT_MFC_VSPRINTF( 
  316. __EXT_MFC_VSPRINTF_PARAM( sTextBuffer, 1024 ),
  317. sFormatSpec, 
  318. _va_p 
  319. );
  320. va_end( _va_p );
  321. return TextOut( sTextBuffer, false );
  322. }
  323. }; // class C3DFont
  324. /////////////////////////////////////////////////////////////////////////////
  325. // C3DObject
  326. class C3DCamera;
  327. class C3DView;
  328. class C3DMirror;
  329. class CObjectHierarchyTreeCtrl;
  330. class C3DObject : public CObject
  331. {
  332. protected:
  333. CString m_sName;
  334. C3DObject * m_pParent;
  335. CList < C3DObject *, C3DObject * > m_listChilds;
  336. HTREEITEM m_hti;
  337. public:
  338. _v3t m_v3LocalScale, m_v3LocalTranslation;
  339. _q4t m_quatLocalOrientation;
  340. _mt m_mtxLastTransformation;
  341. bool m_bEnabledParentDependency:1;
  342. bool m_bEnabledScale:1;
  343. bool m_bEnabledTranslation:1;
  344. bool m_bEnabledOrientation:1;
  345. DECLARE_DYNCREATE( C3DObject );
  346. C3DObject(
  347. LPCTSTR sName = GL_VIEWS_NONAME,
  348. bool bEnabledParentDependency = true,
  349. bool bEnabledScale = false,
  350. bool bEnabledTranslation = true,
  351. bool bEnabledOrientation = true
  352. );
  353. virtual ~C3DObject();
  354. virtual void SerializeState(
  355. CArchive & ar
  356. );
  357. void LocalLoadIdentity()
  358. {
  359. ASSERT_VALID( this );
  360. m_v3LocalTranslation.load_vector();
  361. m_quatLocalOrientation.load_quaternion();
  362. m_v3LocalScale.load_vector( 1.0f, 1.0f, 1.0f );
  363. }
  364. void LocalTrail(
  365. GLfloat fTrailBy,
  366. bool bDoTrailLocalX,
  367. bool bDoTrailLocalY,
  368. bool bDoTrailLocalZ
  369. )
  370. {
  371. ASSERT_VALID( this );
  372. _q4t trailer( m_quatLocalOrientation );
  373. if( bDoTrailLocalZ )
  374. {
  375. }
  376. else if( bDoTrailLocalX )
  377. {
  378. trailer *=
  379. _q4t(
  380. 0.0f,
  381. - _ntr::get_pi() / 2.0f,
  382. 0.0f
  383. );
  384. }
  385. else if( bDoTrailLocalY )
  386. {
  387. trailer *=
  388. _q4t(
  389. _ntr::get_pi() / 2.0f,
  390. 0.0f,
  391. 0.0f
  392. );
  393. }
  394. GLfloat _x, _y, _z;
  395. trailer.get_direction_vector( _x, _y, _z );
  396. m_v3LocalTranslation.x += _x * fTrailBy;
  397. m_v3LocalTranslation.y += _y * fTrailBy;
  398. m_v3LocalTranslation.z += _z * fTrailBy;
  399. }
  400. void LocalAdjustPitch( GLfloat fAngleRads )
  401. {
  402. ASSERT_VALID( this );
  403. m_quatLocalOrientation *= _q4t( fAngleRads, 0.0f, 0.0f );
  404. }
  405. void LocalAdjustYaw( GLfloat fAngleRads )
  406. {
  407. ASSERT_VALID( this );
  408. m_quatLocalOrientation *= _q4t( 0.0f, fAngleRads, 0.0f );
  409. }
  410. void LocalAdjustRoll( GLfloat fAngleRads )
  411. {
  412. ASSERT_VALID( this );
  413. m_quatLocalOrientation *= _q4t( 0.0f, 0.0f, fAngleRads );
  414. }
  415. void LocalAdjustOrientation(
  416. GLfloat fAngleRadsPitch,
  417. GLfloat fAngleRadsYaw,
  418. GLfloat fAngleRadsRoll
  419. )
  420. {
  421. ASSERT_VALID( this );
  422. m_quatLocalOrientation *=
  423. _q4t( fAngleRadsPitch, fAngleRadsYaw, fAngleRadsRoll );
  424. }
  425. LPCTSTR GetName() const
  426. {
  427. ASSERT_VALID( this );
  428. return m_sName;
  429. }
  430. void AddChild( C3DObject * pChild )
  431. {
  432. ASSERT_VALID( this );
  433. ASSERT_VALID( pChild );
  434. m_listChilds.AddTail( pChild );
  435. pChild->m_pParent = this;
  436. }
  437. C3DObject * GetParent()
  438. {
  439. ASSERT_VALID( this );
  440. return m_pParent;
  441. }
  442. const C3DObject * GetParent() const
  443. {
  444. ASSERT_VALID( this );
  445. return m_pParent;
  446. }
  447. HTREEITEM GetHTREEITEM()
  448. {
  449. ASSERT_VALID( this );
  450. ASSERT( m_hti != NULL );
  451. return m_hti;
  452. }
  453. enum eWalkTreeQuery
  454. {
  455. EWTQ_THREAD_INIT = 0L,
  456. EWTQ_THREAD_DONE = 1L,
  457. EWTQ_PLAY = 2L,
  458. EWTQ_TRANSFORM = 3L,
  459. EWTQ_RENDER = 4L,
  460. EWTQ_ADD_TO_TREE = 5L,
  461. };
  462. virtual void WalkTree(
  463. eWalkTreeQuery walkTreeQuery,
  464. C3DCamera * pCam,
  465. C3DView * pView3D,
  466. LPVOID lpvCookie,
  467. C3DMirror * pObjMirror = NULL
  468. );
  469. virtual bool OnWalkTree(
  470. eWalkTreeQuery walkTreeQuery,
  471. C3DCamera * pCam,
  472. C3DView * pView3D,
  473. LPVOID lpvCookie,
  474. C3DMirror * pObjMirror
  475. );
  476. virtual void OnThreadInit( LPVOID lpvCookie );
  477. virtual void OnThreadDone( LPVOID lpvCookie );
  478. virtual void OnPlay(
  479. LPVOID lpvCookie
  480. );
  481. void CalcTransformation(
  482. _mrct mtxParentTransformation
  483. );
  484. virtual void OnTransform(
  485. C3DCamera * pCam,
  486. C3DView * pView3D,
  487. LPVOID lpvCookie
  488. );
  489. virtual void OnRender(
  490. C3DCamera * pCam,
  491. C3DView * pView3D,
  492. LPVOID lpvCookie,
  493. C3DMirror * pObjMirror
  494. );
  495. virtual bool IsRenderSubtree();
  496. virtual bool IsRenderSubtreeItem( C3DObject * pObjChild );
  497. virtual void OnAddToTree(
  498. CObjectHierarchyTreeCtrl * pTreeCtrl
  499. );
  500. virtual void OnTreeItemDblClick(
  501. CObjectHierarchyTreeCtrl * pTreeCtrl
  502. );
  503. virtual void OnQueryTreeDisplayParms(
  504. CString & strTreeItemText,
  505. int & nTreeImageIndex
  506. );
  507. void GenerateSphere(
  508. int nTextureIndex,
  509. _v3rct ptCenter,
  510. GLfloat fRadius,
  511. int nStacksCount,
  512. GLfloat fAngleTheta0,
  513. GLfloat fAngleTheta1,
  514. GLfloat fAngleTheta1Phi0,
  515. GLfloat fAngleTheta1Phi1,
  516. bool bNoDepth = false
  517. );
  518. static bool stat_LoadResourceToMemory(
  519. LPCTSTR pszResId,
  520. LPCTSTR pszRsType,
  521. LPVOID * pLpvOutBuffer,
  522. DWORD * pDwOutSize
  523. );
  524. static bool stat_IsFileExists(
  525. LPCTSTR sFilePath
  526. );
  527. }; // class C3DObject
  528. /////////////////////////////////////////////////////////////////////////////
  529. // C3DModifier
  530. class C3DModifier : public C3DObject
  531. {
  532. protected:
  533. GLfloat
  534. m_fAnglePlayStepPitch, m_fAnglePlayStepYaw, m_fAnglePlayStepRoll;
  535. public:
  536. DECLARE_DYNCREATE( C3DModifier );
  537. C3DModifier(
  538. LPCTSTR sName = GL_VIEWS_NONAME,
  539. GLfloat fAnglePlayStepPitch = 0.0f,
  540. GLfloat fAnglePlayStepYaw = 0.0f,
  541. GLfloat fAnglePlayStepRoll = 0.0f
  542. );
  543. ~C3DModifier();
  544. virtual void OnQueryTreeDisplayParms(
  545. CString & strTreeItemText,
  546. int & nTreeImageIndex
  547. );
  548. virtual void OnPlay(
  549. LPVOID lpvCookie
  550. );
  551. }; // class C3DModifier
  552. /////////////////////////////////////////////////////////////////////////////
  553. // C3DOuterScene
  554. class C3DSquare : public C3DObject
  555. {
  556. public:
  557. DECLARE_DYNCREATE( C3DSquare );
  558. int m_nTextureIndex;
  559. struct
  560. {
  561. GLfloat m_fX, m_fY;
  562. } m_arrTextureCoords[4];
  563. _v3t m_arrPoints[4];
  564. _v3t m_vecNormal;
  565. bool m_bAdjustAlphaFunc:1, m_bAdjustBlendFunc:1,
  566. m_bNoCullFace:1, m_bNoDepth:1, m_bUseNormal:1;
  567. GLenum m_gleBlendFactorS, m_gleBlendFactorD, m_gleAlphaFunc;
  568. GLclampf m_glcAlphaRef;
  569. C3DSquare();
  570. ~C3DSquare();
  571. virtual void OnRender(
  572. C3DCamera * pCam,
  573. C3DView * pView3D,
  574. LPVOID lpvCookie,
  575. C3DMirror * pObjMirror
  576. );
  577. }; // class C3DSquare
  578. /////////////////////////////////////////////////////////////////////////////
  579. // C3DOuterScene
  580. class C3DOuterScene : public C3DObject
  581. {
  582. public:
  583. DECLARE_DYNCREATE( C3DOuterScene );
  584. static volatile bool g_bRenderOuterScene;
  585. static GLfloat g_fBottomPlaneValX;
  586. static GLfloat g_fBottomPlaneValY;
  587. static GLfloat g_fBottomPlaneValZ;
  588. static GLfloat g_fRingRadius;
  589. static GLint g_nSphereValStacks;
  590. C3DOuterScene();
  591. ~C3DOuterScene();
  592. virtual void OnThreadInit( LPVOID lpvCookie );
  593. bool IsRenderSubtree();
  594. virtual void OnQueryTreeDisplayParms(
  595. CString & strTreeItemText,
  596. int & nTreeImageIndex
  597. );
  598. }; // class C3DOuterScene
  599. /////////////////////////////////////////////////////////////////////////////
  600. // C3DCamera
  601. class C3DCamera : public C3DObject
  602. {
  603. public:
  604. static const GLfloat g_arrFovValues[GL_VIEWS_FOV_COUNT];
  605. UINT m_nTreeDblClickCmdID;
  606. int m_nFovIndex;
  607. GLfloat m_fAspect, m_fNearPlane, m_fFarPlane;
  608. static volatile bool g_bRenderCameraAxes;
  609. static GLfloat g_fAxisLineLength;
  610. static GLfloat g_fAxisLineWidth;
  611. DECLARE_DYNCREATE( C3DCamera );
  612. C3DCamera(
  613. UINT nTreeDblClickCmdID = 0L,
  614. LPCTSTR sName = GL_VIEWS_NONAME,
  615. int nFovIndex = GL_VIEWS_FOV_DEF_INDEX,
  616. GLfloat fNearPlane = 1.0f,
  617. GLfloat fFarPlane = 5.0f
  618. );
  619. ~C3DCamera();
  620. GLfloat GetFov() const
  621. {
  622. ASSERT_VALID( this );
  623. ASSERT( 0 <= m_nFovIndex && m_nFovIndex < GL_VIEWS_FOV_COUNT );
  624. return g_arrFovValues[m_nFovIndex];
  625. }
  626. void DoStepLeft( GLfloat fStepSize )
  627. {
  628. ASSERT_VALID( this );
  629. LocalTrail( fStepSize, true, false, false );
  630. }
  631. void DoStepUp( GLfloat fStepSize )
  632. {
  633. ASSERT_VALID( this );
  634. LocalTrail( fStepSize, false, true, false );
  635. }
  636. void DoStepForward( GLfloat fStepSize )
  637. {
  638. ASSERT_VALID( this );
  639. LocalTrail( fStepSize, false, false, true );
  640. }
  641. void DoLookLeft( GLfloat fAngleDegrees )
  642. {
  643. ASSERT_VALID( this );
  644. LocalAdjustYaw( _ntr::d2r(fAngleDegrees) );
  645. }
  646. void DoLookUp( GLfloat fAngleDegrees )
  647. {
  648. ASSERT_VALID( this );
  649. LocalAdjustPitch( _ntr::d2r(fAngleDegrees) );
  650. }
  651. void DoLookOwnAxis( GLfloat fAngleDegrees )
  652. {
  653. ASSERT_VALID( this );
  654. LocalAdjustRoll( _ntr::d2r(fAngleDegrees) );
  655. }
  656. virtual void SerializeState(
  657. CArchive & ar
  658. );
  659. virtual void OnRender(
  660. C3DCamera * pCam,
  661. C3DView * pView3D,
  662. LPVOID lpvCookie,
  663. C3DMirror * pObjMirror
  664. );
  665. virtual void OnTreeItemDblClick(
  666. CObjectHierarchyTreeCtrl * pTreeCtrl
  667. );
  668. virtual void OnQueryTreeDisplayParms(
  669. CString & strTreeItemText,
  670. int & nTreeImageIndex
  671. );
  672. }; // class C3DCamera
  673. /////////////////////////////////////////////////////////////////////////////
  674. // C3DCube
  675. class C3DCube : public C3DObject
  676. {
  677. protected:
  678. bool m_bCenterCube:1;
  679. public:
  680. static volatile bool g_bRenderCubeObjects;
  681. static GLfloat g_fCubeVal;
  682. static GLfloat g_fTranslateCubeVal;
  683. static GLfloat g_fCenterCubePlayPitch;
  684. static GLfloat g_fCenterCubePlayYaw;
  685. static GLfloat g_fCenterCubePlayRoll;
  686. DECLARE_DYNCREATE( C3DCube );
  687. C3DCube(
  688. LPCTSTR sName = GL_VIEWS_NONAME,
  689. bool bCenterCube = false
  690. );
  691. ~C3DCube();
  692. virtual void OnThreadInit( LPVOID lpvCookie );
  693. virtual void OnPlay(
  694. LPVOID lpvCookie
  695. );
  696. virtual bool IsRenderSubtreeItem( C3DObject * pObjChild );
  697. virtual void OnQueryTreeDisplayParms(
  698. CString & strTreeItemText,
  699. int & nTreeImageIndex
  700. );
  701. }; // class C3DCube
  702. /////////////////////////////////////////////////////////////////////////////
  703. // C3DPlanet
  704. class C3DPlanet : public C3DObject
  705. {
  706. protected:
  707. int m_nPlanetTextureIndex;
  708. GLint m_nPlanetStacks;
  709. GLfloat m_fPlanetRadius,
  710. m_fAnglePlayStepPitch, m_fAnglePlayStepYaw, m_fAnglePlayStepRoll;
  711. public:
  712. static volatile bool g_bRenderPlanetObjects;
  713. static GLfloat g_fPlanetRadiusEarth;
  714. static GLfloat g_fPlanetRadiusMoon;
  715. static GLint g_nPlanetSphereStacks;
  716. static GLfloat g_fAnglePlayStepPitchEarth;
  717. static GLfloat g_fAnglePlayStepPitchMoon;
  718. static GLfloat g_fAnglePlayStepYawEarth;
  719. static GLfloat g_fAnglePlayStepYawMoon;
  720. static GLfloat g_fAnglePlayStepRollEarth;
  721. static GLfloat g_fAnglePlayStepRollMoon;
  722. DECLARE_DYNCREATE( C3DPlanet );
  723. C3DPlanet(
  724. LPCTSTR sName = GL_VIEWS_NONAME,
  725. int nPlanetTextureIndex = GL_VIEWS_TEXTURE_IDX_EARTH,
  726. GLint nPlanetStacks = C3DPlanet::g_nPlanetSphereStacks,
  727. GLfloat fPlanetRadius = C3DPlanet::g_fPlanetRadiusEarth,
  728. GLfloat fAnglePlayStepPitch = C3DPlanet::g_fAnglePlayStepPitchEarth,
  729. GLfloat fAnglePlayStepYaw = C3DPlanet::g_fAnglePlayStepYawEarth,
  730. GLfloat fAnglePlayStepRoll = C3DPlanet::g_fAnglePlayStepRollEarth
  731. );
  732. ~C3DPlanet();
  733. virtual void OnThreadInit( LPVOID lpvCookie );
  734. virtual bool IsRenderSubtreeItem( C3DObject * pObjChild );
  735. virtual void OnQueryTreeDisplayParms(
  736. CString & strTreeItemText,
  737. int & nTreeImageIndex
  738. );
  739. virtual void OnPlay(
  740. LPVOID lpvCookie
  741. );
  742. }; // class C3DPlanet
  743. /////////////////////////////////////////////////////////////////////////////
  744. // C3DText
  745. class C3DText : public C3DObject
  746. {
  747. protected:
  748. GLfloat m_fRed, m_fGreen, m_fBlue;
  749. GLfloat m_fAnglePlayStepPitch, m_fAnglePlayStepYaw, m_fAnglePlayStepRoll;
  750. public:
  751. static volatile bool g_bRenderTextObjects;
  752. static GLfloat g_fScaleModifier;
  753. static GLfloat g_fAnglePlayStepPitchText;
  754. static GLfloat g_fAnglePlayStepYawText;
  755. static GLfloat g_fAnglePlayStepRollText;
  756. DECLARE_DYNCREATE( C3DText );
  757. C3DText(
  758. LPCTSTR sName = GL_VIEWS_NONAME, // should be used to set displayed text or one letter
  759. COLORREF clrText = RGB(255,255,255),
  760. GLfloat fAnglePlayStepPitch = C3DText::g_fAnglePlayStepPitchText,
  761. GLfloat fAnglePlayStepYaw = C3DText::g_fAnglePlayStepYawText,
  762. GLfloat fAnglePlayStepRoll = C3DText::g_fAnglePlayStepRollText
  763. );
  764. ~C3DText();
  765. virtual void OnPlay(
  766. LPVOID lpvCookie
  767. );
  768. virtual void OnRender(
  769. C3DCamera * pCam,
  770. C3DView * pView3D,
  771. LPVOID lpvCookie,
  772. C3DMirror * pObjMirror
  773. );
  774. virtual void OnQueryTreeDisplayParms(
  775. CString & strTreeItemText,
  776. int & nTreeImageIndex
  777. );
  778. }; // class C3DText
  779. /////////////////////////////////////////////////////////////////////////////
  780. // C3DWnd
  781. class C3DWnd : public C3DObject
  782. {
  783. protected:
  784. int m_nPlaneTextureIndex;
  785. _v3t m_arrWndPoints[4], m_arrContentPoints[4];
  786. _v3t m_lastNormal;
  787. void _RecalcNormalAndContentArea();
  788. static void stat_CalcWindowContentPlane(
  789. _v3t * arrWndPoints,
  790. _v3t * arrContentPoints
  791. );
  792. public:
  793. DECLARE_DYNCREATE( C3DWnd );
  794. static _v3t g_arrDefPointsWndAviPlayer[4];
  795. static _v3t g_arrDefPointsWndMirror[4];
  796. C3DWnd(
  797. LPCTSTR sName = GL_VIEWS_WND_AVI_PLAYER,
  798. int nPlaneTextureIndex = GL_VIEWS_TEXTURE_IDX_WND_AVI_PLAYER,
  799. _v3rct pt0 = C3DWnd::g_arrDefPointsWndAviPlayer[0],
  800. _v3rct pt1 = C3DWnd::g_arrDefPointsWndAviPlayer[1],
  801. _v3rct pt2 = C3DWnd::g_arrDefPointsWndAviPlayer[2],
  802. _v3rct pt3 = C3DWnd::g_arrDefPointsWndAviPlayer[3]
  803. );
  804. ~C3DWnd();
  805. virtual void OnRender(
  806. C3DCamera * pCam,
  807. C3DView * pView3D,
  808. LPVOID lpvCookie,
  809. C3DMirror * pObjMirror
  810. );
  811. }; // class C3DWnd
  812. /////////////////////////////////////////////////////////////////////////////
  813. // C3DMirror
  814. class C3DMirror : public C3DWnd
  815. {
  816. protected:
  817. bool m_bRenderingThisMirror:1;
  818. public:
  819. static volatile bool C3DMirror::g_bRenderMirrors;
  820. DECLARE_DYNCREATE( C3DMirror );
  821. C3DMirror(
  822. LPCTSTR sName = GL_VIEWS_WND_MIRROR,
  823. int nPlaneTextureIndex = GL_VIEWS_TEXTURE_IDX_WND_MIRROR,
  824. _v3rct pt0 = C3DWnd::g_arrDefPointsWndMirror[0],
  825. _v3rct pt1 = C3DWnd::g_arrDefPointsWndMirror[1],
  826. _v3rct pt2 = C3DWnd::g_arrDefPointsWndMirror[2],
  827. _v3rct pt3 = C3DWnd::g_arrDefPointsWndMirror[3]
  828. );
  829. ~C3DMirror();
  830. virtual void OnRender(
  831. C3DCamera * pCam,
  832. C3DView * pView3D,
  833. LPVOID lpvCookie,
  834. C3DMirror * pObjMirror
  835. );
  836. virtual void OnQueryTreeDisplayParms(
  837. CString & strTreeItemText,
  838. int & nTreeImageIndex
  839. );
  840. }; // class C3DMirror
  841. /////////////////////////////////////////////////////////////////////////////
  842. // C3DAviPlayer
  843. class C3DAviPlayer : public C3DWnd
  844. {
  845. protected:
  846. bool m_bInitComplete:1;
  847. PAVISTREAM m_pAviStream;
  848. AVISTREAMINFO m_pAviInfo;
  849. PGETFRAME m_pGetFrame;
  850. BITMAPINFOHEADER m_dataBmpInfoHdr;
  851. int m_nAviWidth, m_nAviHeight,
  852. m_nRenderWidth, m_nRenderHeight, m_nRenderSize;
  853. HDRAWDIB m_hDrawDib;
  854. long m_nFrameNumber, m_nFrameCount;
  855. HDC m_hDC;
  856. HBITMAP m_hBitmap;
  857. unsigned char * m_pDibRawData;
  858. int m_nSurfaceTextureIndex;
  859. static void stat_AlertDisplay( LPCTSTR sText );
  860. public:
  861. static volatile bool g_bRenderAviPlayers;
  862. DECLARE_DYNCREATE( C3DAviPlayer );
  863. C3DAviPlayer(
  864. LPCTSTR sName = GL_VIEWS_WND_AVI_PLAYER,
  865. int nPlaneTextureIndex = GL_VIEWS_TEXTURE_IDX_WND_AVI_PLAYER,
  866. int nSurfaceTextureIndex = GL_VIEWS_TEXTURE_IDX_AVI_SURFACE,
  867. _v3rct pt0 = C3DWnd::g_arrDefPointsWndAviPlayer[0],
  868. _v3rct pt1 = C3DWnd::g_arrDefPointsWndAviPlayer[1],
  869. _v3rct pt2 = C3DWnd::g_arrDefPointsWndAviPlayer[2],
  870. _v3rct pt3 = C3DWnd::g_arrDefPointsWndAviPlayer[3],
  871. int nRenderWidth = 256,
  872. int nRenderHeight = 256
  873. );
  874. ~C3DAviPlayer();
  875. virtual void OnThreadInit( LPVOID lpvCookie );
  876. virtual void OnThreadDone( LPVOID lpvCookie );
  877. virtual void OnRender(
  878. C3DCamera * pCam,
  879. C3DView * pView3D,
  880. LPVOID lpvCookie,
  881. C3DMirror * pObjMirror
  882. );
  883. virtual void OnPlay(
  884. LPVOID lpvCookie
  885. );
  886. virtual void OnQueryTreeDisplayParms(
  887. CString & strTreeItemText,
  888. int & nTreeImageIndex
  889. );
  890. }; // class C3DAviPlayer
  891. /////////////////////////////////////////////////////////////////////////////
  892. // C3DDC
  893. class C3DDC : public CDC
  894. {
  895. protected:
  896. CBitmap m_bmp;
  897. HBITMAP m_hBmpOld;
  898. COLORREF * m_pColorSurface;
  899. CSize m_sizeView;
  900. void _Init()
  901. {
  902. if( GetSafeHdc() != NULL )
  903. {
  904. ASSERT( m_bmp.GetSafeHandle() != NULL );
  905. return;
  906. }
  907. ASSERT( m_bmp.GetSafeHandle() == NULL );
  908. CWindowDC dcDesktop( NULL );
  909. if( !CreateCompatibleDC(&dcDesktop) )
  910. {
  911. ASSERT( FALSE );
  912. return;
  913. }
  914. ASSERT( m_sizeView.cx >= GL_VIEWS_MIN_VIEW_DX && m_sizeView.cy >= GL_VIEWS_MIN_VIEW_DY );
  915. BITMAPINFOHEADER bih;
  916. ::memset( (LPVOID)&bih, 0, sizeof(BITMAPINFOHEADER) );
  917. bih.biSize = sizeof(BITMAPINFOHEADER);
  918. bih.biWidth = m_sizeView.cx;
  919. bih.biHeight = m_sizeView.cy;
  920. bih.biPlanes = 1;
  921. bih.biBitCount = 32;
  922. bih.biCompression = BI_RGB;
  923. bih.biSizeImage = m_sizeView.cx * m_sizeView.cy;
  924. HBITMAP hDIB =
  925. ::CreateDIBSection(
  926. dcDesktop.GetSafeHdc(),
  927. (LPBITMAPINFO)&bih,
  928. DIB_RGB_COLORS,
  929. (LPVOID*)&m_pColorSurface,
  930. NULL,
  931. NULL
  932. );
  933. if( hDIB == NULL || m_pColorSurface == NULL )
  934. {
  935. CDC::DeleteDC();
  936. ASSERT( FALSE );
  937. return;
  938. }
  939. m_bmp.Attach( hDIB );
  940. m_hBmpOld = (HBITMAP)::SelectObject( GetSafeHdc(), m_bmp.GetSafeHandle() );
  941. }
  942. void _Done()
  943. {
  944. if( GetSafeHdc() != NULL )
  945. {
  946. ::SelectObject( GetSafeHdc(), m_hBmpOld );
  947. m_hBmpOld = NULL;
  948. CDC::DeleteDC();
  949. m_pColorSurface = NULL;
  950. }
  951. if( m_bmp.GetSafeHandle() != NULL )
  952. m_bmp.DeleteObject();
  953. }
  954. public:
  955. C3DDC()
  956. : m_hBmpOld( NULL )
  957. , m_pColorSurface( NULL )
  958. , m_sizeView( GL_VIEWS_MIN_VIEW_DX, GL_VIEWS_MIN_VIEW_DY )
  959. {
  960. }
  961. ~C3DDC()
  962. {
  963. _Done();
  964. }
  965. BOOL DeleteDC()
  966. {
  967. _Done();
  968. return TRUE;
  969. }
  970. CBitmap & GetInternalBitmap()
  971. {
  972. ASSERT_VALID( this );
  973. _Init();
  974. ASSERT( GetSafeHdc() != NULL );
  975. ASSERT( m_bmp.GetSafeHandle() != NULL );
  976. ASSERT( m_pColorSurface != NULL );
  977. return m_bmp;
  978. }
  979. COLORREF * GetColorSurface()
  980. {
  981. ASSERT_VALID( this );
  982. ASSERT( GetSafeHdc() != NULL );
  983. ASSERT( m_bmp.GetSafeHandle() != NULL );
  984. ASSERT( m_pColorSurface != NULL );
  985. return m_pColorSurface;
  986. }
  987. LONG GetColorSurfaceSize()
  988. {
  989. ASSERT_VALID( this );
  990. ASSERT( m_sizeView.cx >= GL_VIEWS_MIN_VIEW_DX && m_sizeView.cy >= GL_VIEWS_MIN_VIEW_DY );
  991. return m_sizeView.cx*m_sizeView.cy*4;
  992. }
  993. CSize GetViewSize() const
  994. {
  995. ASSERT_VALID( this );
  996. ASSERT( m_sizeView.cx >= GL_VIEWS_MIN_VIEW_DX && m_sizeView.cy >= GL_VIEWS_MIN_VIEW_DY );
  997. return m_sizeView;
  998. }
  999. void SetViewSize( CSize sizeView, bool bForceReInit )
  1000. {
  1001. ASSERT_VALID( this );
  1002. ASSERT( m_sizeView.cx >= GL_VIEWS_MIN_VIEW_DX && m_sizeView.cy >= GL_VIEWS_MIN_VIEW_DY );
  1003. sizeView.cx = max( GL_VIEWS_MIN_VIEW_DX, sizeView.cx );
  1004. sizeView.cy = max( GL_VIEWS_MIN_VIEW_DY, sizeView.cy );
  1005. if( m_sizeView == sizeView && (!bForceReInit) )
  1006. return;
  1007. _Done();
  1008. m_sizeView = sizeView;
  1009. _Init();
  1010. ASSERT( GetSafeHdc() != NULL );
  1011. }
  1012. };
  1013. /////////////////////////////////////////////////////////////////////////////
  1014. // C3DTexture
  1015. class C3DTexture
  1016. {
  1017. CSize m_sizeTexture;
  1018. LPVOID m_pData;
  1019. bool m_bAlphaLayerExist:1;
  1020. void _Destroy();
  1021. public:
  1022. C3DTexture();
  1023. ~C3DTexture();
  1024. CSize GetSize() const
  1025. {
  1026. return m_sizeTexture;
  1027. }
  1028. int GetWidth() const
  1029. {
  1030. return m_sizeTexture.cx;
  1031. }
  1032. int GetHeight() const
  1033. {
  1034. return m_sizeTexture.cy;
  1035. }
  1036. LPVOID GetData()
  1037. {
  1038. return m_pData;
  1039. }
  1040. LPCVOID GetData() const
  1041. {
  1042. return m_pData;
  1043. }
  1044. bool IsAlphaLayerExist() const
  1045. {
  1046. return m_bAlphaLayerExist;
  1047. }
  1048. bool IsEmpty() const
  1049. {
  1050. if( m_sizeTexture.cx == 0 )
  1051. {
  1052. ASSERT( m_sizeTexture.cy == 0 );
  1053. ASSERT( m_pData == NULL );
  1054. return true;
  1055. }
  1056. ASSERT( m_sizeTexture.cy != 0 );
  1057. ASSERT( m_pData != NULL );
  1058. return false;
  1059. }
  1060. void Empty()
  1061. {
  1062. _Destroy();
  1063. }
  1064. bool LoadResourceBitmapAs32Bit(
  1065. LPCTSTR lpszResource,
  1066. unsigned char nAlphaClearVal = 255
  1067. );
  1068. bool AddAlphaLayer( unsigned char nAlphaClearVal = 255 );
  1069. bool SetAlphaLayer( unsigned char nAlphaSetVal = 255 );
  1070. bool SetAlphaLayerIf(
  1071. unsigned char nAlphaSetVal,
  1072. COLORREF clr
  1073. );
  1074. bool SetAlphaLayerNB();
  1075. }; // class C3DTexture
  1076. /////////////////////////////////////////////////////////////////////////////
  1077. // C3DView
  1078. class C3DView : public CObject
  1079. {
  1080. protected:
  1081. HWND m_hWndOutput;
  1082. CSize m_sizeView, m_sizeViewNE;
  1083. C3DDC m_dc;
  1084. HGLRC m_hOpenGlContext;
  1085. int m_nCameraIndex;
  1086. void _Init();
  1087. void _Done();
  1088. CCriticalSection m_csGDI;
  1089. public:
  1090. GLuint m_TextureIds[GL_VIEWS_TEXTURE_COUNT];
  1091. C3DFont m_Font3D;
  1092. CString m_strViewName;
  1093. DECLARE_DYNCREATE( C3DView );
  1094. C3DView(
  1095. HWND hWndOutput = NULL
  1096. );
  1097. virtual ~C3DView();
  1098. virtual void Lock();
  1099. virtual void Unlock();
  1100. bool IsViewVisible() const;
  1101. CSize GetViewSize() const
  1102. {
  1103. ASSERT_VALID( this );
  1104. ASSERT( m_sizeView.cx >= GL_VIEWS_MIN_VIEW_DX && m_sizeView.cy >= GL_VIEWS_MIN_VIEW_DY );
  1105. ASSERT( m_sizeViewNE.cx >= GL_VIEWS_MIN_VIEW_DX && m_sizeViewNE.cy >= GL_VIEWS_MIN_VIEW_DY );
  1106. return m_sizeView;
  1107. }
  1108. void SetViewSize( CSize sizeView );
  1109. C3DDC & Get3DDC()
  1110. {
  1111. ASSERT_VALID( this );
  1112. ASSERT( m_dc.GetSafeHdc() != NULL );
  1113. return m_dc;
  1114. }
  1115. HGLRC GetOpenGlContext()
  1116. {
  1117. ASSERT_VALID( this );
  1118. return m_hOpenGlContext;
  1119. }
  1120. HWND GetOutputHWND()
  1121. {
  1122. ASSERT_VALID( this );
  1123. ASSERT( m_hWndOutput != NULL );
  1124. ASSERT( ::IsWindow(m_hWndOutput) );
  1125. return m_hWndOutput;
  1126. }
  1127. enum eBufferBitsType
  1128. {
  1129. __EBB_COLOR,
  1130. __EBB_Z,
  1131. __EBB_STENCIL,
  1132. __EBB_ALPHA,
  1133. __EBB_ACCUM,
  1134. __EBB_AUXILIARY,
  1135. };
  1136. virtual BYTE OnGlGetBufferBits( eBufferBitsType _ebb )
  1137. {
  1138. if( _ebb == __EBB_COLOR )
  1139. return 32;
  1140. if( _ebb == __EBB_Z )
  1141. return 16;
  1142. if( _ebb == __EBB_STENCIL )
  1143. return 8;
  1144. return 0;
  1145. }
  1146. virtual HWND OnGlAlertGetParentHWND()
  1147. {
  1148. return ::GetDesktopWindow();
  1149. }
  1150. virtual void OnGlAlertDisplay(
  1151. LPCTSTR sErrorText,
  1152. LPCTSTR sErrorCaption = _T("Error")
  1153. )
  1154. {
  1155. ASSERT( sErrorText != NULL );
  1156. ASSERT( sErrorCaption != NULL );
  1157. ::ProfUISMsgBox( OnGlAlertGetParentHWND(), sErrorText, sErrorCaption, MB_OK|MB_ICONERROR|MB_SYSTEMMODAL );
  1158. }
  1159. void AdjustViewSize(
  1160. bool bLockView = true
  1161. );
  1162. int GetCameraIndex()
  1163. {
  1164. ASSERT_VALID( this );
  1165. Lock();
  1166. int nCameraIndex = m_nCameraIndex;
  1167. ASSERT( 0 <= nCameraIndex && nCameraIndex < GL_VIEWS_CAMERA_COUNT );
  1168. Unlock();
  1169. return nCameraIndex;
  1170. }
  1171. void SetCameraIndex( int nCameraIndex )
  1172. {
  1173. ASSERT_VALID( this );
  1174. Lock();
  1175. ASSERT( 0 <= nCameraIndex && nCameraIndex < GL_VIEWS_CAMERA_COUNT );
  1176. m_nCameraIndex = nCameraIndex;
  1177. Unlock();
  1178. }
  1179. void DoStepLeft( GLfloat fStepSize );
  1180. void DoStepUp( GLfloat fStepSize );
  1181. void DoStepForward( GLfloat fStepSize );
  1182. void DoLookLeft( GLfloat fAngleDegrees );
  1183. void DoLookUp( GLfloat fAngleDegrees );
  1184. void DoLookOwnAxis( GLfloat fAngleDegrees );
  1185. }; // class C3DView
  1186. /////////////////////////////////////////////////////////////////////////////
  1187. // C3DPipeThread
  1188. class C3DPipeThread : public CWinThread
  1189. {
  1190. friend class C3DView;
  1191. protected:
  1192. bool _ResourcesInit();
  1193. void _ResourcesFree();
  1194. C3DObject * m_pRoot;
  1195. CArray < C3DView *, C3DView * > m_arrViews;
  1196. CArray < C3DCamera *, C3DCamera * > m_arrCams;
  1197. bool m_bInitComplete:1;
  1198. CEvent
  1199. m_eventShutdownStart,
  1200. m_eventShutdownComplete,
  1201. m_eventRenderViews;
  1202. CCriticalSection m_csObjectWriteAccess;
  1203. public:
  1204. volatile bool m_bTimerAnimationEnabled;
  1205. C3DPipeThread();
  1206. virtual ~C3DPipeThread();
  1207. void ObjectWriteAccessSet( bool bLock )
  1208. {
  1209. if( bLock )
  1210. m_csObjectWriteAccess.Lock();
  1211. else
  1212. m_csObjectWriteAccess.Unlock();
  1213. }
  1214. // thread initialization
  1215. virtual BOOL InitInstance();
  1216. // thread deletion
  1217. virtual void Delete();
  1218. // running and idle processing
  1219. virtual int Run();
  1220. // must be called from other thread to signal render event
  1221. void Render();
  1222. // must be called from other thread to signal shutdown
  1223. void ShutdownAndWaitFor();
  1224. // get root
  1225. C3DObject * GetRoot();
  1226. const C3DObject * GetRoot() const;
  1227. // view operation
  1228. void AddView( C3DView * pView3D );
  1229. int GetViewCount() const;
  1230. C3DView * GetView( int nIndex );
  1231. // camera operations
  1232. void AddCamera( C3DCamera * pCam );
  1233. int GetCameraCount() const;
  1234. C3DCamera * GetCamera( int nIndex );
  1235. }; // class C3DPipeThread
  1236. extern C3DPipeThread the3DPipe;
  1237. /////////////////////////////////////////////////////////////////////////////
  1238. // CCameraSelectionComboBox window
  1239. class CCameraSelectionComboBox : public CExtComboBox
  1240. {
  1241. // Construction
  1242. public:
  1243. DECLARE_DYNAMIC( CCameraSelectionComboBox )
  1244. CCameraSelectionComboBox();
  1245. // Attributes
  1246. public:
  1247. // Operations
  1248. public:
  1249. void SyncCameraWithSelectedItem(
  1250. bool bSetFocusToView = false
  1251. );
  1252. int SetCurSel(
  1253. int nSelect,
  1254. bool bSetFocusToView = false
  1255. );
  1256. // Overrides
  1257. // ClassWizard generated virtual function overrides
  1258. //{{AFX_VIRTUAL(CCameraSelectionComboBox)
  1259. protected:
  1260. //}}AFX_VIRTUAL
  1261. // Implementation
  1262. public:
  1263. virtual ~CCameraSelectionComboBox();
  1264. // Generated message map functions
  1265. protected:
  1266. //{{AFX_MSG(CCameraSelectionComboBox)
  1267. //}}AFX_MSG
  1268. afx_msg void OnReflectCbnSelEndOK();
  1269. DECLARE_MESSAGE_MAP()
  1270. }; // class CCameraSelectionComboBox
  1271. /////////////////////////////////////////////////////////////////////////////
  1272. // CCameraFovComboBox window
  1273. class CCameraFovComboBox : public CExtComboBox
  1274. {
  1275. // Construction
  1276. public:
  1277. DECLARE_DYNAMIC( CCameraFovComboBox )
  1278. CCameraFovComboBox();
  1279. // Attributes
  1280. public:
  1281. // Operations
  1282. public:
  1283. void SyncCameraWithSelectedItem(
  1284. bool bSetFocusToView = false
  1285. );
  1286. int SetCurSel(
  1287. int nSelect,
  1288. bool bSetFocusToView = false
  1289. );
  1290. // Overrides
  1291. // ClassWizard generated virtual function overrides
  1292. //{{AFX_VIRTUAL(CCameraFovComboBox)
  1293. protected:
  1294. //}}AFX_VIRTUAL
  1295. // Implementation
  1296. public:
  1297. virtual ~CCameraFovComboBox();
  1298. // Generated message map functions
  1299. protected:
  1300. //{{AFX_MSG(CCameraFovComboBox)
  1301. //}}AFX_MSG
  1302. afx_msg void OnReflectCbnSelEndOK();
  1303. DECLARE_MESSAGE_MAP()
  1304. }; // class CCameraFovComboBox
  1305. /////////////////////////////////////////////////////////////////////////////
  1306. // CObjectHierarchyTreeCtrl window
  1307. class CObjectHierarchyTreeCtrl : public CExtNCSB < CTreeCtrl >
  1308. {
  1309. // Construction
  1310. public:
  1311. DECLARE_DYNAMIC( CObjectHierarchyTreeCtrl )
  1312. CObjectHierarchyTreeCtrl();
  1313. // Attributes
  1314. public:
  1315. // Operations
  1316. public:
  1317. // Overrides
  1318. // ClassWizard generated virtual function overrides
  1319. //{{AFX_VIRTUAL(CObjectHierarchyTreeCtrl)
  1320. //}}AFX_VIRTUAL
  1321. // Implementation
  1322. public:
  1323. virtual ~CObjectHierarchyTreeCtrl();
  1324. // Generated message map functions
  1325. protected:
  1326. //{{AFX_MSG(CObjectHierarchyTreeCtrl)
  1327. afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
  1328. //}}AFX_MSG
  1329. DECLARE_MESSAGE_MAP()
  1330. }; // class CObjectHierarchyTreeCtrl
  1331. /////////////////////////////////////////////////////////////////////////////
  1332. // CChildView window
  1333. class CChildView : public CExtWRB < CWnd >
  1334. {
  1335. // Construction
  1336. public:
  1337. DECLARE_DYNAMIC( CChildView )
  1338. CChildView(
  1339. UINT nIdResourceCursor
  1340. );
  1341. // Attributes
  1342. public:
  1343. class CNavigationBar : public CExtToolControlBar
  1344. {
  1345. public:
  1346. CCameraSelectionComboBox m_wndCameraSelCombo;
  1347. CCameraFovComboBox m_wndCameraFovCombo;
  1348. CNavigationBar()
  1349. {
  1350. }
  1351. ~CNavigationBar()
  1352. {
  1353. }
  1354. // CExtBarContentExpandButton * OnCreateBarRightBtn()
  1355. // {
  1356. // return NULL;
  1357. // }
  1358. virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  1359. {
  1360. if( message == WM_CONTEXTMENU )
  1361. return 0L;
  1362. if( message == WM_LBUTTONDOWN
  1363. || message == WM_LBUTTONUP
  1364. || message == WM_MBUTTONDOWN
  1365. || message == WM_MBUTTONUP
  1366. || message == WM_RBUTTONDOWN
  1367. || message == WM_RBUTTONUP
  1368. )
  1369. {
  1370. HWND hWndThis = GetSafeHwnd();
  1371. ASSERT( hWndThis != NULL );
  1372. ASSERT( ::IsWindow( hWndThis ) );
  1373. HWND hWndParent = ::GetParent( hWndThis );
  1374. ASSERT( hWndParent != NULL );
  1375. ASSERT( ::IsWindow( hWndParent ) );
  1376. HWND hWndFocus = ::GetFocus();
  1377. if( hWndFocus == NULL
  1378. || hWndFocus == hWndThis
  1379. || ::IsChild( hWndThis, hWndFocus )
  1380. )
  1381. ::SetFocus( hWndParent );
  1382. else if( ! ::IsChild( hWndParent, hWndFocus ) )
  1383. ::SetFocus( hWndParent );
  1384. }
  1385. return CExtToolControlBar::WindowProc(message,wParam,lParam);
  1386. }
  1387. bool InitNavigationBar()
  1388. {
  1389. m_bPresubclassDialogMode = true;
  1390. if( !m_wndCameraSelCombo.Create(
  1391. WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST,
  1392. CRect( 0, 0, 100, 400 ),
  1393. this,
  1394. ID_CAMERA_SELECTION_COMBO
  1395. )
  1396. )
  1397. {
  1398. ASSERT( FALSE );
  1399. return  false;
  1400. }
  1401. VERIFY(
  1402. SetButtonCtrl(
  1403. CommandToIndex(ID_CAMERA_SELECTION_COMBO),
  1404. &m_wndCameraSelCombo
  1405. )
  1406. );
  1407. for( int nCamIdx = 0; nCamIdx < GL_VIEWS_CAMERA_COUNT; nCamIdx++ )
  1408. {
  1409. CString sCamName;
  1410. sCamName.Format( GL_VIEWS_CAMERA_NAME_FMT, nCamIdx );
  1411. m_wndCameraSelCombo.InsertString( nCamIdx, sCamName );
  1412. }
  1413. m_wndCameraSelCombo.SetCurSel( 0 );
  1414. m_wndCameraSelCombo.SetFont( CFont::FromHandle((HFONT)::GetStockObject(DEFAULT_GUI_FONT)) );
  1415. if( !m_wndCameraFovCombo.Create(
  1416. WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST,
  1417. CRect( 0, 0, 100, 400 ),
  1418. this,
  1419. ID_CAMERA_FOV_COMBO
  1420. )
  1421. )
  1422. {
  1423. ASSERT( FALSE );
  1424. return  false;
  1425. }
  1426. VERIFY(
  1427. SetButtonCtrl(
  1428. CommandToIndex(ID_CAMERA_FOV_COMBO),
  1429. &m_wndCameraFovCombo
  1430. )
  1431. );
  1432. for( int nFovIdx = 0; nFovIdx < GL_VIEWS_FOV_COUNT; nFovIdx++ )
  1433. {
  1434. CString sFovName;
  1435. int nFovDegrees = (int)
  1436. (
  1437. (
  1438. ( C3DCamera::g_arrFovValues[nFovIdx] * 180.0f )
  1439. / 3.1415926535897932384626433832795f
  1440. ) + 0.4f
  1441. );
  1442. ASSERT( nFovDegrees >= 10 && nFovDegrees <= 180 );
  1443. sFovName.Format( GL_VIEWS_CAMERA_FOV_FMT, nFovDegrees );
  1444. m_wndCameraFovCombo.InsertString( nFovIdx, sFovName );
  1445. }
  1446. m_wndCameraFovCombo.SetCurSel( GL_VIEWS_FOV_DEF_INDEX );
  1447. m_wndCameraFovCombo.SetFont( CFont::FromHandle((HFONT)::GetStockObject(DEFAULT_GUI_FONT)) );
  1448. CMenu menuRotate, menuTranslate;
  1449. if( !menuRotate.LoadMenu(IDR_MENU_CAM_ROTATE)
  1450. || !menuTranslate.LoadMenu(IDR_MENU_CAM_TRANSLATE)
  1451. )
  1452. {
  1453. ASSERT( FALSE );
  1454. return  false;
  1455. }
  1456. int nIdxBtnRotate =
  1457. CommandToIndex(ID_BTN_MENU_ROTATION);
  1458. VERIFY(
  1459. SetButtonMenu(
  1460. nIdxBtnRotate,
  1461. menuRotate.Detach()
  1462. )
  1463. );
  1464. int nIdxBtnTranslate =
  1465. CommandToIndex(ID_BTN_MENU_TRANSLATION);
  1466. VERIFY(
  1467. SetButtonMenu(
  1468. nIdxBtnTranslate,
  1469. menuTranslate.Detach()
  1470. )
  1471. );
  1472. CExtBarButton * pTBB;
  1473. pTBB = GetButton( nIdxBtnRotate );
  1474. ASSERT_VALID( pTBB );
  1475. pTBB->SetSeparatedDropDown();
  1476. pTBB->SetAutoChangeID();
  1477. pTBB->SetCmdID( ID_ROTATE_ABOUT_X0, true );
  1478. pTBB = GetButton( nIdxBtnTranslate );
  1479. ASSERT_VALID( pTBB );
  1480. pTBB->SetSeparatedDropDown();
  1481. pTBB->SetAutoChangeID();
  1482. pTBB->SetCmdID( ID_TRANSLATE_X0, true );
  1483. return true;
  1484. }
  1485. }; // class CNavigationBar
  1486. class COutputWnd : public CWnd
  1487. {
  1488. C3DView * m_pView3D;
  1489. C3DDC m_dc;
  1490. HCURSOR m_hCursor;
  1491. void _SafeResize3D( bool bForceReInit )
  1492. {
  1493. if( m_pView3D == NULL )
  1494. return;
  1495. ASSERT_VALID( m_pView3D );
  1496. CRect rcClient;
  1497. GetClientRect( &rcClient );
  1498. m_pView3D->SetViewSize( rcClient.Size() );
  1499. m_dc.SetViewSize( rcClient.Size(), bForceReInit );
  1500. the3DPipe.Render();
  1501. }
  1502. bool _CanUpdate()
  1503. {
  1504. if( CExtControlBar::FindHwndNotSafeForMutualPaint(this) != NULL )
  1505. return false;
  1506. if( CExtPopupMenuWnd::g_bMenuWithShadows
  1507. && (! g_PaintManager.m_bIsWin2000orLater )
  1508. )
  1509. {
  1510. if( CExtToolControlBar::g_bMenuTracking )
  1511. return false;
  1512. if( CExtPopupMenuWnd::IsMenuTracking() )
  1513. return false;
  1514. } // if( CExtPopupMenuWnd::g_bMenuWithShadows ...
  1515. return true;
  1516. }
  1517. enum eMouseMotionHook
  1518. {
  1519. EMMH_NONE = 0,
  1520. EMMH_LOOK_UP = 1,
  1521. EMMH_LOOK_LEFT = 2,
  1522. EMMH_LOOK_OWN_AXIS = 3,
  1523. EMMH_WALK_FORWARD = 4,
  1524. EMMH_WALK_LEFT = 5,
  1525. EMMH_WALK_UP = 6,
  1526. };
  1527. eMouseMotionHook m_eMMH;
  1528. CPoint m_ptScreenMMH;
  1529. public:
  1530. COutputWnd( UINT nIdResourceCursor )
  1531. : m_pView3D( NULL )
  1532. , m_eMMH( EMMH_NONE )
  1533. , m_ptScreenMMH( -1, -1 )
  1534. {
  1535. HINSTANCE hInst = ::AfxGetInstanceHandle();
  1536. m_hCursor = (HCURSOR)
  1537. ::LoadImage(
  1538. hInst,
  1539. MAKEINTRESOURCE(nIdResourceCursor),
  1540. IMAGE_CURSOR,
  1541. 0,
  1542. 0,
  1543. 0
  1544. );
  1545. ASSERT( m_hCursor != NULL );
  1546. }
  1547. ~COutputWnd()
  1548. {
  1549. if( m_hCursor != NULL )
  1550. ::DestroyCursor( m_hCursor );
  1551. }
  1552. bool Create( CWnd * pWndParent, UINT nDlgCtrlID )
  1553. {
  1554. ASSERT_VALID( this );
  1555. ASSERT_VALID( pWndParent );
  1556. ASSERT( m_hWnd == NULL );
  1557. ASSERT( pWndParent->m_hWnd != NULL );
  1558. ASSERT( ::IsWindow(pWndParent->m_hWnd) );
  1559. if( !CWnd::Create(
  1560. ::AfxRegisterWndClass(0),
  1561. NULL,
  1562. WS_CHILD|WS_VISIBLE,
  1563. CRect( 0, 0, 0, 0 ),
  1564. pWndParent,
  1565. nDlgCtrlID,
  1566. NULL
  1567. )
  1568. )
  1569. {
  1570. ASSERT( FALSE );
  1571. return false;
  1572. }
  1573. m_pView3D = new C3DView( m_hWnd );
  1574. the3DPipe.AddView( m_pView3D );
  1575. return true;
  1576. }
  1577. virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  1578. {
  1579. if( message == GL_VIEWS_WM_QUERY_VIEW_VISIBILITY )
  1580. {
  1581. if( !IsWindowVisible() )
  1582. return 0L;
  1583. CWnd * pWndParent = GetParent();
  1584. ASSERT_VALID( pWndParent );
  1585. if( !pWndParent->IsWindowVisible() )
  1586. return 0L;
  1587. CExtControlBar * pBar =
  1588. DYNAMIC_DOWNCAST(
  1589. CExtControlBar,
  1590. pWndParent
  1591. );
  1592. if( pBar == NULL )
  1593. return 1L;
  1594. if( !pBar->IsVisible() )
  1595. return 0L;
  1596. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1597. if( !pBar->AutoHideModeGet() )
  1598. {
  1599. pWndParent = pBar->GetParent();
  1600. ASSERT_VALID( pWndParent );
  1601. CExtDockDynTabBar * pDockBar =
  1602. DYNAMIC_DOWNCAST(
  1603. CExtDockDynTabBar,
  1604. pWndParent
  1605. );
  1606. if( pDockBar == NULL )
  1607. return 1L;
  1608. pWndParent = pDockBar->GetParent();
  1609. ASSERT_VALID( pWndParent );
  1610. CExtDynTabControlBar * pTabDocker =
  1611. STATIC_DOWNCAST(
  1612. CExtDynTabControlBar,
  1613. pWndParent
  1614. );
  1615. LONG nOwnIndex =
  1616. pTabDocker->FindControlBar( pBar );
  1617. ASSERT( nOwnIndex >= 0 );
  1618. LONG nSelIndex =
  1619. pTabDocker->GetSwitcherSelection();
  1620. if( nOwnIndex != nSelIndex )
  1621. return 0L;
  1622. }
  1623. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1624. return 1L;
  1625. } // if( message == GL_VIEWS_WM_QUERY_VIEW_VISIBILITY )
  1626. if( message == GL_VIEWS_WM_RENDER_FRAME_COMPLETE )
  1627. {
  1628. ASSERT_VALID( m_pView3D );
  1629. if( !_CanUpdate() )
  1630. {
  1631. _SafeResize3D( false );
  1632. CExtPopupMenuWnd::PassMsgLoop( false );
  1633. return 1L;
  1634. }
  1635. C3DDC & dcSrc = m_pView3D->Get3DDC();
  1636. LONG nSurfaceSizeDst = m_dc.GetColorSurfaceSize();
  1637. LONG nSurfaceSizeSrc = dcSrc.GetColorSurfaceSize();
  1638. if( nSurfaceSizeDst != nSurfaceSizeSrc )
  1639. {
  1640. _SafeResize3D( true );
  1641. CExtPopupMenuWnd::PassMsgLoop( false );
  1642. return 1L;
  1643. }
  1644. COLORREF * pSurfDst = m_dc.GetColorSurface();
  1645. COLORREF * pSurfSrc = m_pView3D->Get3DDC().GetColorSurface();
  1646. ::memmove( (LPVOID)pSurfDst, (LPVOID)pSurfSrc, nSurfaceSizeDst );
  1647. Invalidate();
  1648. UpdateWindow();
  1649. CExtPopupMenuWnd::PassMsgLoop( false );
  1650. return 1L;
  1651. } // if( message == GL_VIEWS_WM_RENDER_FRAME_COMPLETE )
  1652. if( message == WM_TIMER
  1653. && wParam == GL_VIEWS_TIMER_ID
  1654. )
  1655. {
  1656. the3DPipe.Render();
  1657. return 0L;
  1658. }
  1659. if( message == WM_ERASEBKGND )
  1660. return 1L;
  1661. if( message == WM_PAINT )
  1662. {
  1663. // #ifdef _DEBUG
  1664. // static int g_nPaintCounter = 0;
  1665. // TRACE1( ">>> output painting %drn", g_nPaintCounter++ );
  1666. // if( CExtPopupMenuWnd::IsKeyPressed( VK_CONTROL ) )
  1667. // {
  1668. //  __asm int 3;
  1669. // }
  1670. // #endif // _DEBUG
  1671. CRect rcClient;
  1672. GetClientRect( &rcClient );
  1673. ASSERT( rcClient.left == 0 && rcClient.top == 0 );
  1674. CPaintDC dcPaint( this );
  1675. if( rcClient.right <= 0 || rcClient.bottom <= 0 )
  1676. return 0L;
  1677. if( m_pView3D == NULL
  1678. || m_dc.GetSafeHdc() == NULL
  1679. )
  1680. {
  1681. dcPaint.FillSolidRect(
  1682. &rcClient,
  1683. RGB(0,0,0)
  1684. );
  1685. return 0L;
  1686. } // if( m_pView3D == NULL )
  1687. CSize sizeBuffer = m_dc.GetViewSize();
  1688. if( sizeBuffer.cx == rcClient.right
  1689. && sizeBuffer.cy == rcClient.bottom
  1690. )
  1691. dcPaint.BitBlt(
  1692. 0, 0, rcClient.right, rcClient.bottom,
  1693. &m_dc,
  1694. 0, 0,
  1695. SRCCOPY
  1696. );
  1697. else
  1698. dcPaint.StretchBlt(
  1699. 0, 0, rcClient.right, rcClient.bottom,
  1700. &m_dc,
  1701. 0, 0, sizeBuffer.cx, sizeBuffer.cy,
  1702. SRCCOPY
  1703. );
  1704. return 0L;
  1705. } // if( message == WM_PAINT )
  1706. if( message == WM_NCCALCSIZE )
  1707. {
  1708. NCCALCSIZE_PARAMS * pNCCSP =
  1709. reinterpret_cast < NCCALCSIZE_PARAMS * > ( lParam );
  1710. ASSERT( pNCCSP != NULL );
  1711. CRect rcInBarWnd( pNCCSP->rgrc[0] );
  1712. CSize sizeDeflate(
  1713. min( 4, ::GetSystemMetrics(SM_CXSIZEFRAME) ),
  1714. min( 4, ::GetSystemMetrics(SM_CYSIZEFRAME) )
  1715. );
  1716. rcInBarWnd.DeflateRect( sizeDeflate );
  1717. ::CopyRect( &(pNCCSP->rgrc[0]), rcInBarWnd );
  1718. return 0;
  1719. } // if( message == WM_NCCALCSIZE )
  1720. if( message == WM_NCPAINT )
  1721. {
  1722. CRect rcInBarWnd, rcInBarClient;
  1723. GetWindowRect( &rcInBarWnd );
  1724. GetClientRect( &rcInBarClient );
  1725. ClientToScreen( &rcInBarClient );
  1726. if( rcInBarWnd == rcInBarClient )
  1727. return 0;
  1728. CPoint ptDevOffset = -rcInBarWnd.TopLeft();
  1729. rcInBarWnd.OffsetRect( ptDevOffset );
  1730. rcInBarClient.OffsetRect( ptDevOffset );
  1731. CWindowDC dc( this );
  1732. ASSERT( dc.GetSafeHdc() != NULL );
  1733. dc.ExcludeClipRect( &rcInBarClient );
  1734. dc.FillSolidRect(
  1735. &rcInBarWnd,
  1736. g_PaintManager->GetColor(
  1737. CExtPaintManager::CLR_3DFACE_OUT,
  1738. this
  1739. )
  1740. );
  1741. return 0;
  1742. } // if( message == WM_NCPAINT )
  1743. if( message == WM_CONTEXTMENU )
  1744. return 0L;
  1745. if( message == WM_LBUTTONDOWN
  1746. || message == WM_LBUTTONUP
  1747. || message == WM_MBUTTONDOWN
  1748. || message == WM_MBUTTONUP
  1749. || message == WM_RBUTTONDOWN
  1750. || message == WM_RBUTTONUP
  1751. )
  1752. { // if mouse clicks
  1753. HWND hWndThis = GetSafeHwnd();
  1754. ASSERT( hWndThis != NULL );
  1755. ASSERT( ::IsWindow( hWndThis ) );
  1756. HWND hWndFocus = ::GetFocus();
  1757. if( hWndFocus != hWndThis )
  1758. ::SetFocus( hWndThis );
  1759. if( message == WM_LBUTTONDOWN )
  1760. {
  1761. if( CExtPopupMenuWnd::IsKeyPressed(VK_CONTROL) )
  1762. m_eMMH = EMMH_WALK_LEFT;
  1763. else if( CExtPopupMenuWnd::IsKeyPressed(VK_SHIFT) )
  1764. m_eMMH = EMMH_WALK_UP;
  1765. else
  1766. m_eMMH = EMMH_WALK_FORWARD;
  1767. VERIFY( ::GetCursorPos(&m_ptScreenMMH) );
  1768. SetCapture();
  1769. }
  1770. else if( message == WM_RBUTTONDOWN )
  1771. {
  1772. if( CExtPopupMenuWnd::IsKeyPressed(VK_CONTROL) )
  1773. m_eMMH = EMMH_LOOK_OWN_AXIS;
  1774. else if( CExtPopupMenuWnd::IsKeyPressed(VK_SHIFT) )
  1775. m_eMMH = EMMH_LOOK_UP;
  1776. else
  1777. m_eMMH = EMMH_LOOK_LEFT;
  1778. VERIFY( ::GetCursorPos(&m_ptScreenMMH) );
  1779. SetCapture();
  1780. }
  1781. else if( message == WM_LBUTTONUP || message == WM_RBUTTONUP )
  1782. {
  1783. if( m_eMMH != EMMH_NONE )
  1784. {
  1785. m_eMMH = EMMH_NONE;
  1786. m_ptScreenMMH.x = m_ptScreenMMH.y = -1;
  1787. ReleaseCapture();
  1788. }
  1789. }
  1790. return 0;
  1791. } // if mouse clicks
  1792. if( message == WM_MOUSEMOVE )
  1793. {
  1794. if( m_pView3D == NULL )
  1795. return 0;
  1796. ASSERT_VALID( m_pView3D );
  1797. CPoint ptScreen;
  1798. VERIFY( ::GetCursorPos(&ptScreen) );
  1799. CPoint ptDiff(
  1800. m_ptScreenMMH.x - ptScreen.x,
  1801. m_ptScreenMMH.y - ptScreen.y
  1802. );
  1803. const GLfloat fDivAngle = 4.0f;
  1804. const GLfloat fDivStep = 200.0f;
  1805. switch( m_eMMH )
  1806. {
  1807. case EMMH_LOOK_UP:
  1808. m_pView3D->DoLookUp(
  1809. - ((GLfloat)ptDiff.y) / fDivAngle
  1810. );
  1811. m_ptScreenMMH = ptScreen;
  1812. the3DPipe.Render();
  1813. break;
  1814. case EMMH_LOOK_LEFT:
  1815. m_pView3D->DoLookLeft(
  1816. -( (GLfloat)ptDiff.x ) / fDivAngle
  1817. );
  1818. m_ptScreenMMH = ptScreen;
  1819. the3DPipe.Render();
  1820. break;
  1821. case EMMH_LOOK_OWN_AXIS:
  1822. m_pView3D->DoLookOwnAxis(
  1823. ( (GLfloat)ptDiff.x ) / fDivAngle
  1824. );
  1825. m_ptScreenMMH = ptScreen;
  1826. the3DPipe.Render();
  1827. break;
  1828. case EMMH_WALK_FORWARD:
  1829. m_pView3D->DoStepForward(
  1830. - ( (GLfloat)ptDiff.y ) / fDivStep
  1831. );
  1832. m_ptScreenMMH = ptScreen;
  1833. the3DPipe.Render();
  1834. break;
  1835. case EMMH_WALK_LEFT:
  1836. m_pView3D->DoStepLeft(
  1837. - ( (GLfloat)ptDiff.x ) / fDivStep
  1838. );
  1839. m_ptScreenMMH = ptScreen;
  1840. the3DPipe.Render();
  1841. break;
  1842. case EMMH_WALK_UP:
  1843. m_pView3D->DoStepUp(
  1844. ( (GLfloat)ptDiff.y ) / fDivStep
  1845. );
  1846. m_ptScreenMMH = ptScreen;
  1847. the3DPipe.Render();
  1848. break;
  1849. }
  1850. return 0;
  1851. } // if( message == WM_MOUSEMOVE )
  1852. if( message == WM_CAPTURECHANGED )
  1853. {
  1854. if( m_hWnd != ((HWND)lParam) )
  1855. {
  1856. m_eMMH = EMMH_NONE;
  1857. m_ptScreenMMH.x = m_ptScreenMMH.y = -1;
  1858. }
  1859. return 0L;
  1860. } // if( message == WM_CAPTURECHANGED )
  1861. if( message == WM_MOUSEWHEEL )
  1862. {
  1863. if( m_pView3D == NULL )
  1864. return 0;
  1865. ASSERT_VALID( m_pView3D );
  1866. int nWheelDelta = (int)((short)(HIWORD(wParam)));
  1867. if( nWheelDelta == 0 )
  1868. return 0;
  1869. const GLfloat fAngle = 5.0f;
  1870. if( CExtPopupMenuWnd::IsKeyPressed(VK_CONTROL) )
  1871. {
  1872. if( CExtPopupMenuWnd::IsKeyPressed(VK_SHIFT) )
  1873. {
  1874. CWnd * pViewWnd = GetParent();
  1875. ASSERT_VALID( pViewWnd );
  1876. pViewWnd->SendMessage(
  1877. WM_COMMAND,
  1878. ( nWheelDelta < 0 )
  1879. ? ID_CAM_FOV_DEC
  1880. : ID_CAM_FOV_INC
  1881. );
  1882. return 0;
  1883. } // if( CExtPopupMenuWnd::IsKeyPressed(VK_SHIFT) )
  1884. else
  1885. m_pView3D->DoLookOwnAxis(
  1886. (nWheelDelta < 0) ? (fAngle) : (-fAngle)
  1887. );
  1888. } // if( CExtPopupMenuWnd::IsKeyPressed(VK_CONTROL) )
  1889. else if( CExtPopupMenuWnd::IsKeyPressed(VK_SHIFT) )
  1890. m_pView3D->DoLookLeft(
  1891. (nWheelDelta < 0) ? (fAngle) : (-fAngle)
  1892. );
  1893. else
  1894. m_pView3D->DoLookUp(
  1895. (nWheelDelta < 0) ? (-fAngle) : (fAngle)
  1896. );
  1897. the3DPipe.Render();
  1898. return 0;
  1899. } // if( message == WM_MOUSEWHEEL )
  1900. if( message == WM_SIZE
  1901. || message == WM_WINDOWPOSCHANGED
  1902. || message == WM_DISPLAYCHANGE
  1903. )
  1904. {
  1905. _SafeResize3D( true );
  1906. return CWnd::WindowProc(message,wParam,lParam);
  1907. }
  1908. if( message == WM_DESTROY )
  1909. {
  1910. TimerAnimationEnable( FALSE );
  1911. return CWnd::WindowProc(message,wParam,lParam);
  1912. }
  1913. if( message == WM_SETCURSOR )
  1914. {
  1915. if( m_hCursor == NULL )
  1916. return 0;
  1917. SetCursor( m_hCursor );
  1918. return (!0);
  1919. } // if( message == WM_SETCURSOR )
  1920. return CWnd::WindowProc(message,wParam,lParam);
  1921. }
  1922. void TimerAnimationEnable( bool bEnable )
  1923. {
  1924. ASSERT_VALID( this );
  1925. the3DPipe.m_bTimerAnimationEnabled = bEnable;
  1926. if( bEnable )
  1927. SetTimer( GL_VIEWS_TIMER_ID, GL_VIEWS_TIMER_ELAPSE, NULL );
  1928. else
  1929. KillTimer( GL_VIEWS_TIMER_ID );
  1930. }
  1931. C3DView * GetView3D()
  1932. {
  1933. ASSERT_VALID( this );
  1934. return m_pView3D;
  1935. }
  1936. }; // class COutputWnd
  1937. CNavigationBar m_wndToolbar;
  1938. COutputWnd m_wndGlPanel;
  1939. // Operations
  1940. public:
  1941. // Overrides
  1942. // ClassWizard generated virtual function overrides
  1943. //{{AFX_VIRTUAL(CChildView)
  1944. protected:
  1945. virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
  1946. //}}AFX_VIRTUAL
  1947. // Implementation
  1948. public:
  1949. virtual ~CChildView();
  1950. static GLfloat g_fStepRotationAngle;
  1951. static GLfloat g_fStepWalkSize;
  1952. // Generated message map functions
  1953. protected:
  1954. //{{AFX_MSG(CChildView)
  1955. afx_msg void OnPaint();
  1956. afx_msg BOOL OnEraseBkgnd(CDC* pDC);
  1957. afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
  1958. afx_msg void OnSize(UINT nType, int cx, int cy);
  1959. afx_msg void OnRotateAboutX0();
  1960. afx_msg void OnRotateAboutX1();
  1961. afx_msg void OnRotateAboutY0();
  1962. afx_msg void OnRotateAboutY1();
  1963. afx_msg void OnRotateAboutZ0();
  1964. afx_msg void OnRotateAboutZ1();
  1965. afx_msg void OnTranslateX0();
  1966. afx_msg void OnTranslateX1();
  1967. afx_msg void OnTranslateY0();
  1968. afx_msg void OnTranslateY1();
  1969. afx_msg void OnTranslateZ0();
  1970. afx_msg void OnTranslateZ1();
  1971. afx_msg void OnSetFocus(CWnd* pOldWnd);
  1972. afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
  1973. afx_msg void OnCamFovInc();
  1974. afx_msg void OnUpdateCamFovInc(CCmdUI* pCmdUI);
  1975. afx_msg void OnCamFovDec();
  1976. afx_msg void OnUpdateCamFovDec(CCmdUI* pCmdUI);
  1977. //}}AFX_MSG
  1978. afx_msg void OnSelectCamera( UINT nCmdID );
  1979. afx_msg void OnUpdateSelectCamera(CCmdUI* pCmdUI);
  1980. afx_msg void OnUpdateEnabledBtnInBar(CCmdUI* pCmdUI);
  1981. afx_msg LRESULT OnExtMenuPrepare(WPARAM wParam, LPARAM lParam);
  1982. DECLARE_MESSAGE_MAP()
  1983. };
  1984. /////////////////////////////////////////////////////////////////////////////
  1985. //{{AFX_INSERT_LOCATION}}
  1986. // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
  1987. #endif // !defined(AFX_CHILDVIEW_H__3C598774_58D7_4703_A198_95CF22226AFC__INCLUDED_)