[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