40 if (mesh.runtime->edit_mesh !=
nullptr) {
42 if (editmesh_eval_final !=
nullptr) {
43 return std::max<int>(1, editmesh_eval_final->
totcol);
46 return std::max<int>(1, mesh.totcol);
50 std::unique_ptr<MeshRenderData>
mr;
67 if (request_face_normals) {
84 if (calc_loose_geom) {
110 const bool is_editmode,
111 const bool is_paint_mode,
112 const bool edit_mode_active,
115 const bool do_uvedit,
217 [](
void *__restrict task_data) {
222 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
232 [](
void *__restrict task_data) {
237 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
248 [](
void *__restrict task_data) {
252 new TaskData{*mr, mbc, do_hq_normals},
253 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
263 [](
void *__restrict task_data) {
268 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
279 [](
void *__restrict task_data) {
283 new TaskData{*mr, mbc, do_hq_normals},
284 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
294 [](
void *__restrict task_data) {
299 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
310 [](
void *__restrict task_data) {
314 extract_tris(data.mr, face_sorted, data.cache, *data.mbc.buff.ibo.tris);
317 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
328 [](
void *__restrict task_data) {
331 data.buffers.ibo.lines,
332 data.buffers.ibo.lines_loose,
333 data.cache.no_loose_wire);
336 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
346 [](
void *__restrict task_data) {
351 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
361 [](
void *__restrict task_data) {
366 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
376 [](
void *__restrict task_data) {
381 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
393 [](
void *__restrict task_data) {
395 extract_tangents(data.mr, data.cache, data.do_hq_normals, *data.buffers.vbo.tan);
398 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
410 [](
void *__restrict task_data) {
426 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
437 [](
void *__restrict task_data) {
442 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
452 [](
void *__restrict task_data) {
457 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
467 [](
void *__restrict task_data) {
472 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
483 [](
void *__restrict task_data) {
488 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
499 [](
void *__restrict task_data) {
502 *data.buffers.vbo.edituv_stretch_area,
504 data.cache.tot_uv_area);
507 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
517 [](
void *__restrict task_data) {
522 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
532 [](
void *__restrict task_data) {
537 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
547 [](
void *__restrict task_data) {
552 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
562 [](
void *__restrict task_data) {
567 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
577 [](
void *__restrict task_data) {
582 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
592 [](
void *__restrict task_data) {
597 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
607 [](
void *__restrict task_data) {
612 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
623 [](
void *__restrict task_data) {
626 data.mr, *data.buffers.ibo.lines_adjacency, data.cache.is_manifold);
629 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
639 [](
void *__restrict task_data) {
644 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
654 [](
void *__restrict task_data) {
659 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
669 [](
void *__restrict task_data) {
674 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
684 [](
void *__restrict task_data) {
689 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
692 if (attrs_requested) {
700 [](
void *__restrict task_data) {
703 {data.cache.attr_used.requests, GPU_MAX_ATTR},
704 {data.buffers.vbo.attr, GPU_MAX_ATTR});
707 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
717 [](
void *__restrict task_data) {
722 [](
void *task_data) {
delete static_cast<TaskData *
>(task_data); });
733 static double avg = 0;
734 static double avg_fps = 0;
735 static double avg_rdata = 0;
736 static double end_prev = 0;
742 avg = avg * 0.95 + (end - rdata_end) * 0.05;
743 avg_fps = avg_fps * 0.95 + (end - end_prev) * 0.05;
744 avg_rdata = avg_rdata * 0.95 + (rdata_end - rdata_start) * 0.05;
747 "rdata %.0fms iter %.0fms (frame %.0fms)\n", avg_rdata * 1000, avg * 1000, avg_fps * 1000);
855 mr, subdiv_cache, cache, *
buffers.vbo.edituv_stretch_angle);
869 if (attrs_requested) {
General operations, lookup, etc. for blender objects.
const Mesh * BKE_object_get_editmesh_eval_final(const Object *object)
struct TaskNode * BLI_task_graph_node_create(struct TaskGraph *task_graph, TaskGraphNodeRunFunction run, void *user_data, TaskGraphNodeFreeFunction free_func)
void BLI_task_graph_edge_create(struct TaskNode *from_node, struct TaskNode *to_node)
bool BLI_task_graph_node_push_work(struct TaskNode *task_node)
void BLI_task_graph_work_and_wait(struct TaskGraph *task_graph)
double BLI_time_now_seconds(void)
Utility defines for timing/benchmarks.
bool GPU_use_hq_normals_workaround()
Read Guarded memory(de)allocation.
bool DRW_vbo_requested(blender::gpu::VertBuf *vbo)
bool DRW_ibo_requested(blender::gpu::IndexBuf *ibo)
void extract_edge_factor_subdiv(const DRWSubdivCache &subdiv_cache, const MeshRenderData &mr, gpu::VertBuf &pos_nor, gpu::VertBuf &vbo)
void extract_lines_paint_mask(const MeshRenderData &mr, gpu::IndexBuf &lines)
void extract_edge_index(const MeshRenderData &mr, gpu::VertBuf &vbo)
void extract_face_dots_uv(const MeshRenderData &mr, gpu::VertBuf &vbo)
void mesh_render_data_update_face_normals(MeshRenderData &mr)
void extract_edituv_lines(const MeshRenderData &mr, gpu::IndexBuf &ibo)
void extract_edituv_lines_subdiv(const MeshRenderData &mr, const DRWSubdivCache &subdiv_cache, gpu::IndexBuf &ibo)
void extract_edituv_stretch_area_subdiv(const MeshRenderData &mr, const DRWSubdivCache &subdiv_cache, gpu::VertBuf &vbo, float &tot_area, float &tot_uv_area)
void extract_tris(const MeshRenderData &mr, const SortedFaceData &face_sorted, MeshBatchCache &cache, gpu::IndexBuf &ibo)
void extract_attributes_subdiv(const MeshRenderData &mr, const DRWSubdivCache &subdiv_cache, const Span< DRW_AttributeRequest > requests, const Span< gpu::VertBuf * > vbos)
void extract_edituv_stretch_angle(const MeshRenderData &mr, gpu::VertBuf &vbo)
void extract_positions_subdiv(const DRWSubdivCache &subdiv_cache, const MeshRenderData &mr, gpu::VertBuf &vbo, gpu::VertBuf *orco_vbo)
void extract_face_dots(const MeshRenderData &mr, gpu::IndexBuf &face_dots)
void extract_edituv_data(const MeshRenderData &mr, gpu::VertBuf &vbo)
void extract_normals(const MeshRenderData &mr, bool use_hq, gpu::VertBuf &vbo)
void extract_points_subdiv(const MeshRenderData &mr, const DRWSubdivCache &subdiv_cache, gpu::IndexBuf &points)
void DRW_subdivide_loose_geom(DRWSubdivCache &subdiv_cache, const MeshBufferCache &cache)
void extract_tris_subdiv(const DRWSubdivCache &subdiv_cache, MeshBatchCache &cache, gpu::IndexBuf &ibo)
void extract_face_dots_position(const MeshRenderData &mr, gpu::VertBuf &vbo)
void extract_edge_factor(const MeshRenderData &mr, gpu::VertBuf &vbo)
void extract_face_dot_normals(const MeshRenderData &mr, const bool use_hq, gpu::VertBuf &vbo)
void extract_lines_adjacency_subdiv(const DRWSubdivCache &subdiv_cache, gpu::IndexBuf &ibo, bool &r_is_manifold)
void extract_weights(const MeshRenderData &mr, const MeshBatchCache &cache, gpu::VertBuf &vbo)
void extract_normals_subdiv(const MeshRenderData &mr, const DRWSubdivCache &subdiv_cache, gpu::VertBuf &pos_nor, gpu::VertBuf &lnor)
void extract_uv_maps(const MeshRenderData &mr, const MeshBatchCache &cache, gpu::VertBuf &vbo)
void extract_edituv_data_subdiv(const MeshRenderData &mr, const DRWSubdivCache &subdiv_cache, gpu::VertBuf &vbo)
void extract_lines(const MeshRenderData &mr, gpu::IndexBuf *lines, gpu::IndexBuf *lines_loose, bool &no_loose_wire)
void extract_weights_subdiv(const MeshRenderData &mr, const DRWSubdivCache &subdiv_cache, const MeshBatchCache &cache, gpu::VertBuf &vbo)
void extract_face_dot_index(const MeshRenderData &mr, gpu::VertBuf &vbo)
void extract_tangents(const MeshRenderData &mr, const MeshBatchCache &cache, const bool use_hq, gpu::VertBuf &vbo)
void extract_vert_index_subdiv(const DRWSubdivCache &subdiv_cache, const MeshRenderData &mr, gpu::VertBuf &vbo)
void extract_face_index_subdiv(const DRWSubdivCache &subdiv_cache, const MeshRenderData &mr, gpu::VertBuf &vbo)
void extract_edituv_tris(const MeshRenderData &mr, gpu::IndexBuf &ibo)
void extract_uv_maps_subdiv(const DRWSubdivCache &subdiv_cache, const MeshBatchCache &cache, gpu::VertBuf &vbo)
void extract_orco(const MeshRenderData &mr, gpu::VertBuf &vbo)
int mesh_render_mat_len_get(const Object &object, const Mesh &mesh)
static bool any_attr_requested(const MeshBufferList &buffers)
void mesh_buffer_cache_create_requested(TaskGraph &task_graph, MeshBatchCache &cache, MeshBufferCache &mbc, Object &object, Mesh &mesh, bool is_editmode, bool is_paint_mode, bool edit_mode_active, const float4x4 &object_to_world, bool do_final, bool do_uvedit, const Scene &scene, const ToolSettings *ts, bool use_hide)
void extract_edituv_stretch_angle_subdiv(const MeshRenderData &mr, const DRWSubdivCache &subdiv_cache, const MeshBatchCache &cache, gpu::VertBuf &vbo)
void extract_face_dots_edituv_data(const MeshRenderData &mr, gpu::VertBuf &vbo)
void extract_edituv_points_subdiv(const MeshRenderData &mr, const DRWSubdivCache &subdiv_cache, gpu::IndexBuf &ibo)
void extract_lines_subdiv(const DRWSubdivCache &subdiv_cache, const MeshRenderData &mr, gpu::IndexBuf *lines, gpu::IndexBuf *lines_loose, bool &no_loose_wire)
void mesh_buffer_cache_create_requested_subdiv(MeshBatchCache &cache, MeshBufferCache &mbc, DRWSubdivCache &subdiv_cache, MeshRenderData &mr)
void extract_tangents_subdiv(const MeshRenderData &mr, const DRWSubdivCache &subdiv_cache, const MeshBatchCache &cache, gpu::VertBuf &vbo)
std::unique_ptr< MeshRenderData > mesh_render_data_create(Object &object, Mesh &mesh, const bool is_editmode, const bool is_paint_mode, const bool edit_mode_active, const float4x4 &object_to_world, const bool do_final, const bool do_uvedit, const bool use_hide, const ToolSettings *ts)
void mesh_render_data_update_corner_normals(MeshRenderData &mr)
void extract_points(const MeshRenderData &mr, gpu::IndexBuf &points)
void extract_vert_index(const MeshRenderData &mr, gpu::VertBuf &vbo)
static void mesh_extract_render_data_node_exec(void *__restrict task_data)
const SortedFaceData & mesh_render_data_faces_sorted_ensure(const MeshRenderData &mr, MeshBufferCache &cache)
void extract_face_index(const MeshRenderData &mr, gpu::VertBuf &vbo)
void extract_sculpt_data(const MeshRenderData &mr, gpu::VertBuf &vbo)
void extract_edit_data_subdiv(const MeshRenderData &mr, const DRWSubdivCache &subdiv_cache, gpu::VertBuf &vbo)
void extract_lines_paint_mask_subdiv(const MeshRenderData &mr, const DRWSubdivCache &subdiv_cache, gpu::IndexBuf &lines)
void extract_positions(const MeshRenderData &mr, gpu::VertBuf &vbo)
void extract_vert_normals(const MeshRenderData &mr, gpu::VertBuf &vbo)
void extract_lines_adjacency(const MeshRenderData &mr, gpu::IndexBuf &ibo, bool &r_is_manifold)
void mesh_render_data_update_loose_geom(MeshRenderData &mr, MeshBufferCache &cache)
void extract_sculpt_data_subdiv(const MeshRenderData &mr, const DRWSubdivCache &subdiv_cache, gpu::VertBuf &vbo)
void extract_mesh_analysis(const MeshRenderData &mr, gpu::VertBuf &vbo)
void extract_skin_roots(const MeshRenderData &mr, gpu::VertBuf &vbo)
void extract_attr_viewer(const MeshRenderData &mr, gpu::VertBuf &vbo)
void extract_attributes(const MeshRenderData &mr, const Span< DRW_AttributeRequest > requests, const Span< gpu::VertBuf * > vbos)
void extract_edituv_tris_subdiv(const MeshRenderData &mr, const DRWSubdivCache &subdiv_cache, gpu::IndexBuf &ibo)
void extract_edituv_face_dots(const MeshRenderData &mr, gpu::IndexBuf &ibo)
void extract_edit_data(const MeshRenderData &mr, gpu::VertBuf &vbo)
void extract_edituv_stretch_area(const MeshRenderData &mr, gpu::VertBuf &vbo, float &tot_area, float &tot_uv_area)
void extract_edituv_points(const MeshRenderData &mr, gpu::IndexBuf &ibo)
void extract_edge_index_subdiv(const DRWSubdivCache &subdiv_cache, const MeshRenderData &mr, gpu::VertBuf &vbo)
void extract_face_dots_subdiv(const DRWSubdivCache &subdiv_cache, gpu::VertBuf &fdots_pos, gpu::VertBuf *fdots_nor, gpu::IndexBuf &fdots)
MeshRuntimeHandle * runtime
DRW_AttributeRequest requests[GPU_MAX_ATTR]
std::unique_ptr< MeshRenderData > mr
bool use_simplify_normals