pass events on to ImGui

pull/3471/head
kallaballa 2 years ago
parent 0c514d73a3
commit 17637cbe3a
  1. 96
      modules/v4d/src/detail/framebuffercontext.cpp

@ -12,6 +12,8 @@
#include <exception>
#include <iostream>
#include "imgui_impl_glfw.h"
#ifdef __EMSCRIPTEN__
# include <emscripten.h>
# include <emscripten/bind.h>
@ -295,30 +297,42 @@ void FrameBufferContext::init() {
setup(framebufferSize_);
glfwSetWindowUserPointer(getGLFWWindow(), getV4D().get());
//
// glfwSetCursorPosCallback(getGLFWWindow(), [](GLFWwindow* glfwWin, double x, double y) {
// V4D* v4d = reinterpret_cast<V4D*>(glfwGetWindowUserPointer(glfwWin));
// v4d->setMousePosition(cv::Point2f(float(x), float(y)));
// }
// );
// glfwSetMouseButtonCallback(getGLFWWindow(), [](GLFWwindow* glfwWin, int button, int action, int modifiers) {
glfwSetCursorPosCallback(getGLFWWindow(), [](GLFWwindow* glfwWin, double x, double y) {
V4D* v4d = reinterpret_cast<V4D*>(glfwGetWindowUserPointer(glfwWin));
ImGui_ImplGlfw_CursorPosCallback(glfwWin, x, y);
if (!ImGui::GetIO().WantCaptureMouse) {
v4d->setMousePosition(cv::Point2f(float(x), float(y)));
}
});
glfwSetMouseButtonCallback(getGLFWWindow(), [](GLFWwindow* glfwWin, int button, int action, int modifiers) {
ImGui_ImplGlfw_MouseButtonCallback(glfwWin, button, action, modifiers);
if (!ImGui::GetIO().WantCaptureMouse) {
// Pass event further
} else {
// Do nothing, since imgui already reacted to mouse click. It would be weird if unrelated things started happening when you click something on UI.
}
});
glfwSetKeyCallback(getGLFWWindow(), [](GLFWwindow* glfwWin, int key, int scancode, int action, int mods) {
ImGui_ImplGlfw_KeyCallback(glfwWin, key, scancode, action, mods);
if (!ImGui::GetIO().WantCaptureKeyboard) {
// Pass event further
} else {
// Do nothing, since imgui already reacted to mouse click. It would be weird if unrelated things started happening when you click something on UI.
}
});
glfwSetCharCallback(getGLFWWindow(), [](GLFWwindow* glfwWin, unsigned int codepoint) {
ImGui_ImplGlfw_CharCallback(glfwWin, codepoint);
});
// glfwSetDropCallback(getGLFWWindow(), [](GLFWwindow* glfwWin, int count, const char** filenames) {
// V4D* v4d = reinterpret_cast<V4D*>(glfwGetWindowUserPointer(glfwWin));
// });
// glfwSetKeyCallback(getGLFWWindow(),
// [](GLFWwindow* glfwWin, int key, int scancode, int action, int mods) {
// }
// );
// glfwSetCharCallback(getGLFWWindow(), [](GLFWwindow* glfwWin, unsigned int codepoint) {
// }
// );
// glfwSetDropCallback(getGLFWWindow(),
// [](GLFWwindow* glfwWin, int count, const char** filenames) {
// }
// );
// glfwSetScrollCallback(getGLFWWindow(),
// [](GLFWwindow* glfwWin, double x, double y) {
// }
// );
glfwSetScrollCallback(getGLFWWindow(), [](GLFWwindow* glfwWin, double x, double y) {
ImGui_ImplGlfw_ScrollCallback(glfwWin, x, y);
});
//
// glfwSetWindowSizeCallback(getGLFWWindow(),
// [](GLFWwindow* glfwWin, int width, int height) {
@ -361,10 +375,13 @@ void FrameBufferContext::init() {
//// }
//// #endif
// });
// glfwSetWindowFocusCallback(getGLFWWindow(), [](GLFWwindow* glfwWin, int i) {
// V4D* v4d = reinterpret_cast<V4D*>(glfwGetWindowUserPointer(glfwWin));
// v4d->makeCurrent();
// });
glfwSetWindowFocusCallback(getGLFWWindow(), [](GLFWwindow* glfwWin, int i) {
V4D* v4d = reinterpret_cast<V4D*>(glfwGetWindowUserPointer(glfwWin));
if(v4d->getGLFWWindow() == glfwWin) {
v4d->setFocused(i == 1);
cerr << "FOCUSED: " << v4d->title() << endl;
}
});
}
cv::Ptr<V4D> FrameBufferContext::getV4D() {
@ -629,12 +646,12 @@ CLExecContext_t& FrameBufferContext::getCLExecContext() {
#endif
void FrameBufferContext::blitFrameBufferToScreen(const cv::Rect& viewport,
const cv::Size& windowSize, bool scale, GLuint drawFramebufferID) {
const cv::Size& windowSize, bool stretch, GLuint drawFramebufferID) {
this->makeCurrent();
double hf = double(windowSize.height) / framebufferSize_.height;
double wf = double(windowSize.width) / framebufferSize_.width;
double f;
if (framebufferSize_.width > framebufferSize_.height)
if (hf > wf)
f = wf;
else
f = hf;
@ -642,26 +659,19 @@ void FrameBufferContext::blitFrameBufferToScreen(const cv::Rect& viewport,
double fbws = framebufferSize_.width * f;
double fbhs = framebufferSize_.height * f;
double marginw = std::max((windowSize.width - framebufferSize_.width) / 2.0, 0.0);
double marginh = std::max((windowSize.height - framebufferSize_.height) / 2.0, 0.0);
double marginws = std::max((windowSize.width - fbws) / 2.0, 0.0);
double marginhs = std::max((windowSize.height - fbhs) / 2.0, 0.0);
double marginw = (windowSize.width - framebufferSize_.width) / 2.0;
double marginh = (windowSize.height - framebufferSize_.height) / 2.0;
double marginws = (windowSize.width - fbws) / 2.0;
double marginhs = (windowSize.height - fbhs) / 2.0;
GLint srcX0 = viewport.x;
GLint srcY0 = viewport.y;
GLint srcX1 = viewport.x + viewport.width;
GLint srcY1 = viewport.y + viewport.height;
GLint dstX0 = scale ? marginws : marginw;
GLint dstY0 = scale ? marginhs : marginh;
GLint dstX1 = scale ? marginws + fbws : marginw + framebufferSize_.width;
GLint dstY1 = scale ? marginhs + fbhs : marginh + framebufferSize_.height;
//#ifdef __EMSCRIPTEN__
// {
// //FIXME WebGL2 workaround for webkit. without we have flickering
// cv::UMat tmp(size(), CV_8UC4);
// FrameBufferContext::FrameBufferScope fbScope(*this, tmp);
// }
//#endif
GLint dstX0 = stretch ? marginws : marginw;
GLint dstY0 = stretch ? marginhs : marginh;
GLint dstX1 = stretch ? marginws + fbws : marginw + framebufferSize_.width;
GLint dstY1 = stretch ? marginhs + fbhs : marginh + framebufferSize_.height;
GL_CHECK(glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFramebufferID));
GL_CHECK(glBlitFramebuffer( srcX0, srcY0, srcX1, srcY1,
dstX0, dstY0, dstX1, dstY1,

Loading…
Cancel
Save