static Array make_vertices(MapBlock *block)
{
- Array vertices = array_create(sizeof(GLfloat) * 6);
+ Array vertices = array_create(sizeof(Vertex));
ITERATE_MAPBLOCK {
NodeDefintion *def = &GNODDEF(block, x, y, z);
};
if (VALIDPOS(npos) && ! GNODDEF(block, npos.x, npos.y, npos.z).visible) {
for (int v = 0; v < 6; v++) {
- GLfloat vertex[6] = {
+ Vertex vertex = {
vpos[f][v].x + offset.x,
vpos[f][v].y + offset.y,
vpos[f][v].z + offset.z,
while (! meshgen.cancel) {
ListPair **lptr = &meshgen.queue.first;
if (*lptr) {
- MapBlock *block = map_get_block(meshgen.map, *(v3s32 *)(*lptr)->key, false);
+ MapBlock *block = (*lptr)->key;
pthread_mutex_lock(&meshgen.mtx);
- free((*lptr)->key);
- *lptr = (*lptr)->next;
+ ListPair *next = (*lptr)->next;
+ free(*lptr);
+ *lptr = next;
pthread_mutex_unlock(&meshgen.mtx);
Array vertices = make_vertices(block);
static void enqueue_block(MapBlock *block)
{
- v3s32 *posptr = malloc(sizeof(v3s32));
- *posptr = block->pos;
pthread_mutex_lock(&meshgen.mtx);
- if (! list_put(&meshgen.queue, posptr, NULL))
- free(posptr);
+ list_put(&meshgen.queue, block, NULL);
pthread_mutex_unlock(&meshgen.mtx);
}
-static bool compare_positions(void *p1, void *p2)
-{
- v3s32 *pos1 = p1;
- v3s32 *pos2 = p2;
- return pos1->x == pos2->x && pos1->y == pos2->y && pos1->z == pos2->z;
-}
-
void mapblock_meshgen_init(Map *map, Scene *scene)
{
meshgen.map = map;
meshgen.scene = scene;
- meshgen.queue = list_create(&compare_positions);
+ meshgen.queue = list_create(NULL);
pthread_mutex_init(&meshgen.mtx, NULL);
map->on_block_add = &enqueue_block;
map->on_block_change = &enqueue_block;
#include <stdlib.h>
#include "mesh.h"
-Mesh *mesh_create(GLfloat *vertices, GLsizei count)
+Mesh *mesh_create(Vertex *vertices, GLsizei count)
{
Mesh *mesh = malloc(sizeof(Mesh));
mesh->pos = (v3f) {0.0f, 0.0f, 0.0f};
mesh->VAO = 0;
mesh->VBO = 0;
mesh->remove = false;
- mesh->vertices = vertices;
+ mesh->vertices = (GLfloat *) vertices;
mesh->count = count;
return mesh;
}
GLsizei count;
} Mesh;
-Mesh *mesh_create(GLfloat *vertices, GLsizei count);
+typedef struct
+{
+ GLfloat x, y, z;
+ GLfloat r, g, b;
+} __attribute__((packed, aligned(4))) Vertex;
+
+Mesh *mesh_create(Vertex *vertices, GLsizei count);
void mesh_delete(Mesh *mesh);
void mesh_transform(Mesh *mesh);
void mesh_render(Mesh *mesh, ShaderProgram *prog);