[Bf-blender-cvs] [29c0528eb6c] gsoc-2021-porting-modifiers-to-nodes-solidify: - working with data from node

Fabian Schempp noreply at git.blender.org
Thu Jun 10 21:02:05 CEST 2021


Commit: 29c0528eb6c7395d61921edb5a5370a505a8c8c9
Author: Fabian Schempp
Date:   Mon May 24 18:56:54 2021 +0200
Branches: gsoc-2021-porting-modifiers-to-nodes-solidify
https://developer.blender.org/rB29c0528eb6c7395d61921edb5a5370a505a8c8c9

- working with data from node

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

M	source/blender/nodes/geometry/nodes/node_geo_solidify.cc
M	source/blender/nodes/geometry/nodes/node_geo_solidify.h
M	source/blender/nodes/geometry/nodes/node_geo_solidify_extrude.c

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

diff --git a/source/blender/nodes/geometry/nodes/node_geo_solidify.cc b/source/blender/nodes/geometry/nodes/node_geo_solidify.cc
index ba60bb90663..50a9740d2ed 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_solidify.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_solidify.cc
@@ -17,6 +17,8 @@
 #include "UI_interface.h"
 #include "UI_resources.h"
 
+#include "DNA_modifier_types.h"
+
 #include "node_geometry_util.hh"
 #include "node_geo_solidify.h"
 
@@ -49,8 +51,41 @@ static void geo_node_solidify_exec(GeoNodeExecParams params)
   geometry_set = geometry_set_realize_instances(geometry_set);
 
   if (geometry_set.has<MeshComponent>()) {
+    SolidifyNodeData solidify_node_data = {
+      /** Name of vertex group to use, MAX_VGROUP_NAME. */
+      "char defgrp_name[64]",
+      "shell_defgrp_name[64]",
+      "rim_defgrp_name[64]",
+      /** New surface offset level. */
+      20.0f,
+      /** Midpoint of the offset. */
+      0.5f,
+      /**
+       * Factor for the minimum weight to use when vertex-groups are used,
+       * avoids 0.0 weights giving duplicate geometry.
+       */
+      0.5f,
+      /** Clamp offset based on surrounding geometry. */
+      2.0f,
+      MOD_SOLIDIFY_MODE_EXTRUDE,
+
+      /** Variables for #MOD_SOLIDIFY_MODE_NONMANIFOLD. */
+      MOD_SOLIDIFY_NONMANIFOLD_OFFSET_MODE_FIXED,
+      MOD_SOLIDIFY_NONMANIFOLD_BOUNDARY_MODE_NONE,
+
+      0,
+      0.0f,
+      0.0f,
+      0.0f,
+      MOD_SOLIDIFY_NORMAL_CALC | MOD_SOLIDIFY_RIM,
+      0,
+      0,
+      0.01f,
+      0.01f,
+    };
+
     MeshComponent &meshComponent = geometry_set.get_component_for_write<MeshComponent>();
-    Mesh *return_mesh = solidify_extrude_modifyMesh(meshComponent.get_for_write());
+    Mesh *return_mesh = solidify_extrude_modifyMesh(&solidify_node_data, meshComponent.get_for_write());
     geometry_set.replace_mesh(return_mesh);
   }
 //  if (geometry_set.has<PointCloudComponent>()) {
diff --git a/source/blender/nodes/geometry/nodes/node_geo_solidify.h b/source/blender/nodes/geometry/nodes/node_geo_solidify.h
index e1904717ee8..bda46dc5150 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_solidify.h
+++ b/source/blender/nodes/geometry/nodes/node_geo_solidify.h
@@ -6,7 +6,41 @@
 extern "C" {
 #endif
 
-Mesh *solidify_extrude_modifyMesh(Mesh *mesh);
+typedef struct SolidifyNodeData {
+  /** Name of vertex group to use, MAX_VGROUP_NAME. */
+  char defgrp_name[64];
+  char shell_defgrp_name[64];
+  char rim_defgrp_name[64];
+  /** New surface offset level. */
+  float offset;
+  /** Midpoint of the offset. */
+  float offset_fac;
+  /**
+   * Factor for the minimum weight to use when vertex-groups are used,
+   * avoids 0.0 weights giving duplicate geometry.
+   */
+  float offset_fac_vg;
+  /** Clamp offset based on surrounding geometry. */
+  float offset_clamp;
+  char mode;
+
+  /** Variables for #MOD_SOLIDIFY_MODE_NONMANIFOLD. */
+  char nonmanifold_offset_mode;
+  char nonmanifold_boundary_mode;
+
+  char _pad;
+  float crease_inner;
+  float crease_outer;
+  float crease_rim;
+  int flag;
+  short mat_ofs;
+  short mat_ofs_rim;
+
+  float merge_tolerance;
+  float bevel_convex;
+} SolidifyNodeData;
+
+Mesh *solidify_extrude_modifyMesh(SolidifyNodeData *smd, Mesh *mesh);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/nodes/geometry/nodes/node_geo_solidify_extrude.c b/source/blender/nodes/geometry/nodes/node_geo_solidify_extrude.c
index 992360a7b1d..1337923cc78 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_solidify_extrude.c
+++ b/source/blender/nodes/geometry/nodes/node_geo_solidify_extrude.c
@@ -184,11 +184,10 @@ static void mesh_calc_hq_normal(Mesh *mesh, float (*poly_nors)[3], float (*r_ver
 /* -------------------------------------------------------------------- */
 /** \name Main Solidify Function
  * \{ */
-/* NOLINTNEXTLINE: readability-function-size */
-Mesh *solidify_extrude_modifyMesh( Mesh *mesh)
+
+Mesh *solidify_extrude_modifyMesh(SolidifyNodeData *smd, Mesh *mesh)
 {
   Mesh *result;
-  //const SolidifyModifierData *smd = (SolidifyModifierData *)md;
 
   MVert *mv, *mvert, *orig_mvert;
   MEdge *ed, *medge, *orig_medge;
@@ -201,9 +200,9 @@ Mesh *solidify_extrude_modifyMesh( Mesh *mesh)
   uint newLoops = 0, newPolys = 0, newEdges = 0, newVerts = 0, rimVerts = 0;
 
   /* only use material offsets if we have 2 or more materials  */
-  const short mat_nr_max = 0;//ctx->object->totcol > 1 ? ctx->object->totcol - 1 : 0;
-  const short mat_ofs = mat_nr_max ? 0 : 0; //<--------
-  const short mat_ofs_rim = mat_nr_max ? 0 : 0; //<--------
+  const short mat_nr_max = 0;//object->totcol > 1 ? object->totcol - 1 : 0;
+  const short mat_ofs = 0;//mat_nr_max ? smd->mat_ofs : 0;
+  const short mat_ofs_rim = 0;//mat_nr_max ? smd->mat_ofs_rim : 0;
 
   /* use for edges */
   /* over-alloc new_vert_arr, old_vert_arr */
@@ -222,34 +221,35 @@ Mesh *solidify_extrude_modifyMesh( Mesh *mesh)
   float(*vert_nors)[3] = NULL;
   float(*poly_nors)[3] = NULL;
 
-  const bool need_poly_normals = false; /*(smd->flag & MOD_SOLIDIFY_NORMAL_CALC) ||
+  const bool need_poly_normals = (smd->flag & MOD_SOLIDIFY_NORMAL_CALC) ||
                                  (smd->flag & MOD_SOLIDIFY_EVEN) ||
                                  (smd->flag & MOD_SOLIDIFY_OFFSET_ANGLE_CLAMP) ||
-                                 (smd->bevel_convex != 0);*/
-
-  const float ofs_orig = 20.0f;//-(((-smd->offset_fac + 1.0f) * 0.5f) * smd->offset);
-  const float ofs_new = 20.0f;//smd->offset + ofs_orig;
-  const float offset_fac_vg = 20.0f;//smd->offset_fac_vg;
-  const float offset_fac_vg_inv = -5.0f;//1.0f - smd->offset_fac_vg;
-  const float bevel_convex = 1.0f;//smd->bevel_convex;
-  const bool do_flip = false;//(smd->flag & MOD_SOLIDIFY_FLIP) != 0;
-  const bool do_clamp = false;//(smd->offset_clamp != 0.0f);
-  const bool do_angle_clamp = false;//do_clamp && (smd->flag & MOD_SOLIDIFY_OFFSET_ANGLE_CLAMP) != 0;
+                                 (smd->bevel_convex != 0);
+
+  const float ofs_orig = -(((-smd->offset_fac + 1.0f) * 0.5f) * smd->offset);
+  const float ofs_new = smd->offset + ofs_orig;
+  const float offset_fac_vg = smd->offset_fac_vg;
+  const float offset_fac_vg_inv = 1.0f - smd->offset_fac_vg;
+  const float bevel_convex = smd->bevel_convex;
+  const bool do_flip = (smd->flag & MOD_SOLIDIFY_FLIP) != 0;
+  const bool do_clamp = (smd->offset_clamp != 0.0f);
+  const bool do_angle_clamp = do_clamp && (smd->flag & MOD_SOLIDIFY_OFFSET_ANGLE_CLAMP) != 0;
   const bool do_bevel_convex = bevel_convex != 0.0f;
-  const bool do_rim = true;//(smd->flag & MOD_SOLIDIFY_RIM) != 0;
-  const bool do_shell = true;//!(do_rim && (smd->flag & MOD_SOLIDIFY_NOSHELL) != 0);
+  const bool do_rim = (smd->flag & MOD_SOLIDIFY_RIM) != 0;
+  const bool do_shell = !(do_rim && (smd->flag & MOD_SOLIDIFY_NOSHELL) != 0);
 
   /* weights */
-  MDeformVert *dvert = NULL;
-  const bool defgrp_invert = false;//(smd->flag & MOD_SOLIDIFY_VGROUP_INV) != 0;
+  MDeformVert *dvert;
+  const bool defgrp_invert = (smd->flag & MOD_SOLIDIFY_VGROUP_INV) != 0;
   int defgrp_index;
-  const int shell_defgrp_index = 0;//BKE_object_defgroup_name_index(ctx->object, smd->shell_defgrp_name);
-  const int rim_defgrp_index = 0;//BKE_object_defgroup_name_index(ctx->object, smd->rim_defgrp_name);
+//  const int shell_defgrp_index = BKE_object_defgroup_name_index(object,
+//                                                                smd->shell_defgrp_name);
+//  const int rim_defgrp_index = BKE_object_defgroup_name_index(object, smd->rim_defgrp_name);
 
   /* array size is doubled in case of using a shell */
   const uint stride = do_shell ? 2 : 1;
 
-  //MOD_get_vgroup(ctx->object, mesh, smd->defgrp_name, &dvert, &defgrp_index);
+  //MOD_get_vgroup(object, mesh, smd->defgrp_name, &dvert, &defgrp_index);
 
   orig_mvert = mesh->mvert;
   orig_medge = mesh->medge;
@@ -355,7 +355,7 @@ Mesh *solidify_extrude_modifyMesh( Mesh *mesh)
     BLI_assert(newEdges == 0);
   }
 
-  if (false){//smd->flag & MOD_SOLIDIFY_NORMAL_CALC) {
+  if (smd->flag & MOD_SOLIDIFY_NORMAL_CALC) {
     vert_nors = MEM_calloc_arrayN(numVerts, sizeof(float[3]), "mod_solid_vno_hq");
     mesh_calc_hq_normal(mesh, poly_nors, vert_nors);
   }
@@ -506,7 +506,7 @@ Mesh *solidify_extrude_modifyMesh( Mesh *mesh)
   }
 
   /* note, copied vertex layers don't have flipped normals yet. do this after applying offset */
-  if (true){//(smd->flag & MOD_SOLIDIFY_EVEN) == 0) {
+  if ((smd->flag & MOD_SOLIDIFY_EVEN) == 0) {
     /* no even thickness, very simple */
     float scalar_short;
     float scalar_short_vgroup;
@@ -514,7 +514,7 @@ Mesh *solidify_extrude_modifyMesh( Mesh *mesh)
     /* for clamping */
     float *vert_lens = NULL;
     float *vert_angs = NULL;
-    const float offset = ofs_new;//fabsf(offset) * smd->offset_clamp;
+    const float offset = fabsf(smd->offset) * smd->offset_clamp;
     const float offset_sq = offset * offset;
 
     /* for bevel weight */
@@ -693,16 +693,16 @@ Mesh *solidify_extrude_modifyMesh( Mesh *mesh)
           float angle = edge_angs[i];
           medge[i].bweight = (char)clamp_i(
               (int)medge[i].bweight + (int)((angle < M_PI ? clamp_f(bevel_convex, 0.0f, 1.0f) :
-                                                            clamp_f(bevel_convex, -1.0f, 0.0f)) *
+                                             clamp_f(bevel_convex, -1.0f, 0.0f)) *
                                             255),
               0,
               255);
           if (do_shell) {
             medge[i + numEdges].bweight = (char)clamp_i(
                 (int)medge[i + numEdges].bweight +
-                    (int)((angle > M_PI ? clamp_f(bevel_convex, 0.0f, 1.0f) :
-                                          clamp_f(bevel_convex, -1.0f, 0.0f)) *
-                          255),
+                (int)((angle > M_PI ? clamp_f(bevel_convex, 0.0f, 1.0f) :
+                       clamp_f(bevel_convex, -1.0f, 0.0f)) *
+                      255),
                 0,
                 255);
           }
@@ -723,7 +723,7 @@ Mesh *solidify_extrude_modifyMesh( Mesh *mesh)
   }
   else {
 #ifdef USE_NONMANIFOLD_WORKAROUND
-    const bool check_non_manifold = true;//(smd->flag & MOD_SOLIDIFY_NORM

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list