static pthread_mutex_t lock_scene_new;
static GLint units;
-// fixme: blending issues still occur
static int cmp_batch_texture(const ModelBatchTexture *ta, const ModelBatchTexture *tb)
{
return
static int cmp_model(const Model *model, const f32 *distance)
{
- return f32_cmp(&model->distance, distance);
+ return -f32_cmp(&model->distance, distance);
}
static void render_model(Model *model)
size_t num_meshes = ceil((double) batch->textures.siz / (double) units);
array_grw(&node->meshes, num_meshes);
- ModelMesh *meshes = node->meshes.ptr + node->meshes.siz - num_meshes;
+ ModelMesh *meshes = &((ModelMesh *) node->meshes.ptr)[node->meshes.siz - num_meshes];
for (size_t m = 0; m < num_meshes; m++) {
ModelMesh *mesh = &meshes[m];
bool visible;
bool transparent;
ModelBatch *batch;
+ ModelBatch *batch_transparent;
TerrainChunk *chunk;
v3s32 chunkp;
TerrainChunk *nbrs[6];
data->visible = true;
}
- if (def->visibility == VISIBILITY_BLEND)
+ ModelBatch *batch = data->batch;
+
+ if (def->visibility == VISIBILITY_BLEND) {
data->transparent = true;
+ batch = data->batch_transparent;
+ }
for (args.v = 0; args.v < 6; args.v++) {
args.vertex.cube = cube_vertices[args.f][args.v];
if (def->render)
def->render(&args);
- model_batch_add_vertex(data->batch, def->tiles.textures[args.f]->txo, &args.vertex);
+ model_batch_add_vertex(batch, def->tiles.textures[args.f]->txo, &args.vertex);
}
}
}
.visible = false,
.transparent = false,
.batch = model_batch_create(&model_shader, &terrain_vertex_layout, offsetof(TerrainVertex, textureIndex)),
+ .batch_transparent = model_batch_create(&model_shader, &terrain_vertex_layout, offsetof(TerrainVertex, textureIndex)),
.chunk = chunk,
.chunkp = v3s32_scale(chunk->pos, CHUNK_SIZE),
.nbrs = {NULL},
CHUNK_ITERATE
render_node(&data, (v3s32) {x, y, z});
- if (!data.batch->textures.siz) {
+ if (!data.batch->textures.siz && !data.batch_transparent->textures.siz) {
model_batch_free(data.batch);
+ model_batch_free(data.batch_transparent);
return NULL;
}
model->root->pos = v3f32_add(v3s32_to_f32(data.chunkp), center_offset);
model->root->scale = (v3f32) {0.0f, 0.0f, 0.0f};
- if (data.visible)
+ if (data.visible) {
model_node_add_batch(model->root, data.batch);
- else
+ model_node_add_batch(model->root, data.batch_transparent);
+ } else {
model_batch_free(data.batch);
+ model_batch_free(data.batch_transparent);
+ }
return model;
}