Changeset View
Changeset View
Standalone View
Standalone View
source/blender/modifiers/intern/MOD_screw.c
| Show All 30 Lines | |||||
| /** \file blender/modifiers/intern/MOD_screw.c | /** \file blender/modifiers/intern/MOD_screw.c | ||||
| * \ingroup modifiers | * \ingroup modifiers | ||||
| */ | */ | ||||
| /* Screw modifier: revolves the edges about an axis */ | /* Screw modifier: revolves the edges about an axis */ | ||||
| #include <limits.h> | #include <limits.h> | ||||
| #include "DNA_mesh_types.h" | |||||
| #include "DNA_meshdata_types.h" | #include "DNA_meshdata_types.h" | ||||
| #include "DNA_object_types.h" | #include "DNA_object_types.h" | ||||
| #include "BLI_math.h" | #include "BLI_math.h" | ||||
| #include "BLI_alloca.h" | #include "BLI_alloca.h" | ||||
| #include "BLI_utildefines.h" | #include "BLI_utildefines.h" | ||||
| #include "BKE_cdderivedmesh.h" | |||||
| #include "BKE_library_query.h" | #include "BKE_library_query.h" | ||||
| #include "BKE_mesh.h" | |||||
| #include "BKE_library.h" | |||||
sybren: Add new `#include` statements in alphabetical order. | |||||
| #include "DEG_depsgraph_build.h" | #include "DEG_depsgraph_build.h" | ||||
| #include "MOD_modifiertypes.h" | #include "MOD_modifiertypes.h" | ||||
| #include "MEM_guardedalloc.h" | #include "MEM_guardedalloc.h" | ||||
| #include "BLI_strict_flags.h" | #include "BLI_strict_flags.h" | ||||
| ▲ Show 20 Lines • Show All 50 Lines • ▼ Show 20 Lines | if (SV_IS_VALID(iter->v)) { | ||||
| iter->e = iter->v_poin->e[(iter->v_poin->e[0] == iter->e)]; | iter->e = iter->v_poin->e[(iter->v_poin->e[0] == iter->e)]; | ||||
| } | } | ||||
| else { | else { | ||||
| iter->e = NULL; | iter->e = NULL; | ||||
| iter->v_poin = NULL; | iter->v_poin = NULL; | ||||
| } | } | ||||
| } | } | ||||
| static DerivedMesh *dm_remove_doubles_on_axis( | static Mesh *mesh_remove_doubles_on_axis( | ||||
| DerivedMesh *result, MVert *mvert_new, const uint totvert, const uint step_tot, | Mesh *result, MVert *mvert_new, const uint totvert, const uint step_tot, | ||||
| const float axis_vec[3], const float axis_offset[3], const float merge_threshold) | const float axis_vec[3], const float axis_offset[3], const float merge_threshold) | ||||
| { | { | ||||
| const float merge_threshold_sq = SQUARE(merge_threshold); | const float merge_threshold_sq = SQUARE(merge_threshold); | ||||
| const bool use_offset = axis_offset != NULL; | const bool use_offset = axis_offset != NULL; | ||||
| uint tot_doubles = 0; | uint tot_doubles = 0; | ||||
| for (uint i = 0; i < totvert; i += 1) { | for (uint i = 0; i < totvert; i += 1) { | ||||
| float axis_co[3]; | float axis_co[3]; | ||||
| if (use_offset) { | if (use_offset) { | ||||
| Show All 27 Lines | for (uint i = 0; i < totvert; i += 1) { | ||||
| doubles_map += totvert; | doubles_map += totvert; | ||||
| } | } | ||||
| tot_doubles_left -= 1; | tot_doubles_left -= 1; | ||||
| if (tot_doubles_left == 0) { | if (tot_doubles_left == 0) { | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| result = CDDM_merge_verts(result, full_doubles_map, (int)(tot_doubles * (step_tot - 1)), CDDM_MERGE_VERTS_DUMP_IF_MAPPED); | result = BKE_mesh_merge_verts(result, full_doubles_map, (int)(tot_doubles * (step_tot - 1)), MESH_MERGE_VERTS_DUMP_IF_MAPPED); | ||||
| MEM_freeN(full_doubles_map); | MEM_freeN(full_doubles_map); | ||||
| } | } | ||||
| return result; | return result; | ||||
| } | } | ||||
| static void initData(ModifierData *md) | static void initData(ModifierData *md) | ||||
| { | { | ||||
| ScrewModifierData *ltmd = (ScrewModifierData *) md; | ScrewModifierData *ltmd = (ScrewModifierData *) md; | ||||
| ltmd->ob_axis = NULL; | ltmd->ob_axis = NULL; | ||||
| ltmd->angle = (float)(M_PI * 2.0); | ltmd->angle = (float)(M_PI * 2.0); | ||||
| ltmd->axis = 2; | ltmd->axis = 2; | ||||
| ltmd->flag = MOD_SCREW_SMOOTH_SHADING; | ltmd->flag = MOD_SCREW_SMOOTH_SHADING; | ||||
| ltmd->steps = 16; | ltmd->steps = 16; | ||||
| ltmd->render_steps = 16; | ltmd->render_steps = 16; | ||||
| ltmd->iter = 1; | ltmd->iter = 1; | ||||
| ltmd->merge_dist = 0.01f; | ltmd->merge_dist = 0.01f; | ||||
| } | } | ||||
| static DerivedMesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, | static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, | ||||
sybrenUnsubmitted Not Done Inline ActionsRemove trailing spaces. sybren: Remove trailing spaces. | |||||
| DerivedMesh *derivedData) | Mesh *meshData) | ||||
| { | { | ||||
| DerivedMesh *dm = derivedData; | Mesh *mesh = meshData; | ||||
| DerivedMesh *result; | Mesh *result; | ||||
| ScrewModifierData *ltmd = (ScrewModifierData *) md; | ScrewModifierData *ltmd = (ScrewModifierData *) md; | ||||
| const bool use_render_params = (ctx->flag & MOD_APPLY_RENDER) != 0; | const bool use_render_params = (ctx->flag & MOD_APPLY_RENDER) != 0; | ||||
| int *origindex; | int *origindex; | ||||
| int mpoly_index = 0; | int mpoly_index = 0; | ||||
| unsigned int step; | unsigned int step; | ||||
| unsigned int i, j; | unsigned int i, j; | ||||
| unsigned int i1, i2; | unsigned int i1, i2; | ||||
| Show All 9 Lines | static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, | ||||
| const int quad_ord_ofs[4] = { | const int quad_ord_ofs[4] = { | ||||
| do_flip ? 2 : 0, | do_flip ? 2 : 0, | ||||
| 1, | 1, | ||||
| do_flip ? 0 : 2, | do_flip ? 0 : 2, | ||||
| 3, | 3, | ||||
| }; | }; | ||||
| unsigned int maxVerts = 0, maxEdges = 0, maxPolys = 0; | unsigned int maxVerts = 0, maxEdges = 0, maxPolys = 0; | ||||
| const unsigned int totvert = (unsigned int)dm->getNumVerts(dm); | const unsigned int totvert = (unsigned int)mesh->totvert; | ||||
| const unsigned int totedge = (unsigned int)dm->getNumEdges(dm); | const unsigned int totedge = (unsigned int)mesh->totedge; | ||||
| const unsigned int totpoly = (unsigned int)dm->getNumPolys(dm); | const unsigned int totpoly = (unsigned int)mesh->totpoly; | ||||
| unsigned int *edge_poly_map = NULL; /* orig edge to orig poly */ | unsigned int *edge_poly_map = NULL; /* orig edge to orig poly */ | ||||
| unsigned int *vert_loop_map = NULL; /* orig vert to orig loop */ | unsigned int *vert_loop_map = NULL; /* orig vert to orig loop */ | ||||
| /* UV Coords */ | /* UV Coords */ | ||||
| const unsigned int mloopuv_layers_tot = (unsigned int)CustomData_number_of_layers(&dm->loopData, CD_MLOOPUV); | const unsigned int mloopuv_layers_tot = (unsigned int)CustomData_number_of_layers(&mesh->ldata, CD_MLOOPUV); | ||||
| MLoopUV **mloopuv_layers = BLI_array_alloca(mloopuv_layers, mloopuv_layers_tot); | MLoopUV **mloopuv_layers = BLI_array_alloca(mloopuv_layers, mloopuv_layers_tot); | ||||
| float uv_u_scale; | float uv_u_scale; | ||||
| float uv_v_minmax[2] = {FLT_MAX, -FLT_MAX}; | float uv_v_minmax[2] = {FLT_MAX, -FLT_MAX}; | ||||
| float uv_v_range_inv; | float uv_v_range_inv; | ||||
| float uv_axis_plane[4]; | float uv_axis_plane[4]; | ||||
| char axis_char = 'X'; | char axis_char = 'X'; | ||||
| bool close; | bool close; | ||||
| Show All 18 Lines | static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, | ||||
| MVert *mvert_new, *mvert_orig, *mv_orig, *mv_new, *mv_new_base; | MVert *mvert_new, *mvert_orig, *mv_orig, *mv_new, *mv_new_base; | ||||
| ScrewVertConnect *vc, *vc_tmp, *vert_connect = NULL; | ScrewVertConnect *vc, *vc_tmp, *vert_connect = NULL; | ||||
| const char mpoly_flag = (ltmd->flag & MOD_SCREW_SMOOTH_SHADING) ? ME_SMOOTH : 0; | const char mpoly_flag = (ltmd->flag & MOD_SCREW_SMOOTH_SHADING) ? ME_SMOOTH : 0; | ||||
| /* don't do anything? */ | /* don't do anything? */ | ||||
| if (!totvert) | if (!totvert) | ||||
| return CDDM_from_template(dm, 0, 0, 0, 0, 0); | return BKE_mesh_new_nomain_from_template(mesh, 0, 0, 0, 0, 0); | ||||
| switch (ltmd->axis) { | switch (ltmd->axis) { | ||||
| case 0: | case 0: | ||||
| other_axis_1 = 1; | other_axis_1 = 1; | ||||
| other_axis_2 = 2; | other_axis_2 = 2; | ||||
| break; | break; | ||||
| case 1: | case 1: | ||||
| other_axis_1 = 0; | other_axis_1 = 0; | ||||
| ▲ Show 20 Lines • Show All 108 Lines • ▼ Show 20 Lines | maxEdges = (totvert * (step_tot - 1)) + /* these are the edges between new verts */ | ||||
| (totedge * step_tot); /* -1 because vert edges join */ | (totedge * step_tot); /* -1 because vert edges join */ | ||||
| maxPolys = totedge * (step_tot - 1); | maxPolys = totedge * (step_tot - 1); | ||||
| } | } | ||||
| if ((ltmd->flag & MOD_SCREW_UV_STRETCH_U) == 0) { | if ((ltmd->flag & MOD_SCREW_UV_STRETCH_U) == 0) { | ||||
| uv_u_scale = (uv_u_scale / (float)ltmd->iter) * (angle / ((float)M_PI * 2.0f)); | uv_u_scale = (uv_u_scale / (float)ltmd->iter) * (angle / ((float)M_PI * 2.0f)); | ||||
| } | } | ||||
| result = CDDM_from_template(dm, (int)maxVerts, (int)maxEdges, 0, (int)maxPolys * 4, (int)maxPolys); | result = BKE_mesh_new_nomain_from_template(mesh, (int)maxVerts, (int)maxEdges, 0, (int)maxPolys * 4, (int)maxPolys); | ||||
| /* copy verts from mesh */ | /* copy verts from mesh */ | ||||
| mvert_orig = dm->getVertArray(dm); | mvert_orig = mesh->mvert; | ||||
| medge_orig = dm->getEdgeArray(dm); | medge_orig = mesh->medge; | ||||
| mvert_new = result->getVertArray(result); | mvert_new = result->mvert; | ||||
| mpoly_new = result->getPolyArray(result); | mpoly_new = result->mpoly; | ||||
| mloop_new = result->getLoopArray(result); | mloop_new = result->mloop; | ||||
| medge_new = result->getEdgeArray(result); | medge_new = result->medge; | ||||
| if (!CustomData_has_layer(&result->polyData, CD_ORIGINDEX)) { | if (!CustomData_has_layer(&result->pdata, CD_ORIGINDEX)) { | ||||
| CustomData_add_layer(&result->polyData, CD_ORIGINDEX, CD_CALLOC, NULL, (int)maxPolys); | CustomData_add_layer(&result->pdata, CD_ORIGINDEX, CD_CALLOC, NULL, (int)maxPolys); | ||||
| } | } | ||||
| origindex = CustomData_get_layer(&result->polyData, CD_ORIGINDEX); | origindex = CustomData_get_layer(&result->pdata, CD_ORIGINDEX); | ||||
| DM_copy_vert_data(dm, result, 0, 0, (int)totvert); /* copy first otherwise this overwrites our own vertex normals */ | CustomData_copy_data(&mesh->vdata, &result->vdata, 0, 0, (int)totvert); | ||||
| if (mloopuv_layers_tot) { | if (mloopuv_layers_tot) { | ||||
| float zero_co[3] = {0}; | float zero_co[3] = {0}; | ||||
| plane_from_point_normal_v3(uv_axis_plane, zero_co, axis_vec); | plane_from_point_normal_v3(uv_axis_plane, zero_co, axis_vec); | ||||
| } | } | ||||
| if (mloopuv_layers_tot) { | if (mloopuv_layers_tot) { | ||||
| unsigned int uv_lay; | unsigned int uv_lay; | ||||
| for (uv_lay = 0; uv_lay < mloopuv_layers_tot; uv_lay++) { | for (uv_lay = 0; uv_lay < mloopuv_layers_tot; uv_lay++) { | ||||
| mloopuv_layers[uv_lay] = CustomData_get_layer_n(&result->loopData, CD_MLOOPUV, (int)uv_lay); | mloopuv_layers[uv_lay] = CustomData_get_layer_n(&result->ldata, CD_MLOOPUV, (int)uv_lay); | ||||
| } | } | ||||
| if (ltmd->flag & MOD_SCREW_UV_STRETCH_V) { | if (ltmd->flag & MOD_SCREW_UV_STRETCH_V) { | ||||
| for (i = 0, mv_orig = mvert_orig; i < totvert; i++, mv_orig++) { | for (i = 0, mv_orig = mvert_orig; i < totvert; i++, mv_orig++) { | ||||
| const float v = dist_signed_squared_to_plane_v3(mv_orig->co, uv_axis_plane); | const float v = dist_signed_squared_to_plane_v3(mv_orig->co, uv_axis_plane); | ||||
| uv_v_minmax[0] = min_ff(v, uv_v_minmax[0]); | uv_v_minmax[0] = min_ff(v, uv_v_minmax[0]); | ||||
| uv_v_minmax[1] = max_ff(v, uv_v_minmax[1]); | uv_v_minmax[1] = max_ff(v, uv_v_minmax[1]); | ||||
| } | } | ||||
| Show All 19 Lines | for (i = 0; i < totedge; i++, med_orig++, med_new++) { | ||||
| med_new->crease = med_orig->crease; | med_new->crease = med_orig->crease; | ||||
| med_new->flag = med_orig->flag & ~ME_LOOSEEDGE; | med_new->flag = med_orig->flag & ~ME_LOOSEEDGE; | ||||
| } | } | ||||
| /* build polygon -> edge map */ | /* build polygon -> edge map */ | ||||
| if (totpoly) { | if (totpoly) { | ||||
| MPoly *mp_orig; | MPoly *mp_orig; | ||||
| mpoly_orig = dm->getPolyArray(dm); | mpoly_orig = mesh->mpoly; | ||||
| mloop_orig = dm->getLoopArray(dm); | mloop_orig = mesh->mloop; | ||||
| edge_poly_map = MEM_malloc_arrayN(totedge, sizeof(*edge_poly_map), __func__); | edge_poly_map = MEM_malloc_arrayN(totedge, sizeof(*edge_poly_map), __func__); | ||||
| memset(edge_poly_map, 0xff, sizeof(*edge_poly_map) * totedge); | memset(edge_poly_map, 0xff, sizeof(*edge_poly_map) * totedge); | ||||
| vert_loop_map = MEM_malloc_arrayN(totvert, sizeof(*vert_loop_map), __func__); | vert_loop_map = MEM_malloc_arrayN(totvert, sizeof(*vert_loop_map), __func__); | ||||
| memset(vert_loop_map, 0xff, sizeof(*vert_loop_map) * totvert); | memset(vert_loop_map, 0xff, sizeof(*vert_loop_map) * totvert); | ||||
| for (i = 0, mp_orig = mpoly_orig; i < totpoly; i++, mp_orig++) { | for (i = 0, mp_orig = mpoly_orig; i < totpoly; i++, mp_orig++) { | ||||
| unsigned int loopstart = (unsigned int)mp_orig->loopstart; | unsigned int loopstart = (unsigned int)mp_orig->loopstart; | ||||
| ▲ Show 20 Lines • Show All 394 Lines • ▼ Show 20 Lines | else { | ||||
| axis_angle_to_mat3_single(mat3, axis_char, step_angle); | axis_angle_to_mat3_single(mat3, axis_char, step_angle); | ||||
| } | } | ||||
| copy_m4_m3(mat, mat3); | copy_m4_m3(mat, mat3); | ||||
| if (screw_ofs) | if (screw_ofs) | ||||
| madd_v3_v3fl(mat[3], axis_vec, screw_ofs * ((float)step / (float)(step_tot - 1))); | madd_v3_v3fl(mat[3], axis_vec, screw_ofs * ((float)step / (float)(step_tot - 1))); | ||||
| /* copy a slice */ | /* copy a slice */ | ||||
| DM_copy_vert_data(dm, result, 0, (int)varray_stride, (int)totvert); | CustomData_copy_data(&mesh->vdata, &result->vdata, 0, (int)varray_stride, (int)totvert); | ||||
| mv_new_base = mvert_new; | mv_new_base = mvert_new; | ||||
| mv_new = &mvert_new[varray_stride]; /* advance to the next slice */ | mv_new = &mvert_new[varray_stride]; /* advance to the next slice */ | ||||
| for (j = 0; j < totvert; j++, mv_new_base++, mv_new++) { | for (j = 0; j < totvert; j++, mv_new_base++, mv_new++) { | ||||
| /* set normal */ | /* set normal */ | ||||
| if (vert_connect) { | if (vert_connect) { | ||||
| mul_v3_m3v3(nor_tx, mat3, vert_connect[j].no); | mul_v3_m3v3(nor_tx, mat3, vert_connect[j].no); | ||||
| ▲ Show 20 Lines • Show All 85 Lines • ▼ Show 20 Lines | if (has_mloop_orig == false && mloopuv_layers_tot) { | ||||
| uv_v_offset_b = (uv_v_offset_b - uv_v_minmax[0]) * uv_v_range_inv; | uv_v_offset_b = (uv_v_offset_b - uv_v_minmax[0]) * uv_v_range_inv; | ||||
| } | } | ||||
| } | } | ||||
| for (step = 0; step <= step_last; step++) { | for (step = 0; step <= step_last; step++) { | ||||
| /* Polygon */ | /* Polygon */ | ||||
| if (has_mpoly_orig) { | if (has_mpoly_orig) { | ||||
| DM_copy_poly_data(dm, result, (int)mpoly_index_orig, (int)mpoly_index, 1); | CustomData_copy_data(&mesh->pdata, &result->pdata, (int)mpoly_index_orig, (int)mpoly_index, 1); | ||||
| origindex[mpoly_index] = (int)mpoly_index_orig; | origindex[mpoly_index] = (int)mpoly_index_orig; | ||||
| } | } | ||||
| else { | else { | ||||
| origindex[mpoly_index] = ORIGINDEX_NONE; | origindex[mpoly_index] = ORIGINDEX_NONE; | ||||
| mp_new->flag = mpoly_flag; | mp_new->flag = mpoly_flag; | ||||
| mp_new->mat_nr = mat_nr; | mp_new->mat_nr = mat_nr; | ||||
| } | } | ||||
| mp_new->loopstart = mpoly_index * 4; | mp_new->loopstart = mpoly_index * 4; | ||||
| mp_new->totloop = 4; | mp_new->totloop = 4; | ||||
| /* Loop-Custom-Data */ | /* Loop-Custom-Data */ | ||||
| if (has_mloop_orig) { | if (has_mloop_orig) { | ||||
| int l_index = (int)(ml_new - mloop_new); | int l_index = (int)(ml_new - mloop_new); | ||||
| DM_copy_loop_data(dm, result, (int)mloop_index_orig[0], l_index + 0, 1); | |||||
| DM_copy_loop_data(dm, result, (int)mloop_index_orig[1], l_index + 1, 1); | CustomData_copy_data(&mesh->ldata, &result->ldata, (int)mloop_index_orig[0], l_index + 0, 1); | ||||
| DM_copy_loop_data(dm, result, (int)mloop_index_orig[1], l_index + 2, 1); | CustomData_copy_data(&mesh->ldata, &result->ldata, (int)mloop_index_orig[1], l_index + 1, 1); | ||||
| DM_copy_loop_data(dm, result, (int)mloop_index_orig[0], l_index + 3, 1); | CustomData_copy_data(&mesh->ldata, &result->ldata, (int)mloop_index_orig[1], l_index + 2, 1); | ||||
| CustomData_copy_data(&mesh->ldata, &result->ldata, (int)mloop_index_orig[0], l_index + 3, 1); | |||||
| if (mloopuv_layers_tot) { | if (mloopuv_layers_tot) { | ||||
| unsigned int uv_lay; | unsigned int uv_lay; | ||||
| const float uv_u_offset_a = (float)(step) * uv_u_scale; | const float uv_u_offset_a = (float)(step) * uv_u_scale; | ||||
| const float uv_u_offset_b = (float)(step + 1) * uv_u_scale; | const float uv_u_offset_b = (float)(step + 1) * uv_u_scale; | ||||
| for (uv_lay = 0; uv_lay < mloopuv_layers_tot; uv_lay++) { | for (uv_lay = 0; uv_lay < mloopuv_layers_tot; uv_lay++) { | ||||
| MLoopUV *mluv = &mloopuv_layers[uv_lay][l_index]; | MLoopUV *mluv = &mloopuv_layers[uv_lay][l_index]; | ||||
| ▲ Show 20 Lines • Show All 105 Lines • ▼ Show 20 Lines | if (edge_poly_map) { | ||||
| MEM_freeN(edge_poly_map); | MEM_freeN(edge_poly_map); | ||||
| } | } | ||||
| if (vert_loop_map) { | if (vert_loop_map) { | ||||
| MEM_freeN(vert_loop_map); | MEM_freeN(vert_loop_map); | ||||
| } | } | ||||
| if ((ltmd->flag & MOD_SCREW_MERGE) && (screw_ofs == 0.0f)) { | if ((ltmd->flag & MOD_SCREW_MERGE) && (screw_ofs == 0.0f)) { | ||||
| DerivedMesh *result_prev = result; | Mesh *result_prev = result; | ||||
| result = dm_remove_doubles_on_axis( | result = mesh_remove_doubles_on_axis( | ||||
| result, mvert_new, totvert, step_tot, | result, mvert_new, totvert, step_tot, | ||||
| axis_vec, ltmd->ob_axis ? mtx_tx[3] : NULL, ltmd->merge_dist); | axis_vec, ltmd->ob_axis ? mtx_tx[3] : NULL, ltmd->merge_dist); | ||||
| if (result != result_prev) { | if (result != result_prev) { | ||||
| result->dirty |= DM_DIRTY_NORMALS; | result->runtime.cd_dirty_vert |= CD_MASK_NORMAL; | ||||
| } | } | ||||
| } | } | ||||
| if ((ltmd->flag & MOD_SCREW_NORMAL_CALC) == 0) { | if ((ltmd->flag & MOD_SCREW_NORMAL_CALC) == 0) { | ||||
| result->dirty |= DM_DIRTY_NORMALS; | result->runtime.cd_dirty_vert |= CD_MASK_NORMAL; | ||||
| } | } | ||||
| return result; | return result; | ||||
| } | } | ||||
| static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) | static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) | ||||
| { | { | ||||
| ScrewModifierData *ltmd = (ScrewModifierData *)md; | ScrewModifierData *ltmd = (ScrewModifierData *)md; | ||||
| Show All 23 Lines | /* flags */ eModifierTypeFlag_AcceptsMesh | | ||||
| eModifierTypeFlag_EnableInEditmode, | eModifierTypeFlag_EnableInEditmode, | ||||
| /* copyData */ modifier_copyData_generic, | /* copyData */ modifier_copyData_generic, | ||||
| /* deformVerts_DM */ NULL, | /* deformVerts_DM */ NULL, | ||||
| /* deformMatrices_DM */ NULL, | /* deformMatrices_DM */ NULL, | ||||
| /* deformVertsEM_DM */ NULL, | /* deformVertsEM_DM */ NULL, | ||||
| /* deformMatricesEM_DM*/NULL, | /* deformMatricesEM_DM*/NULL, | ||||
| /* applyModifier_DM */ applyModifier, | /* applyModifier_DM */ NULL, | ||||
| /* applyModifierEM_DM */NULL, | /* applyModifierEM_DM */NULL, | ||||
| /* deformVerts */ NULL, | /* deformVerts */ NULL, | ||||
| /* deformMatrices */ NULL, | /* deformMatrices */ NULL, | ||||
| /* deformVertsEM */ NULL, | /* deformVertsEM */ NULL, | ||||
| /* deformMatricesEM */ NULL, | /* deformMatricesEM */ NULL, | ||||
| /* applyModifier */ NULL, | /* applyModifier */ applyModifier, | ||||
| /* applyModifierEM */ NULL, | /* applyModifierEM */ NULL, | ||||
| /* initData */ initData, | /* initData */ initData, | ||||
| /* requiredDataMask */ NULL, | /* requiredDataMask */ NULL, | ||||
| /* freeData */ NULL, | /* freeData */ NULL, | ||||
| /* isDisabled */ NULL, | /* isDisabled */ NULL, | ||||
| /* updateDepsgraph */ updateDepsgraph, | /* updateDepsgraph */ updateDepsgraph, | ||||
| /* dependsOnTime */ NULL, | /* dependsOnTime */ NULL, | ||||
| /* dependsOnNormals */ NULL, | /* dependsOnNormals */ NULL, | ||||
| /* foreachObjectLink */ foreachObjectLink, | /* foreachObjectLink */ foreachObjectLink, | ||||
| /* foreachIDLink */ NULL, | /* foreachIDLink */ NULL, | ||||
| /* foreachTexLink */ NULL, | /* foreachTexLink */ NULL, | ||||
| }; | }; | ||||
Add new #include statements in alphabetical order.