[linux-l] Open GL ohne Event Handling?

Olaf Radicke olaf_rad at gmx.de
Di Okt 7 20:21:04 CEST 2003


Am Die, 2003-10-07 um 12.06 schrieb Christoph Lange:
> Kann mir jemand eine Bibliothek nennen, mit der ich OpneGL in ein
> Fenster ausgeben kann, ohne daß dies in einer Event Handling Loop
> geschieht?

Hhhmmm, ich kenne EHL (Event Handling Loop) nur von Perl/Tk, 
Python/Tkinter, GTK+ und Qt. (Wo bei es bei Qt auch ein OpenGL-
Widget gibt). Ohne ein EHL könnte man weder das Programm beenden
noch das Fenster neu zeichnen lassen wenn man es hin und her
schiebt. (Weil das Programm nicht weiß, das sein Fenster verschoben
wurde). Als bin ich mir nicht sicher ob es wirklich das ist was
du willst.
 
> Hintergrund: Ich will INNERHALB eines Programmflusses einige wenige
> Zeichenanweisungen für OpenGL absetzen, so etwa:
> 
> öffne OpenGL-Window
> ...
> tue dies und jenes interessante,
> male jetzt ein grünes Rechteck in die rechte obere Ecke,
> tue jetzt wieder was anderes etc.
> ...
> schließe OpenGL-Window.
> 
> Das Problem mit, z.B., glut ist, 

Sorry - was ist "glut"

> daß man eine OpenGL Event Loop
> startet, in der man lediglich innerhalb von Callbacks die Möglichkeit
> hat, etwas tun zu lassen. 

Also z.B. User drückt Button "Film abspielen". Der Klick auf dann
Button ist das Event welches das Signal "geklickt" an das Objekt
Button schickt. Das Objekt Button ist mit dem Callback der Funktion
oder der Methode eines Objektes verbunden. Diese Methode oder
Funktion fängt an Figuren zu zeichnen in das betreffende Widget.
EHL wird erst wieder gestartet wenn die Funktion oder die Methode
abgearbeitet ist. Wenn in der zeit das Fenster verschoben wird
bleibt alles grau und wird erst wieder neu gezeichnet wenn die
EHL wieder gestartet wurde. Will man das auch zwischen durch das
Fenster aktualisiert wird und das auch der Button "beenden" 
gedrückt werden kann, muss man zwischen durch die EHL ab und
an durch laufen lassen oder bei rechen intensiven Funktionen
ein Thread machen.

> Dieses Callback aber, das für das Zeichnen
> der momentanen Darstellung der Szene verantwortlich ist, wird immer
> wieder neu aufgerufen, nämlich dann, wenn etwas neu zu zeichnen ist.

Du wirst auch bei OpenGL den Callback verändern können bzw.
das Signal-Handling. Bei Qt heißt das z.B. QObjekt::disconnect()
So kann man dann wild im Code alles mit allem "connecten" und
"disconnecten" bis man selber nicht mehr weiß wer was wann warum
tut...

> UND, das ist mein Problem, wenn ich darin etwas anderes, einen
> kontinuierlichen Programmfluß, haben will, muß ich mein Programm
> fragmentieren und Zustände und Sprungmarken definieren, damit ich bei
> jedem Aufruf des Callbacks genau das getan bekomme, was ich haben
> will.

Man könnte auch den User mit einem putzigen Vortschritbalken während
der Bearbeitung unterhalten und alle oder einige Buttons sperren
in der Zeit. 

> Meine momentane Lösung ist das Kidnapping der Event Loop, indem ich
> innerhalb des Display-Callbacks einfach eine Endlosschleife mache.

Ich glaube ich muss das sehen mit ich verstehen kann was
du willst. Bist du morgen in der Lehrterstr.?

MfG
Olaf

-- 
===================================================
"Meine Meinung steht fest. Bitte verwirren sie mich
nicht mit Tatsachen!"
                          Unbekannt.
===================================================





Mehr Informationen über die Mailingliste linux-l