diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h index 7475e562833..a19e0c71155 100644 --- a/source/blender/draw/intern/DRW_render.h +++ b/source/blender/draw/intern/DRW_render.h @@ -211,7 +211,12 @@ DRWShadingGroup *DRW_shgroup_line_batch_create(struct GPUShader *shader, DRWPass void DRW_shgroup_free(struct DRWShadingGroup *shgroup); void DRW_shgroup_call_add(DRWShadingGroup *shgroup, struct Batch *geom, float (*obmat)[4]); -void DRW_shgroup_dynamic_call_add(DRWShadingGroup *shgroup, ...); +void DRW_shgroup_dynamic_call_add_array(DRWShadingGroup *shgroup, const void **attr, unsigned int attr_len); +#define DRW_shgroup_dynamic_call_add(shgroup, ...) do { \ + const void *array[] = {__VA_ARGS__}; \ + DRW_shgroup_dynamic_call_add_array(shgroup, array, (sizeof(array) / sizeof(*array))); \ +} while (0) + void DRW_shgroup_state_set(DRWShadingGroup *shgroup, DRWState state); void DRW_shgroup_attrib_int(DRWShadingGroup *shgroup, const char *name, int size); void DRW_shgroup_attrib_float(DRWShadingGroup *shgroup, const char *name, int size); diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index b5ed450cb0a..1260decb071 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -572,20 +572,17 @@ void DRW_shgroup_call_add(DRWShadingGroup *shgroup, Batch *geom, float (*obmat)[ BLI_addtail(&shgroup->calls, call); } -void DRW_shgroup_dynamic_call_add(DRWShadingGroup *shgroup, ...) +void DRW_shgroup_dynamic_call_add_array(DRWShadingGroup *shgroup, const void *attr[], unsigned int attr_len) { - va_list params; - int i; DRWInterface *interface = shgroup->interface; - int size = sizeof(ListBase) + sizeof(void *) * interface->attribs_count; + unsigned int data_size = sizeof(void *) * interface->attribs_count; + int size = sizeof(ListBase) + data_size; DRWDynamicCall *call = MEM_callocN(size, "DRWDynamicCall"); - va_start(params, shgroup); - for (i = 0; i < interface->attribs_count; ++i) { - call->data[i] = va_arg(params, void *); - } - va_end(params); + BLI_assert(attr_len == interface->attribs_count); + + memcpy(call->data, attr, data_size); interface->instance_count += 1;