Draw Manager: replace varargs with a pointer array
Allows to ensure correct number of args
This commit is contained in:
@@ -211,7 +211,12 @@ DRWShadingGroup *DRW_shgroup_line_batch_create(struct GPUShader *shader, DRWPass
|
|||||||
|
|
||||||
void DRW_shgroup_free(struct DRWShadingGroup *shgroup);
|
void DRW_shgroup_free(struct DRWShadingGroup *shgroup);
|
||||||
void DRW_shgroup_call_add(DRWShadingGroup *shgroup, struct Batch *geom, float (*obmat)[4]);
|
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_state_set(DRWShadingGroup *shgroup, DRWState state);
|
||||||
void DRW_shgroup_attrib_int(DRWShadingGroup *shgroup, const char *name, int size);
|
void DRW_shgroup_attrib_int(DRWShadingGroup *shgroup, const char *name, int size);
|
||||||
void DRW_shgroup_attrib_float(DRWShadingGroup *shgroup, const char *name, int size);
|
void DRW_shgroup_attrib_float(DRWShadingGroup *shgroup, const char *name, int size);
|
||||||
|
@@ -572,20 +572,17 @@ void DRW_shgroup_call_add(DRWShadingGroup *shgroup, Batch *geom, float (*obmat)[
|
|||||||
BLI_addtail(&shgroup->calls, call);
|
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;
|
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");
|
DRWDynamicCall *call = MEM_callocN(size, "DRWDynamicCall");
|
||||||
|
|
||||||
va_start(params, shgroup);
|
BLI_assert(attr_len == interface->attribs_count);
|
||||||
for (i = 0; i < interface->attribs_count; ++i) {
|
|
||||||
call->data[i] = va_arg(params, void *);
|
memcpy(call->data, attr, data_size);
|
||||||
}
|
|
||||||
va_end(params);
|
|
||||||
|
|
||||||
interface->instance_count += 1;
|
interface->instance_count += 1;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user