Контроль мыши в imguiC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Контроль мыши в imgui

Сообщение Anonymous »

Я строю приложение для моделирования гравитации с OpenGL, и я хочу использовать IMGUI для графического интерфейса. Все работало отлично, пока я не добавил графический интерфейс, он появляется в кадре, но элементы управления мыши там не работают, они должны иметь возможность взаимодействовать с кнопкой и прокруткой Zoom, но они не делают.
Вот моя функция для обратного вызова мыши: < /p>
void mouse_callback(GLFWwindow* window, double xpos, double ypos) {

ImGuiIO& io = ImGui::GetIO();
if (io.WantCaptureMouse) {
return; // Check if the mouse is in GUI
}

int leftButtonState = glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT);
int rightButtonState = glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_RIGHT);

if (leftButtonState == GLFW_PRESS) {
// Rotate the camera
float xOffset = xpos - lastX;
float yOffset = lastY - ypos;
lastX = xpos;
lastY = ypos;

float sensitivity = 0.1f;
xOffset *= sensitivity;
yOffset *= sensitivity;

yaw += xOffset;
pitch += yOffset;

if (pitch > 89.0f) pitch = 89.0f;
if (pitch < -89.0f) pitch = -89.0f;
}

if (rightButtonState == GLFW_PRESS) {
// Move the camera
float xOffset = xpos - lastRightX;
float yOffset = lastRightY - ypos;
lastRightX = xpos;
lastRightY = ypos;

float sensitivity = 0.05f;
cameraX -= xOffset * sensitivity;
cameraY += yOffset * sensitivity;
}
}
< /code>
Функция для Scrollback: < /p>
void scroll_callback(GLFWwindow* window, double xoffset, double yoffset) {
ImGuiIO& io = ImGui::GetIO();
if (io.WantCaptureMouse) return;

float zoomSpeed = 5.0f;
zoomLevel -= yoffset * zoomSpeed;
}
< /code>
для обработки кнопок: < /p>
void mouse_button_callback(GLFWwindow* window, int button, int action, int mods) {
ImGuiIO& io = ImGui::GetIO();
if (io.WantCaptureMouse) return;

if (button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS) {
glfwGetCursorPos(window, &lastX, &lastY);
}

if (button == GLFW_MOUSE_BUTTON_RIGHT && action == GLFW_PRESS) {
glfwGetCursorPos(window, &lastRightX, &lastRightY);
}
}
< /code>
Инициализация OpenGl: < /p>
GLFWwindow* initializeOpenGL() {
if (!glfwInit()) {
return nullptr; // Initialization failed
}

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
GLFWwindow* window = glfwCreateWindow(800, 600, "Gravity Simulator", nullptr, nullptr);

if (!window) {
glfwTerminate(); // Window creation failed
return nullptr;
}

glfwMakeContextCurrent(window);
glfwSwapInterval(1);

return window;
}
< /code>
Основная функция с основным циклом: < /p>
int main(void) {
GLFWwindow* window;

// Initialize GLFW
if (!glfwInit())
return -1;

// Create a window
window = glfwCreateWindow(640, 480, "Gravity Simulator", NULL, NULL);
if (!window) {
glfwTerminate();
return -1;
}

glfwMakeContextCurrent(window);
glfwSwapInterval(1); // Enable V-Sync
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io;
ImGui::StyleColorsDark();
ImGui_ImplGlfw_InitForOpenGL(window, true);
ImGui_ImplOpenGL3_Init("#version 130");
glfwSetFramebufferSizeCallback(window, reshape);
glfwSetScrollCallback(window, scroll_callback);
glfwSetMouseButtonCallback(window, mouse_button_callback); // For mouse click handling
glfwSetCursorPosCallback(window, mouse_callback); // For rotation
glEnable(GL_DEPTH_TEST); // Enable depth testing for proper 3D rendering
reshape(window, 640, 480);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, 640.0 / 480.0, 0.1, 100.0);
glMatrixMode(GL_MODELVIEW);
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);

// Main loop
while (!glfwWindowShouldClose(window)) {
glfwPollEvents();
std::cout

Подробнее здесь: https://stackoverflow.com/questions/795 ... l-in-imgui
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»