Glut display Callback als Klassenmethode
-
Hallo,
ich habe eine Klasse geschrieben, die eine kleine OpenGL Szene darstellen soll. Die Klasse hat folgenden Aufbau.
class Viewer { public: Viewer(Scene* myscene); virtual ~Viewer(); void initGL(); void display(); void keyboard(); void reshape(); }Ich übergebe der Klasse meine Szene und die Klasse soll diese nun darstellen. Leider habe ich ein Problem die display Callbackfunktion zu registrieren. Ein "glutDisplayFunc(display);" wirft einen Fehler. Wenn ich die display Funktion als einfache Funktion deklariere funktioniert es natürlich, ich will aber möglichst die Methode der Klasse aufrufen, da ich dann auf die Variablen der Klasse zugreifen kann. Gibt es da irgendeine Möglichkeit das zu realisieren?
Mit freundlichem Gruß,
Tim
-
Wenn eine nichtstatische Methode aufgerufen wird, muss der this Zeiger übergeben werden. Sonst weiss die Methode ja gar nicht, für welche Klasse sie arbeiten soll. Da Glut den Klassenzeiger nicht kennt, kann es auch nicht aufrufen.
Bye, TGGC (Demo or Die)
-
Das heißt also in anderen Worten, dass es keine direkte Möglichkeit gibt eine Klassenmethode als glut Callback Funktion zu übergeben?
Gibt es da ein Workaround oder einen anderen Ansatz dieses Problem zu lösen? Ich will/muss halt in der display Callbackfunktion auf meine Szene bzw. auf die Viewer-Methoden, die die Szene zeichnen, zugreifen können.
Mir würde spontan nur einfallen die Klasse Viewer als Singleton zu implementieren um dann aus der displayfunktion herraus auf die Viewermethoden zuzugreifen. Für so optimal halte ich die Lösung aber auch nicht.
Gruß, Tim
-
Üblicherweise kann man der Callback doch auch Parameter mitgeben, oder? Dann könntest du ja eine statische Wrapper-Methode um dein display() setzen:
class Viewer { void display(); static void s_display(void* ob) { Viewer* self=(Viewer*)ob; self->display(); } Viewer() { glutDisplayFunc(s_display,(void*)this); } }
-
Hallo,
leider kann man in diesem Fall keinen Parameter übergeben. Die "glutDisplayFunc" ist wie folgt in der glut.h definiert.
GLUTAPI void GLUTAPIENTRY glutDisplayFunc(void (GLUTCALLBACK *func)(void));Gruß, Tim
-
Hi,
meine Grundidee/Ansatz ist übrigens der, in die Callback Funktionen Daten reinzubekommen ohne diese als globale Variablen zu deklarieren.
[EDIT]
Ich habe nun hinbekommen, dass die glutDisplayFunc() die Klassenmethode akzeptiert. Ich habe dazu die Funktion display als static deklariert nun akzeptiert der Compiler diese auch problemlos. Da die Funktion aber nun statisch ist, kann ich natürlich in dieser nicht mit this auf die eigentlichen Klasseninhalte zugreifen.
[/EDIT][EDIT]
Das Problem hat sich erledigt! Ich habe nach einer kleinen Recherche einen kleinen, schlanken C++ Wrapper für glut gefunden. Falls es jemanden interessiert, das Ding nennt sich "GlutMaster".
[/EDIT]Vielen Dank für eure Hinweise und Tipps!
Gruß, Tim