From 074a8558b7b320d7be78d436ab5473fd5b53ff56 Mon Sep 17 00:00:00 2001 From: Sebastian Parborg Date: Fri, 29 Apr 2022 18:20:54 +0200 Subject: Fix rendering of wire curves when used as custom bone objects In the current code we do not render any curves if they have not been converted to meshes. This change makes the custom bone drawing try to render mesh objects first and then falls back to curve objects if there is no mesh data available. Reviewed By: Clement Differential Revision: http://developer.blender.org/D14804 --- source/blender/draw/intern/draw_cache.c | 14 ++++++++++++-- source/blender/draw/intern/draw_manager.c | 2 +- source/blender/draw/intern/draw_manager.h | 2 +- 3 files changed, 14 insertions(+), 4 deletions(-) (limited to 'source/blender/draw/intern') diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c index e606d67df25..19d6557c34a 100644 --- a/source/blender/draw/intern/draw_cache.c +++ b/source/blender/draw/intern/draw_cache.c @@ -3357,7 +3357,7 @@ void drw_batch_cache_generate_requested(Object *ob) } } -void drw_batch_cache_generate_requested_evaluated_mesh(Object *ob) +void drw_batch_cache_generate_requested_evaluated_mesh_or_curve(Object *ob) { /* NOTE: Logic here is duplicated from #drw_batch_cache_generate_requested. */ @@ -3374,7 +3374,17 @@ void drw_batch_cache_generate_requested_evaluated_mesh(Object *ob) ((mode == CTX_MODE_EDIT_MESH) && DRW_object_is_in_edit_mode(ob)))); Mesh *mesh = BKE_object_get_evaluated_mesh_no_subsurf(ob); - DRW_mesh_batch_cache_create_requested(DST.task_graph, ob, mesh, scene, is_paint_mode, use_hide); + /* Try getting the mesh first and if that fails, try getting the curve data. + * If the curves are surfaces or have certain modifiers applied to them, the will have mesh data + * of the final result. + */ + if (mesh != NULL) { + DRW_mesh_batch_cache_create_requested( + DST.task_graph, ob, mesh, scene, is_paint_mode, use_hide); + } + else if (ELEM(ob->type, OB_CURVES_LEGACY, OB_FONT, OB_SURF)) { + DRW_curve_batch_cache_create_requested(ob, scene); + } } void drw_batch_cache_generate_requested_delayed(Object *ob) diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index adf9d4a13df..6ab8d30109e 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -164,7 +164,7 @@ static void drw_task_graph_deinit(void) BLI_task_graph_work_and_wait(DST.task_graph); BLI_gset_free(DST.delayed_extraction, - (void (*)(void *key))drw_batch_cache_generate_requested_evaluated_mesh); + (void (*)(void *key))drw_batch_cache_generate_requested_evaluated_mesh_or_curve); DST.delayed_extraction = NULL; BLI_task_graph_work_and_wait(DST.task_graph); diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h index 8812f112014..7a9585262ff 100644 --- a/source/blender/draw/intern/draw_manager.h +++ b/source/blender/draw/intern/draw_manager.h @@ -671,7 +671,7 @@ void drw_batch_cache_generate_requested(struct Object *ob); * \warning Only evaluated mesh data is handled by this delayed generation. */ void drw_batch_cache_generate_requested_delayed(Object *ob); -void drw_batch_cache_generate_requested_evaluated_mesh(Object *ob); +void drw_batch_cache_generate_requested_evaluated_mesh_or_curve(Object *ob); void drw_resource_buffer_finish(DRWData *vmempool); -- cgit v1.2.3