Fix T83187: Unselected UVs shows selected on linked meshes.

When uv editing objects that share the same mesh only the selection
state can get confused. The cause is that the UV editor uses a
particular order of objects and store its state in the first object of a
mesh it hasn't handled. During drawing this state is updated into the
GPU buffers. In the case of linked meshes it can happen that the GPU
buffers are updated based on the object that does not have the correct
selection state making th selection VBOs incorrect.

This patch adds a work around that uses the order that the UV editor is
also using so the GPU buffers are built with the right data.
This commit is contained in:
Jeroen Bakker 2021-01-27 14:17:53 +01:00
parent 4fbeb3e6be
commit f83aa830cd
3 changed files with 20 additions and 5 deletions

@ -26,6 +26,7 @@
#include "BKE_editmesh.h"
#include "BKE_image.h"
#include "BKE_layer.h"
#include "BKE_mask.h"
#include "BKE_paint.h"
@ -45,6 +46,9 @@
#include "overlay_private.h"
/* Forward declarations. */
static void overlay_edit_uv_cache_populate(OVERLAY_Data *vedata, Object *ob);
typedef struct OVERLAY_StretchingAreaTotals {
void *next, *prev;
float *total_area;
@ -393,9 +397,24 @@ void OVERLAY_edit_uv_cache_init(OVERLAY_Data *vedata)
DRW_shgroup_uniform_vec4_copy(grp, "color", (float[4]){1.0f, 1.0f, 1.0f, 1.0f});
DRW_shgroup_call_obmat(grp, geom, NULL);
}
/* HACK: When editing objects that share the same mesh we should only draw the
* first one in the order that is used during uv editing. We can only trust that the first object
* has the correct batches with the correct selection state. See T83187. */
if (pd->edit_uv.do_uv_overlay || pd->edit_uv.do_uv_shadow_overlay) {
uint objects_len = 0;
Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(
draw_ctx->view_layer, NULL, &objects_len);
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
Object *object_eval = DEG_get_evaluated_object(draw_ctx->depsgraph, objects[ob_index]);
DRW_mesh_batch_cache_validate((Mesh *)object_eval->data);
overlay_edit_uv_cache_populate(vedata, object_eval);
}
MEM_freeN(objects);
}
}
void OVERLAY_edit_uv_cache_populate(OVERLAY_Data *vedata, Object *ob)
static void overlay_edit_uv_cache_populate(OVERLAY_Data *vedata, Object *ob)
{
OVERLAY_StorageList *stl = vedata->stl;
OVERLAY_PrivateData *pd = stl->pd;

@ -298,9 +298,6 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob)
OVERLAY_PrivateData *pd = data->stl->pd;
if (pd->space_type == SPACE_IMAGE) {
if (ob->type == OB_MESH) {
OVERLAY_edit_uv_cache_populate(vedata, ob);
}
return;
}

@ -555,7 +555,6 @@ void OVERLAY_edit_particle_draw(OVERLAY_Data *vedata);
void OVERLAY_edit_uv_init(OVERLAY_Data *vedata);
void OVERLAY_edit_uv_cache_init(OVERLAY_Data *vedata);
void OVERLAY_edit_uv_cache_populate(OVERLAY_Data *vedata, Object *ob);
void OVERLAY_edit_uv_draw(OVERLAY_Data *vedata);
void OVERLAY_extra_cache_init(OVERLAY_Data *vedata);