aboutsummaryrefslogtreecommitdiff
path: root/09-september/tomcat/renderer/mesh.c
blob: 7ef27dcc02d6e0c23a682211896f07db56721b17 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include <stdlib.h>
#include <stddef.h>
#include <string.h>

#include "mesh.h"
#include "renderer.h"

#define NUM_ARRAY_ELEMENTS(a) sizeof(a) / sizeof(*a)

Mesh *mesh_new(vertex_t* vertices, GLsizeiptr vertexBuffersize,
               GLushort* indices, GLsizeiptr indexBuffersize)
{
    Mesh *mesh;
    mesh = malloc( sizeof(Mesh) );
    memset(mesh, 0, sizeof(Mesh) );

    render.meshes[render.num_meshes] = mesh;
    render.num_meshes += 1;

    mesh->num_indices = ( indexBuffersize / sizeof(GLushort) );

    glGenVertexArrays(1, &mesh->vao);
    glGenBuffers(1, &mesh->vbo);
    glGenBuffers(1, &mesh->ebo);

    glBindVertexArray(mesh->vao);

    glBindBuffer(GL_ARRAY_BUFFER, mesh->vbo);
    glBufferData(GL_ARRAY_BUFFER, vertexBuffersize, vertices, GL_STATIC_DRAW);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh->ebo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexBuffersize, indices, GL_STATIC_DRAW);

    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glEnableVertexAttribArray(2);
    glEnableVertexAttribArray(3);

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(vertex_t), (const void*)offsetof(vertex_t, position) );
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(vertex_t), (const void*)offsetof(vertex_t, texCoord) );
    glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(vertex_t), (const void*)offsetof(vertex_t, normal) );
    glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(vertex_t), (const void*)offsetof(vertex_t, tangent) );

    glBindVertexArray(0);
    return mesh;
}

Mesh *mesh_make_skybox(float size)
{
    Mesh *mesh;
    mesh = malloc( sizeof(Mesh) );
    memset(mesh, 0, sizeof(Mesh) );

    render.meshes[render.num_meshes] = mesh;
    render.num_meshes += 1;

    Vec3 positions[] =
    {
        {-size,  size, -size}, {-size, -size, -size}, {+size, -size, -size},
        {+size, -size, -size}, {+size, +size, -size}, {-size, +size, -size},

	    {-size, -size, +size}, {-size, -size, -size}, {-size, +size, -size},
	    {-size, +size, -size}, {-size, +size, +size}, {-size, -size, +size},

        {+size, -size, -size}, {+size, -size, +size}, {+size, +size, +size},
	    {+size, +size, +size}, {+size, +size, -size}, {+size, -size, -size},

	    {-size, -size, +size}, {-size, +size, +size}, {+size, +size, +size},
	    {+size, +size, +size}, {+size, -size, +size}, {-size, -size, +size},

	    {-size, +size, -size}, {+size, +size, -size}, {+size, +size, +size},
	    {+size, +size, +size}, {-size, +size, +size}, {-size, +size, -size},

	    {-size, -size, -size}, {-size, -size, +size}, {+size, -size, -size},
	    {+size, -size, -size}, {-size, -size, +size}, {+size, -size, +size}
	};

    mesh->num_indices = 0;
    mesh->num_vertices = NUM_ARRAY_ELEMENTS(positions);

    glGenVertexArrays(1, &mesh->vao);
    glGenBuffers(1, &mesh->vbo);
    mesh->ebo = 0;

    glBindVertexArray(mesh->vao);

    glBindBuffer(GL_ARRAY_BUFFER, mesh->vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW);

    glEnableVertexAttribArray(0);

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0 );

    glBindVertexArray(0);
    return mesh;
}

Mesh *mesh_make_quad()
{
    Mesh *mesh;
    mesh = malloc( sizeof(Mesh) );
    memset(mesh, 0, sizeof(Mesh) );

    render.meshes[render.num_meshes] = mesh;
    render.num_meshes += 1;

    Vec3 positions[] =
    {
        { -0.5f, +0.5f, +0.0f}, { -0.5f, -0.5f, +0.0f},
        { +0.5f, +0.5f, +0.0f}, { +0.5f, -0.5f, +0.0f}
    };

    mesh->num_vertices = NUM_ARRAY_ELEMENTS(positions);
    mesh->num_indices = 0;

    glGenVertexArrays(1, &mesh->vao);
    glGenBuffers(1, &mesh->vbo);
    mesh->ebo = 0;

    glBindVertexArray(mesh->vao);

    glBindBuffer(GL_ARRAY_BUFFER, mesh->vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW);

    glEnableVertexAttribArray(0);

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0 );

    glBindVertexArray(0);
    return mesh;
}

void mesh_purge(Mesh *mesh)
{
    if(mesh)
    {
        if(mesh->vbo)
            glDeleteBuffers(1, &mesh->vbo);
        if(mesh->ebo)
            glDeleteBuffers(1, &mesh->ebo);
        if(mesh->vao)
            glDeleteVertexArrays(1, &mesh->vao);

        memset(mesh, 0, sizeof(Mesh));
    }
}