diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-05-28 15:20:58 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-05-30 13:25:20 +0300 |
commit | ec6da3d72e61240bfec1c09f1ef75e41873bf6a0 (patch) | |
tree | ec083fda5daf51cbdbaf108b125c7f80b932d031 /source/blender/draw | |
parent | 201952aed23b0e4fc93b93f2145621ffd2d86b0d (diff) |
DRW: Add new per drawcall option to bypass culling.
Diffstat (limited to 'source/blender/draw')
-rw-r--r-- | source/blender/draw/intern/DRW_render.h | 4 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.h | 1 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager_data.c | 4 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager_exec.c | 8 |
4 files changed, 13 insertions, 4 deletions
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h index e96594de590..44fb71a231b 100644 --- a/source/blender/draw/intern/DRW_render.h +++ b/source/blender/draw/intern/DRW_render.h @@ -344,10 +344,12 @@ void DRW_shgroup_instance_batch(DRWShadingGroup *shgroup, struct Gwn_Batch *batc void DRW_shgroup_free(struct DRWShadingGroup *shgroup); void DRW_shgroup_call_add(DRWShadingGroup *shgroup, struct Gwn_Batch *geom, float (*obmat)[4]); -void DRW_shgroup_call_object_add(DRWShadingGroup *shgroup, struct Gwn_Batch *geom, struct Object *ob); void DRW_shgroup_call_procedural_points_add(DRWShadingGroup *shgroup, unsigned int point_count, float (*obmat)[4]); void DRW_shgroup_call_procedural_lines_add(DRWShadingGroup *shgroup, unsigned int line_count, float (*obmat)[4]); void DRW_shgroup_call_procedural_triangles_add(DRWShadingGroup *shgroup, unsigned int tria_count, float (*obmat)[4]); +void DRW_shgroup_call_object_add_ex(DRWShadingGroup *shgroup, struct Gwn_Batch *geom, struct Object *ob, bool bypass_culling); +#define DRW_shgroup_call_object_add(shgroup, geom, ob) DRW_shgroup_call_object_add_ex(shgroup, geom, ob, false) +#define DRW_shgroup_call_object_add_no_cull(shgroup, geom, ob) DRW_shgroup_call_object_add_ex(shgroup, geom, ob, true) void DRW_shgroup_call_object_add_with_callback( DRWShadingGroup *shgroup, struct Gwn_Batch *geom, struct Object *ob, DRWCallVisibilityFn *callback, void *user_data); diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h index f2b941810a7..6fd000c0939 100644 --- a/source/blender/draw/intern/draw_manager.h +++ b/source/blender/draw/intern/draw_manager.h @@ -87,6 +87,7 @@ enum { DRW_CALL_CULLED = (1 << 0), DRW_CALL_NEGSCALE = (1 << 1), + DRW_CALL_BYPASS_CULLING = (1 << 2), }; /* Used by DRWCallState.matflag */ diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c index 2bf0d6a6b0e..b6aac33c0f1 100644 --- a/source/blender/draw/intern/draw_manager_data.c +++ b/source/blender/draw/intern/draw_manager_data.c @@ -400,7 +400,7 @@ void DRW_shgroup_call_procedural_triangles_add(DRWShadingGroup *shgroup, unsigne /* These calls can be culled and are optimized for redraw */ -void DRW_shgroup_call_object_add(DRWShadingGroup *shgroup, Gwn_Batch *geom, Object *ob) +void DRW_shgroup_call_object_add_ex(DRWShadingGroup *shgroup, Gwn_Batch *geom, Object *ob, bool bypass_culling) { BLI_assert(geom != NULL); BLI_assert(shgroup->type == DRW_SHG_NORMAL); @@ -413,6 +413,8 @@ void DRW_shgroup_call_object_add(DRWShadingGroup *shgroup, Gwn_Batch *geom, Obje call->select_id = DST.select_id; #endif + SET_FLAG_FROM_TEST(call->state->flag, bypass_culling, DRW_CALL_BYPASS_CULLING); + BLI_LINKS_APPEND(&shgroup->calls, call); } diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c index 8f5dce87c2b..8b0bbb3ad15 100644 --- a/source/blender/draw/intern/draw_manager_exec.c +++ b/source/blender/draw/intern/draw_manager_exec.c @@ -747,7 +747,8 @@ static void draw_matrices_model_prepare(DRWCallState *st) } /* No need to go further the call will not be used. */ - if (st->flag & DRW_CALL_CULLED) + if ((st->flag & DRW_CALL_CULLED) != 0 && + (st->flag & DRW_CALL_BYPASS_CULLING) == 0) return; /* Order matters */ @@ -1119,8 +1120,11 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state) draw_visibility_eval(call->state); draw_matrices_model_prepare(call->state); - if ((call->state->flag & DRW_CALL_CULLED) != 0) + if ((call->state->flag & DRW_CALL_CULLED) != 0 && + (call->state->flag & DRW_CALL_BYPASS_CULLING) == 0) + { continue; + } /* XXX small exception/optimisation for outline rendering. */ if (shgroup->callid != -1) { |