Hilfe mit GLUT Programmierung



  • Hallo,
    ich brauche dringend Hilfe (eigentlich Ratschläge).
    Momentan arbeite ich unter Linux - ich muss ein Programm erstellen, dass graphische Visualizierung besitzt. Die graphische Objekte sind 2d. Ich habe GLUT gewählt. Dies ist schon erfolgreich installiert. Das kompilieren von einigen Beispielsquellcodes klappt prima!
    Jetzt aber kommen wir zu meinem Problem - ich habe bemerkt, dass das GLUT API mein Konsole I/O und alle andere Funktionen blockiert. D.h. wenn ich glutMainLoop() aufrufe, nichts anderes wird funktionieren. Und das ist ja ganz normal, weil diese Funktion die Events von den Callbacks-spezfizierte Funktionen zuordnet. Das finde ich aber nicht schön.
    Könnten sie mir sagen eine Lösung, so dass das GLUT Fenster in C++ Klasse kapsuliert ist, und später mit Hilfe Aufruf von Funktionen verschiedene Objekte malen?
    Leider bin ich mir nicht sicher ob dies ohne Threads zu machen ist. Vielleicht brauche ich ein MessageDispatcher oder so was?
    Je simpler die Lösung ist, desto besser - es soll nicht kompliziert sein.
    MFG



  • Hört sich nach einem ziemlichen Hack an, den du da vorhast.

    Ich glaube, mit deinem eigenen, selbsgemachten Runloop fährst du da besser.

    Sieh dir am besten an, wie der glutMainLoop() gemacht wird (Die Sourcecodes hast du ja), und programmier es nach.



  • für reines 2D wär vielleicht eine andere lib besser, qt zum beispiel. das gibs für linux auch kostenlos (ist in den meissten distributionen auch gleich dabei).

    und falls es doch glut sein soll, bietet qt dafür gleich nen modul an: http://doc.trolltech.com/4.1/qtopengl.html

    gl mit qt hat den vorteil, dass qt sich um das ganze event management etc. kümmert, das ganze ist von haus aus multithreaded, wenn man will, und konsolenausgabe und der ganze schnickschnack ist wie gewohnt verfügbar.



  • mal nen beispiel für ne minimalistische qt3 anwendung mit opengl (aus dem kopf, garantier für nix ;)):

    #include <qgl.h>
    
    class MyOpenGL : public GLWidget
    {
    public:
     MyOpenGL(QWidget *parent = 0, const char *name = 0) : GLWidget(parent, name);
     void paintGL(); // <--- das ist die GL main loop
    }
    
    #include <qapplication.h>
    #include "myopengl.h"
    #include <gl/glut.h>
    
    int main(int argc, char **argv)
    {
     glutInit(&argc, argv); // glut initialisieren, am besten immer als erstes machen
     QApplication *app = new QApplication(argc, argv);
     MyOpenGL *gl = new MyOpenGL(); // neues gl widget
     app->setMainWidget(gl); // widget der qapp zuordnen
     gl->show(); // sichtbar machen ^^
     return app->exec(); // und application starten
    }
    

    wie man nun die paintGL methode zum updaten bringt kommt auf die applikation an. qt updatet immer dann, "wenn es nötig ist".

    entweder benutzt man nen timer für das updaten (s. qtdoc QTimer), wartet auf user inputs (s. qtdoc Events) oder haut den gl callback rein. letzeres benutz ich nie, da können dann andere helfen 😉



  • Danke für die Antworte. Nun arbeite ich nicht mit qt. Das Program ist rein C++. Ich suche nach einem Weg die glutmain-loop vom Programmlogik zu separieren.



  • GLUT hat doch 'nen Render- und ein Idle-Callback, was willst Du noch?! 😕



  • Sgt. Nukem schrieb:

    GLUT hat doch 'nen Render- und ein Idle-Callback, was willst Du noch?! 😕

    Ich schätzte mal er braucht noch sowas wie ein File-Ready-for-Read Callback oder so.



  • Eigentlich brauche ich Hilfe... GLUT blockiert alles was nicht mit Graphic zu tun hat. Dann wie gebe ich Daten in die Konsole ein? Vielleicht soll ich das API wechseln? Ich werde euch sehr dankbar sein, wenn sie mir mit etwas helfen.
    Das Idle-Callback ist nur eine Funktion, die mit der Visualizierung verbunden ist. Wie kann ich folgendes machen:
    1. Benutzer gibt in die Konsole "start" ein.
    2. Ein Fenster taucht auf
    3. Ein Paar Sachen werden gemalt (diese hängen von den Parametern von "start" Befehl ab)
    4. Nachdem die Sachen gemalt sind, kann der Benutzer wieder Anweisungen schreiben usw.
    Ist es jetzt aller Leute klar, was ich brauche?
    Wie sie sehen, es ist nicht kompliziert. Nun ist OpenGL eher nicht Objekt-Orientiert 😞
    Vielleicht ist es leichter mit MESA?



  • Zdravko schrieb:

    Eigentlich brauche ich Hilfe... GLUT blockiert alles was nicht mit Graphic zu tun hat. Dann wie gebe ich Daten in die Konsole ein? Vielleicht soll ich das API wechseln? Ich werde euch sehr dankbar sein, wenn sie mir mit etwas helfen.
    Das Idle-Callback ist nur eine Funktion, die mit der Visualizierung verbunden ist. Wie kann ich folgendes machen:
    1. Benutzer gibt in die Konsole "start" ein.
    2. Ein Fenster taucht auf
    3. Ein Paar Sachen werden gemalt (diese hängen von den Parametern von "start" Befehl ab)
    4. Nachdem die Sachen gemalt sind, kann der Benutzer wieder Anweisungen schreiben usw.
    Ist es jetzt aller Leute klar, was ich brauche?

    Was soll das denn für eine Konsole sein?!

    Meinst Du das Standard-Konsolenfenster von Windows (cmd.exe) bzw. 'ne UNIX-Shell? Oder läuft da Deine Anwendung schon (start hört sich so an)??

    Falls ersteres: Das geht nur mit Threads. Das hat auch nichts mit OpenGL, GLUT oder MESA zu tun. Wenn Du in der Haupt-main() eine Funktion o.ä. aufrufst die nicht zurückkehrt (Endlosschleife oder halt die GLUT main), dann ist die Konsole blockiert.

    Du kannst auch ohne Threads nicht mit scanf() auf Eingaben vom Nutzer warten, trotzdem aber Kram mit printf() ausgeben.

    Falls letzteres: Ich weiß nicht ob GLUT mehrere Fenster unterstützt...



  • Ok ok, danke sehr trotzdem... Ich benutze eine einfachere Bibliothek, wie Z.B. grx.



  • Zdravko schrieb:

    Danke für die Antworte. Nun arbeite ich nicht mit qt. Das Program ist rein C++. Ich suche nach einem Weg die glutmain-loop vom Programmlogik zu separieren.

    Qt verwendet OOP= C++

    GLUT verwendet prozedurales proggen = C



  • @shade37337: BTW auch mit C kann man OOP programmieren - nur weil es in C++ programmiert ist, uss es nicht OOP sein: http://turing.fh-landshut.de/~jamann/usop.html



  • // prevent multiply inclusion
    

    😉


Anmelden zum Antworten