[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