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:
authorClément Foucault <foucault.clem@gmail.com>2018-04-24 13:29:15 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-04-24 13:48:43 +0300
commit2ff8f965dfa5f680f613fc33425281e398893f49 (patch)
tree886990052152c485052d10cffb758267c2d01f17 /source/blender/draw/intern/draw_manager_data.c
parent8fb9dfbec5fa5b6ed1f94494b6972988605e5c14 (diff)
DRW: Add visibility callback function.
This add a callback function that runs after frustum culling test. This callback returns the final visibility for this object. Be aware that it's called for EVERY drawcalls that use this callback even if their visibility has been cached.
Diffstat (limited to 'source/blender/draw/intern/draw_manager_data.c')
-rw-r--r--source/blender/draw/intern/draw_manager_data.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c
index 31f6108f7e0..b11455ead49 100644
--- a/source/blender/draw/intern/draw_manager_data.c
+++ b/source/blender/draw/intern/draw_manager_data.c
@@ -274,6 +274,7 @@ static DRWCallState *drw_call_state_create(DRWShadingGroup *shgroup, float (*obm
DRWCallState *state = BLI_mempool_alloc(DST.vmempool->states);
state->flag = 0;
state->cache_id = 0;
+ state->visibility_cb = NULL;
state->matflag = shgroup->matflag;
/* Matrices */
@@ -357,6 +358,26 @@ void DRW_shgroup_call_object_add(DRWShadingGroup *shgroup, Gwn_Batch *geom, Obje
BLI_LINKS_APPEND(&shgroup->calls, call);
}
+void DRW_shgroup_call_object_add_with_callback(
+ DRWShadingGroup *shgroup, Gwn_Batch *geom, Object *ob,
+ DRWCallVisibilityFn *callback, void *user_data)
+{
+ BLI_assert(geom != NULL);
+ BLI_assert(shgroup->type == DRW_SHG_NORMAL);
+
+ DRWCall *call = BLI_mempool_alloc(DST.vmempool->calls);
+ call->state = drw_call_state_object(shgroup, ob->obmat, ob);
+ call->state->visibility_cb = callback;
+ call->state->user_data = user_data;
+ call->type = DRW_CALL_SINGLE;
+ call->single.geometry = geom;
+#ifdef USE_GPU_SELECT
+ call->select_id = DST.select_id;
+#endif
+
+ BLI_LINKS_APPEND(&shgroup->calls, call);
+}
+
void DRW_shgroup_call_instances_add(DRWShadingGroup *shgroup, Gwn_Batch *geom, float (*obmat)[4], unsigned int *count)
{
BLI_assert(geom != NULL);