diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2019-09-29 03:27:53 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2019-09-29 17:22:09 +0300 |
commit | 9b0fd5ef2ae0b2748e505b8bef29c6e25f58efe2 (patch) | |
tree | eaade4a08679b7080d41cea300645338bfb2be68 /source/blender/blenkernel/intern/pbvh.c | |
parent | f6fc863acd7c24874026202d4c2aec50c60b40d2 (diff) |
Sculpt: only update draw buffers for visible nodes during paint stroke
Also applies to some other sculpt tools like filter and mask expand.
The full update happens after the paint stroke is finished, so it does not
happen on view navigation, which would cause a delay.
Ref T70295
Differential Revision: https://developer.blender.org/D5922
Diffstat (limited to 'source/blender/blenkernel/intern/pbvh.c')
-rw-r--r-- | source/blender/blenkernel/intern/pbvh.c | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c index 50ea4fb0b36..781e7b712d6 100644 --- a/source/blender/blenkernel/intern/pbvh.c +++ b/source/blender/blenkernel/intern/pbvh.c @@ -2287,6 +2287,7 @@ void BKE_pbvh_update_normals(PBVH *bvh, struct SubdivCCG *subdiv_ccg) */ typedef struct PBVHDrawSearchData { PBVHFrustumPlanes *frustum; + int accum_update_flag; } PBVHDrawSearchData; static bool pbvh_draw_search_cb(PBVHNode *node, void *data_v) @@ -2296,11 +2297,13 @@ static bool pbvh_draw_search_cb(PBVHNode *node, void *data_v) return false; } + data->accum_update_flag |= node->flag; return true; } void BKE_pbvh_draw_cb(PBVH *bvh, bool show_vcol, + bool update_only_visible, PBVHFrustumPlanes *frustum, void (*draw_fn)(void *user_data, GPU_PBVH_Buffers *buffers), void *user_data) @@ -2308,22 +2311,30 @@ void BKE_pbvh_draw_cb(PBVH *bvh, PBVHNode **nodes; int totnode; - /* Update all draw buffers. */ const int update_flag = PBVH_RebuildDrawBuffers | PBVH_UpdateDrawBuffers; - BKE_pbvh_search_gather(bvh, update_search_cb, POINTER_FROM_INT(update_flag), &nodes, &totnode); - if (totnode) { - pbvh_update_draw_buffers(bvh, nodes, totnode, show_vcol, update_flag); - } + if (!update_only_visible) { + /* Update all draw buffers, also those outside the view. */ + BKE_pbvh_search_gather(bvh, update_search_cb, POINTER_FROM_INT(update_flag), &nodes, &totnode); - if (nodes) { - MEM_freeN(nodes); + if (totnode) { + pbvh_update_draw_buffers(bvh, nodes, totnode, show_vcol, update_flag); + } + + if (nodes) { + MEM_freeN(nodes); + } } /* Gather visible nodes. */ - PBVHDrawSearchData data = {.frustum = frustum}; + PBVHDrawSearchData data = {.frustum = frustum, .accum_update_flag = 0}; BKE_pbvh_search_gather(bvh, pbvh_draw_search_cb, &data, &nodes, &totnode); + if (update_only_visible && (data.accum_update_flag & update_flag)) { + /* Update draw buffers in visible nodes. */ + pbvh_update_draw_buffers(bvh, nodes, totnode, show_vcol, data.accum_update_flag); + } + /* Draw. */ for (int a = 0; a < totnode; a++) { PBVHNode *node = nodes[a]; |