From b1d00741ee2c0b92b07e47b25fbd949061cc4a53 Mon Sep 17 00:00:00 2001 From: luboslenco Date: Tue, 2 Jun 2026 19:36:16 +0200 Subject: [PATCH] paint: atlas fixes --- paint/sources/export_texture.c | 35 +++++++++++++++++++++++++++------- paint/sources/slot_layer.c | 2 +- paint/sources/util_uv.c | 2 +- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/paint/sources/export_texture.c b/paint/sources/export_texture.c index 9176e753..b443e830 100644 --- a/paint/sources/export_texture.c +++ b/paint/sources/export_texture.c @@ -558,18 +558,39 @@ void export_texture_run(char *path, bool bake_material) { } } if (atlas_export) { + string_array_t *used_atlases = project_get_used_atlases(); for (i32 atlas_index = 0; atlas_index < project_atlas_objects->length; ++atlas_index) { - slot_layer_t_array_t *layers = any_array_create_from_raw((void *[]){}, 0); + // Skip atlases that no object is assigned to + bool atlas_used = false; for (i32 object_index = 0; object_index < project_atlas_objects->length; ++object_index) { if (project_atlas_objects->buffer[object_index] == atlas_index) { - for (i32 i = 0; i < project_layers->length; ++i) { - slot_layer_t *l = project_layers->buffer[i]; - if (slot_layer_get_object_mask(l) == 0 || // shared object - slot_layer_get_object_mask(l) - 1 == object_index) { - any_array_push(layers, l); - } + atlas_used = true; + break; + } + } + if (!atlas_used) { + continue; + } + slot_layer_t_array_t *layers = any_array_create_from_raw((void *[]){}, 0); + for (i32 i = 0; i < project_layers->length; ++i) { + slot_layer_t *l = project_layers->buffer[i]; + i32 mask = slot_layer_get_object_mask(l); + bool add = false; + if (mask == 0) { // Shared object + add = true; + } + else if (mask <= project_paint_objects->length) { // Specific object + add = project_atlas_objects->buffer[mask - 1] == atlas_index; + } + else if (used_atlases != NULL) { // Atlas + i32 used_index = mask - project_paint_objects->length - 1; + if (used_index < used_atlases->length) { + add = string_array_index_of(project_atlas_names, used_atlases->buffer[used_index]) == atlas_index; } } + if (add) { + any_array_push(layers, l); + } } if (layers->length > 0) { export_texture_run_layers(path, layers, project_atlas_names->buffer[atlas_index], false); diff --git a/paint/sources/slot_layer.c b/paint/sources/slot_layer.c index e4377483..19a097b2 100644 --- a/paint/sources/slot_layer.c +++ b/paint/sources/slot_layer.c @@ -1330,7 +1330,7 @@ void layers_set_object_mask() { context_select_paint_object(o); } else { - bool is_atlas = slot_layer_get_object_mask(g_context->layer) > 0 && slot_layer_get_object_mask(g_context->layer) <= project_paint_objects->length; + bool is_atlas = slot_layer_get_object_mask(g_context->layer) > project_paint_objects->length; if (g_context->merged_object == NULL || is_atlas || g_context->merged_object_is_atlas) { mesh_object_t_array_t *visibles = is_atlas ? project_get_atlas_objects(slot_layer_get_object_mask(g_context->layer)) : NULL; util_mesh_merge(visibles); diff --git a/paint/sources/util_uv.c b/paint/sources/util_uv.c index 4daa5f8d..97fca963 100644 --- a/paint/sources/util_uv.c +++ b/paint/sources/util_uv.c @@ -26,7 +26,7 @@ void util_uv_cache_uv_map() { util_uv_uvmap_cached = true; i32 mask = slot_layer_get_object_mask(g_context->layer); - mesh_object_t *merged = mask > 0 ? project_paint_objects->buffer[mask - 1] : g_context->merged_object; + mesh_object_t *merged = (mask > 0 && mask <= project_paint_objects->length) ? project_paint_objects->buffer[mask - 1] : g_context->merged_object; mesh_data_t *mesh = (g_context->layer_filter == 0 && merged != NULL) ? merged->data : g_context->paint_object->data; i16_array_t *texa = mesh->vertex_arrays->buffer[2]->values;