Advertisement
Diamond32_Tutoriales

PICKING OBJECT GLFW + IMGUI

Aug 6th, 2023
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.89 KB | None | 0 0
  1. #include "../UIDrawer.h"
  2. #include <glad/glad.h>
  3. #include <GLFW/glfw3.h>
  4.  
  5. unsigned int framebuffer;
  6. unsigned int texture;
  7. int textureWidth, textureHeight;
  8. ImVec2 imagePosition;
  9.  
  10. class SceneUI : public UIDrawer {
  11.  
  12. public:
  13. unsigned int framebuffer;
  14. unsigned int texture;
  15. ImVec2 imageSizeSCENE;
  16. ImVec2 TextureSize;
  17. ImVec2 RenderSizeWindow;
  18. double textureMousePosX = 0;
  19. double textureMousePosY = 0;
  20.  
  21. void start() override {
  22. glGenFramebuffers(1, &framebuffer);
  23. glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
  24.  
  25. glGenTextures(1, &texture);
  26. glBindTexture(GL_TEXTURE_2D, texture);
  27. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, AppSettings::instance->ScreenWidth, AppSettings::instance->ScreenHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
  28. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  29. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  30. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
  31.  
  32. if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
  33. std::cout << "Framebuffer is not complete!" << std::endl;
  34.  
  35. glBindFramebuffer(GL_FRAMEBUFFER, 0);
  36. }
  37.  
  38. bool isMouseInsideRect(double xpos, double ypos, double rectX, double rectY, double rectWidth, double rectHeight) {
  39. return (xpos >= rectX && xpos <= rectX + rectWidth &&
  40. ypos >= rectY && ypos <= rectY + rectHeight);
  41. }
  42.  
  43. void draw() override {
  44.  
  45. ImVec2 windowSize = ImVec2(1920, 1080);
  46.  
  47. // Dibujamos la imagen en la ventana de ImGui
  48. ImGui::SetNextWindowSize(windowSize);
  49. ImGui::Begin("Scene", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize);
  50. RenderSizeWindow = ImGui::GetWindowSize();
  51.  
  52. // Obtenemos el tamaño de la ventana de ImGui después de que se apliquen las restricciones de tamaño
  53. ImVec2 actualWindowSize = ImGui::GetWindowSize();
  54. float scaleFactor = std::min(actualWindowSize.x / windowSize.x, actualWindowSize.y / windowSize.y);
  55. imageSizeSCENE = ImVec2(1920.0f * scaleFactor, 1080.0f * scaleFactor);
  56.  
  57.  
  58. // Calculamos la posición para centrar la imagen en la ventana
  59. imagePosition = ImVec2((actualWindowSize.x - imageSizeSCENE.x) * 0.5f, (actualWindowSize.y - imageSizeSCENE.y) * 0.5f);
  60.  
  61. ImGui::SetCursorPos(imagePosition);
  62.  
  63. int WindowXSize = static_cast<int>(std::round(imageSizeSCENE.x));
  64. int WindowYSize = static_cast<int>(std::round(imageSizeSCENE.y));
  65. imageSizeSCENE.x = WindowXSize;
  66. imageSizeSCENE.y = WindowYSize;
  67.  
  68. // Invertimos las coordenadas de textura en el eje Y antes de mostrar la imagen
  69. ImGui::Image((void*)(intptr_t)texture, ImVec2 (WindowXSize, WindowYSize), ImVec2(1, 1), ImVec2(0, 0));
  70.  
  71. ///std::cout << "Nuevo tamaño de la textura: " << imageSizeSCENE.x << "x" << imageSizeSCENE.y << std::endl;
  72.  
  73. // Después de obtener el nuevo tamaño de la textura, puedes usarlo como lo necesites
  74.  
  75. imagePosition.x += ImGui::GetWindowPos().x;
  76. imagePosition.y += ImGui::GetWindowPos().y;
  77.  
  78. double x, y;
  79. glfwGetCursorPos(StartEngineGraphics::window, &x, &y);
  80.  
  81. double windowMousePosX = x - imagePosition.x;
  82. double windowMousePosY = y - imagePosition.y;
  83.  
  84. // Obtener el ancho y alto de la imagen o textura
  85. double imageWidth = imageSizeSCENE.x; // Ancho de la imagen
  86. double imageHeight = imageSizeSCENE.y; // Alto de la imagen
  87.  
  88.  
  89. // Ajustar la posición para que el centro sea el punto de origen
  90. double centeredMousePosX = windowMousePosX - (imageWidth * 0.5);
  91. double centeredMousePosY = windowMousePosY - (imageHeight * 0.5);
  92.  
  93. // Obtener el tamaño actual de la ventana
  94. ImVec2 actualWindowSize2 = ImGui::GetWindowSize();
  95.  
  96. // Obtener el factor de escala para convertir las coordenadas del mouse a las coordenadas en el espacio de la textura
  97. float scaleFactor2 = std::min(actualWindowSize2.x / windowSize.x, actualWindowSize2.y / windowSize.y);
  98. textureMousePosX = centeredMousePosX / scaleFactor2;
  99. textureMousePosY = centeredMousePosY / scaleFactor2;
  100.  
  101. for (Entity* objD : SceneManager::GetSceneManager()->OpenScene->objectsInScene) {
  102. glm::vec3& obj = objD->getComponent<SpriteComponent>().cubePosition;
  103.  
  104. // Convertir las coordenadas del objeto al espacio de la cámara
  105. glm::vec3 objPosCamSpace = obj - SceneManager::GetSceneManager()->OpenScene->worldCamera->cameraPosition;
  106.  
  107. float objWidth = 25 * SceneManager::GetSceneManager()->OpenScene->worldCamera->zoom;
  108. float objHeight = 25 * SceneManager::GetSceneManager()->OpenScene->worldCamera->zoom;
  109.  
  110. // Ajustar las coordenadas del objeto para que estén centradas en el espacio de la cámaraf
  111. float objX = objPosCamSpace.x - objWidth * 0.5f;
  112. float objY = objPosCamSpace.y - objHeight * 0.5f;
  113.  
  114. if (textureMousePosX >= objX && textureMousePosX <= objX + objWidth &&
  115. textureMousePosY >= objY && textureMousePosY <= objY + objHeight) {
  116. // Hacer clic en el objeto (realizar la acción deseada)
  117. std::cout << "Objeto cliqueado: " << objD->ObjectTag << std::endl;
  118. // Agregar aquí la lógica para la acción deseada para el objeto clickeado
  119. break; // Si solo quieres detectar un objeto clickeado, puedes agregar break aquí
  120. }
  121. }
  122.  
  123.  
  124. //if (ImGui::IsMouseClicked(ImGuiMouseButton_Left)) {
  125. //
  126. //}
  127.  
  128. ImGui::Begin("Picking Position");
  129. ImGui::Text("Mouse X: %f", textureMousePosX);
  130. ImGui::Text("Mouse Y: %f", textureMousePosY);
  131. ImGui::End();
  132.  
  133. ImGui::Begin("OBJECTS IN SCENE");
  134.  
  135.  
  136. /*
  137. ImGui::Text("Object tag: %f", objD->ObjectTag.c_str());
  138. ImGui::Text("Pos x: : %f", objX);
  139. ImGui::Text("Pos y: : %f", objY);
  140. */
  141. ImGui::End();
  142.  
  143. //ImGui::Begin("OBJECTS IN SCENE");
  144. //ImGui::Text("Object tag: %f", objD->ObjectTag.c_str());
  145. //ImGui::Text("Pos x: : %f", objX);
  146. //ImGui::Text("Pos y: : %f", objY);
  147. //
  148. //ImGui::End();
  149.  
  150.  
  151. ImGui::End();
  152.  
  153.  
  154. ImGui::Begin ("ASSETS");
  155. ImGui::Button ("LAKAKA");
  156. ImGui::End();
  157. }
  158.  
  159. void update() {
  160.  
  161. }
  162.  
  163. void lateupdate() {
  164. glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
  165. }
  166.  
  167.  
  168. void fixupdate() {
  169. glBindFramebuffer(GL_FRAMEBUFFER, 0);
  170.  
  171. // Copiar el contenido del framebuffer en la textura
  172. glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer);
  173. glBindTexture(GL_TEXTURE_2D, texture);
  174. glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, AppSettings::instance->ScreenWidth, AppSettings::instance->ScreenHeight, 0);
  175. glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
  176. }
  177. };
  178.  
  179.  
  180.  
  181.  
  182. /* PICKING WORKING WITHOUT CAMERA POSITION
  183.  
  184.  
  185. double x, y;
  186. glfwGetCursorPos(StartEngineGraphics::window, &x, &y);
  187.  
  188. double windowMousePosX = x - imagePosition.x;
  189. double windowMousePosY = y - imagePosition.y;
  190.  
  191. // Obtener el ancho y alto de la imagen o textura
  192. double imageWidth = imageSizeSCENE.x; // Ancho de la imagen
  193. double imageHeight = imageSizeSCENE.y; // Alto de la imagen
  194.  
  195.  
  196. // Ajustar la posición para que el centro sea el punto de origen
  197. double centeredMousePosX = windowMousePosX - (imageWidth * 0.5);
  198. double centeredMousePosY = windowMousePosY - (imageHeight * 0.5);
  199.  
  200. // Obtener el tamaño actual de la ventana
  201. ImVec2 actualWindowSize2 = ImGui::GetWindowSize();
  202.  
  203. // Obtener el factor de escala para convertir las coordenadas del mouse a las coordenadas en el espacio de la textura
  204. float scaleFactor2 = std::min(actualWindowSize2.x / windowSize.x, actualWindowSize2.y / windowSize.y);
  205. textureMousePosX = centeredMousePosX / scaleFactor2;
  206. textureMousePosY = centeredMousePosY / scaleFactor2;
  207.  
  208.  
  209.  
  210. //if (ImGui::IsMouseClicked(ImGuiMouseButton_Left)) {
  211. //
  212. //}
  213.  
  214. ImGui::Begin("Picking Position");
  215. ImGui::Text("Mouse X: %f", textureMousePosX);
  216. ImGui::Text("Mouse Y: %f", textureMousePosY);
  217. ImGui::End();
  218.  
  219. ImGui::Begin("OBJECTS IN SCENE");
  220.  
  221. for (Entity* objD : SceneManager::GetSceneManager()->OpenScene->objectsInScene) {
  222. glm::vec3& obj = objD->getComponent<SpriteComponent>().cubePosition;
  223.  
  224. // Convertir las coordenadas del objeto al espacio de la cámara
  225. glm::vec3 objPosCamSpace = obj - SceneManager::GetSceneManager()->OpenScene->worldCamera->cameraPosition;
  226.  
  227. float objWidth = 25;
  228. float objHeight = 25;
  229.  
  230. // Ajustar las coordenadas del objeto para que estén centradas en el espacio de la cámara
  231. float objX = objPosCamSpace.x - objWidth * 0.5f;
  232. float objY = objPosCamSpace.y - objHeight * 0.5f;
  233.  
  234. ImGui::Text("Object tag: %f", objD->ObjectTag.c_str());
  235. ImGui::Text("Pos x: : %f", objX);
  236. ImGui::Text("Pos y: : %f", objY);
  237.  
  238. if (textureMousePosX >= objX && textureMousePosX <= objX + objWidth &&
  239. textureMousePosY >= objY && textureMousePosY <= objY + objHeight) {
  240. // Hacer clic en el objeto (realizar la acción deseada)
  241. std::cout << "Objeto cliqueado: " << objD->ObjectTag << std::endl;
  242. // Agregar aquí la lógica para la acción deseada para el objeto clickeado
  243. break; // Si solo quieres detectar un objeto clickeado, puedes agregar break aquí
  244. }
  245. }
  246. ImGui::End();
  247.  
  248.  
  249. if (ImGui::IsMouseClicked(ImGuiMouseButton_Left)) {
  250.  
  251. }
  252.  
  253. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement