diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-10-11 16:50:46 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-10-12 17:38:55 +0300 |
commit | 01745051de735c37a2d817c1a58fda4585b77698 (patch) | |
tree | 119e9593fead5a3858ac17ece3ccdf46e6ce031f /source | |
parent | 9b692ecabd3ddf675b4c6e09999415138df598d4 (diff) |
DRW: Add DRW_shgroup_create_sub to create children shgroup
This makes is easy to create nested drawcalls that will inherit all the
parents properties. This is usefull if only a few uniforms changes for that
drawcall.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenlib/BLI_link_utils.h | 9 | ||||
-rw-r--r-- | source/blender/draw/intern/DRW_render.h | 1 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.h | 4 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager_data.c | 20 |
4 files changed, 28 insertions, 6 deletions
diff --git a/source/blender/blenlib/BLI_link_utils.h b/source/blender/blenlib/BLI_link_utils.h index 5322547ac08..7a1a13a6b31 100644 --- a/source/blender/blenlib/BLI_link_utils.h +++ b/source/blender/blenlib/BLI_link_utils.h @@ -47,6 +47,15 @@ (list)->last = link; \ } (void)0 +/* Use for inserting after a certain element. */ +#define BLI_LINKS_INSERT_AFTER(list, node, link) { \ + if ((node)->next == NULL) { \ + (list)->last = link; \ + } \ + (link)->next = (node)->next; \ + (node)->next = link; \ +} (void)0 + #define BLI_LINKS_FREE(list) { \ while (list) { \ void *next = list->next; \ diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h index 77b8cdacb47..17304dde802 100644 --- a/source/blender/draw/intern/DRW_render.h +++ b/source/blender/draw/intern/DRW_render.h @@ -325,6 +325,7 @@ struct GPUVertFormat *DRW_shgroup_instance_format_array(const DRWInstanceAttribF } while (0) DRWShadingGroup *DRW_shgroup_create(struct GPUShader *shader, DRWPass *pass); +DRWShadingGroup *DRW_shgroup_create_sub(DRWShadingGroup *shgroup); DRWShadingGroup *DRW_shgroup_material_create(struct GPUMaterial *material, DRWPass *pass); DRWShadingGroup *DRW_shgroup_material_instance_create( struct GPUMaterial *material, DRWPass *pass, struct GPUBatch *geom, struct Object *ob, diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h index bba98f5e102..c8a7816c402 100644 --- a/source/blender/draw/intern/draw_manager.h +++ b/source/blender/draw/intern/draw_manager.h @@ -263,12 +263,10 @@ struct DRWShadingGroup { int objectinfo; uint16_t matflag; /* Matrices needed, same as DRWCall.flag */ + DRWPass *pass_parent; /* backlink to pass we're in */ #ifndef NDEBUG char attribs_count; #endif -#if !defined(NDEBUG) || defined(USE_GPU_SELECT) - DRWPass *pass_parent; /* backlink to pass we're in */ -#endif #ifdef USE_GPU_SELECT GPUVertBuf *inst_selectid; int override_selectid; /* Override for single object instances. */ diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c index f0dbf138e50..3823d081adc 100644 --- a/source/blender/draw/intern/draw_manager_data.c +++ b/source/blender/draw/intern/draw_manager_data.c @@ -768,10 +768,7 @@ static DRWShadingGroup *drw_shgroup_create_ex(struct GPUShader *shader, DRWPass shgroup->instance_geom = NULL; shgroup->instance_vbo = NULL; #endif - -#if !defined(NDEBUG) || defined(USE_GPU_SELECT) shgroup->pass_parent = pass; -#endif return shgroup; } @@ -1035,6 +1032,23 @@ bool DRW_shgroup_is_empty(DRWShadingGroup *shgroup) return true; } +DRWShadingGroup *DRW_shgroup_create_sub(DRWShadingGroup *shgroup) +{ + /* Remove this assertion if needed but implement the other cases first! */ + BLI_assert(shgroup->type == DRW_SHG_NORMAL); + + DRWShadingGroup *shgroup_new = BLI_mempool_alloc(DST.vmempool->shgroups); + + *shgroup_new = *shgroup; + shgroup_new->uniforms = NULL; /* Not sure about that.. Should we copy them instead? */ + shgroup_new->calls.first = NULL; + shgroup_new->calls.last = NULL; + + BLI_LINKS_INSERT_AFTER(&shgroup->pass_parent->shgroups, shgroup, shgroup_new); + + return shgroup; +} + /** \} */ /* -------------------------------------------------------------------- */ |