Commit: 59455f9b6638cdd2437a3891eb0ee1ee58a5ee6a Author: Hans Goudey Date: Sat Jun 26 23:50:49 2021 -0500 Branches: curve-nodes-modifier https://developer.blender.org/rB59455f9b6638cdd2437a3891eb0ee1ee58a5ee6a
Further refactoring WIP =================================================================== M source/blender/blenkernel/BKE_curve.h M source/blender/blenkernel/BKE_displist.h M source/blender/blenkernel/BKE_spline.hh M source/blender/blenkernel/intern/curve.c M source/blender/blenkernel/intern/curve_eval.cc M source/blender/blenkernel/intern/displist.cc M source/blender/blenkernel/intern/effect.c M source/blender/blenkernel/intern/geometry_set_instances.cc M source/blender/blenkernel/intern/mesh_convert.c M source/blender/blenkernel/intern/object_update.c M source/blender/blenlib/BLI_vector.hh M source/blender/editors/object/object_add.c M source/blender/editors/object/object_modifier.c M source/blender/editors/object/object_relations.c =================================================================== diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h index 2687a5ea16c..dbff1e23ad7 100644 --- a/source/blender/blenkernel/BKE_curve.h +++ b/source/blender/blenkernel/BKE_curve.h @@ -121,6 +121,7 @@ void BKE_curve_material_remap(struct Curve *cu, const unsigned int *remap, unsig void BKE_curve_smooth_flag_set(struct Curve *cu, const bool use_smooth); ListBase *BKE_curve_nurbs_get(struct Curve *cu); +const ListBase *BKE_curve_nurbs_get_for_read(const struct Curve *cu); int BKE_curve_nurb_vert_index_get(const struct Nurb *nu, const void *vert); void BKE_curve_nurb_active_set(struct Curve *cu, const struct Nurb *nu); @@ -153,6 +154,7 @@ void BKE_curve_editNurb_keyIndex_delCV(struct GHash *keyindex, const void *cv); void BKE_curve_editNurb_keyIndex_free(struct GHash **keyindex); void BKE_curve_editNurb_free(struct Curve *cu); struct ListBase *BKE_curve_editNurbs_get(struct Curve *cu); +const struct ListBase *BKE_curve_editNurbs_get_for_read(const struct Curve *cu); void BKE_curve_bevelList_free(struct ListBase *bev); void BKE_curve_bevelList_make(struct Object *ob, struct ListBase *nurbs, bool for_render); diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h index fe72c5a129f..37e144ebbd3 100644 --- a/source/blender/blenkernel/BKE_displist.h +++ b/source/blender/blenkernel/BKE_displist.h @@ -87,13 +87,11 @@ bool BKE_displist_has_faces(const struct ListBase *lb); void BKE_displist_make_curveTypes(struct Depsgraph *depsgraph, const struct Scene *scene, struct Object *ob, - const bool for_render, - const bool for_orco); + const bool for_render); void BKE_displist_make_curveTypes_forRender(struct Depsgraph *depsgraph, const struct Scene *scene, struct Object *ob, struct ListBase *dispbase, - const bool for_orco, struct Mesh **r_final); void BKE_displist_make_mball(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob); void BKE_displist_make_mball_forRender(struct Depsgraph *depsgraph, diff --git a/source/blender/blenkernel/BKE_spline.hh b/source/blender/blenkernel/BKE_spline.hh index 0de9270bde1..cf77cc9b100 100644 --- a/source/blender/blenkernel/BKE_spline.hh +++ b/source/blender/blenkernel/BKE_spline.hh @@ -32,6 +32,7 @@ #include "BKE_attribute_math.hh" struct Curve; +struct ListBase; class Spline; using SplinePtr = std::unique_ptr<Spline>; @@ -546,4 +547,5 @@ struct CurveEval { void assert_valid_point_attributes() const; }; -std::unique_ptr<CurveEval> curve_eval_from_dna_curve(const Curve &curve); +std::unique_ptr<CurveEval> curve_eval_from_dna_curve(const Curve &curve, + const ListBase &nurbs_list); diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index 462451fe72b..14135104907 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -442,6 +442,15 @@ ListBase *BKE_curve_editNurbs_get(Curve *cu) return NULL; } +const ListBase *BKE_curve_editNurbs_get_for_read(const Curve *cu) +{ + if (cu->editnurb) { + return &cu->editnurb->nurbs; + } + + return NULL; +} + short BKE_curve_type_get(const Curve *cu) { int type = cu->type; @@ -5078,6 +5087,15 @@ ListBase *BKE_curve_nurbs_get(Curve *cu) return &cu->nurb; } +const ListBase *BKE_curve_nurbs_get_for_read(const Curve *cu) +{ + if (cu->editnurb) { + return BKE_curve_editNurbs_get_for_read(cu); + } + + return &cu->nurb; +} + void BKE_curve_nurb_active_set(Curve *cu, const Nurb *nu) { if (nu == NULL) { diff --git a/source/blender/blenkernel/intern/curve_eval.cc b/source/blender/blenkernel/intern/curve_eval.cc index 0a6e4458a35..e39fb384690 100644 --- a/source/blender/blenkernel/intern/curve_eval.cc +++ b/source/blender/blenkernel/intern/curve_eval.cc @@ -257,9 +257,10 @@ static SplinePtr spline_from_dna_poly(const Nurb &nurb) return spline; } -std::unique_ptr<CurveEval> curve_eval_from_dna_curve(const Curve &dna_curve) +std::unique_ptr<CurveEval> curve_eval_from_dna_curve(const Curve &dna_curve, + const ListBase &nurbs_list) { - Vector<const Nurb *> nurbs(*BKE_curve_nurbs_get(&const_cast<Curve &>(dna_curve))); + Vector<const Nurb *> nurbs(nurbs_list); std::unique_ptr<CurveEval> curve = std::make_unique<CurveEval>(); curve->resize(nurbs.size()); diff --git a/source/blender/blenkernel/intern/displist.cc b/source/blender/blenkernel/intern/displist.cc index 63414c57ed4..39f4b6b8732 100644 --- a/source/blender/blenkernel/intern/displist.cc +++ b/source/blender/blenkernel/intern/displist.cc @@ -539,13 +539,18 @@ void BKE_displist_fill(const ListBase *dispbase, /* do not free polys, needed for wireframe display */ } -static void bevels_to_filledpoly(const Curve *cu, ListBase *dispbase) +static void bevels_to_filledpoly(const Curve *cu, const ListBase *src, ListBase *dst) { ListBase front = {nullptr, nullptr}; ListBase back = {nullptr, nullptr}; - LISTBASE_FOREACH (const DispList *, dl, dispbase) { + LISTBASE_FOREACH (const DispList *, dl, src) { if (dl->type == DL_SURF) { + + /* This should be moved specifically to the surface evaluation functions, + * now that they are further separated. */ + BLI_assert_unreachable(); + if ((dl->flag & DL_CYCL_V) && (dl->flag & DL_CYCL_U) == 0) { if ((cu->flag & CU_BACK) && (dl->flag & DL_BACK_CURVE)) { DispList *dlnew = (DispList *)MEM_callocN(sizeof(DispList), __func__); @@ -590,28 +595,32 @@ static void bevels_to_filledpoly(const Curve *cu, ListBase *dispbase) } const float z_up[3] = {0.0f, 0.0f, -1.0f}; - BKE_displist_fill(&front, dispbase, z_up, true); - BKE_displist_fill(&back, dispbase, z_up, false); + BKE_displist_fill(&front, dst, z_up, true); + BKE_displist_fill(&back, dst, z_up, false); BKE_displist_free(&front); BKE_displist_free(&back); - BKE_displist_fill(dispbase, dispbase, z_up, false); + BKE_displist_fill(src, dst, z_up, false); } -static void curve_to_filledpoly(const Curve *cu, ListBase *dispbase) +static ListBase curve_to_filledpoly(const Curve *cu, const ListBase *src) { if (!CU_DO_2DFILL(cu)) { return; } - if (dispbase->first && ((DispList *)dispbase->first)->type == DL_SURF) { - bevels_to_filledpoly(cu, dispbase); + ListBase dst = {nullptr, nullptr}; + + if (src->first && ((DispList *)src->first)->type == DL_SURF) { + bevels_to_filledpoly(cu, src, &dst); } else { const float z_up[3] = {0.0f, 0.0f, -1.0f}; - BKE_displist_fill(dispbase, dispbase, z_up, false); + BKE_displist_fill(src, &dst, z_up, false); } + + return dst; } /* taper rules: @@ -632,7 +641,7 @@ static float displist_calc_taper(Depsgraph *depsgraph, (DispList *)taperobj->runtime.curve_cache->disp.first : nullptr; if (dl == nullptr) { - BKE_displist_make_curveTypes(depsgraph, scene, taperobj, false, false); + BKE_displist_make_curveTypes(depsgraph, scene, taperobj, false); dl = (DispList *)taperobj->runtime.curve_cache->disp.first; } if (dl) { @@ -832,19 +841,13 @@ void BKE_curve_calc_modifiers_pre(Depsgraph *depsgraph, } } -static void curve_calc_modifiers_post(Depsgraph *depsgraph, - const Scene *scene, - Object *ob, - ListBase *dispbase, - const bool for_render, - Mesh **r_final, - GeometrySet **r_geometry_set) +static GeometrySet curve_calc_modifiers_post(Depsgraph *depsgraph, + const Scene *scene, + Object *ob, + ListBase *dispbase, + const bool for_render) { const Curve *cu = (const Curve *)ob->data; - if (r_final) { - /* The result mesh should already be cleared by the caller. */ - BLI_assert(*r_final == nullptr); - } const bool editmode = (!for_render && (cu->editnurb || cu->editfont)); const bool use_cache = !for_render; @@ -867,23 +870,24 @@ static void curve_calc_modifiers_post(Depsgraph *depsgraph, ModifierData *md = pretessellatePoint == nullptr ? BKE_modifiers_get_virtual_modifierlist(ob, &virtualModifierData) : pretessellatePoint->next; - if (md == nullptr) { - return; - } - Mesh *modified = nullptr; GeometrySet geometry_set; - if (md->type == eModifierType_Nodes && !BKE_modifier_is_enabled(scene, md, required_mode)) { - geometry_set.replace_curve(curve_eval_from_dna_curve(*cu).release()); + if (md && md->type == eModifierType_Nodes && BKE_modifier_is_enabled(scene, md, required_mode)) { + geometry_set.replace_curve(curve_eval_from_dna_curve(*cu, *dispbase).release()); } else { - if (ELEM(ob->type, OB_CURVE, OB_FONT) && (cu->flag & CU_DEFORM_FILL)) { + const ListBase final_ if (cu->flag & CU_DEFORM_FILL) + { curve_to_filledpoly(cu, dispbase); } - modified = BKE_mesh_new_nomain_from_curve_displist(ob, 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); + mesh->totcol = cu->totcol; + + geometry_set.replace_mesh(mesh); } - float(*vertCos)[3] = nullptr; for (; md; md = md->next) { const ModifierTypeInfo *mti = BKE_modifier_get_info((ModifierType)md->type); if (!BKE_modifier_is_enabled(scene, md, required_mode)) { @@ -891, @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs