CommonGraphicsAppInterface.h 7.0 KB

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