From 24b84e468805fb15baa465fbf2a34592b6db16ca Mon Sep 17 00:00:00 2001 From: YimingWu Date: Wed, 1 Dec 2021 15:51:23 +0800 Subject: LineArt: Use consitent view vector direction. Now do not invertes view vector in different stages of calculation. --- source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) (limited to 'source') diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c index 88d717eb032..3df2bec67ff 100644 --- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c +++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c @@ -502,10 +502,6 @@ static void lineart_main_occlusion_begin(LineartRenderBuffer *rb) rb->edge_mark.last = rb->edge_mark.first; rb->floating.last = rb->floating.first; - /* This is needed because the occlusion function expects the camera vector to point towards the - * camera. */ - negate_v3_db(rb->view_vector); - TaskPool *tp = BLI_task_pool_create(NULL, TASK_PRIORITY_HIGH); for (i = 0; i < thread_count; i++) { @@ -3010,7 +3006,7 @@ static void lineart_triangle_intersect_in_bounding_area(LineartRenderBuffer *rb, */ static void lineart_main_get_view_vector(LineartRenderBuffer *rb) { - float direction[3] = {0, 0, -1}; + float direction[3] = {0, 0, 1}; float trans[3]; float inv[4][4]; float obmat_no_scale[4][4]; -- cgit v1.2.3 From 9cec9b4d6e33e2270baa8b94454b16665a8f2f60 Mon Sep 17 00:00:00 2001 From: YimingWu Date: Tue, 30 Nov 2021 22:22:21 +0800 Subject: Fix(unreported): LineArt intersection mask logic error. The stroke generation call mistakenly uses all enabled types to check intersection mask, the correct behavior is to use individual edge(chain) type. --- source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c index 3df2bec67ff..9a2304755bd 100644 --- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c +++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c @@ -4394,7 +4394,7 @@ static void lineart_gpencil_generate(LineartCache *cache, } } } - if (types & LRT_EDGE_FLAG_INTERSECTION) { + if (ec->type & LRT_EDGE_FLAG_INTERSECTION) { if (mask_switches & LRT_GPENCIL_INTERSECTION_MATCH) { if (ec->intersection_mask != intersection_mask) { continue; -- cgit v1.2.3 From 594656e7a39d3598d7a357511742fb0b001254bc Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Wed, 1 Dec 2021 21:16:18 -0500 Subject: Fix T93525: Crash with curve/text armature bone gizmo The problem is that drw_batch_cache_generate_requested_delayed is called on the object, which uses the original object data type to choose which data type to get info for. So for curves and text it uses the incorrect type (not the evaluated mesh like we hardcoded in the armature overlay code). To fix this I hardcoded the "delayed" generation to only use the evaluated mesh. Luckily it wasn't use elsewhere besides this armature overlay system. That seems like the simplest fix for 3.0. A proper solution should rewrite this whole area anyway. Differential Revision: https://developer.blender.org/D13439 --- .../blender/draw/engines/overlay/overlay_armature.c | 10 +++++++--- source/blender/draw/intern/draw_cache.c | 19 +++++++++++++++++++ source/blender/draw/intern/draw_manager.c | 3 ++- source/blender/draw/intern/draw_manager.h | 5 +++++ 4 files changed, 33 insertions(+), 4 deletions(-) (limited to 'source') diff --git a/source/blender/draw/engines/overlay/overlay_armature.c b/source/blender/draw/engines/overlay/overlay_armature.c index 50d8fe3065d..cc12f097526 100644 --- a/source/blender/draw/engines/overlay/overlay_armature.c +++ b/source/blender/draw/engines/overlay/overlay_armature.c @@ -591,12 +591,16 @@ static void drw_shgroup_bone_custom_wire(ArmatureDrawContext *ctx, const float color[4], Object *custom) { + /* See comments in #drw_shgroup_bone_custom_solid. */ + Mesh *mesh = BKE_object_get_evaluated_mesh(custom); + if (mesh == NULL) { + return; + } /* TODO(fclem): arg... less than ideal but we never iter on this object * to assure batch cache is valid. */ - drw_batch_cache_validate(custom); - - struct GPUBatch *geom = DRW_cache_object_all_edges_get(custom); + DRW_mesh_batch_cache_validate(mesh); + struct GPUBatch *geom = DRW_mesh_batch_cache_get_all_edges(mesh); if (geom) { DRWCallBuffer *buf = custom_bone_instance_shgroup(ctx, ctx->custom_wire, geom); BoneInstanceData inst_data; diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c index 7b66026f7ad..d1b82bab277 100644 --- a/source/blender/draw/intern/draw_cache.c +++ b/source/blender/draw/intern/draw_cache.c @@ -3450,6 +3450,25 @@ void drw_batch_cache_generate_requested(Object *ob) } } +/* Note: Logic here is duplicated from #drw_batch_cache_generate_requested. */ +void drw_batch_cache_generate_requested_evaluated_mesh(Object *ob) +{ + const DRWContextState *draw_ctx = DRW_context_state_get(); + const Scene *scene = draw_ctx->scene; + const enum eContextObjectMode mode = CTX_data_mode_enum_ex( + draw_ctx->object_edit, draw_ctx->obact, draw_ctx->object_mode); + const bool is_paint_mode = ELEM( + mode, CTX_MODE_SCULPT, CTX_MODE_PAINT_TEXTURE, CTX_MODE_PAINT_VERTEX, CTX_MODE_PAINT_WEIGHT); + + const bool use_hide = ((ob->type == OB_MESH) && + ((is_paint_mode && (ob == draw_ctx->obact) && + DRW_object_use_hide_faces(ob)) || + ((mode == CTX_MODE_EDIT_MESH) && DRW_object_is_in_edit_mode(ob)))); + + Mesh *mesh = BKE_object_get_evaluated_mesh(ob); + DRW_mesh_batch_cache_create_requested(DST.task_graph, ob, mesh, scene, is_paint_mode, use_hide); +} + void drw_batch_cache_generate_requested_delayed(Object *ob) { BLI_gset_add(DST.delayed_extraction, ob); diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index b921b82cbf5..44eea828172 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -173,7 +173,8 @@ 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); + BLI_gset_free(DST.delayed_extraction, + (void (*)(void *key))drw_batch_cache_generate_requested_evaluated_mesh); 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 162fe9b5fd1..a4924711384 100644 --- a/source/blender/draw/intern/draw_manager.h +++ b/source/blender/draw/intern/draw_manager.h @@ -663,7 +663,12 @@ eDRWCommandType command_type_get(const uint64_t *command_type_bits, int index); void drw_batch_cache_validate(Object *ob); 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_resource_buffer_finish(DRWData *vmempool); -- cgit v1.2.3