After this commit, all mesh data extraction and drawing code is in C++, including headers, making it possible to use improved types for future performance improvements and simplifications. The only non-trivial changes are in `draw_cache_impl_mesh.cc`, where use of certain features and macros in C necessitated larger changes. Differential Revision: https://developer.blender.org/D15088
113 lines
3.1 KiB
C++
113 lines
3.1 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,
|
|
eCustomDataType type,
|
|
int layer,
|
|
eAttrDomain domain)
|
|
{
|
|
if (attrs->num_requests >= GPU_MAX_ATTR) {
|
|
return nullptr;
|
|
}
|
|
|
|
DRW_AttributeRequest *req = &attrs->requests[attrs->num_requests];
|
|
req->cd_type = type;
|
|
req->layer_index = layer;
|
|
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;
|
|
}
|