Test.h
上传用户:gb3593
上传日期:2022-01-07
资源大小:3028k
文件大小:5k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /*
  2. * Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com
  3. *
  4. * This software is provided 'as-is', without any express or implied
  5. * warranty.  In no event will the authors be held liable for any damages
  6. * arising from the use of this software.
  7. * Permission is granted to anyone to use this software for any purpose,
  8. * including commercial applications, and to alter it and redistribute it
  9. * freely, subject to the following restrictions:
  10. * 1. The origin of this software must not be misrepresented; you must not
  11. * claim that you wrote the original software. If you use this software
  12. * in a product, an acknowledgment in the product documentation would be
  13. * appreciated but is not required.
  14. * 2. Altered source versions must be plainly marked as such, and must not be
  15. * misrepresented as being the original software.
  16. * 3. This notice may not be removed or altered from any source distribution.
  17. */
  18. #ifndef TEST_H
  19. #define TEST_H
  20. #include <Box2D/Box2D.h>
  21. #include "Render.h"
  22. #include <cstdlib>
  23. class Test;
  24. struct Settings;
  25. typedef Test* TestCreateFcn();
  26. #define RAND_LIMIT 32767 /// Random number in range [-1,1] inline float32 RandomFloat() { float32 r = (float32)(rand() & (RAND_LIMIT)); r /= RAND_LIMIT; r = 2.0f * r - 1.0f; return r; } /// Random floating point number in range [lo, hi] inline float32 RandomFloat(float32 lo, float32 hi) { float32 r = (float32)(rand() & (RAND_LIMIT)); r /= RAND_LIMIT; r = (hi - lo) * r + lo; return r; } /// Test settings. Some can be controlled in the GUI.
  27. struct Settings
  28. {
  29. Settings() :
  30. hz(60.0f),
  31. velocityIterations(8),
  32. positionIterations(3),
  33. drawStats(0),
  34. drawShapes(1),
  35. drawJoints(1),
  36. drawAABBs(0),
  37. drawPairs(0),
  38. drawContactPoints(0),
  39. drawContactNormals(0),
  40. drawContactForces(0),
  41. drawFrictionForces(0),
  42. drawCOMs(0),
  43. enableWarmStarting(1),
  44. enableContinuous(1),
  45. pause(0),
  46. singleStep(0)
  47. {}
  48. float32 hz;
  49. int32 velocityIterations;
  50. int32 positionIterations;
  51. int32 drawShapes;
  52. int32 drawJoints;
  53. int32 drawAABBs;
  54. int32 drawPairs;
  55. int32 drawContactPoints;
  56. int32 drawContactNormals;
  57. int32 drawContactForces;
  58. int32 drawFrictionForces;
  59. int32 drawCOMs;
  60. int32 drawStats;
  61. int32 enableWarmStarting;
  62. int32 enableContinuous;
  63. int32 pause;
  64. int32 singleStep;
  65. };
  66. struct TestEntry
  67. {
  68. const char *name;
  69. TestCreateFcn *createFcn;
  70. };
  71. extern TestEntry g_testEntries[];
  72. // This is called when a joint in the world is implicitly destroyed
  73. // because an attached body is destroyed. This gives us a chance to
  74. // nullify the mouse joint.
  75. class DestructionListener : public b2DestructionListener
  76. {
  77. public:
  78. void SayGoodbye(b2Fixture* fixture) { B2_NOT_USED(fixture); }
  79. void SayGoodbye(b2Joint* joint);
  80. Test* test;
  81. };
  82. const int32 k_maxContactPoints = 2048;
  83. struct ContactPoint
  84. {
  85. b2Fixture* fixtureA;
  86. b2Fixture* fixtureB;
  87. b2Vec2 normal;
  88. b2Vec2 position;
  89. b2PointState state;
  90. };
  91. class Test : public b2ContactListener
  92. {
  93. public:
  94. Test();
  95. virtual ~Test();
  96. void SetTextLine(int32 line) { m_textLine = line; }
  97.     void DrawTitle(int x, int y, const char *string);
  98. virtual void Step(Settings* settings);
  99. virtual void Keyboard(unsigned char key) { B2_NOT_USED(key); }
  100. void ShiftMouseDown(const b2Vec2& p);
  101. virtual void MouseDown(const b2Vec2& p);
  102. virtual void MouseUp(const b2Vec2& p);
  103. void MouseMove(const b2Vec2& p);
  104. void LaunchBomb();
  105. void LaunchBomb(const b2Vec2& position, const b2Vec2& velocity);
  106. void SpawnBomb(const b2Vec2& worldPt);
  107. void CompleteBombSpawn(const b2Vec2& p);
  108. // Let derived tests know that a joint was destroyed.
  109. virtual void JointDestroyed(b2Joint* joint) { B2_NOT_USED(joint); }
  110. // Callbacks for derived classes.
  111. virtual void BeginContact(b2Contact* contact) { B2_NOT_USED(contact); }
  112. virtual void EndContact(b2Contact* contact) { B2_NOT_USED(contact); }
  113. virtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold);
  114. virtual void PostSolve(const b2Contact* contact, const b2ContactImpulse* impulse)
  115. {
  116. B2_NOT_USED(contact);
  117. B2_NOT_USED(impulse);
  118. }
  119. protected:
  120. friend class DestructionListener;
  121. friend class BoundaryListener;
  122. friend class ContactListener;
  123. b2Body* m_groundBody;
  124. b2AABB m_worldAABB;
  125. ContactPoint m_points[k_maxContactPoints];
  126. int32 m_pointCount;
  127. DestructionListener m_destructionListener;
  128. DebugDraw m_debugDraw;
  129. int32 m_textLine;
  130. b2World* m_world;
  131. b2Body* m_bomb;
  132. b2MouseJoint* m_mouseJoint;
  133. b2Vec2 m_bombSpawnPoint;
  134. bool m_bombSpawning;
  135. b2Vec2 m_mouseWorld;
  136. int32 m_stepCount;
  137. };
  138. #endif