diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-04-24 13:29:15 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-04-24 13:48:43 +0300 |
commit | 2ff8f965dfa5f680f613fc33425281e398893f49 (patch) | |
tree | 886990052152c485052d10cffb758267c2d01f17 /source/blender/draw/intern/draw_manager_data.c | |
parent | 8fb9dfbec5fa5b6ed1f94494b6972988605e5c14 (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.c | 21 |
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); |