26 if (
format.attr_len == 0) {
38 struct gpuSculptData {
54 for (const int face_index : range) {
55 const BMFace &face = *BM_face_at_index(&const_cast<BMesh &>(bm), face_index);
56 const IndexRange face_range(BM_elem_index_get(BM_FACE_FIRST_LOOP(&face)), face.len);
58 uchar4 face_set_color(UCHAR_MAX);
59 if (face_set_offset != -1) {
60 const int face_set_id = BM_ELEM_CD_GET_INT(&face, face_set_offset);
61 if (face_set_id != default_face_set) {
62 BKE_paint_face_set_overlay_color_get(face_set_id, face_set_seed, face_set_color);
65 vbo_data.slice(face_range).fill(gpuSculptData{face_set_color, 0.0f});
67 if (mask_offset != -1) {
68 const BMLoop *loop = BM_FACE_FIRST_LOOP(&face);
69 for ([[maybe_unused]] const int i : IndexRange(face.len)) {
70 const int index = BM_elem_index_get(loop);
71 vbo_data[index].mask = BM_ELEM_CD_GET_FLOAT(loop->v, mask_offset);
80 const Span<int> corner_verts = mr.corner_verts;
85 for (const int face_index : range) {
86 const IndexRange face = faces[face_index];
87 uchar4 face_set_color(UCHAR_MAX);
88 if (!face_set.is_empty()) {
89 const int face_set_id = face_set[face_index];
90 if (face_set_id != default_face_set) {
91 BKE_paint_face_set_overlay_color_get(face_set_id, face_set_seed, face_set_color);
94 vbo_data.slice(face).fill(gpuSculptData{face_set_color, 0.0f});
96 if (!mask.is_empty()) {
97 for (const int corner : face) {
98 vbo_data[corner].mask = mask[corner_verts[corner]];
122 const Span<int> corner_verts = coarse_mesh.corner_verts();
150 if (face_sets.is_empty()) {
159 for (
const int i : range) {
160 const int face_index = subdiv_loop_face_index[i];
162 uchar4 face_set_color(UCHAR_MAX);
163 const int face_set_id = face_sets[face_index];
165 if (face_set_id != default_face_set) {
int CustomData_get_offset_named(const CustomData *data, eCustomDataType type, blender::StringRef name)
void BKE_paint_face_set_overlay_color_get(int face_set, int seed, uchar r_color[4])
MINLINE void copy_v3_v3_uchar(unsigned char r[3], const unsigned char a[3])
void GPU_vertbuf_init_build_on_device(blender::gpu::VertBuf &verts, const GPUVertFormat &format, uint v_len)
#define GPU_vertbuf_init_with_format(verts, format)
blender::gpu::VertBuf * GPU_vertbuf_calloc()
void GPU_vertbuf_data_alloc(blender::gpu::VertBuf &verts, uint v_len)
void GPU_vertbuf_discard(blender::gpu::VertBuf *)
Read Guarded memory(de)allocation.
ATTR_WARN_UNUSED_RESULT BMesh * bm
constexpr void fill(const T &value) const
constexpr int64_t size() const
GAttributeReader lookup(const StringRef attribute_id) const
ccl_device_inline float4 mask(const int4 mask, const float4 a)
void gather(const GVArray &src, const IndexMask &indices, GMutableSpan dst, int64_t grain_size=4096)
static const GPUVertFormat & get_sculpt_data_format()
void draw_subdiv_build_sculpt_data_buffer(const DRWSubdivCache &cache, gpu::VertBuf *mask_vbo, gpu::VertBuf *face_set_vbo, gpu::VertBuf *sculpt_data)
void draw_subdiv_interp_custom_data(const DRWSubdivCache &cache, gpu::VertBuf &src_data, gpu::VertBuf &dst_data, int comp_type, int dimensions, int dst_offset)
void extract_sculpt_data(const MeshRenderData &mr, gpu::VertBuf &vbo)
void extract_sculpt_data_subdiv(const MeshRenderData &mr, const DRWSubdivCache &subdiv_cache, gpu::VertBuf &vbo)
void parallel_for(const IndexRange range, const int64_t grain_size, const Function &function, const TaskSizeHints &size_hints=detail::TaskSizeHints_Static(1))
blender::VecBase< uint8_t, 4 > uchar4
int face_sets_color_default
int * subdiv_loop_face_index
eMRExtractType extract_type