git

Ja es ist passiert. Ich habe auf git umgestellt. Ich hatte zuletzt einige noch nicht ins SVN eingespielte Änderungen und habe an verschiedenen Sachen gleichzeitig gearbeitet. Ohne Versionsverwaltung ein echtes Problem. Einen eigenen Branch im SVN wollte ich auch nicht mehr. Die Lösung des Problems: git

Nun kann ich auf meiner Festplatte commits vornehmen ohne auf einen externen Server angewiesen sein. Kann also weiterentwickeln an noch nicht eingespielten Bereichen und habe dennoch eine Versionierung.

Natürlich ist git noch etwas gewöhnungsbedürftig. Aber ich denke mal, dass ich mich so langsam aber sicher eh einarbeiten muss, da ich davon ausgehe, dass die KDE langfristig auch ein git verwenden wird. Mal abwarten.

Texturierte Cube Caps

So heute morgen hab ich mal wieder ein bißchen an meinem Würfel gearbeitet. Es ist nun möglich auf die Cube caps ein Bild abzubilden. Um eins klarzustellen: es wird nicht einfach möglich sein, das Bild zu wechseln. Ich werde keine Konfiguration dazu anbieten. Die Caps sind als Branding Bereich gedacht. Also für das KDE-Logo oder Kubuntu Logo oder OpenSuSE Logo. Für die Distributionen wird es einfach das Bild auszutauschen – für den Nutzer jedoch nicht. Wird aber dennoch möglich sein. Mit einem Blick in den Code wird es sofort ersichtlich.

So hier der obligatorische Screenshot (bitte entschuldigt die schlechte Qualität des Logos – ich bin zu dumm Inkscape zu bedienen):
Texturierte Cube caps

Lineare Algebra

Ja man glaubt es kaum: ich habe heute mein “Mathematik für Informatiker” Buch vorgeholt und nachgelesen wie man Matrizen multipliziert. Hätte ja nicht gedacht, dass ich in dem Bereich mal was programmiere…

Wie kam es dazu? Mein Würfel hat mittlerweile Caps erhalten. Das Problem ist, dass man die Caps in der richtigen Reihenfolge zeichnen muss, weil sie sonst entweder Arbeitsflächen überdecken oder von welchen überdeckt werden. Für den Normalfall nicht kompliziert: wenn die Hälfte der Desktops gezeichnet ist, müssen die Caps gezeichnet werden.

Nun ist es aber auch möglich den Würfel vertikal zu rotieren und das ändert alles. Jetzt müssen die Caps vor bzw. nach dem Zeichnen des Würfels gezeichnet werden, falls der Würfel so weit geneigt ist, dass die hintere Wand höher ist als die vordere.

Und nun wird es kompliziert. Ich dachte ja ich komme mit Dreicksmathematik daran. Geschicktes Einsetzen von Winkeln mit Sinus, etc. Nach mehreren Stunden hab ich es aufgegeben und erkannt, dass es nicht anders geht. Mir wurde klar ich muss die Y-Werte ausrechnen und miteinander vergleichen.

Nun wie macht das OpenGL? Es gibt zwei Matrizen: die Modelview und die Projection Matrix. Die Modelview enthält sämtliche aktuellen Transformationen, die Projection die perspektivische Verzerrung. Also muss man die Koordinaten mit der Modelview Matrix multiplizieren (hier brauchte ich mein Buch), diese dann noch einmal mit der Projection Matrix. Nun hat man tolle Werte, die man nach bestimmten Regeln dividieren muss um schlussendlich den Viewport darauf zu multiplizieren und hier ist der y-Wert. Das ganze kann man gleich vier mal machen um alle Werte zu erhalten.

So und nach einem Tag Programmieren, an dem ich eigentlich Lernen wollte, habe ich nun einen schönen Würfel mit Cube Caps:

Zylinder

So das waren jetzt einige Stunden Arbeit, aber nachdem ich gerade festgestellt habe, dass sin() und cos() die Werte in Bogenmaß und nicht in Grad wollen, habe ich nun meinen Würfel in einen Zylinder umgewandelt.

Das Ganze ist komplizierter als es auf den ersten Blick aussehen mag. Zuerst muss man die Fenster in viele kleine Quadrate aufteilen, damit ein Fenster durch mehr als nur vier Vertizes beschrieben wird. Nun kommt ein Shader zum Einsatz, der jeden Vertex verändert. Und zwar wird der Z-Wert des Vertex so verändert, dass er auf dem Kreis liegt. Dafür ist natürlich ein bißchen Mathematik nötig und wer mich kennt, weiß dass Sinus und Kosinus noch nie zu meinen Freunden gehörten 😉 Daher ist der Code aktuell auch nur Proof of Concept und wird auch in einen eigenen Effekt ausgelagert.

Was vier Zeilen Code doch ausmachen können

Ich habe lange darüber gegrübelt und mich gewundert warum mein Würfel bei n>4 Arbeitsflächen nicht korrekt gezeichnet wird. Gestern Abend hab ich mir des Problems mal angenommen (Dank der vertikalen Rotationsmöglichkeit konnte ich den Bug endlich genau betrachten) und nach etwa einer Stunde herumprobieren hatte ich eine Lösung für n<8 Arbeitsflächen. Heute hab ich dann noch einmal Zeit investiert und hab das Problem lösen können. Nun wird die geometrische Figur für allgemein n Arbeitsflächen korrekt aufgespannt. So wie im folgenden Screenshot für die maximale Anzahl von 20 Arbeitsflächen (nicht, dass der Effekt dann benutzbar wäre). 20 Desktops

Richtig überrascht hat mich dann der Blick in den Diff. Nur vier Zeilen Code wurden verändert. Tja manchmal reicht wenig um viel zu erreichen. Andererseits hab ich somit knapp eine halbe Stunde pro Zeile gebraucht 😉
Die Rotation funktioniert für n<>4 jedoch immer noch nicht korrekt 🙁

Skydome

Nur damit ihr nicht denkt ich hätte heute vergessen einen neuen Screenshot zu zeigen 😉
Hab mich heute mal an dem Skydome Support versucht. Wie man sehen kann mit Erfolg. Leider gibt es aber noch keine GUI zum Konfigurieren des Hintergrundbildes – man muss noch die Konfig Datei bearbeiten. Plasma hat einen sehr schönen Dialog zum Auswählen eines Hintergrundbildes. Den würde ich auch ganz gerne verwenden, befindet sich aber noch nicht in den KDE Libs. Mal schauen was sich machen lässt.

So hier der Screenshot:

Hoch und runter

Ich war heute mal richtig fleißig und es lief gut, daher gibt es jetzt schon wieder einen Screenshot 😀
Vertical and horizontal rotation
Wie man sieht, kann man jetzt um eine weitere Achse rotieren. Mit den Cursor-Tasten Hoch und Runter kann man den Würfel jeweils um 90° nach oben oder nach unten drehen. Nicht, dass man das wirklich bräuchte, aber Compiz hat’s auch 😉
Obwohl ich es zuerst nicht so implementieren wollte, kann man den Würfel gleichzeitig nach links/rechts und oben/unten drehen. Die Animationen beeinflussen sich gegenseitig zum Glück nicht. Auf dem Screenshot kann man jetzt auch die Spiegelung besser erkennen. Und man sieht auch, dass da noch nicht alles stimmt 😉

Spiegelung

Und mal wieder ein neuer Screenshot:
Cube with reflection
Ich weiß es ist schwer zu erkennen, aber der Würfel wird nun gespiegelt. Das erfreuliche ist, dass es keinerlei Auswirkungen auf die Performance hat. Auch neu ist, dass man nun eine eigene Hintergrundfarbe festlegen kann. Das hat mir mal wieder die Stärken von C++ und der KDE API gezeigt. Im Qt-Designer einfach nur einen KColorButton eingefügt, in der Config Klasse bei Speichern und Laden den Wert ausgelesen, im Effekt auch Auslesen und als ClearColor definieren. Wenige Zeilen Code und tolle Auswirkung. So macht programmieren Spaß 😉

Linus’ Law nr 76

Don’t claim to have a config option, if you don’t actually have the UI to change it[1]

Um behaupten zu können, dass der Cube konfigurierbar ist, habe ich heute den passenden Dialog geschrieben. Noch ist es nicht viel, aber alle Optionen funktionieren bereits. Ein neues Feature hat dabei auch noch Einzug gehalten: Der Name der aktuell ausgewählten Arbeitsfläche wird angezeigt – natürlich auch ausschaltbar.

Cube Konfiguration

[1]: https://lists.linux-foundation.org/pipermail/desktop_architects/2007-February/002338.html

Rotation

Nachdem ich diese Woche eine Klausur geschrieben hatte, kann ich mich nun wieder voll auf meinen Würfel konzentrieren. Der Würfel wird nun anders gezeichnet. Bisher wurde jede Seite zuerst als Texture gespeichert und danach auf den Würfel angebracht. Dies hab ich nun ausgeschaltet: jede Seite wird direkt gerendert. Das hat den Vorteil, dass es auch auf älterer Hardware läuft und bedeutend schneller ist (nun ca. 25-30 FPS). Aber die Änderung hat auch ein paar Nachteile. So funktioniert das herumklappen der Fenster um die Würfelecken zur Zeit nicht mehr. Leider hab ich aktuell noch keine Idee, wie man dies lösen kann…

Nun hab ich auch begonnen die Rotation zu implementieren. Funktioniert bereits für den Spezialfall von 4 Arbeitsflächen – dem klassischen Würfel. Mit den Cursor Tasten kann der Würfel nach links und rechts rotiert werden; über die Tasten 1-4 (oder größer) kann direkt zu der gewählten Arbeitsfläche rotiert werden und der Effekt wird dann beendet. Selbstverständlich sucht der Effekt den schnellsten Weg zum Rotieren.

Rotierter Würfel
Das neue Standardhintergrundbild von KDE 4.1 ist meines Erachtens nach sehr gelungen.