[Bf-blender-cvs] [7ae47bc368c] curve-nodes-modifier: More cleanup, displist still shows up when it shouldn't (no mesh in data_eval)
Hans Goudey
noreply at git.blender.org
Tue Jul 13 01:40:44 CEST 2021
Commit: 7ae47bc368c4a6cbd8f2e01dd8e33c16f846683f
Author: Hans Goudey
Date: Mon Jun 28 20:27:07 2021 -0500
Branches: curve-nodes-modifier
https://developer.blender.org/rB7ae47bc368c4a6cbd8f2e01dd8e33c16f846683f
More cleanup, displist still shows up when it shouldn't (no mesh in data_eval)
===================================================================
M source/blender/blenkernel/intern/displist.cc
===================================================================
diff --git a/source/blender/blenkernel/intern/displist.cc b/source/blender/blenkernel/intern/displist.cc
index 4063a61e75b..3faa1ff99ce 100644
--- a/source/blender/blenkernel/intern/displist.cc
+++ b/source/blender/blenkernel/intern/displist.cc
@@ -832,10 +832,17 @@ void BKE_curve_calc_modifiers_pre(Depsgraph *depsgraph,
}
}
+static void geometry_set_ensure_mesh(GeometrySet &geometry_set)
+{
+ if (!geometry_set.has_mesh()) {
+ geometry_set.replace_mesh(BKE_mesh_new_nomain(0, 0, 0, 0, 0));
+ }
+}
+
static GeometrySet curve_calc_modifiers_post(Depsgraph *depsgraph,
const Scene *scene,
Object *ob,
- ListBase *dispbase,
+ const ListBase *dispbase,
const bool for_render)
{
const Curve *cu = (const Curve *)ob->data;
@@ -869,7 +876,6 @@ static GeometrySet curve_calc_modifiers_post(Depsgraph *depsgraph,
geometry_set.replace_curve(curve_eval.release());
}
else {
- curve_to_filledpoly(cu, dispbase);
Mesh *mesh = BKE_mesh_new_nomain_from_curve_displist(ob, dispbase);
/* Copy materials, since BKE_mesh_new_nomain_from_curve_displist() doesn't. */
mesh->mat = (Material **)MEM_dupallocN(cu->mat);
@@ -889,9 +895,7 @@ static GeometrySet curve_calc_modifiers_post(Depsgraph *depsgraph,
continue;
}
- if (!geometry_set.has_mesh()) {
- geometry_set.replace_mesh(BKE_mesh_new_nomain(0, 0, 0, 0, 0));
- }
+ geometry_set_ensure_mesh(geometry_set);
Mesh *mesh = geometry_set.get_mesh_for_write();
if (mti->type == eModifierTypeType_OnlyDeform) {
@@ -915,17 +919,16 @@ static GeometrySet curve_calc_modifiers_post(Depsgraph *depsgraph,
}
}
- if (geometry_set.has_mesh()) {
- Mesh *final_mesh = geometry_set.get_mesh_for_write();
+ geometry_set_ensure_mesh(geometry_set);
+ Mesh *final_mesh = geometry_set.get_mesh_for_write();
- /* XXX2.8(Sybren): make sure the face normals are recalculated as well */
- BKE_mesh_ensure_normals(final_mesh);
+ /* XXX2.8(Sybren): make sure the face normals are recalculated as well */
+ BKE_mesh_ensure_normals(final_mesh);
- /* Set flag which makes it easier to see what's going on in a debugger. */
- final_mesh->id.tag |= LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT;
- BLI_strncpy(final_mesh->id.name, cu->id.name, sizeof(final_mesh->id.name));
- *((short *)final_mesh->id.name) = ID_ME;
- }
+ /* Set flag which makes it easier to see what's going on in a debugger. */
+ final_mesh->id.tag |= LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT;
+ BLI_strncpy(final_mesh->id.name, cu->id.name, sizeof(final_mesh->id.name));
+ *((short *)final_mesh->id.name) = ID_ME;
return geometry_set;
}
@@ -961,12 +964,12 @@ static void displist_surf_indices(DispList *dl)
}
}
-static void displist_make_surf(Depsgraph *depsgraph,
- const Scene *scene,
- Object *ob,
- ListBase *dispbase,
- Mesh **r_final,
- const bool for_render)
+static void evaluate_surface_object(Depsgraph *depsgraph,
+ const Scene *scene,
+ Object *ob,
+ const bool for_render,
+ ListBase *r_dispbase,
+ Mesh **r_final)
{
BLI_assert(ob->type == OB_SURF);
const Curve *cu = (const Curve *)ob->data;
@@ -982,7 +985,7 @@ static void displist_make_surf(Depsgraph *depsgraph,
BKE_curve_calc_modifiers_pre(depsgraph, scene, ob, deformed_nurbs, deformed_nurbs, for_render);
- LISTBASE_FOREACH (Nurb *, nu, deformed_nurbs) {
+ LISTBASE_FOREACH (const Nurb *, nu, deformed_nurbs) {
if (!(for_render || nu->hide == 0) || !BKE_nurb_check_valid_uv(nu)) {
continue;
}
@@ -996,7 +999,7 @@ static void displist_make_surf(Depsgraph *depsgraph,
DispList *dl = (DispList *)MEM_callocN(sizeof(DispList), "makeDispListsurf");
dl->verts = (float *)MEM_mallocN(len * sizeof(float[3]), "dlverts");
- BLI_addtail(dispbase, dl);
+ BLI_addtail(r_dispbase, dl);
dl->parts = 1;
dl->nr = len;
dl->col = nu->mat_nr;
@@ -1018,7 +1021,7 @@ static void displist_make_surf(Depsgraph *depsgraph,
DispList *dl = (DispList *)MEM_callocN(sizeof(DispList), "makeDispListsurf");
dl->verts = (float *)MEM_mallocN(len * sizeof(float[3]), "dlverts");
- BLI_addtail(dispbase, dl);
+ BLI_addtail(r_dispbase, dl);
dl->col = nu->mat_nr;
dl->charidx = nu->charidx;
@@ -1043,7 +1046,9 @@ static void displist_make_surf(Depsgraph *depsgraph,
}
}
- GeometrySet geometry_set = curve_calc_modifiers_post(depsgraph, scene, ob, dispbase, for_render);
+ curve_to_filledpoly(cu, r_dispbase);
+ GeometrySet geometry_set = curve_calc_modifiers_post(
+ depsgraph, scene, ob, r_dispbase, for_render);
MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
*r_final = mesh_component.release();
}
@@ -1268,8 +1273,8 @@ static void calc_bevfac_mapping(const Curve *cu,
static void evaluate_curve_type_object(Depsgraph *depsgraph,
const Scene *scene,
Object *ob,
- ListBase *dispbase,
const bool for_render,
+ ListBase *r_dispbase,
GeometrySet *r_geometry_set)
{
const Curve *cu = (const Curve *)ob->data;
@@ -1288,12 +1293,17 @@ static void evaluate_curve_type_object(Depsgraph *depsgraph,
BKE_curve_bevelList_make(ob, deformed_nurbs, for_render);
+ if ((cu->flag & CU_PATH) ||
+ DEG_get_eval_flags_for_id(depsgraph, &ob->id) & DAG_EVAL_NEED_CURVE_PATH) {
+ BKE_anim_path_calc_data(ob);
+ }
+
/* If curve has no bevel will return nothing */
ListBase dlbev = BKE_curve_bevel_make(cu);
/* no bevel or extrude, and no width correction? */
if (BLI_listbase_is_empty(&dlbev) && cu->width == 1.0f) {
- curve_to_displist(cu, deformed_nurbs, for_render, dispbase);
+ curve_to_displist(cu, deformed_nurbs, for_render, r_dispbase);
}
else {
const float widfac = cu->width - 1.0f;
@@ -1311,7 +1321,7 @@ static void evaluate_curve_type_object(Depsgraph *depsgraph,
if (BLI_listbase_is_empty(&dlbev)) {
DispList *dl = (DispList *)MEM_callocN(sizeof(DispList), "makeDispListbev");
dl->verts = (float *)MEM_mallocN(sizeof(float[3]) * bl->nr, "dlverts");
- BLI_addtail(dispbase, dl);
+ BLI_addtail(r_dispbase, dl);
if (bl->poly != -1) {
dl->type = DL_POLY;
@@ -1361,7 +1371,7 @@ static void evaluate_curve_type_object(Depsgraph *depsgraph,
/* for each part of the bevel use a separate displblock */
DispList *dl = (DispList *)MEM_callocN(sizeof(DispList), "makeDispListbev1");
dl->verts = data = (float *)MEM_mallocN(sizeof(float[3]) * dlb->nr * steps, "dlverts");
- BLI_addtail(dispbase, dl);
+ BLI_addtail(r_dispbase, dl);
dl->type = DL_SURF;
@@ -1457,8 +1467,8 @@ static void evaluate_curve_type_object(Depsgraph *depsgraph,
}
if (bottom_capbase.first) {
- BKE_displist_fill(&bottom_capbase, dispbase, bottom_no, false);
- BKE_displist_fill(&top_capbase, dispbase, top_no, false);
+ BKE_displist_fill(&bottom_capbase, r_dispbase, bottom_no, false);
+ BKE_displist_fill(&top_capbase, r_dispbase, top_no, false);
BKE_displist_free(&bottom_capbase);
BKE_displist_free(&top_capbase);
}
@@ -1468,12 +1478,8 @@ static void evaluate_curve_type_object(Depsgraph *depsgraph,
BKE_displist_free(&dlbev);
- if ((cu->flag & CU_PATH) ||
- DEG_get_eval_flags_for_id(depsgraph, &ob->id) & DAG_EVAL_NEED_CURVE_PATH) {
- BKE_anim_path_calc_data(ob);
- }
-
- *r_geometry_set = curve_calc_modifiers_post(depsgraph, scene, ob, dispbase, for_render);
+ curve_to_filledpoly(cu, r_dispbase);
+ *r_geometry_set = curve_calc_modifiers_post(depsgraph, scene, ob, r_dispbase, for_render);
}
void BKE_displist_make_curveTypes(Depsgraph *depsgraph,
@@ -1493,12 +1499,12 @@ void BKE_displist_make_curveTypes(Depsgraph *depsgraph,
if (ob->type == OB_SURF) {
Mesh *mesh_eval;
- displist_make_surf(depsgraph, scene, ob, dispbase, &mesh_eval, for_render);
+ evaluate_surface_object(depsgraph, scene, ob, for_render, dispbase, &mesh_eval);
BKE_object_eval_assign_data(ob, &mesh_eval->id, true);
}
else {
GeometrySet geometry_set;
- evaluate_curve_type_object(depsgraph, scene, ob, dispbase, for_render, &geometry_set);
+ evaluate_curve_type_object(depsgraph, scene, ob, for_render, dispbase, &geometry_set);
ob->runtime.geometry_set_eval = new GeometrySet(std::move(geometry_set));
}
@@ -1513,11 +1519,11 @@ void BKE_displist_make_curveTypes_forRender(
}
if (ob->type == OB_SURF) {
- displist_make_surf(depsgraph, scene, ob, dispbase, r_final, true);
+ evaluate_surface_object(depsgraph, scene, ob, true, dispbase, r_final);
}
else {
GeometrySet geometry_set;
- evaluate_curve_type_object(depsgraph, scene, ob, dispbase, true, &geometry_set);
+ evaluate_curve_type_object(depsgraph, scene, ob, true, dispbase, &geometry_set);
MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
*r_final = mesh_component.release();
}
More information about the Bf-blender-cvs
mailing list