diff options
author | Pablo Dobarro <pablodp606@gmail.com> | 2020-11-18 14:16:43 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2020-11-18 14:20:57 +0300 |
commit | 4b55abc335558262c1c897738b159b7a0b0ef5f9 (patch) | |
tree | 052edeb6a25ff6162850b1759b5d30c29caa0464 /source/blender | |
parent | dfa2b0e1c95bf72d58bbff9fb5c4045521af04d6 (diff) |
Fix T82586: Sculpt normals not updating with EEVEE enabled
The root cause of this bug is that the function that updates the PBVH
normals is drw_sculpt_generate_calls. As now both the overlays and
mesh can be drawn without using pbvh drawing, the normals were not
updating. This patch forces a normals updates also in the no PBVH
drawing code path of the overlays. This was affecting both shading and
sculpt surface sampling in both flat and smooth shading modes.
Having the sculpt normals being updated by the drawing code is a wrong
design which also causes other issues like:
Brushes that sample the surface and do multiple stroke steps between
redraws will sample invalid normals, creating artifacts during the
stroke clearly visible in some brushes.
Brushes that do not need to sample the surface update the normals on
each redraw. This affects performance a lot as in some cases, updating the
normals takes more time than doing the brush deformation. If flat shading
is being used, this is only necessary to do once after the stroke ends.
Reviewed By: fclem
Differential Revision: https://developer.blender.org/D9535
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/draw/intern/draw_cache_impl_mesh.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c index 7217be106ae..8e23199430a 100644 --- a/source/blender/draw/intern/draw_cache_impl_mesh.c +++ b/source/blender/draw/intern/draw_cache_impl_mesh.c @@ -51,6 +51,8 @@ #include "BKE_mesh_tangent.h" #include "BKE_modifier.h" #include "BKE_object_deform.h" +#include "BKE_paint.h" +#include "BKE_pbvh.h" #include "atomic_ops.h" @@ -1310,6 +1312,17 @@ void DRW_mesh_batch_cache_create_requested(struct TaskGraph *task_graph, return; } + /* TODO(pablodp606): This always updates the sculpt normals for regular drawing (non-PBVH). + * This makes tools that sample the surface per step get wrong normals until a redraw happens. + * Normal updates should be part of the brush loop and only run during the stroke when the + * brush needs to sample the surface. The drawing code should only update the normals + * per redraw when smooth shading is enabled. */ + const bool do_update_sculpt_normals = ob->sculpt && ob->sculpt->pbvh; + if (do_update_sculpt_normals) { + Mesh *mesh = ob->data; + BKE_pbvh_update_normals(ob->sculpt->pbvh, mesh->runtime.subdiv_ccg); + } + cache->batch_ready |= batch_requested; const bool do_cage = (is_editmode && |