diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-07-30 13:23:23 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-07-30 15:18:55 +0300 |
commit | d65df10216b8de09b8a1cfc695030649511337a0 (patch) | |
tree | 9933a42e8db798f40078fc30e3ee7a2f076ba393 /source/blender | |
parent | 6a493e44302588c35a269ed34a3e679c7912074b (diff) |
DRW: Add DRW_shgroup_is_empty and DRW_pass_is_empty
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/draw/intern/DRW_render.h | 4 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager_data.c | 27 |
2 files changed, 31 insertions, 0 deletions
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h index adcfe2524c7..cd2db3cfd0a 100644 --- a/source/blender/draw/intern/DRW_render.h +++ b/source/blender/draw/intern/DRW_render.h @@ -402,6 +402,8 @@ void DRW_shgroup_uniform_int_copy(DRWShadingGroup *shgroup, const char *name, co void DRW_shgroup_uniform_bool_copy(DRWShadingGroup *shgroup, const char *name, const bool value); void DRW_shgroup_uniform_float_copy(DRWShadingGroup *shgroup, const char *name, const float value); +bool DRW_shgroup_is_empty(DRWShadingGroup *shgroup); + /* Passes */ DRWPass *DRW_pass_create(const char *name, DRWState state); void DRW_pass_state_set(DRWPass *pass, DRWState state); @@ -410,6 +412,8 @@ void DRW_pass_state_remove(DRWPass *pass, DRWState state); void DRW_pass_foreach_shgroup(DRWPass *pass, void (*callback)(void *userData, DRWShadingGroup *shgrp), void *userData); void DRW_pass_sort_shgroup_z(DRWPass *pass); +bool DRW_pass_is_empty(DRWPass *pass); + /* Viewport */ typedef enum { /* keep in sync with the union struct DRWMatrixState. */ diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c index dccb869c133..407eea16d91 100644 --- a/source/blender/draw/intern/draw_manager_data.c +++ b/source/blender/draw/intern/draw_manager_data.c @@ -998,6 +998,23 @@ void DRW_shgroup_stencil_mask(DRWShadingGroup *shgroup, uint mask) shgroup->stencil_mask = mask; } +bool DRW_shgroup_is_empty(DRWShadingGroup *shgroup) +{ + switch (shgroup->type) { + case DRW_SHG_NORMAL: + case DRW_SHG_FEEDBACK_TRANSFORM: + return shgroup->calls.first == NULL; + case DRW_SHG_POINT_BATCH: + case DRW_SHG_LINE_BATCH: + case DRW_SHG_TRIANGLE_BATCH: + case DRW_SHG_INSTANCE: + case DRW_SHG_INSTANCE_EXTERNAL: + return shgroup->instance_count == 0; + } + BLI_assert(!"Shading Group type not supported"); + return true; +} + /** \} */ /* -------------------------------------------------------------------- */ @@ -1019,6 +1036,16 @@ DRWPass *DRW_pass_create(const char *name, DRWState state) return pass; } +bool DRW_pass_is_empty(DRWPass *pass) +{ + for (DRWShadingGroup *shgroup = pass->shgroups.first; shgroup; shgroup = shgroup->next) { + if (!DRW_shgroup_is_empty(shgroup)) { + return false; + } + } + return true; +} + void DRW_pass_state_set(DRWPass *pass, DRWState state) { pass->state = state; |