[Bf-blender-cvs] [59455f9b663] curve-nodes-modifier: Further refactoring WIP
Hans Goudey
noreply at git.blender.org
Tue Jul 13 01:40:42 CEST 2021
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. @@
More information about the Bf-blender-cvs
mailing list