3dPageAnimation.cpp
上传用户:shxiangxiu
上传日期:2007-01-03
资源大小:1101k
文件大小:10k
源码类别:

OpenGL

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // 3dPageAnimation.cpp : implementation file
  3. //
  4. // glOOP (OpenGL Object Oriented Programming library)
  5. // Copyright (c) Craig Fahrnbach 1997, 1998
  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. // This program is -not- in the public domain.
  17. //
  18. /////////////////////////////////////////////////////////////////////////////
  19. #include "stdafx.h"
  20. #include "glOOP.h"
  21. #include "3dObjectDialog.h"
  22. #ifdef _DEBUG
  23. #undef THIS_FILE
  24. static char BASED_CODE THIS_FILE[] = __FILE__;
  25. #endif
  26. /////////////////////////////////////////////////////////////////////////////
  27. // C3dPageAnimation
  28. IMPLEMENT_DYNCREATE(C3dPageAnimation, CPropertyPage)
  29. /////////////////////////////////////////////////////////////////////////////
  30. // C3dPageAnimation dialog construction
  31. C3dPageAnimation::C3dPageAnimation()
  32. : CPropertyPage(C3dPageAnimation::IDD)
  33. {
  34. m_szSelectedProcedure = _T("");
  35. m_pObject = NULL;
  36. m_pCamera = NULL;
  37. m_pWorld  = NULL;
  38. m_pAnimation = NULL;
  39. //{{AFX_DATA_INIT(C3dPageAnimation)
  40. //}}AFX_DATA_INIT
  41. }
  42. /////////////////////////////////////////////////////////////////////////////
  43. // C3dPageAnimation Destructor
  44. C3dPageAnimation::~C3dPageAnimation()
  45. {
  46. }
  47. void C3dPageAnimation::DoDataExchange(CDataExchange* pDX)
  48. {
  49. CPropertyPage::DoDataExchange(pDX);
  50. //{{AFX_DATA_MAP(C3dPageAnimation)
  51. DDX_Control(pDX, IDC_SELECTED_LIST, m_AnimationList);
  52. DDX_Control(pDX, IDC_PROCEDURE_LIST, m_ProcedureList);
  53. //}}AFX_DATA_MAP
  54. }
  55. BEGIN_MESSAGE_MAP(C3dPageAnimation, CPropertyPage)
  56. //{{AFX_MSG_MAP(C3dPageAnimation)
  57. ON_BN_CLICKED(IDC_BUTTON_ADD, OnButtonAdd)
  58. ON_BN_CLICKED(IDC_BUTTON_CONFIGURE, OnButtonConfigure)
  59. ON_BN_CLICKED(IDC_BUTTON_DELETE, OnButtonDelete)
  60. ON_LBN_SELCHANGE(IDC_PROCEDURE_LIST, OnSelchangeProcedureList)
  61. ON_LBN_SELCHANGE(IDC_SELECTED_LIST, OnSelchangeSelectedList)
  62. //}}AFX_MSG_MAP
  63. END_MESSAGE_MAP()
  64. /////////////////////////////////////////////////////////////////////////////
  65. // C3dPageAnimation functions
  66. void C3dPageAnimation::AddObjectProcedures()
  67. {
  68. // Available list of animation procedures for Objects
  69. m_ProcedureList.AddString(SZ_ANIMATE_SPIN);
  70. m_ProcedureList.AddString(SZ_ANIMATE_WOBBLE);
  71. m_ProcedureList.AddString(SZ_ANIMATE_KEYFRAME);
  72. // if(m_pObject->m_pTextureMap)
  73. // {
  74. // if(m_pObject->m_pTextureMap->IsKindOf( RUNTIME_CLASS (CMyAviVideo)))
  75. // m_ProcedureList.AddString(SZ_ANIMATE_AVI);
  76. // }
  77. }
  78. void C3dPageAnimation::AddCameraProcedures()
  79. {
  80. // Available list of animation procedures for our Camera
  81. m_ProcedureList.AddString(SZ_ANIMATE_SPIN);
  82. m_ProcedureList.AddString(SZ_ANIMATE_WOBBLE);
  83. m_ProcedureList.AddString(SZ_ANIMATE_KEYFRAME);
  84. }
  85. void C3dPageAnimation::AddWorldProcedures()
  86. {
  87. // if(m_pWorld->m_pBkgndTextureMap)
  88. // {
  89. // if(m_pWorld->m_pBkgndTextureMap->IsKindOf( RUNTIME_CLASS (CMyAviVideo)))
  90. // m_ProcedureList.AddString(SZ_ANIMATE_AVI);
  91. // }
  92. }
  93. void C3dPageAnimation::DisplaySelectedProcedures()
  94. {
  95. if(m_pObject)
  96. {
  97. // Reset or clear the contents of the list box
  98. m_AnimationList.ResetContent();
  99. // Fill the List box with all animation procedures attached to this 
  100. // object
  101. CAnimation* pAnimation = NULL;
  102. // walk the list
  103. POSITION Pos = m_pObject->m_AnimList.GetHeadPosition();
  104. while (Pos)
  105. {
  106. pAnimation = m_pObject->m_AnimList.GetAt(Pos);
  107. m_AnimationList.AddString(pAnimation->m_szName);
  108. int count = m_AnimationList.GetCount() - 1; // zero based
  109. m_AnimationList.SetItemData(count, (unsigned long)pAnimation);
  110. pAnimation = m_pObject->m_AnimList.GetNext(Pos);
  111. }
  112. }
  113. if(m_pCamera)
  114. {
  115. // Reset or clear the contents of the list box
  116. m_AnimationList.ResetContent();
  117. // Fill the List box with all animation procedures attached to this 
  118. // camera
  119. CAnimation* pAnimation = NULL;
  120. // walk the list
  121. POSITION Pos = m_pCamera->m_AnimList.GetHeadPosition();
  122. while (Pos)
  123. {
  124. pAnimation = m_pCamera->m_AnimList.GetAt(Pos);
  125. m_AnimationList.AddString(pAnimation->m_szName);
  126. int count = m_AnimationList.GetCount() - 1; // zero based
  127. m_AnimationList.SetItemData(count, (unsigned long)pAnimation);
  128. pAnimation = m_pCamera->m_AnimList.GetNext(Pos);
  129. }
  130. }
  131. if(m_pWorld)
  132. {
  133. // Reset or clear the contents of the list box
  134. m_AnimationList.ResetContent();
  135. // Fill the List box with all animation procedures attached to this 
  136. // World
  137. CAnimation* pAnimation = NULL;
  138. // walk the list
  139. POSITION Pos = m_pWorld->m_AnimList.GetHeadPosition();
  140. while (Pos)
  141. {
  142. pAnimation = m_pWorld->m_AnimList.GetAt(Pos);
  143. m_AnimationList.AddString(pAnimation->m_szName);
  144. int count = m_AnimationList.GetCount() - 1; // zero based
  145. m_AnimationList.SetItemData(count, (unsigned long)pAnimation);
  146. pAnimation = m_pWorld->m_AnimList.GetNext(Pos);
  147. }
  148. }
  149. }
  150. /////////////////////////////////////////////////////////////////////////////
  151. // C3dPageAnimation message handlers
  152. BOOL C3dPageAnimation::OnInitDialog() 
  153. {
  154. // let the base class do the default work
  155. CPropertyPage::OnInitDialog();
  156. // Reset or clear the contents of the list box
  157. m_ProcedureList.ResetContent();
  158. // Display the list of available animation procedures
  159. if(m_pObject)
  160. AddObjectProcedures();
  161. if(m_pCamera)
  162. AddCameraProcedures();
  163. if(m_pWorld)
  164. AddWorldProcedures();
  165. // Display the objects current animation procedures
  166. DisplaySelectedProcedures();
  167. // Dialog box is being initialized (FALSE)
  168. // or data is being retrieved (TRUE).
  169. UpdateData(FALSE);
  170. return TRUE;  // return TRUE unless you set the focus to a control
  171.               // EXCEPTION: OCX Property Pages should return FALSE
  172. }
  173. void C3dPageAnimation::OnOK() 
  174. {
  175. // TODO: Add your specialized code here and/or call the base class
  176. CPropertyPage::OnOK();
  177. }
  178. void C3dPageAnimation::OnButtonAdd() 
  179. {
  180. if(m_szSelectedProcedure == _T("") )
  181. AfxMessageBox("Please select a procedure from the 'Available Procedures' list.", MB_OK);
  182. else
  183. {
  184. if(m_pObject) // Which object animation procedure do we add? 
  185. {
  186. if(m_szSelectedProcedure.Compare(SZ_ANIMATE_SPIN) == 0)
  187. {
  188. if(!m_pObject->m_AnimList.Find(SZ_ANIMATE_SPIN))
  189. {
  190. CAnimSpin* pAnimSpin = new CAnimSpin;
  191. m_pObject->m_AnimList.Append(pAnimSpin);
  192. }
  193. else
  194. AfxMessageBox("Can only have one 'Spin' animation!", MB_OK);
  195. }
  196. if(m_szSelectedProcedure.Compare(SZ_ANIMATE_WOBBLE) == 0)
  197. {
  198. if(!m_pObject->m_AnimList.Find(SZ_ANIMATE_WOBBLE))
  199. {
  200. CAnimWobble* pAnimWobble = new CAnimWobble;
  201. m_pObject->m_AnimList.Append(pAnimWobble);
  202. }
  203. else
  204. AfxMessageBox("Can only have one 'Wobble' animation!", MB_OK);
  205. }
  206. if(m_szSelectedProcedure.Compare(SZ_ANIMATE_AVI) == 0)
  207. {
  208. if(!m_pObject->m_AnimList.Find(SZ_ANIMATE_AVI))
  209. {
  210. CAnimAVI* pAnimAVI = new CAnimAVI;
  211. m_pObject->m_AnimList.Append(pAnimAVI);
  212. }
  213. else
  214. AfxMessageBox("This Object can only have one animation procedure!", MB_OK);
  215. }
  216. if(m_szSelectedProcedure.Compare(SZ_ANIMATE_KEYFRAME) == 0)
  217. {
  218. CAnimKeyFrame* pAnimKey = new CAnimKeyFrame;
  219. m_pObject->m_AnimList.Append(pAnimKey);
  220. }
  221. }
  222. if(m_pCamera) // Which camera animation procedure do we add? 
  223. {
  224. if(m_szSelectedProcedure.Compare(SZ_ANIMATE_SPIN) == 0)
  225. {
  226. if(!m_pCamera->m_AnimList.Find(SZ_ANIMATE_SPIN))
  227. {
  228. CAnimSpin* pAnimSpin = new CAnimSpin;
  229. m_pCamera->m_AnimList.Append(pAnimSpin);
  230. }
  231. else
  232. AfxMessageBox("Can only have one 'Spin' animation!", MB_OK);
  233. }
  234. if(m_szSelectedProcedure.Compare(SZ_ANIMATE_WOBBLE) == 0)
  235. {
  236. if(!m_pObject->m_AnimList.Find(SZ_ANIMATE_WOBBLE))
  237. {
  238. CAnimWobble* pAnimWobble = new CAnimWobble;
  239. m_pCamera->m_AnimList.Append(pAnimWobble);
  240. }
  241. else
  242. AfxMessageBox("Can only have one 'Wobble' animation!", MB_OK);
  243. }
  244. if(m_szSelectedProcedure.Compare(SZ_ANIMATE_KEYFRAME) == 0)
  245. {
  246. CAnimKeyFrame* pAnimKey = new CAnimKeyFrame;
  247. m_pCamera->m_AnimList.Append(pAnimKey);
  248. }
  249. }
  250. if(m_pWorld) // Which World animation procedure do we add? 
  251. {
  252. if(m_szSelectedProcedure.Compare(SZ_ANIMATE_AVI) == 0)
  253. {
  254. if(!m_pWorld->m_AnimList.Find(SZ_ANIMATE_AVI))
  255. {
  256. CAnimAVI* pAnimAVI = new CAnimAVI;
  257. m_pWorld->m_AnimList.Append(pAnimAVI);
  258. }
  259. else
  260. AfxMessageBox("This TextureMap can only have one animation procedure!", MB_OK);
  261. }
  262. }
  263. }
  264. // Update the selected animation procedures
  265. DisplaySelectedProcedures();
  266. }
  267. void C3dPageAnimation::OnButtonConfigure() 
  268. {
  269. if(m_pObject)
  270. {
  271. m_pObject->EditAnimation(this, NULL);
  272. return;
  273. }
  274. if(m_pCamera)
  275. {
  276. m_pCamera->EditAnimation(this, NULL);
  277. return;
  278. }
  279. if(m_pWorld)
  280. {
  281. m_pWorld->EditAnimation(this, NULL);
  282. return;
  283. }
  284. }
  285. void C3dPageAnimation::OnButtonDelete() 
  286. {
  287. if(m_pAnimation == NULL)
  288. AfxMessageBox("Please select a procedure from the 'Selected Procedures' list to delete.", MB_OK);
  289. else
  290. {
  291. if(m_pObject)
  292. {
  293. m_pObject->m_AnimList.Delete(m_pAnimation);
  294. m_pAnimation = NULL;
  295. DisplaySelectedProcedures();
  296. return;
  297. }
  298. if(m_pCamera)
  299. {
  300. m_pCamera->m_AnimList.Delete(m_pAnimation);
  301. m_pAnimation = NULL;
  302. DisplaySelectedProcedures();
  303. return;
  304. }
  305. if(m_pWorld)
  306. {
  307. m_pWorld->m_AnimList.Delete(m_pAnimation);
  308. m_pAnimation = NULL;
  309. DisplaySelectedProcedures();
  310. return;
  311. }
  312. }
  313. }
  314. void C3dPageAnimation::OnSelchangeProcedureList() 
  315. {
  316. // Get the zero-based index of the item selected
  317. int index = m_ProcedureList.GetCurSel();
  318. if(index != LB_ERR)
  319. {
  320. // Get the user selected procedure from the list
  321. // a C3dColor pointer..
  322. m_ProcedureList.GetText(index, m_szSelectedProcedure);
  323. }
  324. else
  325. m_szSelectedProcedure = _T("");
  326. }
  327. void C3dPageAnimation::OnSelchangeSelectedList() 
  328. {
  329. // User selected an Animation procedure from the "Selected List"
  330. // Get the zero-based index of the item selected
  331. int index = m_AnimationList.GetCurSel();
  332. if(index != LB_ERR)
  333. {
  334. // Cast the user selected list box items' lParam to
  335. // a CAnimation pointer..
  336. m_pAnimation = (CAnimation*)m_AnimationList.GetItemData(index);
  337. }
  338. else
  339. m_pAnimation = NULL;
  340. }