Mesh: Draw: Replace extractor abstraction for face dots UV edit data buffer
Part of #116901.
This commit is contained in:
@@ -644,7 +644,6 @@ void mesh_buffer_cache_create_requested(TaskGraph &task_graph,
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
EXTRACT_ADD_REQUESTED(vbo, fdots_edituv_data);
|
||||
for (int i = 0; i < GPU_MAX_ATTR; i++) {
|
||||
EXTRACT_ADD_REQUESTED(vbo, attr[i]);
|
||||
}
|
||||
@@ -667,7 +666,8 @@ void mesh_buffer_cache_create_requested(TaskGraph &task_graph,
|
||||
!DRW_vbo_requested(buffers.vbo.face_idx) && !DRW_vbo_requested(buffers.vbo.edge_idx) &&
|
||||
!DRW_vbo_requested(buffers.vbo.vert_idx) && !DRW_vbo_requested(buffers.vbo.fdot_idx) &&
|
||||
!DRW_vbo_requested(buffers.vbo.weights) && !DRW_vbo_requested(buffers.vbo.fdots_uv) &&
|
||||
!DRW_vbo_requested(buffers.vbo.uv) && !DRW_vbo_requested(buffers.vbo.edituv_stretch_area) &&
|
||||
!DRW_vbo_requested(buffers.vbo.fdots_edituv_data) && !DRW_vbo_requested(buffers.vbo.uv) &&
|
||||
!DRW_vbo_requested(buffers.vbo.edituv_stretch_area) &&
|
||||
!DRW_vbo_requested(buffers.vbo.edituv_stretch_angle) &&
|
||||
!DRW_vbo_requested(buffers.vbo.edituv_data) &&
|
||||
!DRW_ibo_requested(buffers.ibo.lines_paint_mask) &&
|
||||
@@ -959,6 +959,21 @@ void mesh_buffer_cache_create_requested(TaskGraph &task_graph,
|
||||
[](void *task_data) { delete static_cast<TaskData *>(task_data); });
|
||||
BLI_task_graph_edge_create(task_node_mesh_render_data, task_node);
|
||||
}
|
||||
if (DRW_vbo_requested(buffers.vbo.fdots_edituv_data)) {
|
||||
struct TaskData {
|
||||
MeshRenderData &mr;
|
||||
MeshBufferList &buffers;
|
||||
};
|
||||
TaskNode *task_node = BLI_task_graph_node_create(
|
||||
&task_graph,
|
||||
[](void *__restrict task_data) {
|
||||
const TaskData &data = *static_cast<TaskData *>(task_data);
|
||||
extract_face_dots_edituv_data(data.mr, *data.buffers.vbo.fdots_edituv_data);
|
||||
},
|
||||
new TaskData{*mr, buffers},
|
||||
[](void *task_data) { delete static_cast<TaskData *>(task_data); });
|
||||
BLI_task_graph_edge_create(task_node_mesh_render_data, task_node);
|
||||
}
|
||||
if (DRW_vbo_requested(buffers.vbo.uv)) {
|
||||
struct TaskData {
|
||||
MeshRenderData &mr;
|
||||
|
||||
@@ -441,6 +441,7 @@ void extract_weights_subdiv(const MeshRenderData &mr,
|
||||
void extract_face_dots(const MeshRenderData &mr, gpu::IndexBuf &face_dots);
|
||||
|
||||
void extract_face_dots_uv(const MeshRenderData &mr, gpu::VertBuf &vbo);
|
||||
void extract_face_dots_edituv_data(const MeshRenderData &mr, gpu::VertBuf &vbo);
|
||||
|
||||
void extract_lines_paint_mask(const MeshRenderData &mr, gpu::IndexBuf &lines);
|
||||
void extract_lines_paint_mask_subdiv(const MeshRenderData &mr,
|
||||
@@ -490,7 +491,6 @@ extern const MeshExtract extract_edituv_tris;
|
||||
extern const MeshExtract extract_edituv_lines;
|
||||
extern const MeshExtract extract_edituv_points;
|
||||
extern const MeshExtract extract_edituv_fdots;
|
||||
extern const MeshExtract extract_fdots_edituv_data;
|
||||
extern const MeshExtract extract_attr[GPU_MAX_ATTR];
|
||||
extern const MeshExtract extract_attr_viewer;
|
||||
|
||||
|
||||
@@ -12,73 +12,44 @@
|
||||
|
||||
namespace blender::draw {
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
/** \name Extract Face-dots Edit UV flag
|
||||
* \{ */
|
||||
|
||||
struct MeshExtract_EditUVFdotData_Data {
|
||||
EditLoopData *vbo_data;
|
||||
BMUVOffsets offsets;
|
||||
};
|
||||
|
||||
static void extract_fdots_edituv_data_init(const MeshRenderData &mr,
|
||||
MeshBatchCache & /*cache*/,
|
||||
void *buf,
|
||||
void *tls_data)
|
||||
void extract_face_dots_edituv_data(const MeshRenderData &mr, gpu::VertBuf &vbo)
|
||||
{
|
||||
gpu::VertBuf *vbo = static_cast<gpu::VertBuf *>(buf);
|
||||
static GPUVertFormat format = {0};
|
||||
if (format.attr_len == 0) {
|
||||
GPU_vertformat_attr_add(&format, "flag", GPU_COMP_U8, 4, GPU_FETCH_INT);
|
||||
}
|
||||
|
||||
GPU_vertbuf_init_with_format(vbo, &format);
|
||||
GPU_vertbuf_data_alloc(vbo, mr.faces_num);
|
||||
|
||||
MeshExtract_EditUVFdotData_Data *data = static_cast<MeshExtract_EditUVFdotData_Data *>(tls_data);
|
||||
data->vbo_data = (EditLoopData *)GPU_vertbuf_get_data(vbo);
|
||||
data->offsets = BM_uv_map_get_offsets(mr.bm);
|
||||
}
|
||||
|
||||
static void extract_fdots_edituv_data_iter_face_bm(const MeshRenderData &mr,
|
||||
const BMFace *f,
|
||||
const int /*f_index*/,
|
||||
void *_data)
|
||||
{
|
||||
MeshExtract_EditUVFdotData_Data *data = static_cast<MeshExtract_EditUVFdotData_Data *>(_data);
|
||||
EditLoopData *eldata = &data->vbo_data[BM_elem_index_get(f)];
|
||||
memset(eldata, 0x0, sizeof(*eldata));
|
||||
mesh_render_data_face_flag(mr, f, data->offsets, *eldata);
|
||||
}
|
||||
|
||||
static void extract_fdots_edituv_data_iter_face_mesh(const MeshRenderData &mr,
|
||||
const int face_index,
|
||||
void *_data)
|
||||
{
|
||||
MeshExtract_EditUVFdotData_Data *data = static_cast<MeshExtract_EditUVFdotData_Data *>(_data);
|
||||
EditLoopData *eldata = &data->vbo_data[face_index];
|
||||
memset(eldata, 0x0, sizeof(*eldata));
|
||||
BMFace *efa = bm_original_face_get(mr, face_index);
|
||||
if (efa) {
|
||||
mesh_render_data_face_flag(mr, efa, data->offsets, *eldata);
|
||||
GPU_vertbuf_init_with_format(&vbo, &format);
|
||||
GPU_vertbuf_data_alloc(&vbo, mr.faces_num);
|
||||
MutableSpan vbo_data(static_cast<EditLoopData *>(GPU_vertbuf_get_data(&vbo)), mr.faces_num);
|
||||
const BMesh &bm = *mr.bm;
|
||||
const BMUVOffsets offsets = BM_uv_map_get_offsets(&bm);
|
||||
if (mr.extract_type == MR_EXTRACT_BMESH) {
|
||||
threading::parallel_for(IndexRange(bm.totface), 2048, [&](const IndexRange range) {
|
||||
for (const int face_index : range) {
|
||||
const BMFace &face = *BM_face_at_index(&const_cast<BMesh &>(bm), face_index);
|
||||
vbo_data[face_index] = {};
|
||||
mesh_render_data_face_flag(mr, &face, offsets, vbo_data[face_index]);
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
if (mr.orig_index_face) {
|
||||
const Span<int> orig_index_face(mr.orig_index_face, mr.faces_num);
|
||||
threading::parallel_for(IndexRange(mr.faces_num), 4096, [&](const IndexRange range) {
|
||||
for (const int face : range) {
|
||||
vbo_data[face] = {};
|
||||
if (orig_index_face[face] == ORIGINDEX_NONE) {
|
||||
continue;
|
||||
}
|
||||
const BMFace *orig_face = bm_original_face_get(mr, face);
|
||||
mesh_render_data_face_flag(mr, orig_face, offsets, vbo_data[face]);
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
vbo_data.fill({});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
constexpr MeshExtract create_extractor_fdots_edituv_data()
|
||||
{
|
||||
MeshExtract extractor = {nullptr};
|
||||
extractor.init = extract_fdots_edituv_data_init;
|
||||
extractor.iter_face_bm = extract_fdots_edituv_data_iter_face_bm;
|
||||
extractor.iter_face_mesh = extract_fdots_edituv_data_iter_face_mesh;
|
||||
extractor.data_type = MR_DATA_NONE;
|
||||
extractor.data_size = sizeof(MeshExtract_EditUVFdotData_Data);
|
||||
extractor.use_threading = true;
|
||||
extractor.mesh_buffer_offset = offsetof(MeshBufferList, vbo.fdots_edituv_data);
|
||||
return extractor;
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
const MeshExtract extract_fdots_edituv_data = create_extractor_fdots_edituv_data();
|
||||
|
||||
} // namespace blender::draw
|
||||
|
||||
Reference in New Issue
Block a user