Changeset View
Changeset View
Standalone View
Standalone View
source/blender/modifiers/intern/MOD_met_mess.c
- This file was added.
| #include <stdio.h> | |||||
| #include "BLI_math_vector.h" | |||||
| #include "BLT_translation.h" | |||||
| #include "BKE_context.h" | |||||
| #include "BKE_deform.h" | |||||
| #include "BKE_screen.h" | |||||
| #include "BKE_modifier.h" | |||||
| #include "DNA_object_types.h" | |||||
| #include "DNA_mesh_types.h" | |||||
| #include "DNA_meshdata_types.h" | |||||
| #include "DNA_screen_types.h" | |||||
| #include "RNA_access.h" | |||||
| #include "UI_interface.h" | |||||
| #include "UI_resources.h" | |||||
| #include "MOD_modifiertypes.h" | |||||
| #include "MOD_ui_common.h" | |||||
| #include "MOD_util.h" | |||||
| static void requiredDataMask(Object *UNUSED(ob), | |||||
| ModifierData *md, | |||||
| CustomData_MeshMasks *r_cddata_masks) | |||||
| { | |||||
| MetMessModifierData *cmd = (MetMessModifierData *)md; | |||||
| /* ask for vertexgroups if we need them */ | |||||
| if (cmd->defgrp_name[0] != '\0') { | |||||
| r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT; | |||||
| } | |||||
| } | |||||
| static void metmess_do(MetMessModifierData *md, | |||||
| const ModifierEvalContext *UNUSED(ctx), | |||||
| Object *ob, | |||||
| Mesh *mesh, | |||||
| float (*vertexCos)[3], | |||||
| int numVerts) | |||||
| { | |||||
| MDeformVert *dvert = NULL; | |||||
| const bool invert_vgroup = (md->flag & MOD_METMESS_INVERT_VGROUP) != 0; | |||||
| float fac = md->fac; | |||||
| const float fac_orig = fac; | |||||
| int i, defgrp_index; | |||||
| /* Iterate through each vertex of the mesh and apply an offset. */ | |||||
| for (i = 0; i < numVerts; i++) { | |||||
| float tmp_co[3]; | |||||
| copy_v3_v3(tmp_co, vertexCos[i]); | |||||
| /* If a vertex group was specified, multiply the factor by the weight | |||||
| * of that group on this vertex. */ | |||||
| if (md->defgrp_name[0] != '\0') { | |||||
| MOD_get_vgroup(ob, mesh, md->defgrp_name, &dvert, &defgrp_index); | |||||
| if (dvert) { | |||||
| const float weight = invert_vgroup ? | |||||
| 1.0f - BKE_defvert_find_weight(&dvert[i], defgrp_index) : | |||||
| BKE_defvert_find_weight(&dvert[i], defgrp_index); | |||||
| if (weight == 0.0f) { | |||||
| continue; | |||||
| } | |||||
| fac = fac_orig * weight; | |||||
| } | |||||
| } | |||||
| tmp_co[0] += fac; | |||||
| copy_v3_v3(vertexCos[i], tmp_co); | |||||
| } | |||||
| } | |||||
| static void deformVerts(ModifierData *md, | |||||
| const ModifierEvalContext *ctx, | |||||
| Mesh *mesh, | |||||
| float (*vertexCos)[3], | |||||
| int numVerts) | |||||
| { | |||||
| MetMessModifierData *mmd = (MetMessModifierData *)md; | |||||
| Mesh *mesh_src = NULL; | |||||
| if (ctx->object->type == OB_MESH && mmd->defgrp_name[0] != '\0') { | |||||
| /* mesh_src is only needed for vgroups. */ | |||||
| mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false); | |||||
| } | |||||
| metmess_do(mmd, ctx, ctx->object, mesh_src, vertexCos, numVerts); | |||||
| } | |||||
| static void panel_draw(const bContext *UNUSED(C), Panel *panel) | |||||
| { | |||||
| uiLayout *layout = panel->layout; | |||||
| PointerRNA ob_ptr; | |||||
| PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); | |||||
| uiItemR(layout, ptr, "factor", 0, NULL, ICON_NONE); | |||||
| modifier_vgroup_ui(layout, ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL); | |||||
| modifier_panel_end(layout, ptr); | |||||
| } | |||||
| static void panelRegister(ARegionType *region_type) | |||||
| { | |||||
| modifier_panel_register(region_type, eModifierType_MetMess, panel_draw); | |||||
| } | |||||
| ModifierTypeInfo modifierType_MetMess = { | |||||
| /* name */ "Met's Mess", | |||||
| /* structName */ "MetMessModifierData", | |||||
| /* structSize */ sizeof(MetMessModifierData), | |||||
| /* srna */ &RNA_MetMessModifier, | |||||
| /* type */ eModifierTypeType_OnlyDeform, | |||||
| /* flags */ eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_AcceptsVertexCosOnly | | |||||
| eModifierTypeFlag_SupportsEditmode, | |||||
| /* icon */ ICON_FUND, | |||||
| /* copyData */ BKE_modifier_copydata_generic, /* | |||||
| /* deformVerts */ deformVerts, | |||||
| /* deformMatrices */ NULL, | |||||
| /* deformVertsEM */ NULL, | |||||
| /* deformMatricesEM */ NULL, | |||||
| /* modifyMesh */ NULL, | |||||
| /* modifyHair */ NULL, | |||||
| /* modifyGeometrySet */ NULL, | |||||
| /* initData */ NULL, | |||||
| /* requiredDataMask */ requiredDataMask, | |||||
| /* freeData */ NULL, | |||||
| /* isDisabled */ NULL, | |||||
| /* updateDepsgraph */ NULL, | |||||
| /* dependsOnTime */ NULL, | |||||
| /* dependsOnNormals */ NULL, | |||||
| /* foreachIDLink */ NULL, | |||||
| /* foreachTexLink */ NULL, | |||||
| /* freeRuntimeData */ NULL, | |||||
| /* panelRegister */ panelRegister, | |||||
| /* blendWrite */ NULL, | |||||
| /* blendRead */ NULL, | |||||
| }; | |||||
| No newline at end of file | |||||