paint: atlas fixes

This commit is contained in:
luboslenco
2026-06-02 19:36:16 +02:00
parent b3701ae7d3
commit b1d00741ee
3 changed files with 30 additions and 9 deletions
+28 -7
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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;