CommonGraphicsAppInterface.h 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. #ifndef COMMON_GRAPHICS_APP_H
  2. #define COMMON_GRAPHICS_APP_H
  3. #include "Bullet3Common/b3Vector3.h"
  4. #include "CommonRenderInterface.h"
  5. #include "CommonWindowInterface.h"
  6. #include "CommonCameraInterface.h"
  7. struct DrawGridData
  8. {
  9. int gridSize;
  10. float upOffset;
  11. int upAxis;
  12. float gridColor[4];
  13. DrawGridData(int upAx = 1)
  14. : gridSize(10),
  15. upOffset(0.001f),
  16. upAxis(upAx)
  17. {
  18. gridColor[0] = 0.6f;
  19. gridColor[1] = 0.6f;
  20. gridColor[2] = 0.6f;
  21. gridColor[3] = 1.f;
  22. }
  23. };
  24. enum EnumSphereLevelOfDetail
  25. {
  26. SPHERE_LOD_POINT_SPRITE = 0,
  27. SPHERE_LOD_LOW,
  28. SPHERE_LOD_MEDIUM,
  29. SPHERE_LOD_HIGH,
  30. };
  31. struct CommonGraphicsApp
  32. {
  33. enum drawText3DOption
  34. {
  35. eDrawText3D_OrtogonalFaceCamera = 1,
  36. eDrawText3D_TrueType = 2,
  37. eDrawText3D_TrackObject = 4,
  38. };
  39. class CommonWindowInterface* m_window;
  40. struct CommonRenderInterface* m_renderer;
  41. struct CommonParameterInterface* m_parameterInterface;
  42. struct Common2dCanvasInterface* m_2dCanvasInterface;
  43. bool m_leftMouseButton;
  44. bool m_middleMouseButton;
  45. bool m_rightMouseButton;
  46. float m_wheelMultiplier;
  47. float m_mouseMoveMultiplier;
  48. float m_mouseXpos;
  49. float m_mouseYpos;
  50. bool m_mouseInitialized;
  51. float m_backgroundColorRGB[3];
  52. CommonGraphicsApp()
  53. : m_window(0),
  54. m_renderer(0),
  55. m_parameterInterface(0),
  56. m_2dCanvasInterface(0),
  57. m_leftMouseButton(false),
  58. m_middleMouseButton(false),
  59. m_rightMouseButton(false),
  60. m_wheelMultiplier(0.01f),
  61. m_mouseMoveMultiplier(0.4f),
  62. m_mouseXpos(0.f),
  63. m_mouseYpos(0.f),
  64. m_mouseInitialized(false)
  65. {
  66. m_backgroundColorRGB[0] = 0.7;
  67. m_backgroundColorRGB[1] = 0.7;
  68. m_backgroundColorRGB[2] = 0.8;
  69. }
  70. virtual ~CommonGraphicsApp()
  71. {
  72. }
  73. virtual void dumpNextFrameToPng(const char* pngFilename) {}
  74. virtual void dumpFramesToVideo(const char* mp4Filename) {}
  75. virtual void getScreenPixels(unsigned char* rgbaBuffer, int bufferSizeInBytes, float* depthBuffer, int depthBufferSizeInBytes) {}
  76. virtual void setViewport(int width, int height) {}
  77. virtual void getBackgroundColor(float* red, float* green, float* blue) const
  78. {
  79. if (red)
  80. *red = m_backgroundColorRGB[0];
  81. if (green)
  82. *green = m_backgroundColorRGB[1];
  83. if (blue)
  84. *blue = m_backgroundColorRGB[2];
  85. }
  86. virtual void setMp4Fps(int fps) {}
  87. virtual void setBackgroundColor(float red, float green, float blue)
  88. {
  89. m_backgroundColorRGB[0] = red;
  90. m_backgroundColorRGB[1] = green;
  91. m_backgroundColorRGB[2] = blue;
  92. }
  93. virtual void setMouseWheelMultiplier(float mult)
  94. {
  95. m_wheelMultiplier = mult;
  96. }
  97. virtual float getMouseWheelMultiplier() const
  98. {
  99. return m_wheelMultiplier;
  100. }
  101. virtual void setMouseMoveMultiplier(float mult)
  102. {
  103. m_mouseMoveMultiplier = mult;
  104. }
  105. virtual float getMouseMoveMultiplier() const
  106. {
  107. return m_mouseMoveMultiplier;
  108. }
  109. virtual void drawGrid(DrawGridData data = DrawGridData()) = 0;
  110. virtual void setUpAxis(int axis) = 0;
  111. virtual int getUpAxis() const = 0;
  112. virtual void swapBuffer() = 0;
  113. virtual void drawText(const char* txt, int posX, int posY)
  114. {
  115. float size = 1;
  116. float colorRGBA[4] = { 0, 0, 0, 1 };
  117. drawText(txt, posX, posY, size, colorRGBA);
  118. }
  119. virtual void drawText(const char* txt, int posX, int posY, float size)
  120. {
  121. float colorRGBA[4] = { 0, 0, 0, 1 };
  122. drawText(txt, posX, posY, size, colorRGBA);
  123. }
  124. virtual void drawText(const char* txt, int posX, int posY, float size, float colorRGBA[4]) = 0;
  125. virtual void drawText3D(const char* txt, float posX, float posY, float posZ, float size) = 0;
  126. virtual void drawText3D(const char* txt, float position[3], float orientation[4], float color[4], float size, int optionFlag) = 0;
  127. virtual void drawTexturedRect(float x0, float y0, float x1, float y1, float color[4], float u0, float v0, float u1, float v1, int useRGBA) = 0;
  128. virtual int registerCubeShape(float halfExtentsX, float halfExtentsY, float halfExtentsZ, int textureIndex = -1, float textureScaling = 1) = 0;
  129. virtual int registerGraphicsUnitSphereShape(EnumSphereLevelOfDetail lod, int textureId = -1) = 0;
  130. virtual void registerGrid(int xres, int yres, float color0[4], float color1[4]) = 0;
  131. void defaultMouseButtonCallback(int button, int state, float x, float y)
  132. {
  133. if (button == 0)
  134. m_leftMouseButton = (state == 1);
  135. if (button == 1)
  136. m_middleMouseButton = (state == 1);
  137. if (button == 2)
  138. m_rightMouseButton = (state == 1);
  139. m_mouseXpos = x;
  140. m_mouseYpos = y;
  141. m_mouseInitialized = true;
  142. }
  143. void defaultMouseMoveCallback(float x, float y)
  144. {
  145. if (m_window && m_renderer)
  146. {
  147. CommonCameraInterface* camera = m_renderer->getActiveCamera();
  148. bool isAltPressed = m_window->isModifierKeyPressed(B3G_ALT);
  149. bool isControlPressed = m_window->isModifierKeyPressed(B3G_CONTROL);
  150. if (isAltPressed || isControlPressed)
  151. {
  152. float xDelta = x - m_mouseXpos;
  153. float yDelta = y - m_mouseYpos;
  154. float cameraDistance = camera->getCameraDistance();
  155. float pitch = camera->getCameraPitch();
  156. float yaw = camera->getCameraYaw();
  157. float targPos[3];
  158. float camPos[3];
  159. camera->getCameraTargetPosition(targPos);
  160. camera->getCameraPosition(camPos);
  161. b3Vector3 cameraPosition = b3MakeVector3(b3Scalar(camPos[0]),
  162. b3Scalar(camPos[1]),
  163. b3Scalar(camPos[2]));
  164. b3Vector3 cameraTargetPosition = b3MakeVector3(b3Scalar(targPos[0]),
  165. b3Scalar(targPos[1]),
  166. b3Scalar(targPos[2]));
  167. b3Vector3 cameraUp = b3MakeVector3(0, 0, 0);
  168. cameraUp[camera->getCameraUpAxis()] = 1.f;
  169. if (m_leftMouseButton)
  170. {
  171. // if (b3Fabs(xDelta)>b3Fabs(yDelta))
  172. // {
  173. pitch -= yDelta * m_mouseMoveMultiplier;
  174. // } else
  175. // {
  176. yaw -= xDelta * m_mouseMoveMultiplier;
  177. // }
  178. }
  179. if (m_middleMouseButton)
  180. {
  181. cameraTargetPosition += cameraUp * yDelta *m_mouseMoveMultiplier* 0.01;
  182. b3Vector3 fwd = cameraTargetPosition - cameraPosition;
  183. b3Vector3 side = cameraUp.cross(fwd);
  184. side.normalize();
  185. cameraTargetPosition += side * xDelta *m_mouseMoveMultiplier* 0.01;
  186. }
  187. if (m_rightMouseButton)
  188. {
  189. cameraDistance -= xDelta * m_mouseMoveMultiplier*0.01f;
  190. cameraDistance -= yDelta * m_mouseMoveMultiplier*0.01f;
  191. if (cameraDistance < 1)
  192. cameraDistance = 1;
  193. if (cameraDistance > 1000)
  194. cameraDistance = 1000;
  195. }
  196. camera->setCameraDistance(cameraDistance);
  197. camera->setCameraPitch(pitch);
  198. camera->setCameraYaw(yaw);
  199. camera->setCameraTargetPosition(cameraTargetPosition[0], cameraTargetPosition[1], cameraTargetPosition[2]);
  200. }
  201. } //m_window && m_renderer
  202. m_mouseXpos = x;
  203. m_mouseYpos = y;
  204. m_mouseInitialized = true;
  205. }
  206. // void defaultKeyboardCallback(int key, int state)
  207. // {
  208. // }
  209. void defaultWheelCallback(float deltax, float deltay)
  210. {
  211. if (m_renderer)
  212. {
  213. b3Vector3 cameraTargetPosition, cameraPosition, cameraUp = b3MakeVector3(0, 0, 0);
  214. cameraUp[getUpAxis()] = 1;
  215. CommonCameraInterface* camera = m_renderer->getActiveCamera();
  216. camera->getCameraPosition(cameraPosition);
  217. camera->getCameraTargetPosition(cameraTargetPosition);
  218. if (!m_leftMouseButton)
  219. {
  220. float cameraDistance = camera->getCameraDistance();
  221. if (deltay < 0 || cameraDistance > 1)
  222. {
  223. cameraDistance -= deltay*m_wheelMultiplier;
  224. if (cameraDistance < 1)
  225. cameraDistance = 1;
  226. camera->setCameraDistance(cameraDistance);
  227. }
  228. else
  229. {
  230. b3Vector3 fwd = cameraTargetPosition - cameraPosition;
  231. fwd.normalize();
  232. cameraTargetPosition += fwd * deltay * m_wheelMultiplier; //todo: expose it in the GUI?
  233. }
  234. }
  235. else
  236. {
  237. if (b3Fabs(deltax) > b3Fabs(deltay))
  238. {
  239. b3Vector3 fwd = cameraTargetPosition - cameraPosition;
  240. b3Vector3 side = cameraUp.cross(fwd);
  241. side.normalize();
  242. cameraTargetPosition += side * deltax * m_wheelMultiplier;
  243. }
  244. else
  245. {
  246. cameraTargetPosition -= cameraUp * deltay * m_wheelMultiplier;
  247. }
  248. }
  249. camera->setCameraTargetPosition(cameraTargetPosition[0], cameraTargetPosition[1], cameraTargetPosition[2]);
  250. }
  251. }
  252. };
  253. #endif //COMMON_GRAPHICS_APP_H