Unsere Mathe Bibliothek benötigt ein paar Updates, damit wir alles umsetzen können was wir für dieses Kapitel benötigen.

Neue Datentypen

Zuerst fügen wir unserem Header ein paar zusätzliche Datentypen hinzu.

typedef struct {
    float x;
    float y;
    float z;
} vector3;

typedef struct {
    float r;
    float g;
    float b;
    float a;
} color;

typedef struct {
    vector3 pos;
    color color;
} vertex;

typedef struct {
    vertex* vertices;
    int vcount;
} mesh;

vector3: Eine Struktur mit 3 float-Komponenten (x,y,z) zur Darstellung von Vektoren im Raum.

color: Eine Struktur mit 4 float-Komponenten (red,green,blue,alpha) zur Darstellung von Farben.

vertex: Eine Struktur, bestehend aus einer Position und einer Farbe. Hiermit werden wir zukünftig die Eckpunkte unserer 3D Modelle definieren.

mesh: Eine Struktur welche eine dynamische Anzahl von Vertices enthalten kann und deren Anzahl im vcount Feld.

Denken sie daran, dass Sie diese Typdefinitionen innerhalb des IF-Block definieren müssen, genau wie die Matrix.

Neue Funktionen

Außerdem benötigen wir noch eine neue Funktion.

vector3 matrixVector3Multiply(matrix m, vector3 v);

Mit dieser Funktion sind wir in der Lage eine Matrix mit einem Vektor zu multiplizieren. Das Ergebnis ist wiederum ein Vektor. Dies ist super hilfreich, weil wir damit genau das tun können was die GPU intern tut. Wir können auf diese Weise Vektoren rotieren oder verschieben. Hier die Implementierung:

vector3 matrixVector3Multiply(matrix m, vector3 v)
{
    vector3 result = {
        m.m11 * v.x + m.m21 * v.y + m.m31 * v.z,
        m.m12 * v.x + m.m22 * v.y + m.m32 * v.z,
        m.m13 * v.x + m.m23 * v.y + m.m33 * v.z
    };
    return result;
}

Lesen Sie hierzu auch den Artikel auf Wikipedia. Insbesondere werden Sie dort auch Hinweise zu verschiedenen Implementierungen und deren Laufzeiten finden. Wie gesagt: Uns geht es hier in erster Linie um Lesbarkeit des Codes. Wir werden aber auf dieses Thema in einem zukünftigen Kapitel nochmal zu sprechen kommen.