Alles was nun folgt spielt sich innerhalb der Szene ab. Da wir mit dynamischer Speicherzuweisung arbeiten benötigen wir Funktionen aus der <stdlib.h> die wir oben in der scene.c einbinden müssen.

#include <stdlib.h>

Anschließend definieren wir das THM Grün mit unserem neuen Datentyp color. Und wir erstellen eine Variable in der wir einen grünen Würfel speichern wollen.

static const color thmGreen = {0.5f, 0.73f, 0.14f, 1.0f};

static mesh greenCube;

Und dann benötigen wir noch die nötige Funktion, die die Eckpunkte dieses Würfels berechnet, den Speicherbereich zuweist und den Würfel erzeugt.

static mesh createCubeMesh(color col)
{
    vertex* vertices = (vertex *)calloc(24, sizeof(vertex));
    vertices[0] = (vertex){ { -1, -1,  1 }, col };
    vertices[1] = (vertex){ {  1, -1,  1 }, col };
    vertices[2] = (vertex){ {  1,  1,  1 }, col };
    vertices[3] = (vertex){ { -1,  1,  1 }, col };
    for (int i = 1; i < 6; i++)
    {
        matrix rotationMatrix;
        if (i <= 3) rotationMatrix = matrixRotateY(deg2rad(90.0f * i));
        if (i == 4) rotationMatrix = matrixRotateX(deg2rad(90.0f));
        if (i == 5) rotationMatrix = matrixRotateX(deg2rad(-90.0f));
        vertices[i * 4 + 0] = (vertex){ matrixVector3Multiply(rotationMatrix, vertices[0].pos), col };
        vertices[i * 4 + 1] = (vertex){ matrixVector3Multiply(rotationMatrix, vertices[1].pos), col };
        vertices[i * 4 + 2] = (vertex){ matrixVector3Multiply(rotationMatrix, vertices[2].pos), col };
        vertices[i * 4 + 3] = (vertex){ matrixVector3Multiply(rotationMatrix, vertices[3].pos), col };
    }
    return (mesh){
        vcount: 24,
        vertices: vertices
    };
}

Mesh laden, rendern und entladen

Innerhalb der Funktion loadScene können wir nun unseren Würfel laden:

greenCube = createCubeMesh(thmGreen);

In der renderScene können wir ihn rendern:

renderMesh(greenCube, matrixTranslate(0,0,0));

Und in der unloadScene müssen wir den Speicher wieder freigeben:

free(greenCube.vertices);