Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Montagne <montagne29@wanadoo.fr>2018-05-07 19:15:27 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2018-05-07 19:18:05 +0300
commit3800be695bc19dcbefc23fe7b157f104b1efb8dc (patch)
treede6ed183d07f85eccdbb31739b88db425b743269 /source/blender/modifiers/intern/MOD_weightvgedit.c
parent15f9ca05d1307dcaf63f9ead81ea95283b9484e5 (diff)
Modifier stack: move vgroup editing modifiers to new Mesh-based system.
Some notes here: * Proximity with non-mesh objects (like curve, see TEST_2 scene in weightvg testfile) are not working currently. This is known TODO of COW depsgraph project. * Proximity modifier is slower, due to some other TODO pending on BVHTree creation/caching for Mesh.
Diffstat (limited to 'source/blender/modifiers/intern/MOD_weightvgedit.c')
-rw-r--r--source/blender/modifiers/intern/MOD_weightvgedit.c75
1 files changed, 48 insertions, 27 deletions
diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.c b/source/blender/modifiers/intern/MOD_weightvgedit.c
index 1a9651909dd..cc000cbee09 100644
--- a/source/blender/modifiers/intern/MOD_weightvgedit.c
+++ b/source/blender/modifiers/intern/MOD_weightvgedit.c
@@ -34,11 +34,11 @@
#include "BLI_rand.h"
#include "DNA_color_types.h" /* CurveMapping. */
+#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
-#include "BKE_cdderivedmesh.h"
#include "BKE_colortools.h" /* CurveMapping. */
#include "BKE_deform.h"
#include "BKE_library.h"
@@ -154,19 +154,18 @@ static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams))
return (wmd->defgrp_name[0] == '\0');
}
-static DerivedMesh *applyModifier(ModifierData *md,
+static Mesh *applyModifier(ModifierData *md,
const ModifierEvalContext *ctx,
- DerivedMesh *derivedData)
+ Mesh *mesh)
{
WeightVGEditModifierData *wmd = (WeightVGEditModifierData *) md;
- DerivedMesh *dm = derivedData;
+
MDeformVert *dvert = NULL;
MDeformWeight **dw = NULL;
float *org_w; /* Array original weights. */
float *new_w; /* Array new weights. */
- int numVerts;
- int defgrp_index;
int i;
+
/* Flags. */
const bool do_add = (wmd->edit_flags & MOD_WVG_EDIT_ADD2VG) != 0;
const bool do_rem = (wmd->edit_flags & MOD_WVG_EDIT_REMFVG) != 0;
@@ -176,30 +175,50 @@ static DerivedMesh *applyModifier(ModifierData *md,
#endif
/* Get number of verts. */
- numVerts = dm->getNumVerts(dm);
+ const int numVerts = mesh->totvert;
/* Check if we can just return the original mesh.
* Must have verts and therefore verts assigned to vgroups to do anything useful!
*/
- if ((numVerts == 0) || BLI_listbase_is_empty(&ctx->object->defbase))
- return dm;
+ if ((numVerts == 0) || BLI_listbase_is_empty(&ctx->object->defbase)) {
+ return mesh;
+ }
/* Get vgroup idx from its name. */
- defgrp_index = defgroup_name_index(ctx->object, wmd->defgrp_name);
- if (defgrp_index == -1)
- return dm;
+ const int defgrp_index = defgroup_name_index(ctx->object, wmd->defgrp_name);
+ if (defgrp_index == -1) {
+ return mesh;
+ }
- dvert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MDEFORMVERT, numVerts);
+ const bool has_mdef = CustomData_has_layer(&mesh->vdata, CD_MDEFORMVERT);
/* If no vertices were ever added to an object's vgroup, dvert might be NULL. */
- if (!dvert) {
+ if (!has_mdef) {
/* If this modifier is not allowed to add vertices, just return. */
- if (!do_add)
- return dm;
- /* Else, add a valid data layer! */
- dvert = CustomData_add_layer(&dm->vertData, CD_MDEFORMVERT, CD_CALLOC, NULL, numVerts);
- /* Ultimate security check. */
- if (!dvert)
- return dm;
+ if (!do_add) {
+ return mesh;
+ }
+ }
+
+ Mesh *result;
+ BKE_id_copy_ex(
+ NULL, &mesh->id, (ID **)&result,
+ LIB_ID_CREATE_NO_MAIN |
+ LIB_ID_CREATE_NO_USER_REFCOUNT |
+ LIB_ID_CREATE_NO_DEG_TAG|
+ LIB_ID_COPY_NO_PREVIEW,
+ false);
+
+ if (has_mdef) {
+ dvert = CustomData_get_layer(&result->vdata, CD_MDEFORMVERT);
+ }
+ else {
+ /* Add a valid data layer! */
+ dvert = CustomData_add_layer(&result->vdata, CD_MDEFORMVERT, CD_CALLOC, NULL, numVerts);
+ }
+ /* Ultimate security check. */
+ if (!dvert) {
+ BKE_id_free(NULL, result);
+ return mesh;
}
/* Get org weights, assuming 0.0 for vertices not in given vgroup. */
@@ -220,17 +239,19 @@ static DerivedMesh *applyModifier(ModifierData *md,
if (wmd->falloff_type != MOD_WVG_MAPPING_NONE) {
RNG *rng = NULL;
- if (wmd->falloff_type == MOD_WVG_MAPPING_RANDOM)
+ if (wmd->falloff_type == MOD_WVG_MAPPING_RANDOM) {
rng = BLI_rng_new_srandom(BLI_ghashutil_strhash(ctx->object->id.name + 2));
+ }
weightvg_do_map(numVerts, new_w, wmd->falloff_type, wmd->cmap_curve, rng);
- if (rng)
+ if (rng) {
BLI_rng_free(rng);
+ }
}
/* Do masking. */
- weightvg_do_mask(numVerts, NULL, org_w, new_w, ctx->object, dm, wmd->mask_constant,
+ weightvg_do_mask(numVerts, NULL, org_w, new_w, ctx->object, result, wmd->mask_constant,
wmd->mask_defgrp_name, wmd->modifier.scene, wmd->mask_texture,
wmd->mask_tex_use_channel, wmd->mask_tex_mapping,
wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name);
@@ -251,7 +272,7 @@ static DerivedMesh *applyModifier(ModifierData *md,
MEM_freeN(dw);
/* Return the vgroup-modified mesh. */
- return dm;
+ return result;
}
@@ -271,14 +292,14 @@ ModifierTypeInfo modifierType_WeightVGEdit = {
/* deformMatrices_DM */ NULL,
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
- /* applyModifier_DM */ applyModifier,
+ /* applyModifier_DM */ NULL,
/* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
- /* applyModifier */ NULL,
+ /* applyModifier */ applyModifier,
/* applyModifierEM */ NULL,
/* initData */ initData,