আমি এই একই সমস্যা ছিল। এটি বিরক্তিকর যে glfwSetWindowUserPointer এবং glfGetWindowUserPointer ব্যবহারের বিষয়ে খুব কম ডকুমেন্টেশন রয়েছে। আপনার সমস্যার সমাধানটি এখানে দেওয়া হল:
WindowManager::WindowManager() {
// ...
glfwSetUserPointer(window_, this);
glfwSetKeyCallback(window_, key_callback_);
// ...
}
void WindowManager::key_callback(GLFWwindow *window, int, int ,int, int) {
WindowManager *windowManager =
static_cast<WindowManager*>(glfwGetUserPointer(window));
Keyboard *keyboard = windowManager->keyboard_;
switch(key) {
case GLFW_KEY_ESCAPE:
keyboard->reconfigure();
break;
}
}
যাইহোক, যেহেতু এটি সি ++ ক্লাস সহ জিএলএফডাব্লু ব্যবহারের শীর্ষ ফলাফলগুলির মধ্যে একটি, আমিও একটি সি ++ শ্রেণিতে একটি গল্ফডাব্লু উইন্ডোকে আবদ্ধ করার আমার পদ্ধতিটি সরবরাহ করব। আমি মনে করি এটি এটি করার জন্য এটি সবচেয়ে মার্জিত উপায়, কারণ এটি গ্লোবাল, সিঙ্গেলনস বা ইউনিক_পটার ব্যবহার করা এড়ানো যায় না, প্রোগ্রামারটিকে উইন্ডোটিকে আরও অনেক OO / C ++ - y স্টাইলে ম্যানিপুলেট করতে দেয় এবং সাবক্লাসিংয়ের অনুমতি দেয় (মূল্যের ব্যয়ে) কিছুটা বেশি বিশৃঙ্খলাযুক্ত শিরোনাম ফাইল)।
// Window.hpp
#include <GLFW/glfw3.h>
class Window {
public:
Window();
auto ViewportDidResize(int w, int h) -> void;
// Make virtual you want to subclass so that windows have
// different contents. Another strategy is to split the
// rendering calls into a renderer class.
(virtual) auto RenderScene(void) -> void;
(virtual) auto UpdateScene(double ms) -> void;
// etc for input, quitting
private:
GLFWwindow *m_glfwWindow;
// Here are our callbacks. I like making them inline so they don't take up
// any of the cpp file
inline static auto WindowResizeCallback(
GLFWwindow *win,
int w,
int h) -> void {
Window *window = static_cast<Window*>(glfwGetUserPointer(win));
window->ViewportDidResize(w, h);
}
inline static auto WindowRefreshCallback(
void) -> void {
Window *window = static_cast<Window*>(glfwGetUserPointer(win));
window->RenderScene(void);
}
// same for input, quitting
}
এবং জন্য:
// Window.cpp
#include <GLFW/glfw3.h>
#include "Window.hpp"
Window::Window() {
// initialise glfw and m_glfwWindow,
// create openGL context, initialise any other c++ resources
glfwInit();
m_glfwWindow = glfwCreateWindow(800, 600, "GL", NULL, NULL);
// needed for glfwGetUserPointer to work
glfwSetWindowUserPointer(m_glfwWindow, this);
// set our static functions as callbacks
glfwSetFramebufferSizeCallback(m_glfwWindow, WindowResizeCallback);
glfwSetWindowRefreshCallback(m_glfwWindow, WindowRefreshCallback);
}
// Standard window methods are called for each window
auto
Window::ViewportDidResize(int w, int h) -> void
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
}
এটি সম্ভবত উইন্ডো ম্যানেজার / ইনপুট ম্যানেজার শ্রেণীর সাথে বেশ সহজেই সংহত করা যেতে পারে তবে আমি মনে করি প্রতিটি উইন্ডো নিজেই পরিচালনা করা আরও সহজ।