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
path: root/source
diff options
context:
space:
mode:
authorBastien Montagne <montagne29@wanadoo.fr>2018-11-26 13:46:20 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2018-11-26 23:07:50 +0300
commitede994c3140b92076a3f398b6889e02231461150 (patch)
tree77e4f2c870576f09e3d9d76dbe06615288d7c509 /source
parent8cd5edf8508a00df9791f7b0795b23c74e00c449 (diff)
MOD_curve: do not compute mesh when not needed.
This modifier only uses mesh to get vgroup, which is only needed in case modified object is indeed a mesh! Building a mesh from curve here is not only useless and time-consuming, it will also easily fail the assert about same number of vertices! Also, use MOD_get_vgroup() helper in modifier code itself and pass reluting MDeformVert & index to BKE_curve's curve_deform_verts(), this is simpler and avoids duplicating vgroup handling code. Also fixes crash when used on lattice. Related to T57972.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/BKE_lattice.h5
-rw-r--r--source/blender/blenkernel/intern/lattice.c26
-rw-r--r--source/blender/modifiers/intern/MOD_curve.c16
3 files changed, 16 insertions, 31 deletions
diff --git a/source/blender/blenkernel/BKE_lattice.h b/source/blender/blenkernel/BKE_lattice.h
index 2e093ba11a2..b2911129525 100644
--- a/source/blender/blenkernel/BKE_lattice.h
+++ b/source/blender/blenkernel/BKE_lattice.h
@@ -63,9 +63,8 @@ bool object_deform_mball(struct Object *ob, struct ListBase *dispbase);
void outside_lattice(struct Lattice *lt);
void curve_deform_verts(
- struct Object *cuOb, struct Object *target,
- struct Mesh *mesh, float (*vertexCos)[3],
- int numVerts, const char *vgroup, short defaxis);
+ struct Object *cuOb, struct Object *target, float (*vertexCos)[3],
+ int numVerts, struct MDeformVert *dvert, const int defgrp_index, short defaxis);
void curve_deform_vector(
struct Object *cuOb, struct Object *target,
float orco[3], float vec[3], float mat[3][3], int no_rot_axis);
diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c
index a04f32adece..0fa675639ea 100644
--- a/source/blender/blenkernel/intern/lattice.c
+++ b/source/blender/blenkernel/intern/lattice.c
@@ -704,14 +704,12 @@ static bool calc_curve_deform(Object *par, float co[3],
}
void curve_deform_verts(
- Object *cuOb, Object *target, Mesh *mesh, float (*vertexCos)[3],
- int numVerts, const char *vgroup, short defaxis)
+ Object *cuOb, Object *target, float (*vertexCos)[3],
+ int numVerts, MDeformVert *dvert, const int defgrp_index, short defaxis)
{
Curve *cu;
int a;
CurveDeform cd;
- MDeformVert *dvert = NULL;
- int defgrp_index = -1;
const bool is_neg_axis = (defaxis > 2);
if (cuOb->type != OB_CURVE)
@@ -732,26 +730,6 @@ void curve_deform_verts(
cd.dmax[0] = cd.dmax[1] = cd.dmax[2] = 0.0f;
}
- /* Check whether to use vertex groups (only possible if target is a Mesh or Lattice).
- * We want either a Mesh/Lattice with no derived data, or derived data with deformverts.
- */
- if (vgroup && vgroup[0] && ELEM(target->type, OB_MESH, OB_LATTICE)) {
- defgrp_index = defgroup_name_index(target, vgroup);
-
- if (defgrp_index != -1) {
- /* if there's derived data without deformverts, don't use vgroups */
- if (mesh) {
- dvert = CustomData_get_layer(&mesh->vdata, CD_MDEFORMVERT);
- }
- else if (target->type == OB_LATTICE) {
- dvert = ((Lattice *)target->data)->dvert;
- }
- else {
- dvert = ((Mesh *)target->data)->dvert;
- }
- }
- }
-
if (dvert) {
MDeformVert *dvert_iter;
float vec[3];
diff --git a/source/blender/modifiers/intern/MOD_curve.c b/source/blender/modifiers/intern/MOD_curve.c
index 73a541090e8..308cb79b74a 100644
--- a/source/blender/modifiers/intern/MOD_curve.c
+++ b/source/blender/modifiers/intern/MOD_curve.c
@@ -112,15 +112,23 @@ static void deformVerts(
int numVerts)
{
CurveModifierData *cmd = (CurveModifierData *) md;
- Mesh *mesh_src = MOD_get_mesh_eval(ctx->object, NULL, mesh, NULL, false, false);
+ Mesh *mesh_src = NULL;
- BLI_assert(mesh_src->totvert == numVerts);
+ if (ctx->object->type == OB_MESH) {
+ /* mesh_src is only needed for vgroups. */
+ mesh_src = MOD_get_mesh_eval(ctx->object, NULL, mesh, NULL, false, false);
+ BLI_assert(mesh_src->totvert == numVerts);
+ }
+
+ struct MDeformVert *dvert = NULL;
+ int defgrp_index = -1;
+ MOD_get_vgroup(ctx->object, mesh_src, cmd->name, &dvert, &defgrp_index);
/* silly that defaxis and curve_deform_verts are off by 1
* but leave for now to save having to call do_versions */
- curve_deform_verts(cmd->object, ctx->object, mesh_src, vertexCos, numVerts, cmd->name, cmd->defaxis - 1);
+ curve_deform_verts(cmd->object, ctx->object, vertexCos, numVerts, dvert, defgrp_index, cmd->defaxis - 1);
- if (mesh_src != mesh) {
+ if (!ELEM(mesh_src, NULL, mesh)) {
BKE_id_free(NULL, mesh_src);
}
}