Fix T69941 Assert selecting UVs
authorClément Foucault <foucault.clem@gmail.com>
Fri, 27 Sep 2019 14:40:18 +0000 (16:40 +0200)
committerClément Foucault <foucault.clem@gmail.com>
Fri, 27 Sep 2019 15:19:00 +0000 (17:19 +0200)
Was caused by DRW_mesh_batch_cache_get_edituv_faces_stretch_area called
after DRW_mesh_batch_cache_create_requested. So it was created on the wrong
object/mesh.

source/blender/draw/intern/draw_cache_impl.h
source/blender/draw/intern/draw_cache_impl_mesh.c
source/blender/editors/uvedit/uvedit_draw.c

index 970b6053cf94a63c4704c0b2a9354fd5355e807c..cdc1791b153c748f904a93de7abda448b0a0e150 100644 (file)
@@ -151,8 +151,8 @@ struct GPUBatch *DRW_mesh_batch_cache_get_verts_with_select_id(struct Mesh *me);
 struct GPUBatch *DRW_mesh_batch_cache_get_wireframes_face(struct Mesh *me);
 /* edit-mesh UV editor */
 struct GPUBatch *DRW_mesh_batch_cache_get_edituv_faces_stretch_area(struct Mesh *me,
-                                                                    float *tot_area,
-                                                                    float *tot_uv_area);
+                                                                    float **tot_area,
+                                                                    float **tot_uv_area);
 struct GPUBatch *DRW_mesh_batch_cache_get_edituv_faces_stretch_angle(struct Mesh *me);
 struct GPUBatch *DRW_mesh_batch_cache_get_edituv_faces(struct Mesh *me);
 struct GPUBatch *DRW_mesh_batch_cache_get_edituv_edges(struct Mesh *me);
index e399b784145d4d49eb64573e6f29f7cf535b6c42..77b9daa959df9e3aebd060dbe6c6089a9613a2cb 100644 (file)
@@ -882,18 +882,18 @@ GPUBatch *DRW_mesh_batch_cache_get_verts_with_select_id(Mesh *me)
  * The `cache->tot_area` and cache->tot_uv_area` update are calculation are
  * only valid after calling `DRW_mesh_batch_cache_create_requested`. */
 GPUBatch *DRW_mesh_batch_cache_get_edituv_faces_stretch_area(Mesh *me,
-                                                             float *tot_area,
-                                                             float *tot_uv_area)
+                                                             float **tot_area,
+                                                             float **tot_uv_area)
 {
   MeshBatchCache *cache = mesh_batch_cache_get(me);
   texpaint_request_active_uv(cache, me);
   mesh_batch_cache_add_request(cache, MBC_EDITUV_FACES_STRETCH_AREA);
 
   if (tot_area != NULL) {
-    *tot_area = cache->tot_area;
+    *tot_area = &cache->tot_area;
   }
   if (tot_uv_area != NULL) {
-    *tot_uv_area = cache->tot_uv_area;
+    *tot_uv_area = &cache->tot_uv_area;
   }
   return DRW_batch_request(&cache->batch.edituv_faces_stretch_area);
 }
index bd9419684185351aa2de18e002cec3fd2f3d17bf..fafd54804c037e1b4399cea76f5f544665b2801d 100644 (file)
@@ -177,6 +177,7 @@ static void uvedit_get_batches(Object *ob,
                                float *tot_area,
                                float *tot_area_uv)
 {
+  float *tmp_tot_area, *tmp_tot_area_uv;
   int drawfaces = draw_uvs_face_check(scene->toolsettings);
   const bool draw_stretch = (sima->flag & SI_DRAW_STRETCH) != 0;
   const bool draw_faces = (sima->flag & SI_NO_DRAWFACES) == 0;
@@ -193,7 +194,8 @@ static void uvedit_get_batches(Object *ob,
   }
 
   if (draw_stretch && (sima->dt_uvstretch == SI_UVDT_STRETCH_AREA)) {
-    batches->faces = DRW_mesh_batch_cache_get_edituv_faces_stretch_area(ob->data, NULL, NULL);
+    batches->faces = DRW_mesh_batch_cache_get_edituv_faces_stretch_area(
+        ob->data, &tmp_tot_area, &tmp_tot_area_uv);
   }
   else if (draw_stretch) {
     batches->faces = DRW_mesh_batch_cache_get_edituv_faces_stretch_angle(ob->data);
@@ -207,11 +209,11 @@ static void uvedit_get_batches(Object *ob,
 
   DRW_mesh_batch_cache_create_requested(ob, ob->data, scene, false, false);
 
-  /* after create_requested we can load the actual areas */
-  float tmp_tot_area, tmp_tot_area_uv;
-  DRW_mesh_batch_cache_get_edituv_faces_stretch_area(ob->data, &tmp_tot_area, &tmp_tot_area_uv);
-  *tot_area += tmp_tot_area;
-  *tot_area_uv += tmp_tot_area_uv;
+  if (draw_stretch && (sima->dt_uvstretch == SI_UVDT_STRETCH_AREA)) {
+    /* after create_requested we can load the actual areas */
+    *tot_area += *tmp_tot_area;
+    *tot_area_uv += *tmp_tot_area_uv;
+  }
 }
 
 static void draw_uvs_shadow(SpaceImage *UNUSED(sima),