| Was ist XPGL? XPGL steht für XProfanGraphicsLanguage. Inspiriert wurde ich dazu von der Textdatei, die die "Welt" in Lektion 10 von NeHe's OpenGL-Tutorial beschreibt: <a href='https://nehe.gamedev.net/'>Neon Helium OpenGL Tutorial</a>
In diesem Tutorial wurde die Textdatei allerdings lediglich benutzt, diese Welt zu beschreiben. Im Programm wurde sie dann Dreieck für Dreieck ausgelesen und dargestellt. Das war mir entschieden zu langsam. Die Idee zu XPGL kam mir dann, als ich mich mit den Vektor-Funktionen von OpenGL befaßte, die es ermöglichen für Vertex (Koordinaten), Farbe, Texturabschnitt und Normalwerte je ein Datenarray (= Vektor) anzugeben und das Ganze dann mit einem einzigen OpenGL-Befehl auf den Bildschirm zu bringen.
Die Idee war, diese Textdatei so umzugestalten, daß sie möglichst universell ist (also nicht nur für Dreiecke mit Textur funktioniert) und derart in den Speicher gelesen wird, daß sie mit einem OpenGL-Befehl angezeigt werden kann. Damit war XPGL geboren.
[head]XPGL besteht also aus folgenden Komponenten[/head] Da ist zunächst die XPGL-Datei, die die Daten der darzustellenden "Welt" enthält.
Dann gibt es eine Datenstruktur in XProfan, die diese Werte aufnimmt. Mit @oGL("LoadXPGL " kann eine XPGL-datei in den Speicher geladen werden. Es können bis zu 1999 XPGL-Dateien gleichzeitig im Speicher sein, wenn die Ausstattung des Rechners mit RAM es hergibt.
Mit der @oGL("UseXPGL " werden die Daten einer XPGL-Datenstruktur blitzschnell an das OpenGL-System übetragen. Ab hier übernimmt die Grafik-Karte, sofern sie OpenGL-fähig ist. (Bei älteren Karten käme hier der OpenGL-Treiber und der RAM des Rechners zum Einsatz, was nicht sehr effizient ist.)
Das letzte Glied in der Kette ist die Funktion @oGL("DrawXPGL ", mit der die komplette "Welt" (oder ein beliebiger Teil derselben) auf den OpenGL-Bildschirm gebracht wird.
Als zusätzliche Möglichkeit ist noch vorgesehen, die geladenen XPGL-Daten mit o@GL("SaveXPGLData " als binäres Datenfile abzuspeichern und mit oGL("LoadXPGLData " wieder zu laden. Mit @oGL("CreateXPGL " kann man XPGL-Daten auch direkt im Programm erzeugen. @oGL("XPGLCount " ermittel die Anzahl der Punkte in den XPGL-Daten, @oGL("XPGLObjType " ermittelt den Objekttyp und @oGL("XPGLType " die Art der Werte.
[head]Das Format einer XPGL-Datei[/head] Eine XPGL-Datei ist ein Textdatei. Zeilen die mit einem "/" beginnen, werden als Kommentarzeilen interpretiert und überlesen. Leerzeilen dienen der Gliederung und werden auch überlesen.
Wichtig ist die 1. Daten-Zeile: Sie hat die Struktur Objekttyp; Art der Werte; Anzahl[; Autonormal] (4 Werte, durch Komma getrennt). Autonormal kann weggelassen werden. Die anderen Werte müssen vorhanden sein.
Objekttyp:
·P = Punkt ·L = Line ·T = Triangle ·Q = Quad ·LS = Line-Strip ·LL = Line-Loop ·TS = Triangle-Strip ·TF = Triangle-Fan ·QS = Quad-Strip ·PY = Polygon
Art der Werte:
·V = Vertex (Koordinaten des Punktes: 3 Werte/Punkt) ·C = Color (4 Werte/Punkt) ·T = Textur (2 Werte/Punkt) ·N = Normal(3 Werte/Punkt)
Beispiel: VT (Vertex + Textur)
Das V für Vertex muß immer vorhanden sein.
Anzahl:
Anzahl der Objekte (bei Q, T und L) bzw. Anzahl der Punkte (bei allen anderen).Ein Quad hat 4, ein Triangle hat 3 und eine Line hat 2 Punkte
4 Werte für "Autonormal":
x, y und z für den Mittelpunkt des Objektes und der Normalwert (0.5 wenn die Beleuchtung von außen kommt, -0.5 wenn sie von innen kommt). Werden diese Werte trotz des Kennzeichens "N" weggelassen, werden hierfür die Defaultwerte von 0, 0, 0, 0.5 angenommen.
Beispiele für eine 1. Zeile:
T;VT;36 (36 Triangles mit Vertex und Textur)
T;VTN;36;0,-0.5,-2,0.5 (zusätzlich automatisches Erstellen des Normal-Vektors, wenn keine Normal-Werte vorhanden sind
Die weiteren Zeilen enthalten die Wertegruppen: Gruppen getrennt durch ";", Werte getrennt durch ",". Das Dezimaltrennzeichen bei den Werten ist der Punkt. Die Wertegruppen müssen in der gleichen Reihenfolge stehen, wie die Kennzeichen für die Art der Werte. Im Falle von "VT" stehen also in jeder Zeile zunächst die drei durch Komma getrennten Koordinaten, dann folgen nach einem Semikolon die beiden durch ein Komma getrennten Textur-Koordinaten.
Wird bei der Werteart N mit angegeben, liegen aber keine N-Werte vor, werden diese automatisch generiert.
Eine ausführlichere Beschreibung mit Beispielen findet sich im ogl->xpgl
[head]Beispielinhalt einer XPGL-Datei:[/head]
T;VT;36
// Normale sind nicht angegeben, daher wird 1, 1, 1 genommen
// Floor 1
-13.0, 0, -13.0; 0.0, 130.0
-13.0, 0, 13.0; 0.0, 0.0
13.0, 0, 13.0; 130.0, 0.0
-13.0, 0, -13.0; 0.0, 130.0
13.0, 0, -13.0; 130.0, 130.0
13.0, 0, 13.0; 130.0, 0.0
// Ceiling 1
-3.0, 1.0, -3.0; 0.0, 1.0
-3.0, 1.0, 3.0; 0.0, 0.0
3.0, 1.0, 3.0; 1.0, 0.0
-3.0, 1.0, -3.0; 0.0, 1.0
3.0, 1.0, -3.0; 1.0, 1.0
3.0, 1.0, 3.0; 1.0, 0.0
// A1
-2.0, 1.0, -2.0; 0.0, 1.0
-2.0, 0.0, -2.0; 0.0, 0.0
-0.5, 0.0, -2.0; 1.5, 0.0
-2.0, 1.0, -2.0; 0.0, 1.0
-0.5, 1.0, -2.0; 1.5, 1.0
-0.5, 0.0, -2.0; 1.5, 0.0
// A2
2.0, 1.0, -2.0; 2.0, 1.0
2.0, 0.0, -2.0; 2.0, 0.0
0.5, 0.0, -2.0; 0.5, 0.0
2.0, 1.0, -2.0; 2.0, 1.0
0.5, 1.0, -2.0; 0.5, 1.0
0.5, 0.0, -2.0; 0.5, 0.0
// B1
-2.0, 1.0, 2.0; 2.0, 1.0
-2.0, 0.0, 2.0; 2.0, 0.0
-0.5, 0.0, 2.0; 0.5, 0.0
-2.0, 1.0, 2.0; 2.0, 1.0
-0.5, 1.0, 2.0; 0.5, 1.0
-0.5, 0.0, 2.0; 0.5, 0.0
// B2
2.0, 1.0, 2.0; 2.0, 1.0
2.0, 0.0, 2.0; 2.0, 0.0
0.5, 0.0, 2.0; 0.5, 0.0
2.0, 1.0, 2.0; 2.0, 1.0
0.5, 1.0, 2.0; 0.5, 1.0
0.5, 0.0, 2.0; 0.5, 0.0
// C1
-2.0, 1.0, -2.0; 0.0, 1.0
-2.0, 0.0, -2.0; 0.0, 0.0
-2.0, 0.0, -0.5; 1.5, 0.0
-2.0, 1.0, -2.0; 0.0, 1.0
-2.0, 1.0, -0.5; 1.5, 1.0
-2.0, 0.0, -0.5; 1.5, 0.0
// C2
-2.0, 1.0, 2.0; 2.0, 1.0
-2.0, 0.0, 2.0; 2.0, 0.0
-2.0, 0.0, 0.5; 0.5, 0.0
-2.0, 1.0, 2.0; 2.0, 1.0
-2.0, 1.0, 0.5; 0.5, 1.0
-2.0, 0.0, 0.5; 0.5, 0.0
// D1
2.0, 1.0, -2.0; 0.0, 1.0
2.0, 0.0, -2.0; 0.0, 0.0
2.0, 0.0, -0.5; 1.5, 0.0
2.0, 1.0, -2.0; 0.0, 1.0
2.0, 1.0, -0.5; 1.5, 1.0
2.0, 0.0, -0.5; 1.5, 0.0
// D2
2.0, 1.0, 2.0; 2.0, 1.0
2.0, 0.0, 2.0; 2.0, 0.0
2.0, 0.0, 0.5; 0.5, 0.0
2.0, 1.0, 2.0; 2.0, 1.0
2.0, 1.0, 0.5; 0.5, 1.0
2.0, 0.0, 0.5; 0.5, 0.0
// Upper hallway - L
-0.5, 1.0, -3.0; 0.0, 1.0
-0.5, 0.0, -3.0; 0.0, 0.0
-0.5, 0.0, -2.0; 1.0, 0.0
-0.5, 1.0, -3.0; 0.0, 1.0
-0.5, 1.0, -2.0; 1.0, 1.0
-0.5, 0.0, -2.0; 1.0, 0.0
// Upper hallway - R
0.5, 1.0, -3.0; 0.0, 1.0
0.5, 0.0, -3.0; 0.0, 0.0
0.5, 0.0, -2.0; 1.0, 0.0
0.5, 1.0, -3.0; 0.0, 1.0
0.5, 1.0, -2.0; 1.0, 1.0
0.5, 0.0, -2.0; 1.0, 0.0
// Lower hallway - L
-0.5, 1.0, 3.0; 0.0, 1.0
-0.5, 0.0, 3.0; 0.0, 0.0
-0.5, 0.0, 2.0; 1.0, 0.0
-0.5, 1.0, 3.0; 0.0, 1.0
-0.5, 1.0, 2.0; 1.0, 1.0
-0.5, 0.0, 2.0; 1.0, 0.0
// Lower hallway - R
0.5, 1.0, 3.0; 0.0, 1.0
0.5, 0.0, 3.0; 0.0, 0.0
0.5, 0.0, 2.0; 1.0, 0.0
0.5, 1.0, 3.0; 0.0, 1.0
0.5, 1.0, 2.0; 1.0, 1.0
0.5, 0.0, 2.0; 1.0, 0.0
// Left hallway - Lw
-3.0, 1.0, 0.5; 1.0, 1.0
-3.0, 0.0, 0.5; 1.0, 0.0
-2.0, 0.0, 0.5; 0.0, 0.0
-3.0, 1.0, 0.5; 1.0, 1.0
-2.0, 1.0, 0.5; 0.0, 1.0
-2.0, 0.0, 0.5; 0.0, 0.0
// Left hallway - Hi
-3.0, 1.0, -0.5; 1.0, 1.0
-3.0, 0.0, -0.5; 1.0, 0.0
-2.0, 0.0, -0.5; 0.0, 0.0
-3.0, 1.0, -0.5; 1.0, 1.0
-2.0, 1.0, -0.5; 0.0, 1.0
-2.0, 0.0, -0.5; 0.0, 0.0
// Right hallway - Lw
3.0, 1.0, 0.5; 1.0, 1.0
3.0, 0.0, 0.5; 1.0, 0.0
2.0, 0.0, 0.5; 0.0, 0.0
3.0, 1.0, 0.5; 1.0, 1.0
2.0, 1.0, 0.5; 0.0, 1.0
2.0, 0.0, 0.5; 0.0, 0.0
// Right hallway - Hi
3.0, 1.0, -0.5; 1.0, 1.0
3.0, 0.0, -0.5; 1.0, 0.0
2.0, 0.0, -0.5; 0.0, 0.0
3.0, 1.0, -0.5; 1.0, 1.0
2.0, 1.0, -0.5; 0.0, 1.0
2.0, 0.0, -0.5; 0.0, 0.0
|
|