Entwickler-Ecke

Open Source Units - glComponents - GUI für OpenGl


jakobwenzel - Sa 17.03.07 00:04
Titel: glComponents - GUI für OpenGl
Normale VCL-Komponenten sind auf OpenGl-Formularen nicht mehr sichtbar und oft will man (für Spiele) auch nicht das Standardaussehen, sondern ein eigenes.

Hierfür habe ich glComponents geschrieben.
Das Projekt bietet ein Bitmap-Fontsystem und die meisten Standard-Komponenten für OpenGl.

Die Komponenten wären im Einzelnen:


Besonderheiten sind:


Hinweis: Es wird nur Y-Ursprung oben unterstützt, Standard für OpenGl ist jedoch unten
So funktioniert das ganze Perfekt zusammen mit Fear2d [http://www.delphi-forum.de/viewtopic.php?t=62017]



Die Verwendung von glComponents erfolgt ähnlich wie die manuelle Initialisierung von VCL-Komponenten, es müssen allerdings einige Besonderheiten beachtet werden.

Zuerst muss eine zentrale Verwaltungsklasse vom Typ TglManager erstellt werden. Deren Konstruktor wird als Parameter entweder Breite und Höhe des Formulars oder direkt das Formular übergeben. Optional kann auch noch der Standardskin und das Verzeichnis angegeben werden.

Nun können einzelne Komponenten erstellt werden. Hier sind die Parameter des Konstruktors entweder nur die Verwaltungsklasse oder eine übergeordnete Komponente.

Die meisten Eigenschaften der Komponenten orientieren sich an der VCL, eine Ausnahme bildet jedoch Color:
Hier werden OpenGl-typisch die Rot-, Grün-, Blau- und Alphawerte (Transparenz) einzeln in Single-Variablen mit dem Wertebereich 0 - 1 gespeichert. Normale Delphi-TColor-Werte können über die Methode FromTColor benutzt werden.


Damit die Eingaben nun auch bei den Komponenten ankommen, müssen mehrere Arten von Ereignissen an die Verwaltungsklasse weitergeleitet werden.

Das sind im einzelnen:


In der Ereignisbehandlung müssen nun die gleich benannten Methoden der Verwaltungsklasse aufgerufen werden, die in der Regel auch die selben Parameterlisten haben.

Zusätzlich muss noch die Windows-Botschaft CM_DIALOGKEY abgefangen werden (die zugehörige Ereignisbehandlung muss dann leer sein), damit auch auf die Tab-Taste reagiert wird.


Die gesamte GUI kann hier inklusive eines Demo-Projekts runtergeladen werden: http://wilson.kilu.de/counter/load.php?id=3

Lizenz: 2-clause-BSD
Aktuelle Version: 0.1

Benötigte Units:


EDIT: Screenshot hinzugefügt


alias5000 - Sa 17.03.07 01:16

hm, ich habe jetzt einfach mal deine kompilierte Demo gestartet und die geht irgendwie grad gar nimmer mehr. Der meldet mir am Anfang eine AV. Danach wird der gesamte Bildschirm weiß und im Sekundentakt kommen AV- Meldungen, die ich nicht sehen kann (man hörts halt und bekommts zu Gesicht, wenn man den Taskmanager mal in den Vorderfrund ziehen konnte)

Gruß
alias5000


jakobwenzel - Sa 17.03.07 12:06

Haste alles extrahiert oder die Exe direkt aus dem Archiv gestartet?


alias5000 - Sa 17.03.07 12:38

Nene, schon alles extrahiert


jakobwenzel - Sa 17.03.07 14:36

Komisch, ich hab das jetz auf 3 Computern ausprobiert und auf keinem kann ich den Fehler reproduzieren.


Danniolo - Sa 17.03.07 20:40

Bei mir gehts! Allerdings ist der Mauszeiger etwas träge - die Bewegungen werden also erst mit einige gewissen Verzögerung umgesetzt. (Framerate: 85FPS - VerticalSync ist über den Treiber aktiviert)
Wäre schön, wenn man das noch verbessern könnte, also dass der Mauszeiger direkt anspricht.
Ansonsten: super!


Eddie - Sa 17.03.07 20:40

Hi, ich habs grad mal bei mir ausprobiert. Es funktioniert einwandfrei ^^
Und ich kann nur eins dazu sagen: Respekt!!!
Sieht genial aus, ich werd wohl noch ein wenig damit rumspielen.


jakobwenzel - Sa 17.03.07 20:52

user profile iconDanniolo hat folgendes geschrieben:
Bei mir gehts! Allerdings ist der Mauszeiger etwas träge - die Bewegungen werden also erst mit einige gewissen Verzögerung umgesetzt. (Framerate: 85FPS - VerticalSync ist über den Treiber aktiviert)
Wäre schön, wenn man das noch verbessern könnte, also dass der Mauszeiger direkt anspricht.

Das wird eigentlich schon so direkt umgesetzt, wie es mit eigenem Mauszeiger geht.
Stockt die Bewegung, oder ist sie einfach nur verzögert?

Ansonsten noch danke für das Lob.

Wenn das mal jemand mit NVidia-Grafikkarte testen könnte wäre das toll, denn ich hab hier zu Hause nur ATI-Karten, bei einem Freund mit NVidia-Karte gibts jedoch kleine Darstellungsfehler bei den Checkboxen und Radiobuttons. Kann das irgendwer reproduzieren?


alias5000 - Sa 17.03.07 21:07

ich kann das nachher mal auf Vista mit nem Intel 945 GM Chipsatz testen. Nur halt jetzt nich, da kriege ich dann Haue, weil meine Family darüber ne DVD gucken will :lol:

Gruß
alias5000


Danniolo - Sa 17.03.07 21:16

user profile iconjakobwenzel hat folgendes geschrieben:
Das wird eigentlich schon so direkt umgesetzt, wie es mit eigenem Mauszeiger geht.
Stockt die Bewegung, oder ist sie einfach nur verzögert?

Die Bewgung stockt nicht - sie ist ledigleich verzögert.

user profile iconjakobwenzel hat folgendes geschrieben:

Wenn das mal jemand mit NVidia-Grafikkarte testen könnte wäre das toll, denn ich hab hier zu Hause nur ATI-Karten, bei einem Freund mit NVidia-Karte gibts jedoch kleine Darstellungsfehler bei den Checkboxen und Radiobuttons. Kann das irgendwer reproduzieren?


Bei mir (Nvidia GeForce 6800 GT) gibt es keine erkennbaren Grafikfehler (siehe hier [http://tausch.danniolo.de/glc_nvidia.PNG]).


Eddie - Sa 17.03.07 22:20

Ich habe eine nVidia GeForce 7950GT und es wird auch alles ohne Probleme/Darstellungsfehler angezeigt.


Heiko - So 18.03.07 13:29

Hallo Jakob,

2 Dinge fallen mir gerade zu deinen Komponenten ein.
Zum einem: Woran liegt es, dass das Umstellen des Styles bei 800 FPS immer noch 2-3 Sekunden dauert? Denn an OpenGL liegt es garantiert nicht ;).
Und zum zweiten: Kannst du mal eine Kleinigkeit testen (wenn ich deine Demo selber kompiliere bekomme ich nur AVs ;) )? Und zwar: Verkleine mal irgendeine deiner OpenGL-Kompos auf so ca. 5Px. Warum ich Frage? Ich habe selber mal angefangen OGL-Kompos zu schreiben. Ergebnis: OpenGL scheint nicht dafür geeignet [http://www.delphigl.com/forum/viewtopic.php?t=6177&] zu sein :(.

Grüße HEiko


jakobwenzel - So 18.03.07 13:38

user profile iconHeiko hat folgendes geschrieben:
Zum einem: Woran liegt es, dass das Umstellen des Styles bei 800 FPS immer noch 2-3 Sekunden dauert? Denn an OpenGL liegt es garantiert nicht ;).

Die neuen Grafiken werden von der Festplatte geladen, wobei die alten dann verworfen werden. In nem richtigen Programm wird (wenn der Stil überhaupt mal gewechselt wird) das wohl eher sehr selten gewechselt werden, weshalb man das eigentlich vernachlässigen kann.
user profile iconHeiko hat folgendes geschrieben:

Und zum zweiten: Kannst du mal eine Kleinigkeit testen (wenn ich deine Demo selber kompiliere bekomme ich nur AVs ;) )? Und zwar: Verkleine mal irgendeine deiner OpenGL-Kompos auf so ca. 5Px. Warum ich Frage? Ich habe selber mal angefangen OGL-Kompos zu schreiben. Ergebnis: OpenGL scheint nicht dafür geeignet [http://www.delphigl.com/forum/viewtopic.php?t=6177&] zu sein :(.

Funktioniert perfekt. :wink:
Was solte denn deiner Meinung nach passieren?

Dass die neu kompilierte Demo bei dir aber nicht läuft find ich komisch. :gruebel:


Heiko - So 18.03.07 13:52

user profile iconjakobwenzel hat folgendes geschrieben:
Funktioniert perfekt. :wink:
Was solte denn deiner Meinung nach passieren?

Siehe Link. Wenn du Bilder verwendest, ist es klar, warum es funktioniert. Aber: IsSt es nicht übertriebemn für jeden Button ein Bild zu nehmen? Eigentlich zeichnet man das direkt mit OGL ;).

user profile iconjakobwenzel hat folgendes geschrieben:
Dass die neu kompilierte Demo bei dir aber nicht läuft find ich komisch. :gruebel:

ka, der hatte irgendein Prob mit der Initialisierung von OpenGL.


jakobwenzel - So 18.03.07 13:58

user profile iconHeiko hat folgendes geschrieben:
user profile iconjakobwenzel hat folgendes geschrieben:
Funktioniert perfekt. :wink:
Was solte denn deiner Meinung nach passieren?

Siehe Link. Wenn du Bilder verwendest, ist es klar, warum es funktioniert. Aber: IsSt es nicht übertriebemn für jeden Button ein Bild zu nehmen? Eigentlich zeichnet man das direkt mit OGL ;).

Find ich nicht, dadurch reduziert sich der Aufwand beim erstellen eines neuen Styles (grad nur noch ein Bild machen), es können theoretisch neue Styles hinzugefügt werden, ohne das Programm neu zu kompilieren.
Du würdest die Buttons dann aus mehreren verschiedenfarbigen Teilen zusammensetzen, oder was?
user profile iconHeiko hat folgendes geschrieben:

user profile iconjakobwenzel hat folgendes geschrieben:
Dass die neu kompilierte Demo bei dir aber nicht läuft find ich komisch. :gruebel:

ka, der hatte irgendein Prob mit der Initialisierung von OpenGL.

Komisch... Haste irgendwas an der Demo geändert?


Heiko - So 18.03.07 14:07

user profile iconjakobwenzel hat folgendes geschrieben:
Find ich nicht, dadurch reduziert sich der Aufwand beim erstellen eines neuen Styles (grad nur noch ein Bild machen), es können theoretisch neue Styles hinzugefügt werden, ohne das Programm neu zu kompilieren.
Du würdest die Buttons dann aus mehreren verschiedenfarbigen Teilen zusammensetzen, oder was?


Siehe Link. Wenn du Bilder verwendest, ist es klar, warum es funktioniert. Aber: IsSt es nicht übertriebemn für jeden Button ein Bild zu nehmen? Eigentlich zeichnet man das direkt mit OGL ;).


user profile iconjakobwenzel hat folgendes geschrieben:
Komisch... Haste irgendwas an der Demo geändert?

Nein. Ich habe lediglich bei Fear2D die Version von Martok verwendet, weil die von Fear wegen seinem ServerCrash ja nimmer da ist, verwendet und dort alles, was mit Sound zu tun hat ausgeklammert.

Aso, könnte es vlt. daran liegen, dass ich bei der glCompos-Unit ne ganze Menge an TExturen-Prozeduren ausgeklammert habe, da du da irgendeine Konstante nimmst, die meine Units nicht kennen (glBitmap 1.8.10; dglOpenGL V1.8 BETA)?


jakobwenzel - So 18.03.07 14:11

user profile iconHeiko hat folgendes geschrieben:
Aso, könnte es vlt. daran liegen, dass ich bei der glCompos-Unit ne ganze Menge an TExturen-Prozeduren ausgeklammert habe, da du da irgendeine Konstante nimmst, die meine Units nicht kennen (glBitmap 1.8.10; dglOpenGL V1.8 BETA)?

Ich hab die glOpenGl V2.0, daran dürfts liegen.


F34r0fTh3D4rk - Fr 06.04.07 18:23

die qualität ist bei mir ziemlich mies, wenn ich AA aus habe, vor allem weil die schrift dann so dick ist. ansonsten siehts sehr schick aus ;)

ansonsten ne coole unit ;) sieht auch alles sehr schick aus. praktisch wäre noch ein editor für die grafiken, damit man die leichter selbst machen kann ;)

ahja und dass man den buttons verschiedene größen geben kann, wäre wirklich net schlecht, dann musst du die button grafik nur geschickt zerteilen und wieder zusammenfügen

mfg


jakobwenzel - Sa 07.04.07 16:34

user profile iconF34r0fTh3D4rk hat folgendes geschrieben:
die qualität ist bei mir ziemlich mies, wenn ich AA aus habe, vor allem weil die schrift dann so dick ist. ansonsten siehts sehr schick aus ;)

Das liegt wahrscheinlich an ClearType. (Zumindest ist es bei mir aus, es sieht normal aus, und auf einem anderen Rechner wo es an ist, tritt der selbe Fehler auf) Ich bastel momentan an ner neuen Version, da wird das dann automatisch deaktiviert.

user profile iconF34r0fTh3D4rk hat folgendes geschrieben:

ansonsten ne coole unit ;) sieht auch alles sehr schick aus. praktisch wäre noch ein editor für die grafiken, damit man die leichter selbst machen kann ;)

Das ist doch einfach nur ne Zip-Datei in der die ganzen Grafiken liegen. Ein eigener Editor ist da IMHO ziemlich nutzlos. :?

user profile iconF34r0fTh3D4rk hat folgendes geschrieben:

ahja und dass man den buttons verschiedene größen geben kann, wäre wirklich net schlecht, dann musst du die button grafik nur geschickt zerteilen und wieder zusammenfügen

Einfach width und height setzen, oder meinst du irgendwas anderes? :nixweiss:


Martok - Sa 07.04.07 16:38

Wenn du eh am basteln einer neuen bist: könntest du das vielleicht so machen, dass man das auch halbwegs portieren kann?

Ich versuche grade, das ganze mit SDL kompatibel zu machen, aber neu schreiben scheint wohl einfacher zu werden....


EDIT: ahja...glBitmap ist Windows-Only. Gut, dann brauchen wir eh eine neue mit SDL_IMAGE...


F34r0fTh3D4rk - Sa 07.04.07 18:03

user profile iconjakobwenzel hat folgendes geschrieben:

user profile iconF34r0fTh3D4rk hat folgendes geschrieben:

ahja und dass man den buttons verschiedene größen geben kann, wäre wirklich net schlecht, dann musst du die button grafik nur geschickt zerteilen und wieder zusammenfügen

Einfach width und height setzen, oder meinst du irgendwas anderes? :nixweiss:


ja aber dann stretcht er das doch nur, oder net ?


mfg


jakobwenzel - Sa 07.04.07 18:13

Nein, das ganze wird aus 9 Quads aufgebaut, von denen die 8 äußeren die Höhe bzw. Breite des in den Einstellungen angegebenen Rands haben, und nur das innere gestretched wird.

PS: Das wird in der Prozedur DrawBordered gemacht.