[Bf-blender-cvs] [5ce01b8ce8d] sculpt-dev: * Sculpt-dev: pbvh draw cleanup

Joseph Eagar noreply at git.blender.org
Thu Nov 18 00:33:00 CET 2021


Commit: 5ce01b8ce8d6fd3ed51cdf014aab56da369e89e8
Author: Joseph Eagar
Date:   Wed Nov 17 15:27:47 2021 -0800
Branches: sculpt-dev
https://developer.blender.org/rB5ce01b8ce8d6fd3ed51cdf014aab56da369e89e8

* Sculpt-dev: pbvh draw cleanup

* PBVH drawing for eevee is now used for
  PBVH_FACES as well as PBVH_BMESH.
* PBVH_FACES now uses pbvh draw for eevee rendering
* Refactored gpu_pbvh_gpu_make_vcol_offs into a
  more general gpu_pbvh_gpu_make_attr_offs.
  This should be a usable alternative to using a generic
  attribute gpu system (whether the one that's #ifdef'd out
  in gpu_buffers.c, or the new one that hit master
  recently).
* Textured workbench draw mode now works for pbvh drawing.
* Fixed nasty stack overflow in dyntopo edge collapse.

===================================================================

M	source/blender/blenkernel/intern/attribute.c
M	source/blender/blenkernel/intern/dyntopo.c
M	source/blender/blenkernel/intern/paint.c
M	source/blender/blenkernel/intern/pbvh.c
M	source/blender/draw/DRW_engine.h
M	source/blender/draw/engines/workbench/workbench_engine.c
M	source/blender/draw/engines/workbench/workbench_materials.c
M	source/blender/draw/engines/workbench/workbench_shader.c
M	source/blender/draw/intern/draw_cache.c
M	source/blender/gpu/GPU_buffers.h
M	source/blender/gpu/intern/gpu_buffers.c

===================================================================

diff --git a/source/blender/blenkernel/intern/attribute.c b/source/blender/blenkernel/intern/attribute.c
index 6c0bc58bc66..f20281b806d 100644
--- a/source/blender/blenkernel/intern/attribute.c
+++ b/source/blender/blenkernel/intern/attribute.c
@@ -488,9 +488,11 @@ void BKE_id_attributes_active_color_set(ID *id, CustomDataLayer *active_layer)
 {
   AttributeRef *ref = BKE_id_attributes_active_color_ref_p(id);
 
-  if (!ref || !ref->type) {
+  if (!ref) {
     fprintf(stderr, "%s: vertex colors not supported for this type\n", __func__);
-    return;
+  }
+  if (!ref || !ref->type) {
+    return NULL;
   }
 
   DomainInfo info[ATTR_DOMAIN_NUM];
@@ -537,8 +539,10 @@ CustomDataLayer *BKE_id_attributes_render_color_get(ID *id)
 {
   AttributeRef *ref = BKE_id_attributes_render_color_ref_p(id);
 
-  if (!ref || !ref->type) {
+  if (!ref) {
     fprintf(stderr, "%s: vertex colors not supported for this type\n", __func__);
+  }
+  if (!ref || !ref->type) {
     return NULL;
   }
 
diff --git a/source/blender/blenkernel/intern/dyntopo.c b/source/blender/blenkernel/intern/dyntopo.c
index dd076f26bb9..e6a25abe410 100644
--- a/source/blender/blenkernel/intern/dyntopo.c
+++ b/source/blender/blenkernel/intern/dyntopo.c
@@ -3637,6 +3637,8 @@ static BMVert *pbvh_bmesh_collapse_edge(PBVH *pbvh,
       } while ((e2 = BM_DISK_EDGE_NEXT(e2, v)) != v->e);
     }
 
+    float (*uv)[2] = BLI_array_alloca(uv, 4*totuv);
+
     do {
       const void *ls2[2] = {l->head.data, l->next->head.data};
       float ws2[2] = {0.5f, 0.5f};
@@ -3648,7 +3650,6 @@ static BMVert *pbvh_bmesh_collapse_edge(PBVH *pbvh,
         ws2[axis ^ 1] = 1.0f;
       }
 
-      float uv[2][2];
       for (int step = 0; uv_layer && step < 2; step++) {
         BMLoop *l1 = step ? l : l->next;
 
diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c
index 331c53d9081..44cad73fdd5 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -2704,8 +2704,7 @@ bool BKE_sculptsession_use_pbvh_draw(const Object *ob, const View3D *v3d)
 
   if (BKE_pbvh_type(ss->pbvh) == PBVH_FACES) {
     /* Regular mesh only draws from PBVH without modifiers and shape keys. */
-    const bool full_shading = (v3d && (v3d->shading.type > OB_SOLID));
-    return !(ss->shapekey_active || ss->deform_modifiers_active || full_shading);
+    return !(ss->shapekey_active || ss->deform_modifiers_active);
   }
 
   /* Multires and dyntopo always draw directly from the PBVH. */
diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c
index f8ed686176a..74cfa2ae83d 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -1445,7 +1445,7 @@ bool BKE_pbvh_get_color_layer(PBVH *pbvh,
   }
 }
 
-static void pbvh_update_draw_buffer_cb(void *__restrict userdata,
+ATTR_NO_OPT static void pbvh_update_draw_buffer_cb(void *__restrict userdata,
                                        const int n,
                                        const TaskParallelTLS *__restrict UNUSED(tls))
 {
@@ -1461,19 +1461,25 @@ static void pbvh_update_draw_buffer_cb(void *__restrict userdata,
   AttributeDomain vcol_domain;
 
   BKE_pbvh_get_color_layer(pbvh, me, &vcol_layer, &vcol_domain);
-  CustomDataLayer *render_vcol_layer = BKE_id_attributes_render_color_get((ID *)me);
+  CustomDataLayer *render_vcol_layer = NULL;
+  AttributeRef *render_ref = BKE_id_attributes_render_color_ref_p(&me->id);
 
-  if (pbvh->bm && render_vcol_layer) {
-    AttributeDomain domain = BKE_id_attribute_domain((ID *)me, render_vcol_layer);
-    CustomData *cdata = domain == ATTR_DOMAIN_POINT ? &pbvh->bm->vdata : &pbvh->bm->ldata;
+  CustomData *vdata, *ldata;
 
-    int idx = CustomData_get_named_layer_index(
-        cdata, render_vcol_layer->type, render_vcol_layer->name);
+  if (!pbvh->bm) {
+    vdata = pbvh->vdata ? pbvh->vdata : &me->vdata;
+    ldata = pbvh->ldata ? pbvh->ldata : &me->ldata;
+  }
+  else {
+    vdata = &pbvh->bm->vdata;
+    ldata = &pbvh->bm->ldata;
+  }
 
-    if (idx == -1) {
-      render_vcol_layer = NULL; /* layers hasn't been synced over yet */
-    }
-    else {
+  if (render_ref) {
+    CustomData *cdata = render_ref->domain == ATTR_DOMAIN_POINT ? vdata : ldata;
+
+    int idx = CustomData_get_named_layer_index(cdata, render_ref->type, render_ref->name);
+    if (idx != -1) {
       render_vcol_layer = cdata->layers + idx;
     }
   }
@@ -1539,13 +1545,15 @@ static void pbvh_update_draw_buffer_cb(void *__restrict userdata,
         AttributeDomain domain;
 
         BKE_pbvh_get_color_layer(pbvh, pbvh->mesh, &cl, &domain);
-
+        
         GPU_pbvh_mesh_buffers_update(node->draw_buffers,
                                      pbvh->verts,
+                                     vdata,
+                                     ldata,
                                      CustomData_get_layer(pbvh->vdata, CD_PAINT_MASK),
-                                     cl ? cl->data : NULL,
-                                     cl ? cl->type : -1,
-                                     cl ? domain : ATTR_DOMAIN_AUTO,
+                                     cl,
+                                     render_vcol_layer,
+                                     domain, 
                                      CustomData_get_layer(pbvh->pdata, CD_SCULPT_FACE_SETS),
                                      pbvh->face_sets_color_seed,
                                      pbvh->face_sets_color_default,
@@ -1735,7 +1743,7 @@ static void pbvh_update_draw_buffers(
       .pbvh = pbvh, .nodes = nodes, .flat_vcol_shading = pbvh->flat_vcol_shading, .mesh = me};
 
   TaskParallelSettings settings;
-  BKE_pbvh_parallel_range_settings(&settings, true, totnode);
+  BKE_pbvh_parallel_range_settings(&settings, false /*XXX*/, totnode);
   BLI_task_parallel_range(0, totnode, &data, pbvh_update_draw_buffer_cb, &settings);
 
   for (int i = 0; i < totnode; i++) {
@@ -3283,7 +3291,7 @@ void BKE_pbvh_draw_cb(PBVH *pbvh,
     // check that need_full_render is set to GPU_pbvh_need_full_render_get(),
     // but only if nodes need updating
 
-    if (pbvh->type == PBVH_BMESH && pbvh->need_full_render != GPU_pbvh_need_full_render_get()) {
+    if (pbvh->type != PBVH_GRIDS && pbvh->need_full_render != GPU_pbvh_need_full_render_get()) {
       // update all nodes
       MEM_SAFE_FREE(nodes);
 
diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h
index d63a3897249..096fa5d0912 100644
--- a/source/blender/draw/DRW_engine.h
+++ b/source/blender/draw/DRW_engine.h
@@ -84,7 +84,8 @@ void DRW_make_cdlayer_attr_aliases(struct GPUVertFormat *format,
                                    char *base_name,
                                    struct CustomData *data,
                                    struct CustomDataLayer *cl,
-                                   bool is_active_render);
+                                   bool is_active_render,
+                                   bool is_active_layer);
 
 void DRW_draw_render_loop_ex(struct Depsgraph *depsgraph,
                              struct RenderEngineType *engine_type,
diff --git a/source/blender/draw/engines/workbench/workbench_engine.c b/source/blender/draw/engines/workbench/workbench_engine.c
index 3d93ef47e27..f90c74d96ef 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.c
+++ b/source/blender/draw/engines/workbench/workbench_engine.c
@@ -104,12 +104,12 @@ static struct GPUBatch **workbench_object_surface_material_get(Object *ob)
   return DRW_cache_object_surface_material_get(ob, gpumat_array, materials_len);
 }
 
-static void workbench_cache_sculpt_populate(WORKBENCH_PrivateData *wpd,
+ATTR_NO_OPT static void workbench_cache_sculpt_populate(WORKBENCH_PrivateData *wpd,
                                             Object *ob,
                                             eV3DShadingColorType color_type)
 {
-  const bool use_single_drawcall = !ELEM(color_type, V3D_SHADING_MATERIAL_COLOR);
-  BLI_assert(color_type != V3D_SHADING_TEXTURE_COLOR);
+  const bool use_single_drawcall = !ELEM(
+      color_type, V3D_SHADING_MATERIAL_COLOR, V3D_SHADING_TEXTURE_COLOR);
 
   if (use_single_drawcall) {
     DRWShadingGroup *grp = workbench_material_setup(wpd, ob, 0, color_type, NULL);
@@ -121,6 +121,7 @@ static void workbench_cache_sculpt_populate(WORKBENCH_PrivateData *wpd,
     for (int i = 0; i < materials_len; i++) {
       shgrps[i] = workbench_material_setup(wpd, ob, i + 1, color_type, NULL);
     }
+
     DRW_shgroup_call_sculpt_with_materials(shgrps, materials_len, ob);
   }
 }
@@ -240,7 +241,7 @@ static void workbench_cache_hair_populate(WORKBENCH_PrivateData *wpd,
  * Decide what color-type to draw the object with.
  * In some cases it can be overwritten by #workbench_material_setup().
  */
-static eV3DShadingColorType workbench_color_type_get(WORKBENCH_PrivateData *wpd,
+ATTR_NO_OPT static eV3DShadingColorType workbench_color_type_get(WORKBENCH_PrivateData *wpd,
                                                      Object *ob,
                                                      bool *r_sculpt_pbvh,
                                                      bool *r_texpaint_mode,
@@ -297,11 +298,6 @@ static eV3DShadingColorType workbench_color_type_get(WORKBENCH_PrivateData *wpd,
     }
   }
 
-  if (is_sculpt_pbvh && color_type == V3D_SHADING_TEXTURE_COLOR) {
-    /* Force use of material color for sculpt. */
-    color_type = V3D_SHADING_MATERIAL_COLOR;
-  }
-
   if (r_draw_shadow) {
     *r_draw_shadow = (ob->dtx & OB_DRAW_NO_SHADOW_CAST) == 0 && SHADOW_ENABLED(wpd);
     /* Currently unsupported in sculpt mode. We could revert to the slow
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c
index aaa1a5a6ff6..b885503d458 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -158,7 +158,7 @@ BLI_INLINE bool workbench_material_chunk_select(WORKBENCH_PrivateData *wpd,
   return resource_changed;
 }
 
-DRWShadingGroup *workbench_material_setup_ex(WORKBENCH_PrivateData *wpd,
+ATTR_NO_OPT

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list