[Bf-blender-cvs] [a58a4cfc146] gsoc-2021-porting-modifiers-to-nodes-solidify: - working with data from node
Fabian Schempp
noreply at git.blender.org
Tue Jun 22 10:49:55 CEST 2021
Commit: a58a4cfc146dcb2ad209cabc962244717ec62866
Author: Fabian Schempp
Date: Mon May 24 18:56:54 2021 +0200
Branches: gsoc-2021-porting-modifiers-to-nodes-solidify
https://developer.blender.org/rBa58a4cfc146dcb2ad209cabc962244717ec62866
- working with data from node
===================================================================
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.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_NORMAL_CALC) != 0;
+ const bool check_non_manifold = (smd->flag & MOD_SOLIDIFY_NORMAL_CALC) != 0;
#endif
/* same as EM_solidify() in editmesh_lib.c */
float *vert_angles = MEM_calloc_arrayN(
@@ -879,8 +879,8 @@ Mesh *solidify_extrude_modifyMesh( Mesh *mesh)
}
if (do_clamp) {
- const float clamp_fac = 20.0f; //= 1 + (do_angle_clamp ? fabsf(smd->offset_fac) : 0);
- const float offset = 20.0f;//fabsf(smd->offset) * smd->offset_clamp * clamp_fac;
+ const float clamp_fac = 1 + (do_angle_clamp ? fabsf(smd->offset_fac) : 0);
+ const float offset = fabsf(smd->offset) * smd->offset_clamp * clamp_fac;
if (offset > FLT_EPSILON) {
float *vert_lens_sq = MEM_malloc_arrayN(numVerts, sizeof(float), "vert_lens_sq");
const float offset_sq = offset * offset;
@@ -920,16 +920,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, 1) :
- clamp_f(bevel_convex, -1, 0)) *
+ clamp_f(bevel_convex, -1, 0)) *
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, 1) :
- clamp_f(bevel_convex, -1, 0)) *
- 255),
+ (int)((angle > M_PI ? clamp_f(bevel_convex, 0, 1) :
+ clamp_f(bevel_convex, -1, 0)) *
+ 255),
0,
255);
}
@@ -996,35 +996,35 @@ Mesh *solidify_extrude_modifyMesh( Mesh *mesh)
}
/* Add vertex we
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list