Fix blending issues

master
Elias Fleckenstein 2022-04-17 21:16:08 +02:00
parent 637f50d9bd
commit 639fa5993f
No known key found for this signature in database
GPG Key ID: 06927A5199D6C9B2
2 changed files with 17 additions and 8 deletions

View File

@ -18,7 +18,6 @@ static List scene_new;
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
@ -130,7 +129,7 @@ static ModelNode *clone_node(ModelNode *original, ModelNode *parent)
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)
@ -421,7 +420,7 @@ void model_node_add_batch(ModelNode *node, ModelBatch *batch)
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];

View File

@ -16,6 +16,7 @@ typedef struct {
bool visible;
bool transparent;
ModelBatch *batch;
ModelBatch *batch_transparent;
TerrainChunk *chunk;
v3s32 chunkp;
TerrainChunk *nbrs[6];
@ -121,8 +122,12 @@ static inline void render_node(ChunkRenderData *data, v3s32 offset)
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];
@ -132,7 +137,7 @@ static inline void render_node(ChunkRenderData *data, v3s32 offset)
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);
}
}
}
@ -157,6 +162,7 @@ static Model *create_chunk_model(TerrainChunk *chunk, bool animate)
.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},
@ -167,8 +173,9 @@ static Model *create_chunk_model(TerrainChunk *chunk, bool animate)
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;
}
@ -186,10 +193,13 @@ static Model *create_chunk_model(TerrainChunk *chunk, bool animate)
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;
}