Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/BKE_pbvh.h1
-rw-r--r--source/blender/blenkernel/intern/pbvh.c27
2 files changed, 20 insertions, 8 deletions
diff --git a/source/blender/blenkernel/BKE_pbvh.h b/source/blender/blenkernel/BKE_pbvh.h
index fa773ce78d9..426f81d889a 100644
--- a/source/blender/blenkernel/BKE_pbvh.h
+++ b/source/blender/blenkernel/BKE_pbvh.h
@@ -174,6 +174,7 @@ bool BKE_pbvh_node_find_nearest_to_ray(PBVH *bvh,
void BKE_pbvh_draw_cb(PBVH *bvh,
bool show_vcol,
+ bool update_only_visible,
PBVHFrustumPlanes *frustum,
void (*draw_fn)(void *user_data, struct GPU_PBVH_Buffers *buffers),
void *user_data);
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];