[Bf-blender-cvs] [6c4c09b2dfa] blender-v3.4-release: Fix T102519: GPU Subdivision : selected vertices not visible in paint mode

Miguel Pozo noreply at git.blender.org
Tue Nov 29 21:05:17 CET 2022


Commit: 6c4c09b2dfa3c657fae7187467d71a26a254fa34
Author: Miguel Pozo
Date:   Tue Nov 29 21:05:14 2022 +0100
Branches: blender-v3.4-release
https://developer.blender.org/rB6c4c09b2dfa3c657fae7187467d71a26a254fa34

Fix T102519: GPU Subdivision : selected vertices not visible in paint mode

Retrieve and load the vertices selected/hidden state in pos_nor extraction.

Reviewed By: fclem

Maniphest Tasks: T102519

Differential Revision: https://developer.blender.org/D16594

===================================================================

M	source/blender/draw/intern/draw_cache_impl_subdivision.cc
M	source/blender/draw/intern/draw_subdivision.h
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_stretch_angle.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos_nor.cc
M	source/blender/draw/intern/shaders/common_subdiv_patch_evaluation_comp.glsl

===================================================================

diff --git a/source/blender/draw/intern/draw_cache_impl_subdivision.cc b/source/blender/draw/intern/draw_cache_impl_subdivision.cc
index 67e498a3cc7..a225c931a14 100644
--- a/source/blender/draw/intern/draw_cache_impl_subdivision.cc
+++ b/source/blender/draw/intern/draw_cache_impl_subdivision.cc
@@ -1408,6 +1408,7 @@ static void drw_subdiv_compute_dispatch(const DRWSubdivCache *cache,
 }
 
 void draw_subdiv_extract_pos_nor(const DRWSubdivCache *cache,
+                                 GPUVertBuf *flags_buffer,
                                  GPUVertBuf *pos_nor,
                                  GPUVertBuf *orco)
 {
@@ -1460,6 +1461,10 @@ void draw_subdiv_extract_pos_nor(const DRWSubdivCache *cache,
   GPU_vertbuf_bind_as_ssbo(patch_arrays_buffer, binding_point++);
   GPU_vertbuf_bind_as_ssbo(patch_index_buffer, binding_point++);
   GPU_vertbuf_bind_as_ssbo(patch_param_buffer, binding_point++);
+  if (flags_buffer) {
+    GPU_vertbuf_bind_as_ssbo(flags_buffer, binding_point);
+  }
+  binding_point++;
   GPU_vertbuf_bind_as_ssbo(pos_nor, binding_point++);
   if (orco) {
     GPU_vertbuf_bind_as_ssbo(src_extra_buffer, binding_point++);
diff --git a/source/blender/draw/intern/draw_subdivision.h b/source/blender/draw/intern/draw_subdivision.h
index aeccba3bc75..5133abc9257 100644
--- a/source/blender/draw/intern/draw_subdivision.h
+++ b/source/blender/draw/intern/draw_subdivision.h
@@ -242,6 +242,7 @@ void draw_subdiv_finalize_custom_normals(const DRWSubdivCache *cache,
                                          GPUVertBuf *pos_nor);
 
 void draw_subdiv_extract_pos_nor(const DRWSubdivCache *cache,
+                                 GPUVertBuf *flags_buffer,
                                  struct GPUVertBuf *pos_nor,
                                  struct GPUVertBuf *orco);
 
diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_stretch_angle.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_stretch_angle.cc
index 492756f30bb..9fd15a2309c 100644
--- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_stretch_angle.cc
+++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_stretch_angle.cc
@@ -236,7 +236,7 @@ static void extract_edituv_stretch_angle_init_subdiv(const DRWSubdivCache *subdi
                                      draw_subdiv_get_pos_nor_format(),
                                      subdiv_cache->num_subdiv_loops + loose_geom.loop_len);
 
-    draw_subdiv_extract_pos_nor(subdiv_cache, pos_nor, nullptr);
+    draw_subdiv_extract_pos_nor(subdiv_cache, nullptr, pos_nor, nullptr);
   }
 
   /* UVs are stored contiguously so we need to compute the offset in the UVs buffer for the active
diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos_nor.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos_nor.cc
index b3bbf3b8b63..8d9e6742d61 100644
--- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos_nor.cc
+++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos_nor.cc
@@ -200,8 +200,26 @@ static GPUVertFormat *get_custom_normals_format()
   return &format;
 }
 
+static void extract_vertex_flags(const MeshRenderData *mr, char *flags)
+{
+  for (int i = 0; i < mr->vert_len; i++) {
+    char *flag = &flags[i];
+    const bool vert_hidden = mr->hide_vert && mr->hide_vert[i];
+    /* Flag for paint mode overlay. */
+    if (vert_hidden || ((mr->v_origindex) && (mr->v_origindex[i] == ORIGINDEX_NONE))) {
+      *flag = -1;
+    }
+    else if (mr->select_vert && mr->select_vert[i]) {
+      *flag = 1;
+    }
+    else {
+      *flag = 0;
+    }
+  }
+}
+
 static void extract_pos_nor_init_subdiv(const DRWSubdivCache *subdiv_cache,
-                                        const MeshRenderData * /*mr*/,
+                                        const MeshRenderData *mr,
                                         MeshBatchCache *cache,
                                         void *buffer,
                                         void * /*data*/)
@@ -217,6 +235,17 @@ static void extract_pos_nor_init_subdiv(const DRWSubdivCache *subdiv_cache,
     return;
   }
 
+  GPUVertBuf *flags_buffer = GPU_vertbuf_calloc();
+  static GPUVertFormat flag_format = {0};
+  if (flag_format.attr_len == 0) {
+    GPU_vertformat_attr_add(&flag_format, "flag", GPU_COMP_I32, 1, GPU_FETCH_INT);
+  }
+  GPU_vertbuf_init_with_format(flags_buffer, &flag_format);
+  GPU_vertbuf_data_alloc(flags_buffer, divide_ceil_u(mr->vert_len, 4));
+  char *flags = static_cast<char *>(GPU_vertbuf_get_data(flags_buffer));
+  extract_vertex_flags(mr, flags);
+  GPU_vertbuf_tag_dirty(flags_buffer);
+
   GPUVertBuf *orco_vbo = cache->final.buff.vbo.orco;
 
   if (orco_vbo) {
@@ -231,7 +260,7 @@ static void extract_pos_nor_init_subdiv(const DRWSubdivCache *subdiv_cache,
     GPU_vertbuf_init_build_on_device(orco_vbo, &format, subdiv_cache->num_subdiv_loops);
   }
 
-  draw_subdiv_extract_pos_nor(subdiv_cache, vbo, orco_vbo);
+  draw_subdiv_extract_pos_nor(subdiv_cache, flags_buffer, vbo, orco_vbo);
 
   if (subdiv_cache->use_custom_loop_normals) {
     Mesh *coarse_mesh = subdiv_cache->mesh;
@@ -279,6 +308,8 @@ static void extract_pos_nor_init_subdiv(const DRWSubdivCache *subdiv_cache,
     GPU_vertbuf_discard(vertex_normals);
     GPU_vertbuf_discard(subdiv_loop_subdiv_vert_index);
   }
+
+  GPU_vertbuf_discard(flags_buffer);
 }
 
 static void extract_pos_nor_loose_geom_subdiv(const DRWSubdivCache *subdiv_cache,
diff --git a/source/blender/draw/intern/shaders/common_subdiv_patch_evaluation_comp.glsl b/source/blender/draw/intern/shaders/common_subdiv_patch_evaluation_comp.glsl
index 81e346863c2..8b9a178c461 100644
--- a/source/blender/draw/intern/shaders/common_subdiv_patch_evaluation_comp.glsl
+++ b/source/blender/draw/intern/shaders/common_subdiv_patch_evaluation_comp.glsl
@@ -87,16 +87,30 @@ layout(std430, binding = 11) readonly buffer extraCoarseFaceData
   uint extra_coarse_face_data[];
 };
 #else
-layout(std430, binding = 8) writeonly buffer outputVertexData
+layout(std430, binding = 8) readonly buffer inputFlagsBuffer
+{
+  int flags_buffer[]; /*char*/
+};
+float get_flag(int vertex)
+{
+  int char4 = flags_buffer[vertex / 4];
+  int flag = (char4 >> ((vertex % 4) * 8)) & 0xFF;
+  if (flag >= 128) {
+    flag = -128 + (flag - 128);
+  }
+
+  return float(flag);
+}
+layout(std430, binding = 9) writeonly buffer outputVertexData
 {
   PosNorLoop output_verts[];
 };
 #  if defined(ORCO_EVALUATION)
-layout(std430, binding = 9) buffer src_extra_buffer
+layout(std430, binding = 10) buffer src_extra_buffer
 {
   float srcExtraVertexBuffer[];
 };
-layout(std430, binding = 10) writeonly buffer outputOrcoData
+layout(std430, binding = 11) writeonly buffer outputOrcoData
 {
   vec4 output_orcos[];
 };
@@ -463,6 +477,9 @@ void main()
     if (origindex == -1) {
       flag = -1.0;
     }
+    else {
+      flag = get_flag(origindex);
+    }
 
     PosNorLoop vertex_data;
     set_vertex_pos(vertex_data, pos);



More information about the Bf-blender-cvs mailing list