[Bf-blender-cvs] [c56082d9704] temp-geometry-nodes-mesh-modifier: support geometry nodes modifier in edit mode and cleanup

Jacques Lucke noreply at git.blender.org
Mon Dec 7 15:53:40 CET 2020


Commit: c56082d9704a21de42f8cd4bf3c9e3f792d0add6
Author: Jacques Lucke
Date:   Mon Dec 7 15:34:35 2020 +0100
Branches: temp-geometry-nodes-mesh-modifier
https://developer.blender.org/rBc56082d9704a21de42f8cd4bf3c9e3f792d0add6

support geometry nodes modifier in edit mode and cleanup

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

M	source/blender/blenkernel/intern/DerivedMesh.cc
M	source/blender/modifiers/intern/MOD_nodes.cc

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

diff --git a/source/blender/blenkernel/intern/DerivedMesh.cc b/source/blender/blenkernel/intern/DerivedMesh.cc
index 4575de6c5f4..e3f1b8b6f72 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.cc
+++ b/source/blender/blenkernel/intern/DerivedMesh.cc
@@ -882,6 +882,40 @@ void BKE_mesh_wrapper_deferred_finalize(Mesh *me_eval,
   BLI_assert(me_eval->runtime.wrapper_type_finalize == 0);
 }
 
+static Mesh *modifier_modify_mesh_or_geometry_set(ModifierData *md,
+                                                  const ModifierEvalContext &mectx,
+                                                  Object *ob,
+                                                  Mesh *input_mesh,
+                                                  GeometrySet &geometry_set)
+{
+  Mesh *mesh_output = nullptr;
+  const ModifierTypeInfo *mti = BKE_modifier_get_info((ModifierType)md->type);
+  if (mti->modifyPointCloud) {
+    BKE_mesh_wrapper_ensure_mdata(input_mesh);
+    /* The mesh is not stored in the geometry set. It is only added temporarily for this
+     * specific modifier. Other geometry components are stored in the geometry set though. */
+    {
+      BLI_assert(!geometry_set.has<MeshComponent>());
+      MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
+      mesh_component.replace(input_mesh, GeometryOwnershipType::Editable);
+      mesh_component.copy_vertex_group_names_from_object(*ob);
+    }
+    mti->modifyPointCloud(md, &mectx, &geometry_set);
+    {
+      MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
+      mesh_output = mesh_component.release();
+      geometry_set.remove<MeshComponent>();
+      if (mesh_output == nullptr) {
+        mesh_output = BKE_mesh_new_nomain(0, 0, 0, 0, 0);
+      }
+    }
+  }
+  else {
+    mesh_output = BKE_modifier_modify_mesh(md, &mectx, input_mesh);
+  }
+  return mesh_output;
+}
+
 static void mesh_calc_modifiers(struct Depsgraph *depsgraph,
                                 Scene *scene,
                                 Object *ob,
@@ -1200,29 +1234,8 @@ static void mesh_calc_modifiers(struct Depsgraph *depsgraph,
         }
       }
 
-      Mesh *mesh_next = nullptr;
-      if (mti->modifyPointCloud) {
-        /* The mesh is not stored in the geometry set. It is only added temporarily for this
-         * specific modifier. Other geometry components are stored in the geometry set though. */
-        {
-          BLI_assert(!geometry_set.has<MeshComponent>());
-          MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
-          mesh_component.replace(mesh_final, GeometryOwnershipType::Editable);
-          mesh_component.copy_vertex_group_names_from_object(*ob);
-        }
-        mti->modifyPointCloud(md, &mectx, &geometry_set);
-        {
-          MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
-          mesh_next = mesh_component.release();
-          geometry_set.remove<MeshComponent>();
-          if (mesh_next == nullptr) {
-            mesh_next = BKE_mesh_new_nomain(0, 0, 0, 0, 0);
-          }
-        }
-      }
-      else {
-        mesh_next = BKE_modifier_modify_mesh(md, &mectx, mesh_final);
-      }
+      Mesh *mesh_next = modifier_modify_mesh_or_geometry_set(
+          md, mectx, ob, mesh_final, geometry_set);
       ASSERT_IS_VALID_MESH(mesh_next);
 
       if (mesh_next) {
@@ -1516,7 +1529,8 @@ static void editbmesh_calc_modifiers(struct Depsgraph *depsgraph,
                                      const CustomData_MeshMasks *dataMask,
                                      /* return args */
                                      Mesh **r_cage,
-                                     Mesh **r_final)
+                                     Mesh **r_final,
+                                     GeometrySet **r_final_geometry_set)
 {
   /* Input and final mesh. Final mesh is only created the moment the first
    * constructive modifier is executed, or a deform modifier needs normals
@@ -1524,6 +1538,7 @@ static void editbmesh_calc_modifiers(struct Depsgraph *depsgraph,
   Mesh *mesh_input = (Mesh *)ob->data;
   Mesh *mesh_final = nullptr;
   Mesh *mesh_cage = nullptr;
+  GeometrySet geometry_set;
 
   /* Deformed vertex locations array. Deform only modifier need this type of
    * float array rather than MVert*. Tracked along with mesh_final as an
@@ -1688,7 +1703,8 @@ static void editbmesh_calc_modifiers(struct Depsgraph *depsgraph,
         }
       }
 
-      Mesh *mesh_next = BKE_modifier_modify_mesh(md, &mectx, mesh_final);
+      Mesh *mesh_next = modifier_modify_mesh_or_geometry_set(
+          md, mectx, ob, mesh_final, geometry_set);
       ASSERT_IS_VALID_MESH(mesh_next);
 
       if (mesh_next) {
@@ -1790,6 +1806,8 @@ static void editbmesh_calc_modifiers(struct Depsgraph *depsgraph,
   if (r_cage) {
     *r_cage = mesh_cage;
   }
+
+  *r_final_geometry_set = new GeometrySet(std::move(geometry_set));
 }
 
 static void mesh_build_extra_data(struct Depsgraph *depsgraph, Object *ob, Mesh *mesh_eval)
@@ -1900,11 +1918,14 @@ static void editbmesh_build_data(struct Depsgraph *depsgraph,
 
   Mesh *me_cage;
   Mesh *me_final;
+  GeometrySet *geometry_set;
 
-  editbmesh_calc_modifiers(depsgraph, scene, obedit, em, dataMask, &me_cage, &me_final);
+  editbmesh_calc_modifiers(
+      depsgraph, scene, obedit, em, dataMask, &me_cage, &me_final, &geometry_set);
 
   em->mesh_eval_final = me_final;
   em->mesh_eval_cage = me_cage;
+  obedit->runtime.geometry_set_eval = geometry_set;
 
   BKE_object_boundbox_calc_from_mesh(obedit, em->mesh_eval_final);
 
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index 80c69398d15..e6d2060a277 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -1050,9 +1050,9 @@ ModifierTypeInfo modifierType_Nodes = {
     /* srna */ &RNA_NodesModifier,
     /* type */ eModifierTypeType_Constructive,
     /* flags */
-    static_cast<ModifierTypeFlag>(eModifierTypeFlag_AcceptsMesh |
-                                  eModifierTypeFlag_SupportsEditmode |
-                                  eModifierTypeFlag_EnableInEditmode),
+    static_cast<ModifierTypeFlag>(
+        eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_SupportsEditmode |
+        eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping),
     /* icon */ ICON_NODETREE,
 
     /* copyData */ copyData,



More information about the Bf-blender-cvs mailing list