paint: atlas fixes
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user