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

OpenGL

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // AnimKeyFrame.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. #include <math.h>
  23. #ifdef _DEBUG
  24. #define new DEBUG_NEW
  25. #undef THIS_FILE
  26. static char THIS_FILE[] = __FILE__;
  27. #endif
  28. /////////////////////////////////////////////////////////////////////////////
  29. // CAnimKeyFrame
  30. IMPLEMENT_DYNAMIC(CAnimKeyFrame, CAnimation)
  31. /////////////////////////////////////////////////////////////////////////////
  32. // CAnimKeyFrame construction
  33. CAnimKeyFrame::CAnimKeyFrame()
  34. {
  35. // Set the attributes to default values..
  36. m_szName = SZ_ANIMATE_KEYFRAME;
  37. m_bCycleKeyFrames = TRUE;
  38. // Create a KeyFrame List
  39. m_pKeyFrameList = new CKeyFrameList;
  40. ASSERT(m_pKeyFrameList);
  41. }
  42. /////////////////////////////////////////////////////////////////////////////
  43. // CAnimKeyFrame Destructor
  44. CAnimKeyFrame::~CAnimKeyFrame()
  45. {
  46. // Delete the keyframe list
  47. if(m_pKeyFrameList)
  48. delete m_pKeyFrameList;
  49. }
  50. /////////////////////////////////////////////////////////////////////////////
  51. // CAnimKeyFrame Methods or virtual function implimentation
  52. void CAnimKeyFrame::AddAnimationPage(LPVOID pSht, C3dObject* pObject, C3dCamera* pCamera, C3dWorld* pWorld)
  53. {
  54. CAnimPropSheet* pSheet = (CAnimPropSheet*)pSht;
  55. ASSERT(pSheet);
  56. // Add the page to the property sheet
  57. pSheet->AddPage(&pSheet->m_KeyFramePage);
  58. // Save the address of this animation procedure in the page
  59. pSheet->m_KeyFramePage.m_pAnimation = this;
  60. }
  61. void CAnimKeyFrame::AnimateCamera(C3dCamera* pCamera, double dTime)
  62. {
  63. // First pass through, just save the objects original
  64. // parameters
  65. if(m_bFirst)
  66. {
  67. m_bFirst = FALSE;
  68. SaveCameraAttributes(pCamera);
  69. return;
  70. }
  71. }
  72. void CAnimKeyFrame::AnimateObject(C3dObject* pObject, double dTime)
  73. {
  74. // First pass through, just save the objects original
  75. // parameters
  76. if(m_bFirst)
  77. {
  78. m_bFirst = FALSE;
  79. SaveObjectAttributes(pObject);
  80. return;
  81. }
  82. // Ensure the list is not empty then calculate a new time index
  83. // if necessary.
  84. if(!m_pKeyFrameList->IsEmpty())
  85. {
  86. // Get the last keyframe
  87. CKeyFrame* pLastKey = (CKeyFrame*) m_pKeyFrameList->GetTail();
  88. if(m_bCycleKeyFrames) // Continuously cycle keyframes
  89. {
  90. if(pLastKey->m_dTime < dTime)
  91. // Last key is less than 'dTime', so divide the target 'dTime'
  92. // by the last keyframes' time and extract the remainder
  93. dTime = fmod( dTime, pLastKey->m_dTime);
  94. }
  95. else // Cycle through KeyFrame list once only..
  96. {
  97. if(pLastKey->m_dTime < dTime)
  98. // The animation time index is greater than last keyframe value,
  99. // so set the time index equal to the last valid keyframe so that
  100. // the object ends EXACTLY on the last time interpolated value
  101. dTime = pLastKey->m_dTime;
  102. }
  103. }
  104. // Step through list backward until we find a keyframe
  105. // which is less or equal to 'dTime'
  106. POSITION pos = m_pKeyFrameList->GetTailPosition();
  107. ASSERT(pos);
  108. do {
  109. POSITION thispos = pos;
  110. CKeyFrame* pKeyPrevious = (CKeyFrame*) m_pKeyFrameList->GetPrev(pos);
  111. if (pKeyPrevious->m_dTime <= dTime)
  112. {
  113. // Found the keyframe who's time is smaller than the target, now 
  114. // see if we have next key frame.
  115. CKeyFrame* pKey = (CKeyFrame*) m_pKeyFrameList->GetNext(thispos);
  116. if(thispos)
  117. {
  118. pKey = (CKeyFrame*) m_pKeyFrameList->GetNext(thispos);
  119. if(pKey)
  120. {
  121. pKey->m_pKeyFramePrevious = pKeyPrevious;
  122. // Animate the keyframe
  123. pKey->AnimateObject(pObject, dTime);
  124. }
  125. }
  126. return;
  127. }
  128. } while (pos);
  129. }
  130. void CAnimKeyFrame::Serialize(CArchive& ar, int iVersion)
  131. {
  132. CString szIndentSave;
  133. CString szBuffer;
  134. CString szName;
  135. szBuffer.GetBuffer(256);
  136. szName.GetBuffer(128);
  137. if (ar.IsStoring())
  138. {
  139. // Save the CAnimation derived class header...
  140. szBuffer.Format("%sCAnimKeyFrame {n", szIndent);
  141. ar.WriteString(szBuffer);
  142. // Save the CAnimKeyFrame specific data...
  143. szBuffer.Format("%stCycle Frames  < %d >n", szIndent, m_bCycleKeyFrames);
  144. ar.WriteString(szBuffer);
  145. // Save all keyframes in the list
  146. m_pKeyFrameList->Serialize(ar, iVersion);
  147. szBuffer.Format("%s}n", szIndent); // end of animation def
  148. ar.WriteString(szBuffer);
  149. }
  150. else
  151. {
  152. // Read the derived class data..
  153. ar.ReadString(szBuffer);
  154. szBuffer.TrimLeft(); // Remove leading white spaces
  155. sscanf(szBuffer, "Cycle Frames  < %d >n", &m_bCycleKeyFrames);
  156. // Load all CAnimation procedures
  157. while(ar.ReadString(szBuffer))
  158. {
  159. szBuffer.TrimLeft(); // Remove leading white spaces
  160. if(szBuffer.Compare("}") == 0) // end of CAnimKeyFrame procedure
  161. break;
  162. if(szBuffer.Compare("CKeyFrame List {") == 0)
  163. m_pKeyFrameList->Serialize(ar, iVersion);
  164. }
  165. }
  166. }
  167. void CAnimKeyFrame::Reset()
  168. {
  169. // TODO:  Add any CAnimKeyFrame reset code here..
  170. }
  171. /////////////////////////////////////////////////////////////////////////////
  172. // CAnimKeyFrame function implimentation