Previously the attribute name was only stored in the request for curves. Instead, pass it as part of the "add request" function, so that it is always used. Since the whole attribute pipeline is name-based, this can simplify code in a few places.
115 lines
3.2 KiB
C++
115 lines
3.2 KiB
C++
/* SPDX-License-Identifier: GPL-2.0-or-later
|
|
* Copyright 2022 Blender Foundation. All rights reserved. */
|
|
|
|
#include "draw_attributes.h"
|
|
|
|
/* Return true if the given DRW_AttributeRequest is already in the requests. */
|
|
static bool drw_attributes_has_request(const DRW_Attributes *requests, DRW_AttributeRequest req)
|
|
{
|
|
for (int i = 0; i < requests->num_requests; i++) {
|
|
const DRW_AttributeRequest src_req = requests->requests[i];
|
|
if (src_req.domain != req.domain) {
|
|
continue;
|
|
}
|
|
if (src_req.layer_index != req.layer_index) {
|
|
continue;
|
|
}
|
|
if (src_req.cd_type != req.cd_type) {
|
|
continue;
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
static void drw_attributes_merge_requests(const DRW_Attributes *src_requests,
|
|
DRW_Attributes *dst_requests)
|
|
{
|
|
for (int i = 0; i < src_requests->num_requests; i++) {
|
|
if (dst_requests->num_requests == GPU_MAX_ATTR) {
|
|
return;
|
|
}
|
|
|
|
if (drw_attributes_has_request(dst_requests, src_requests->requests[i])) {
|
|
continue;
|
|
}
|
|
|
|
dst_requests->requests[dst_requests->num_requests] = src_requests->requests[i];
|
|
dst_requests->num_requests += 1;
|
|
}
|
|
}
|
|
|
|
void drw_attributes_clear(DRW_Attributes *attributes)
|
|
{
|
|
memset(attributes, 0, sizeof(DRW_Attributes));
|
|
}
|
|
|
|
void drw_attributes_merge(DRW_Attributes *dst,
|
|
const DRW_Attributes *src,
|
|
ThreadMutex *render_mutex)
|
|
{
|
|
BLI_mutex_lock(render_mutex);
|
|
drw_attributes_merge_requests(src, dst);
|
|
BLI_mutex_unlock(render_mutex);
|
|
}
|
|
|
|
bool drw_attributes_overlap(const DRW_Attributes *a, const DRW_Attributes *b)
|
|
{
|
|
for (int i = 0; i < b->num_requests; i++) {
|
|
if (!drw_attributes_has_request(a, b->requests[i])) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
DRW_AttributeRequest *drw_attributes_add_request(DRW_Attributes *attrs,
|
|
const char *name,
|
|
const eCustomDataType type,
|
|
const int layer_index,
|
|
const eAttrDomain domain)
|
|
{
|
|
if (attrs->num_requests >= GPU_MAX_ATTR) {
|
|
return nullptr;
|
|
}
|
|
|
|
DRW_AttributeRequest *req = &attrs->requests[attrs->num_requests];
|
|
req->cd_type = type;
|
|
BLI_strncpy(req->attribute_name, name, sizeof(req->attribute_name));
|
|
req->layer_index = layer_index;
|
|
req->domain = domain;
|
|
attrs->num_requests += 1;
|
|
return req;
|
|
}
|
|
|
|
bool drw_custom_data_match_attribute(const CustomData *custom_data,
|
|
const char *name,
|
|
int *r_layer_index,
|
|
eCustomDataType *r_type)
|
|
{
|
|
const eCustomDataType possible_attribute_types[7] = {
|
|
CD_PROP_BOOL,
|
|
CD_PROP_INT8,
|
|
CD_PROP_INT32,
|
|
CD_PROP_FLOAT,
|
|
CD_PROP_FLOAT2,
|
|
CD_PROP_FLOAT3,
|
|
CD_PROP_COLOR,
|
|
};
|
|
|
|
for (int i = 0; i < ARRAY_SIZE(possible_attribute_types); i++) {
|
|
const eCustomDataType attr_type = possible_attribute_types[i];
|
|
int layer_index = CustomData_get_named_layer(custom_data, attr_type, name);
|
|
if (layer_index == -1) {
|
|
continue;
|
|
}
|
|
|
|
*r_layer_index = layer_index;
|
|
*r_type = attr_type;
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|