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. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs