Fix T69051 Vertex Paint: Selection not show in vertex select mode.
authorClément Foucault <foucault.clem@gmail.com>
Mon, 26 Aug 2019 16:43:46 +0000 (18:43 +0200)
committerClément Foucault <foucault.clem@gmail.com>
Mon, 26 Aug 2019 16:43:53 +0000 (18:43 +0200)
source/blender/draw/intern/draw_cache_extract_mesh.c
source/blender/draw/intern/draw_cache_impl_mesh.c

index 7753b3490322fdfbb0a3ed583e2849f1868043ba..6280bd8ccb2682f4b2cd010ab66586dc34aa8bc4 100644 (file)
@@ -1433,7 +1433,7 @@ static void extract_pos_nor_loop_mesh(const MeshRenderData *mr,
                                       int l,
                                       const MLoop *mloop,
                                       int UNUSED(p),
-                                      const MPoly *mpoly,
+                                      const MPoly *UNUSED(mpoly),
                                       void *_data)
 {
   MeshExtract_PosNor_Data *data = _data;
@@ -1442,9 +1442,9 @@ static void extract_pos_nor_loop_mesh(const MeshRenderData *mr,
   copy_v3_v3(vert->pos, mvert->co);
   vert->nor = data->packed_nor[mloop->v];
   /* Flag for paint mode overlay. */
-  if (mpoly->flag & ME_HIDE)
+  if (mvert->flag & ME_HIDE)
     vert->nor.w = -1;
-  else if (mpoly->flag & ME_FACE_SEL)
+  else if (mvert->flag & SELECT)
     vert->nor.w = 1;
   else
     vert->nor.w = 0;
@@ -1526,7 +1526,7 @@ static void *extract_lnor_init(const MeshRenderData *mr, void *buf)
 {
   static GPUVertFormat format = {0};
   if (format.attr_len == 0) {
-    GPU_vertformat_attr_add(&format, "nor", GPU_COMP_I10, 3, GPU_FETCH_INT_TO_FLOAT_UNIT);
+    GPU_vertformat_attr_add(&format, "nor", GPU_COMP_I10, 4, GPU_FETCH_INT_TO_FLOAT_UNIT);
     GPU_vertformat_alias_add(&format, "lnor");
   }
   GPUVertBuf *vbo = buf;
@@ -1561,6 +1561,13 @@ static void extract_lnor_loop_mesh(
   else {
     ((GPUPackedNormal *)data)[l] = GPU_normal_convert_i10_v3(mr->poly_normals[p]);
   }
+  /* Flag for paint mode overlay. */
+  if (mpoly->flag & ME_HIDE)
+    ((GPUPackedNormal *)data)[l].w = -1;
+  else if (mpoly->flag & ME_FACE_SEL)
+    ((GPUPackedNormal *)data)[l].w = 1;
+  else
+    ((GPUPackedNormal *)data)[l].w = 0;
 }
 
 static const MeshExtract extract_lnor = {
index 884d39343c61e488ef564e6842b39f12e4323039..456e21db6ed26c9c01076013e208774b66244d34 100644 (file)
@@ -549,6 +549,7 @@ void DRW_mesh_batch_cache_dirty_tag(Mesh *me, int mode)
       {
         GPU_INDEXBUF_DISCARD_SAFE(mbufcache->ibo.lines_paint_mask);
         GPU_VERTBUF_DISCARD_SAFE(mbufcache->vbo.pos_nor);
+        GPU_VERTBUF_DISCARD_SAFE(mbufcache->vbo.lnor);
       }
       GPU_BATCH_DISCARD_SAFE(cache->batch.surface);
       GPU_BATCH_DISCARD_SAFE(cache->batch.wire_loops);
@@ -1140,6 +1141,8 @@ void DRW_mesh_batch_cache_create_requested(
   }
   if (DRW_batch_requested(cache->batch.wire_loops, GPU_PRIM_LINES)) {
     DRW_ibo_request(cache->batch.wire_loops, &mbufcache->ibo.lines_paint_mask);
+    /* Order matters. First ones override latest vbos' attribs. */
+    DRW_vbo_request(cache->batch.wire_loops, &mbufcache->vbo.lnor);
     DRW_vbo_request(cache->batch.wire_loops, &mbufcache->vbo.pos_nor);
   }
   if (DRW_batch_requested(cache->batch.wire_edges, GPU_PRIM_LINES)) {