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

OpenGL

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // AnimWobble.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 "AnimationDialog.h"
  22. #ifdef _DEBUG
  23. #define new DEBUG_NEW
  24. #undef THIS_FILE
  25. static char THIS_FILE[] = __FILE__;
  26. #endif
  27. /////////////////////////////////////////////////////////////////////////////
  28. // CAnimWobble
  29. IMPLEMENT_DYNAMIC(CAnimWobble, CAnimation)
  30. /////////////////////////////////////////////////////////////////////////////
  31. // CAnimWobble construction
  32. CAnimWobble::CAnimWobble()
  33. {
  34. // Set the attributes to default values..
  35. m_szName = SZ_ANIMATE_WOBBLE;
  36. m_bFirst = TRUE;
  37. m_fWobbleX = 2.0f;
  38. m_fWobbleY = 2.0f;
  39. m_fWobbleZ = 2.0f;
  40. m_fLimitX = 45.0f;
  41. m_fLimitY = 45.0f;
  42. m_fLimitZ = 45.0f;
  43. m_dSpeedX = 0.0f;
  44. m_dSpeedY = 0.0f;
  45. m_dSpeedZ = 0.0f;
  46. m_bIncX = TRUE;
  47. m_bIncY = TRUE;
  48. m_bIncZ = TRUE;
  49. }
  50. /////////////////////////////////////////////////////////////////////////////
  51. // CAnimWobble Destructor
  52. CAnimWobble::~CAnimWobble()
  53. {
  54. }
  55. /////////////////////////////////////////////////////////////////////////////
  56. // CAnimWobble Methods or virtual function implimentation
  57. void CAnimWobble::AddAnimationPage(LPVOID pSht, C3dObject* pObject, C3dCamera* pCamera, C3dWorld* pWorld)
  58. {
  59. CAnimPropSheet* pSheet = (CAnimPropSheet*)pSht;
  60. ASSERT(pSheet);
  61. // Add the page to the property sheet
  62. pSheet->AddPage(&pSheet->m_WobblePage);
  63. // Save the address of this animation procedure in the page
  64. pSheet->m_WobblePage.m_pAnimation = this;
  65. }
  66. void CAnimWobble::AnimateCamera(C3dCamera* pCamera, double dTime)
  67. {
  68. GLfloat fXIncrement; // Rotation incremental values
  69. GLfloat fYIncrement;
  70. GLfloat fZIncrement;
  71. // Ensure that we have a vaild pointer..
  72. if(!pCamera)
  73. return;
  74. // First pass through, just save the objects original
  75. // parameters
  76. if(m_bFirst)
  77. {
  78. m_bFirst = FALSE;
  79. SaveCameraAttributes(pCamera);
  80. return;
  81. }
  82. // Calculate the incremental index values
  83. if(m_dSpeedX)
  84. fXIncrement = (GLfloat)(m_fWobbleX/(m_dSpeedX/(dTime-m_dTimePrevious)));
  85. else
  86. fXIncrement = m_fWobbleX;
  87. if(m_dSpeedY)
  88. fYIncrement = (GLfloat)(m_fWobbleY/(m_dSpeedY/(dTime-m_dTimePrevious)));
  89. else
  90. fYIncrement = m_fWobbleY;
  91. if(m_dSpeedZ)
  92. fZIncrement = (GLfloat)(m_fWobbleZ/(m_dSpeedZ/(dTime-m_dTimePrevious)));
  93. else
  94. fZIncrement = m_fWobbleZ;
  95. // Wobble the shape
  96. if(m_fWobbleX)
  97. {
  98. if(m_bIncX)
  99. {
  100. pCamera->m_fRotation[X] += fXIncrement;
  101. if(pCamera->m_fRotation[X] > (m_fRotation[X]+m_fLimitX))
  102. {
  103. pCamera->m_fRotation[X] -= fXIncrement;
  104. m_bIncX = FALSE;
  105. }
  106. }
  107. else
  108. {
  109. pCamera->m_fRotation[X] -= fXIncrement;
  110. if(pCamera->m_fRotation[X] < (m_fRotation[X]-m_fLimitX))
  111. {
  112. pCamera->m_fRotation[X] += fXIncrement;
  113. m_bIncX = TRUE;
  114. }
  115. }
  116. }
  117. if(m_fWobbleY)
  118. {
  119. if(m_bIncY)
  120. {
  121. pCamera->m_fRotation[Y] += fYIncrement;
  122. if(pCamera->m_fRotation[Y] > (m_fRotation[Y]+m_fLimitY))
  123. {
  124. pCamera->m_fRotation[Y] -= fYIncrement;
  125. m_bIncY = FALSE;
  126. }
  127. }
  128. else
  129. {
  130. pCamera->m_fRotation[Y] -= fYIncrement;
  131. if(pCamera->m_fRotation[Y] < (m_fRotation[Y]-m_fLimitY))
  132. {
  133. pCamera->m_fRotation[Y] += fYIncrement;
  134. m_bIncY = TRUE;
  135. }
  136. }
  137. }
  138. if(m_fWobbleZ)
  139. {
  140. if(m_bIncZ)
  141. {
  142. pCamera->m_fRotation[Z] += fZIncrement;
  143. if(pCamera->m_fRotation[Z] > (m_fRotation[Z]+m_fLimitZ))
  144. {
  145. pCamera->m_fRotation[Z] -= fZIncrement;
  146. m_bIncZ = FALSE;
  147. }
  148. }
  149. else
  150. {
  151. pCamera->m_fRotation[Z] -= fZIncrement;
  152. if(pCamera->m_fRotation[Z] < (m_fRotation[Z]-m_fLimitZ))
  153. {
  154. pCamera->m_fRotation[Z] += fZIncrement;
  155. m_bIncZ = TRUE;
  156. }
  157. }
  158. }
  159. // Save the time of the last iteration
  160. m_dTimePrevious = dTime;
  161. }
  162. void CAnimWobble::AnimateObject(C3dObject* pObject, double dTime)
  163. {
  164. GLfloat fXIncrement; // Rotation incremental values
  165. GLfloat fYIncrement;
  166. GLfloat fZIncrement;
  167. // Ensure that we have a vaild pointer..
  168. if(!pObject)
  169. return;
  170. // First pass through, just save the objects original
  171. // parameters
  172. if(m_bFirst)
  173. {
  174. m_bFirst = FALSE;
  175. SaveObjectAttributes(pObject);
  176. return;
  177. }
  178. // Calculate the incremental index values
  179. if(m_dSpeedX)
  180. fXIncrement = (GLfloat)(m_fWobbleX/(m_dSpeedX/(dTime-m_dTimePrevious)));
  181. else
  182. fXIncrement = m_fWobbleX;
  183. if(m_dSpeedY)
  184. fYIncrement = (GLfloat)(m_fWobbleY/(m_dSpeedY/(dTime-m_dTimePrevious)));
  185. else
  186. fYIncrement = m_fWobbleY;
  187. if(m_dSpeedZ)
  188. fZIncrement = (GLfloat)(m_fWobbleZ/(m_dSpeedZ/(dTime-m_dTimePrevious)));
  189. else
  190. fZIncrement = m_fWobbleZ;
  191. // Wobble the shape
  192. if(m_fWobbleX)
  193. {
  194. if(m_bIncX)
  195. {
  196. pObject->m_fRotation[X] += fXIncrement;
  197. if(pObject->m_fRotation[X] > (m_fRotation[X]+m_fLimitX))
  198. {
  199. pObject->m_fRotation[X] -= fXIncrement;
  200. m_bIncX = FALSE;
  201. }
  202. }
  203. else
  204. {
  205. pObject->m_fRotation[X] -= fXIncrement;
  206. if(pObject->m_fRotation[X] < (m_fRotation[X]-m_fLimitX))
  207. {
  208. pObject->m_fRotation[X] += fXIncrement;
  209. m_bIncX = TRUE;
  210. }
  211. }
  212. }
  213. if(m_fWobbleY)
  214. {
  215. if(m_bIncY)
  216. {
  217. pObject->m_fRotation[Y] += fYIncrement;
  218. if(pObject->m_fRotation[Y] > (m_fRotation[Y]+m_fLimitY))
  219. {
  220. pObject->m_fRotation[Y] -= fYIncrement;
  221. m_bIncY = FALSE;
  222. }
  223. }
  224. else
  225. {
  226. pObject->m_fRotation[Y] -= fYIncrement;
  227. if(pObject->m_fRotation[Y] < (m_fRotation[Y]-m_fLimitY))
  228. {
  229. pObject->m_fRotation[Y] += fYIncrement;
  230. m_bIncY = TRUE;
  231. }
  232. }
  233. }
  234. if(m_fWobbleZ)
  235. {
  236. if(m_bIncZ)
  237. {
  238. pObject->m_fRotation[Z] += fZIncrement;
  239. if(pObject->m_fRotation[Z] > (m_fRotation[Z]+m_fLimitZ))
  240. {
  241. pObject->m_fRotation[Z] -= fZIncrement;
  242. m_bIncZ = FALSE;
  243. }
  244. }
  245. else
  246. {
  247. pObject->m_fRotation[Z] -= fZIncrement;
  248. if(pObject->m_fRotation[Z] < (m_fRotation[Z]-m_fLimitZ))
  249. {
  250. pObject->m_fRotation[Z] += fZIncrement;
  251. m_bIncZ = TRUE;
  252. }
  253. }
  254. }
  255. // Save the time of the last iteration
  256. m_dTimePrevious = dTime;
  257. }
  258. void CAnimWobble::Serialize(CArchive& ar, int iVersion)
  259. {
  260. CString szBuffer;
  261. CString szName;
  262. szBuffer.GetBuffer(256);
  263. szName.GetBuffer(128);
  264. if (ar.IsStoring())
  265. {
  266. // Save the CAnimation derived class header...
  267. szBuffer.Format("%sCAnimWobble {n", szIndent);
  268. ar.WriteString(szBuffer);
  269. // Save the this animation procedures' specific data...
  270. szBuffer.Format("%stWobbleX       < %f >n", szIndent, m_fWobbleX);
  271. ar.WriteString(szBuffer);
  272. szBuffer.Format("%stWobbleY       < %f >n", szIndent, m_fWobbleY);
  273. ar.WriteString(szBuffer);
  274. szBuffer.Format("%stWobbleZ       < %f >n", szIndent, m_fWobbleZ);
  275. ar.WriteString(szBuffer);
  276. szBuffer.Format("%stLimitX        < %f >n", szIndent, m_fLimitX);
  277. ar.WriteString(szBuffer);
  278. szBuffer.Format("%stLimitY        < %f >n", szIndent, m_fLimitY);
  279. ar.WriteString(szBuffer);
  280. szBuffer.Format("%stLimitZ        < %f >n", szIndent, m_fLimitZ);
  281. ar.WriteString(szBuffer);
  282. szBuffer.Format("%stSpinSpeedX    < %f >n", szIndent, m_dSpeedX);
  283. ar.WriteString(szBuffer);
  284. szBuffer.Format("%stSpinSpeedY    < %f >n", szIndent, m_dSpeedY);
  285. ar.WriteString(szBuffer);
  286. szBuffer.Format("%stSpinSpeedZ    < %f >n", szIndent, m_dSpeedZ);
  287. ar.WriteString(szBuffer);
  288. // Save the base class data...
  289. CAnimation::Serialize(ar, iVersion);
  290. szBuffer.Format("%s}n", szIndent); // end of animation def
  291. ar.WriteString(szBuffer);
  292. }
  293. else
  294. {
  295. // Read the derived class data..
  296. ar.ReadString(szBuffer);
  297. szBuffer.TrimLeft(); // Remove leading white spaces
  298. sscanf(szBuffer, "WobbleX       < %f >n", &m_fWobbleX);
  299. ar.ReadString(szBuffer);
  300. szBuffer.TrimLeft();
  301. sscanf(szBuffer, "WobbleY       < %f >n", &m_fWobbleY);
  302. ar.ReadString(szBuffer);
  303. szBuffer.TrimLeft();
  304. sscanf(szBuffer, "WobbleZ       < %f >n", &m_fWobbleZ);
  305. ar.ReadString(szBuffer);
  306. szBuffer.TrimLeft();
  307. sscanf(szBuffer, "LimitX        < %f >n", &m_fLimitX);
  308. ar.ReadString(szBuffer);
  309. szBuffer.TrimLeft();
  310. sscanf(szBuffer, "LimitY        < %f >n", &m_fLimitY);
  311. ar.ReadString(szBuffer);
  312. szBuffer.TrimLeft();
  313. sscanf(szBuffer, "LimitZ        < %f >n", &m_fLimitZ);
  314. ar.ReadString(szBuffer);
  315. szBuffer.TrimLeft();
  316. sscanf(szBuffer, "SpinSpeedX    < %lf >n", (float*)&m_dSpeedX);
  317. ar.ReadString(szBuffer);
  318. szBuffer.TrimLeft();
  319. sscanf(szBuffer, "SpinSpeedY    < %lf >n", (float*)&m_dSpeedY);
  320. ar.ReadString(szBuffer);
  321. szBuffer.TrimLeft();
  322. sscanf(szBuffer, "SpinSpeedZ    < %lf >n", (float*)&m_dSpeedZ);
  323. // Read the base class data...
  324. CAnimation::Serialize(ar, iVersion);
  325. }
  326. }
  327. void CAnimWobble::Reset()
  328. {
  329. // TODO:  Add any CAnimWobble reset code here..
  330. }
  331. /////////////////////////////////////////////////////////////////////////////
  332. // CAnimWobble function implimentation