BilliardView.h
上传用户:owen_mei
上传日期:2022-08-09
资源大小:2263k
文件大小:8k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // BilliardView.h : interface of the CBilliardView class
  2. //
  3. /////////////////////////////////////////////////////////////////////////////
  4. #if !defined(AFX_MYSDOPENGLVIEW_H__75C5AAEC_37B0_4A8B_9132_9A0C663F6DDC__INCLUDED_)
  5. #define AFX_MYSDOPENGLVIEW_H__75C5AAEC_37B0_4A8B_9132_9A0C663F6DDC__INCLUDED_
  6. #if _MSC_VER > 1000
  7. #pragma once
  8. #endif // _MSC_VER > 1000
  9. #include "mathdefs.h"
  10. #include "LoadTGA.h"
  11. #include <time.h>
  12. #include <mmsystem.h>
  13. #include <assert.h>
  14. // This sets up the table position in the world
  15. // TODO: Should load with the model....?
  16. #define TABLE_POSITION 3.45f //  球桌的高度
  17. #define LEFT_BUMPER 4.88f // Left X coordinate of Table Bumper
  18. #define RIGHT_BUMPER 4.88f // Right X coordinate of Table Bumper
  19. #define TOP_BUMPER 2.3f // Top Z coordinate of Table Bumper -  Ooops model error
  20. #define BOTTOM_BUMPER 2.45f // Bottom Z coordinate of Table Bumper
  21. // 球的物理尺寸
  22. #define BALL_DIAMETER 0.1875f // 球的直径
  23. #define EPSILON 0.00001f // ERROR TERM
  24. #define DEFAULT_DAMPING 0.002f //  缺省的阻尼
  25. #define CUE_STICK_FORCE 5.0f // For Mouse interaction
  26. #define BALL_COUNT 2
  27. #define SYSTEM_COUNT 3
  28. #define MAX_CONTACTS 10
  29. #define OGL_WBALL_DLIST 1 // 白球的显示列表
  30. #define OGL_YBALL_DLIST 2 // 黄球的显示列表
  31. #define OGL_CUE_DLIST 3 // 球杆的显示列表
  32. #define ART_PATH "art/"
  33. #define MAX_TEXTURES 255
  34. //  碰撞类型
  35. enum tCollisionTypes
  36. {
  37. NOT_COLLIDING, //  没有碰撞
  38. PENETRATING, //  穿过
  39. COLLIDING_WITH_WALL, //  球与边界之间的碰撞
  40. COLLIDING_WITH_BALL //  球与球之间的碰撞
  41. };
  42. enum tIntegratorTypes
  43. {
  44. EULER_INTEGRATOR,
  45. MIDPOINT_INTEGRATOR,
  46. RK4_INTEGRATOR
  47. };
  48. //  在游戏模拟的过程中有关碰撞的数据结构
  49. typedef struct s_Contact
  50. {
  51. int ball,ball2; // 当两球碰撞时用到球2
  52.     tVector normal; // 碰撞平面的法向量
  53. int type; // 碰撞类型
  54. float Kr; // 恢复系数
  55. } t_Contact;
  56. //  碰撞平面的数据结构
  57. typedef struct s_CollisionPlane
  58. {
  59. tVector normal; // 法向量
  60.     float d; // ax + by + cz + d = 0
  61. } t_CollisionPlane;
  62. //  摄像机的数据结构
  63. typedef struct s_Camera
  64. {
  65. tVector rot; //  旋转
  66. tVector trans; //  平移
  67. float fov; //  视场
  68. } t_Camera;
  69. // 球杆的数据结构
  70. typedef struct s_Cue
  71. float draw,old_draw; //  球杆向后拉动的距离
  72. float yaw; //  球杆的旋转角度
  73. tVector pos; //  球杆的位置
  74. float drawtime;
  75. } t_CueStick;
  76. //  球的数据结构
  77. typedef struct s_Ball
  78. {
  79. tVector pos; //  球的位置
  80.     tVector v; //  球的速度
  81. tVector f; //  作用于球上的力
  82.     tVector angMom; // Angular Momentum
  83.     tVector torque; // 作用于球上的力矩
  84. float oneOverM; //  质量的倒数
  85. tQuaternion orientation;
  86. int flags; //  是否处于碰撞状态
  87. } t_Ball;
  88. #define POLY_SELECTED 1
  89. #define POLY_TEXTURED 2
  90. typedef struct s_TexPool
  91. {
  92. char map[255];
  93. GLuint glTex;
  94. byte *data;
  95. int type;
  96. }t_TexPool;
  97. // 多边形数据结构(可以为四边形和三角形)
  98. typedef struct 
  99. {
  100. t2DCoord t1[4],t2[4];
  101. uint TexNdx1;
  102. uint TexNdx2;
  103. unsigned short index[4];
  104. long type;
  105. long color[4];
  106. } tPrimPoly;
  107. // 定义场景的数据结构(包含有三角形和四边形)
  108. typedef struct 
  109. {
  110. long vertexCnt; //  顶点数目
  111. tVector *vertex; //  顶点数据
  112. long triCnt,quadCnt; //  三角形和四边形的数目
  113. tPrimPoly *tri,*quad; //  三角形和四边形的数据
  114. char map[255]; //  纹理映射
  115. } t_Visual;
  116. class CBilliardView : public CView
  117. {
  118. protected: // create from serialization only
  119. CBilliardView();
  120. DECLARE_DYNCREATE(CBilliardView)
  121. // Attributes
  122. public:
  123. CBilliardDoc* GetDocument();
  124. // Operations
  125. public:
  126. // Overrides
  127. // ClassWizard generated virtual function overrides
  128. //{{AFX_VIRTUAL(CBilliardView)
  129. public:
  130. virtual void OnDraw(CDC* pDC);  // overridden to draw this view
  131. virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
  132. protected:
  133. virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
  134. virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
  135. virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
  136. //}}AFX_VIRTUAL
  137. // Implementation
  138. public:
  139. virtual ~CBilliardView();
  140. /////////////////////////////////////////////////////////////////
  141. //添加成员函数与成员变量
  142. BOOL RenderWorld();
  143. BOOL SetupPixelFormat(void);
  144. void SetLogicalPalette(void);
  145. BOOL InitializeOpenGL(CDC* pDC);
  146. HGLRC m_hRC; //OpenGL绘制描述表
  147. HPALETTE m_hPalette; //OpenGL调色板
  148. CDC*     m_pDC; //OpenGL设备描述表
  149. /////////////////////////////////////////////////////////////////
  150. int g_MouseHitX, g_MouseHitY; //  鼠标单击位置
  151. int g_Dragging; //  鼠标是否为拖动状态
  152. float g_LastYaw, g_LastPitch;
  153. int g_DrawingStick ; //  是否绘制球杆的标志
  154. float g_LastDraw;
  155. float g_LastTime;
  156. int g_SimRunning; //  是否进入游戏标志
  157. long g_TimeIterations;
  158. int g_UseFixedTimeStep; //  是否使用固定的时间步长
  159. float g_MaxTimeStep;
  160. t_CueStick g_CueStick; //  一个球杆
  161. t_Ball g_Ball[2]; //  两个球
  162. float g_Kd;
  163. float g_Kr_Bumper; //  球与边界碰撞的恢复系数
  164. float g_Kr_Ball; //  球与球碰撞的恢复系数
  165. float g_Csf;
  166. float g_Ckf;
  167. int g_IntegratorType;
  168. int g_CollisionRootFinding; // ONLY SET WHEN FINDING A COLLISION
  169. int g_UseDamping; // 是否使用阻尼
  170. int g_UseFriction; // 是否使用摩擦
  171. int g_CueHitBall; // 球杆是否击中球
  172. int g_BallInPlay; // 球是否在运动
  173. tVector g_CueForce;
  174. tVector g_Gravity;
  175. t_Contact g_Contact[MAX_CONTACTS]; // 可能发生的碰撞
  176. int g_ContactCnt; // 碰撞计数器
  177. t_CollisionPlane g_CollisionPlane[4]; // 碰撞平面数
  178. int g_CollisionPlaneCnt;
  179. t_Ball g_GameSys[SYSTEM_COUNT][BALL_COUNT]; // LIST OF PHYSICAL PARTICLES
  180. t_Ball *g_CurrentSys,*g_TargetSys;
  181. t_Camera g_POV; // 摄像机
  182. int g_TextureCnt; // 装入的纹理数
  183. t_TexPool g_TexPool[MAX_TEXTURES]; // 保存纹理信息
  184. t_Visual g_Scene; // 静态场景
  185. int tx,ty;
  186. float magnitude;
  187. CLoadTGA m_LoadTGA;
  188. CMathDefs m_MathDefs;
  189. ///////////////////////////////////////////////////////////////////////////////
  190. BOOL InitGame(void);
  191. void InitRender(void);
  192. void LoadTextures();
  193. void LoadSceneFile(char *filename);
  194. void SetupViewRC(void);
  195. void RenderCueAndBalls();
  196. void RenderScene();
  197. void SetupBalls();
  198. void ComputeForces( t_Ball *system);
  199. void IntegrateSysOverTime(t_Ball *initial,t_Ball *source, t_Ball *target, float deltaTime);
  200. void EulerIntegrate( float DeltaTime);
  201. void MidPointIntegrate( float DeltaTime);
  202. int CheckForCollisions( t_Ball *system );
  203. void ResolveCollisions( t_Ball *system );
  204. void Simulate(float DeltaTime, BOOL running);
  205. float GetTime( void );
  206. #ifdef _DEBUG
  207. virtual void AssertValid() const;
  208. virtual void Dump(CDumpContext& dc) const;
  209. #endif
  210. protected:
  211. // Generated message map functions
  212. protected:
  213. //{{AFX_MSG(CBilliardView)
  214. afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
  215. afx_msg void OnDestroy();
  216. afx_msg void OnSize(UINT nType, int cx, int cy);
  217. afx_msg void OnTimer(UINT nIDEvent);
  218. afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  219. afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  220. afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  221. afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
  222. afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
  223. afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
  224. //}}AFX_MSG
  225. DECLARE_MESSAGE_MAP()
  226. };
  227. #ifndef _DEBUG  // debug version in BilliardView.cpp
  228. inline CBilliardDoc* CBilliardView::GetDocument()
  229.    { return (CBilliardDoc*)m_pDocument; }
  230. #endif
  231. /////////////////////////////////////////////////////////////////////////////
  232. //{{AFX_INSERT_LOCATION}}
  233. // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
  234. #endif // !defined(AFX_MYSDOPENGLVIEW_H__75C5AAEC_37B0_4A8B_9132_9A0C663F6DDC__INCLUDED_)