Commit: 39f1908ba9a5752cea502b0654a7523b0cbcbfdb Author: Fabian Schempp Date: Wed Jun 9 23:24:51 2021 +0200 Branches: gsoc-2021-porting-modifiers-to-nodes-solidify https://developer.blender.org/rB39f1908ba9a5752cea502b0654a7523b0cbcbfdb
- selection for simple =================================================================== M source/blender/blenkernel/BKE_deform.h M source/blender/blenkernel/BKE_solidifiy.h M source/blender/blenkernel/intern/solidify_extrude.c M source/blender/blenkernel/intern/solidify_nonmanifold.c M source/blender/modifiers/intern/MOD_solidify.c M source/blender/nodes/geometry/nodes/node_geo_solidifiy.cc =================================================================== diff --git a/source/blender/blenkernel/BKE_deform.h b/source/blender/blenkernel/BKE_deform.h index 8b5fdf69bb0..a9c6a4ab394 100644 --- a/source/blender/blenkernel/BKE_deform.h +++ b/source/blender/blenkernel/BKE_deform.h @@ -16,7 +16,6 @@ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. * All rights reserved. */ - #pragma once #ifdef __cplusplus diff --git a/source/blender/blenkernel/BKE_solidifiy.h b/source/blender/blenkernel/BKE_solidifiy.h index 832c3e06387..c022352544c 100644 --- a/source/blender/blenkernel/BKE_solidifiy.h +++ b/source/blender/blenkernel/BKE_solidifiy.h @@ -1,3 +1,5 @@ +#include "DNA_object_types.h" + #ifdef __cplusplus extern "C" { #endif @@ -6,6 +8,7 @@ struct Mesh; typedef struct SolidifyData { /** Name of vertex group to use, MAX_VGROUP_NAME. */ + const Object *object; char defgrp_name[64]; char shell_defgrp_name[64]; char rim_defgrp_name[64]; @@ -35,6 +38,7 @@ typedef struct SolidifyData { float merge_tolerance; float bevel_convex; + float *selection; } SolidifyData; Mesh *solidify_extrude(const SolidifyData *solidify_data, Mesh *mesh); diff --git a/source/blender/blenkernel/intern/solidify_extrude.c b/source/blender/blenkernel/intern/solidify_extrude.c index fb461b7e06b..4589772f89e 100644 --- a/source/blender/blenkernel/intern/solidify_extrude.c +++ b/source/blender/blenkernel/intern/solidify_extrude.c @@ -32,6 +32,7 @@ #include "MEM_guardedalloc.h" #include "BKE_deform.h" +#include "BKE_lattice.h" #include "BKE_mesh.h" #include "BKE_solidifiy.h" @@ -182,10 +183,27 @@ static void mesh_calc_hq_normal(Mesh *mesh, float (*poly_nors)[3], float (*r_ver /* -------------------------------------------------------------------- */ /** \name Main Solidify Function * \{ */ +static void get_vgroup( + Object *ob, struct Mesh *mesh, const char *name, MDeformVert **dvert, int *defgrp_index) +{ + *defgrp_index = BKE_object_defgroup_name_index(ob, name); + *dvert = NULL; + + if (*defgrp_index != -1) { + if (ob->type == OB_LATTICE) { + *dvert = BKE_lattice_deform_verts_get(ob); + } + else if (mesh) { + *dvert = mesh->dvert; + } + } +} Mesh *solidify_extrude(const SolidifyData *solidify_data, Mesh *mesh) { - printf("solidify extrude: %f, %i\n", solidify_data->offset, solidify_data->flag); + //printf("solidify extrude: %f, %i\n", solidify_data->offset, solidify_data->flag); + printf("selection data %f\n",solidify_data->selection[0]); + Mesh *result; MVert *mv, *mvert, *orig_mvert; @@ -199,9 +217,9 @@ Mesh *solidify_extrude(const SolidifyData *solidify_data, 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;//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; + const short mat_nr_max = solidify_data->object->totcol > 1 ? solidify_data->object->totcol - 1 : 0; + const short mat_ofs = mat_nr_max ? solidify_data->mat_ofs : 0; + const short mat_ofs_rim = mat_nr_max ? solidify_data->mat_ofs_rim : 0; /* use for edges */ /* over-alloc new_vert_arr, old_vert_arr */ @@ -241,14 +259,14 @@ Mesh *solidify_extrude(const SolidifyData *solidify_data, Mesh *mesh) MDeformVert *dvert = mesh->dvert; const bool defgrp_invert = (solidify_data->flag & MOD_SOLIDIFY_VGROUP_INV) != 0; int defgrp_index = 0; -// 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); + const int shell_defgrp_index = BKE_object_defgroup_name_index(solidify_data->object, + solidify_data->shell_defgrp_name); + const int rim_defgrp_index = BKE_object_defgroup_name_index(solidify_data->object, solidify_data->rim_defgrp_name); /* array size is doubled in case of using a shell */ const uint stride = do_shell ? 2 : 1; - //MOD_get_vgroup(object, mesh, smd->defgrp_name, &dvert, &defgrp_index); + get_vgroup(solidify_data->object, mesh, solidify_data->defgrp_name, &dvert, &defgrp_index); orig_mvert = mesh->mvert; orig_medge = mesh->medge; @@ -593,6 +611,10 @@ Mesh *solidify_extrude(const SolidifyData *solidify_data, Mesh *mesh) MEM_freeN(edge_user_pairs); } + ///// + ///// + ///// V-Group influence start + if (ofs_new != 0.0f) { uint i_orig, i_end; bool do_shell_align; @@ -603,17 +625,17 @@ Mesh *solidify_extrude(const SolidifyData *solidify_data, Mesh *mesh) for (i_orig = 0; i_orig < i_end; i_orig++, mv++) { const uint i = do_shell_align ? i_orig : new_vert_arr[i_orig]; - if (dvert) { - MDeformVert *dv = &dvert[i]; + //if (dvert) { + //MDeformVert *dv = &dvert[i]; if (defgrp_invert) { - scalar_short_vgroup = 1.0f - BKE_defvert_find_weight(dv, defgrp_index); + scalar_short_vgroup = 1.0f - solidify_data->selection[i];//BKE_defvert_find_weight(dv, defgrp_index); } else { - scalar_short_vgroup = BKE_defvert_find_weight(dv, defgrp_index); + scalar_short_vgroup = solidify_data->selection[i];//BKE_defvert_find_weight(dv, defgrp_index); } scalar_short_vgroup = (offset_fac_vg + (scalar_short_vgroup * offset_fac_vg_inv)) * scalar_short; - } + //} if (do_clamp && offset > FLT_EPSILON) { /* always reset because we may have set before */ if (dvert == NULL) { @@ -650,17 +672,17 @@ Mesh *solidify_extrude(const SolidifyData *solidify_data, Mesh *mesh) for (i_orig = 0; i_orig < i_end; i_orig++, mv++) { const uint i = do_shell_align ? i_orig : new_vert_arr[i_orig]; - if (dvert) { - MDeformVert *dv = &dvert[i]; + //if (dvert) { + //MDeformVert *dv = &dvert[i]; if (defgrp_invert) { - scalar_short_vgroup = 1.0f - BKE_defvert_find_weight(dv, defgrp_index); + scalar_short_vgroup = 1.0f - solidify_data->selection[i];//BKE_defvert_find_weight(dv, defgrp_index); } else { - scalar_short_vgroup = BKE_defvert_find_weight(dv, defgrp_index); + scalar_short_vgroup = solidify_data->selection[i];//BKE_defvert_find_weight(dv, defgrp_index); } scalar_short_vgroup = (offset_fac_vg + (scalar_short_vgroup * offset_fac_vg_inv)) * scalar_short; - } + //} if (do_clamp && offset > FLT_EPSILON) { /* always reset because we may have set before */ if (dvert == NULL) { @@ -686,6 +708,10 @@ Mesh *solidify_extrude(const SolidifyData *solidify_data, Mesh *mesh) } } + ///// V-Group influende end + ///// + ///// + if (do_bevel_convex) { for (uint i = 0; i < numEdges; i++) { if (edge_users[i] == INVALID_PAIR) { @@ -789,25 +815,25 @@ Mesh *solidify_extrude(const SolidifyData *solidify_data, Mesh *mesh) } /* vertex group support */ - if (dvert) { - MDeformVert *dv = dvert; + //if (dvert) { + //MDeformVert *dv = dvert; float scalar; if (defgrp_invert) { - for (i = 0; i < numVerts; i++, dv++) { - scalar = 1.0f - BKE_defvert_find_weight(dv, defgrp_index); + for (i = 0; i < numVerts; i++){//}, dv++) { + scalar = 1.0f - solidify_data->selection[i];//BKE_defvert_find_weight(dv, defgrp_index); scalar = offset_fac_vg + (scalar * offset_fac_vg_inv); vert_angles[i] *= scalar; } } else { - for (i = 0; i < numVerts; i++, dv++) { - scalar = BKE_defvert_find_weight(dv, defgrp_index); + for (i = 0; i < numVerts; i++){//, dv++) { + scalar = solidify_data->selection[i];//BKE_defvert_find_weight(dv, defgrp_index); scalar = offset_fac_vg + (scalar * offset_fac_vg_inv); vert_angles[i] *= scalar; } } - } + //} /* for angle clamp */ float *vert_angs = NULL; @@ -995,35 +1021,35 @@ Mesh *solidify_extrude(const SolidifyData *solidify_data, Mesh *mesh) } /* Add vertex weights for rim and shell vgroups. */ -// if (shell_defgrp_index != -1 || rim_defgrp_index != -1) { -// dvert = CustomData_duplicate_referenced_layer(&result->vdata, CD_MDEFORMVERT, result->totvert); -// /* If no vertices were ever added to an object's vgroup, dvert might be NULL. */ -// if (dvert == NULL) { -// /* Add a valid data layer! */ -// dvert = CustomData_add_layer( -// &result->vdata, CD_MDEFORMVERT, CD_CALLOC, NULL, result->totvert); -// } -// /* Ultimate security check. */ -// if (dvert != NULL) { -// result->dvert = dvert; -// -// if (rim_defgrp_index != -1) { -// for (uint i = 0; i < rimVerts; i++) { -// BKE_defvert_ensure_index(&result->dvert[new_vert_arr[i]], rim_defgrp_index)->weight = -// 1.0f; -// BKE_defvert_ensure_index(&result->dvert[(do_shell ? new_vert_arr[i] : i) + numVerts], -// rim_defgrp_index) -// ->weight = 1.0f; -// } -// } -// -// if (shell_defgrp_index != -1) { -// for (uint i = numVerts; i < result->totvert; i++) { -// BKE_defvert_ensure_index(&result->dvert[i], shell_defgrp_index)->weight = 1.0f; -// } -// } -// } -// } + if (shell_defgrp_index != -1 || rim_defgrp_index != -1) { + dvert = CustomData_duplicate_referenced_layer(&result->vdata, CD_MDEFORMVERT, result->totvert); + /* If no vertices were ever added to an object's vgroup, dvert might be NULL. */ + if (dvert == NULL) { + /* Add a valid data layer! */ + dvert = CustomData_add_layer( + &result->vdata, CD_MDEFORMVERT, CD_CALLOC, NULL, result->totvert); + } + /* Ultimate security check. */ + @@ 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