CommonGraphicsAppInterface.h 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  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()
  14. :gridSize(10),
  15. upOffset(0.001f),
  16. upAxis(1)
  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. class CommonWindowInterface* m_window;
  34. struct CommonRenderInterface* m_renderer;
  35. struct CommonParameterInterface* m_parameterInterface;
  36. struct Common2dCanvasInterface* m_2dCanvasInterface;
  37. bool m_leftMouseButton;
  38. bool m_middleMouseButton;
  39. bool m_rightMouseButton;
  40. float m_wheelMultiplier;
  41. float m_mouseMoveMultiplier;
  42. float m_mouseXpos;
  43. float m_mouseYpos;
  44. bool m_mouseInitialized;
  45. float m_backgroundColorRGB[3];
  46. CommonGraphicsApp()
  47. :m_window(0),
  48. m_renderer(0),
  49. m_parameterInterface(0),
  50. m_2dCanvasInterface(0),
  51. m_leftMouseButton(false),
  52. m_middleMouseButton(false),
  53. m_rightMouseButton(false),
  54. m_wheelMultiplier(0.01f),
  55. m_mouseMoveMultiplier(0.4f),
  56. m_mouseXpos(0.f),
  57. m_mouseYpos(0.f),
  58. m_mouseInitialized(false)
  59. {
  60. m_backgroundColorRGB[0] = 0.9;
  61. m_backgroundColorRGB[1] = 0.9;
  62. m_backgroundColorRGB[2] = 1;
  63. }
  64. virtual ~CommonGraphicsApp()
  65. {
  66. }
  67. virtual void dumpNextFrameToPng(const char* pngFilename){}
  68. virtual void dumpFramesToVideo(const char* mp4Filename){}
  69. virtual void getBackgroundColor(float* red, float* green, float* blue) const
  70. {
  71. if (red)
  72. *red = m_backgroundColorRGB[0];
  73. if (green)
  74. *green = m_backgroundColorRGB[1];
  75. if (blue)
  76. *blue = m_backgroundColorRGB[2];
  77. }
  78. virtual void setBackgroundColor(float red, float green, float blue)
  79. {
  80. m_backgroundColorRGB[0] = red;
  81. m_backgroundColorRGB[1] = green;
  82. m_backgroundColorRGB[2] = blue;
  83. }
  84. virtual void setMouseWheelMultiplier(float mult)
  85. {
  86. m_wheelMultiplier = mult;
  87. }
  88. virtual float getMouseWheelMultiplier() const
  89. {
  90. return m_wheelMultiplier;
  91. }
  92. virtual void setMouseMoveMultiplier(float mult)
  93. {
  94. m_mouseMoveMultiplier = mult;
  95. }
  96. virtual float getMouseMoveMultiplier() const
  97. {
  98. return m_mouseMoveMultiplier;
  99. }
  100. virtual void drawGrid(DrawGridData data=DrawGridData()) = 0;
  101. virtual void setUpAxis(int axis) = 0;
  102. virtual int getUpAxis() const = 0;
  103. virtual void swapBuffer() = 0;
  104. virtual void drawText( const char* txt, int posX, int posY) = 0;
  105. virtual void drawText3D( const char* txt, float posX, float posZY, float posZ, float size)=0;
  106. virtual int registerCubeShape(float halfExtentsX,float halfExtentsY, float halfExtentsZ, int textureIndex = -1, float textureScaling = 1)=0;
  107. virtual int registerGraphicsUnitSphereShape(EnumSphereLevelOfDetail lod, int textureId=-1) = 0;
  108. virtual void registerGrid(int xres, int yres, float color0[4], float color1[4])=0;
  109. void defaultMouseButtonCallback( int button, int state, float x, float y)
  110. {
  111. if (button==0)
  112. m_leftMouseButton= (state==1);
  113. if (button==1)
  114. m_middleMouseButton= (state==1);
  115. if (button==2)
  116. m_rightMouseButton= (state==1);
  117. m_mouseXpos = x;
  118. m_mouseYpos = y;
  119. m_mouseInitialized = true;
  120. }
  121. void defaultMouseMoveCallback( float x, float y)
  122. {
  123. if (m_window && m_renderer)
  124. {
  125. CommonCameraInterface* camera = m_renderer->getActiveCamera();
  126. bool isAltPressed = m_window->isModifierKeyPressed(B3G_ALT);
  127. bool isControlPressed = m_window->isModifierKeyPressed(B3G_CONTROL);
  128. if (isAltPressed || isControlPressed)
  129. {
  130. float xDelta = x-m_mouseXpos;
  131. float yDelta = y-m_mouseYpos;
  132. float cameraDistance = camera->getCameraDistance();
  133. float pitch = camera->getCameraPitch();
  134. float yaw = camera->getCameraYaw();
  135. float targPos[3];
  136. float camPos[3];
  137. camera->getCameraTargetPosition(targPos);
  138. camera->getCameraPosition(camPos);
  139. b3Vector3 cameraPosition = b3MakeVector3(b3Scalar(camPos[0]),
  140. b3Scalar(camPos[1]),
  141. b3Scalar(camPos[2]));
  142. b3Vector3 cameraTargetPosition = b3MakeVector3( b3Scalar(targPos[0]),
  143. b3Scalar(targPos[1]),
  144. b3Scalar(targPos[2]));
  145. b3Vector3 cameraUp = b3MakeVector3(0,0,0);
  146. cameraUp[camera->getCameraUpAxis()] = 1.f;
  147. if (m_leftMouseButton)
  148. {
  149. // if (b3Fabs(xDelta)>b3Fabs(yDelta))
  150. // {
  151. pitch -= xDelta*m_mouseMoveMultiplier;
  152. // } else
  153. // {
  154. yaw += yDelta*m_mouseMoveMultiplier;
  155. // }
  156. }
  157. if (m_middleMouseButton)
  158. {
  159. cameraTargetPosition += cameraUp * yDelta*0.01;
  160. b3Vector3 fwd = cameraTargetPosition-cameraPosition;
  161. b3Vector3 side = cameraUp.cross(fwd);
  162. side.normalize();
  163. cameraTargetPosition += side * xDelta*0.01;
  164. }
  165. if (m_rightMouseButton)
  166. {
  167. cameraDistance -= xDelta*0.01f;
  168. cameraDistance -= yDelta*0.01f;
  169. if (cameraDistance<1)
  170. cameraDistance=1;
  171. if (cameraDistance>1000)
  172. cameraDistance=1000;
  173. }
  174. camera->setCameraDistance(cameraDistance);
  175. camera->setCameraPitch(pitch);
  176. camera->setCameraYaw(yaw);
  177. camera->setCameraTargetPosition(cameraTargetPosition[0],cameraTargetPosition[1],cameraTargetPosition[2]);
  178. }
  179. }//m_window && m_renderer
  180. m_mouseXpos = x;
  181. m_mouseYpos = y;
  182. m_mouseInitialized = true;
  183. }
  184. // void defaultKeyboardCallback(int key, int state)
  185. // {
  186. // }
  187. void defaultWheelCallback( float deltax, float deltay)
  188. {
  189. if (m_renderer)
  190. {
  191. b3Vector3 cameraTargetPosition, cameraPosition, cameraUp = b3MakeVector3(0,0,0);
  192. cameraUp[getUpAxis()] = 1;
  193. CommonCameraInterface* camera = m_renderer->getActiveCamera();
  194. camera->getCameraPosition(cameraPosition);
  195. camera->getCameraTargetPosition(cameraTargetPosition);
  196. if (!m_leftMouseButton)
  197. {
  198. float cameraDistance = camera->getCameraDistance();
  199. if (deltay<0 || cameraDistance>1)
  200. {
  201. cameraDistance -= deltay*0.01f;
  202. if (cameraDistance<1)
  203. cameraDistance=1;
  204. camera->setCameraDistance(cameraDistance);
  205. } else
  206. {
  207. b3Vector3 fwd = cameraTargetPosition-cameraPosition;
  208. fwd.normalize();
  209. cameraTargetPosition += fwd*deltay*m_wheelMultiplier;//todo: expose it in the GUI?
  210. }
  211. } else
  212. {
  213. if (b3Fabs(deltax)>b3Fabs(deltay))
  214. {
  215. b3Vector3 fwd = cameraTargetPosition-cameraPosition;
  216. b3Vector3 side = cameraUp.cross(fwd);
  217. side.normalize();
  218. cameraTargetPosition += side * deltax*m_wheelMultiplier;
  219. } else
  220. {
  221. cameraTargetPosition -= cameraUp * deltay*m_wheelMultiplier;
  222. }
  223. }
  224. camera->setCameraTargetPosition(cameraTargetPosition[0],cameraTargetPosition[1],cameraTargetPosition[2]);
  225. }
  226. }
  227. };
  228. #endif //COMMON_GRAPHICS_APP_H