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 <exception>
#include <iostream> #include <iostream>
#include "imgui_impl_glfw.h"
#ifdef __EMSCRIPTEN__ #ifdef __EMSCRIPTEN__
# include <emscripten.h> # include <emscripten.h>
# include <emscripten/bind.h> # include <emscripten/bind.h>
@ -295,30 +297,42 @@ void FrameBufferContext::init() {
setup(framebufferSize_); setup(framebufferSize_);
glfwSetWindowUserPointer(getGLFWWindow(), getV4D().get()); glfwSetWindowUserPointer(getGLFWWindow(), getV4D().get());
// glfwSetCursorPosCallback(getGLFWWindow(), [](GLFWwindow* glfwWin, double x, double y) {
// glfwSetCursorPosCallback(getGLFWWindow(), [](GLFWwindow* glfwWin, double x, double y) { V4D* v4d = reinterpret_cast<V4D*>(glfwGetWindowUserPointer(glfwWin));
// V4D* v4d = reinterpret_cast<V4D*>(glfwGetWindowUserPointer(glfwWin)); ImGui_ImplGlfw_CursorPosCallback(glfwWin, x, y);
// v4d->setMousePosition(cv::Point2f(float(x), float(y))); if (!ImGui::GetIO().WantCaptureMouse) {
// } v4d->setMousePosition(cv::Point2f(float(x), float(y)));
// ); }
// glfwSetMouseButtonCallback(getGLFWWindow(), [](GLFWwindow* glfwWin, int button, int action, int modifiers) { });
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)); // V4D* v4d = reinterpret_cast<V4D*>(glfwGetWindowUserPointer(glfwWin));
// }); // });
// glfwSetKeyCallback(getGLFWWindow(),
// [](GLFWwindow* glfwWin, int key, int scancode, int action, int mods) { glfwSetScrollCallback(getGLFWWindow(), [](GLFWwindow* glfwWin, double x, double y) {
// } ImGui_ImplGlfw_ScrollCallback(glfwWin, x, y);
// ); });
// glfwSetCharCallback(getGLFWWindow(), [](GLFWwindow* glfwWin, unsigned int codepoint) {
// }
// );
// glfwSetDropCallback(getGLFWWindow(),
// [](GLFWwindow* glfwWin, int count, const char** filenames) {
// }
// );
// glfwSetScrollCallback(getGLFWWindow(),
// [](GLFWwindow* glfwWin, double x, double y) {
// }
// );
// //
// glfwSetWindowSizeCallback(getGLFWWindow(), // glfwSetWindowSizeCallback(getGLFWWindow(),
// [](GLFWwindow* glfwWin, int width, int height) { // [](GLFWwindow* glfwWin, int width, int height) {
@ -361,10 +375,13 @@ void FrameBufferContext::init() {
//// } //// }
//// #endif //// #endif
// }); // });
// glfwSetWindowFocusCallback(getGLFWWindow(), [](GLFWwindow* glfwWin, int i) { glfwSetWindowFocusCallback(getGLFWWindow(), [](GLFWwindow* glfwWin, int i) {
// V4D* v4d = reinterpret_cast<V4D*>(glfwGetWindowUserPointer(glfwWin)); V4D* v4d = reinterpret_cast<V4D*>(glfwGetWindowUserPointer(glfwWin));
// v4d->makeCurrent(); if(v4d->getGLFWWindow() == glfwWin) {
// }); v4d->setFocused(i == 1);
cerr << "FOCUSED: " << v4d->title() << endl;
}
});
} }
cv::Ptr<V4D> FrameBufferContext::getV4D() { cv::Ptr<V4D> FrameBufferContext::getV4D() {
@ -629,12 +646,12 @@ CLExecContext_t& FrameBufferContext::getCLExecContext() {
#endif #endif
void FrameBufferContext::blitFrameBufferToScreen(const cv::Rect& viewport, 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(); this->makeCurrent();
double hf = double(windowSize.height) / framebufferSize_.height; double hf = double(windowSize.height) / framebufferSize_.height;
double wf = double(windowSize.width) / framebufferSize_.width; double wf = double(windowSize.width) / framebufferSize_.width;
double f; double f;
if (framebufferSize_.width > framebufferSize_.height) if (hf > wf)
f = wf; f = wf;
else else
f = hf; f = hf;
@ -642,26 +659,19 @@ void FrameBufferContext::blitFrameBufferToScreen(const cv::Rect& viewport,
double fbws = framebufferSize_.width * f; double fbws = framebufferSize_.width * f;
double fbhs = framebufferSize_.height * f; double fbhs = framebufferSize_.height * f;
double marginw = std::max((windowSize.width - framebufferSize_.width) / 2.0, 0.0); double marginw = (windowSize.width - framebufferSize_.width) / 2.0;
double marginh = std::max((windowSize.height - framebufferSize_.height) / 2.0, 0.0); double marginh = (windowSize.height - framebufferSize_.height) / 2.0;
double marginws = std::max((windowSize.width - fbws) / 2.0, 0.0); double marginws = (windowSize.width - fbws) / 2.0;
double marginhs = std::max((windowSize.height - fbhs) / 2.0, 0.0); double marginhs = (windowSize.height - fbhs) / 2.0;
GLint srcX0 = viewport.x; GLint srcX0 = viewport.x;
GLint srcY0 = viewport.y; GLint srcY0 = viewport.y;
GLint srcX1 = viewport.x + viewport.width; GLint srcX1 = viewport.x + viewport.width;
GLint srcY1 = viewport.y + viewport.height; GLint srcY1 = viewport.y + viewport.height;
GLint dstX0 = scale ? marginws : marginw; GLint dstX0 = stretch ? marginws : marginw;
GLint dstY0 = scale ? marginhs : marginh; GLint dstY0 = stretch ? marginhs : marginh;
GLint dstX1 = scale ? marginws + fbws : marginw + framebufferSize_.width; GLint dstX1 = stretch ? marginws + fbws : marginw + framebufferSize_.width;
GLint dstY1 = scale ? marginhs + fbhs : marginh + framebufferSize_.height; GLint dstY1 = stretch ? 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
GL_CHECK(glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFramebufferID)); GL_CHECK(glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFramebufferID));
GL_CHECK(glBlitFramebuffer( srcX0, srcY0, srcX1, srcY1, GL_CHECK(glBlitFramebuffer( srcX0, srcY0, srcX1, srcY1,
dstX0, dstY0, dstX1, dstY1, dstX0, dstY0, dstX1, dstY1,

Loading…
Cancel
Save