diff options
author | Daniel Dunbar <daniel@zuster.org> | 2005-07-19 06:36:21 +0400 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2005-07-19 06:36:21 +0400 |
commit | 09b527263951781290af8461476dcd9ed5394c37 (patch) | |
tree | 85435546528e215ebf92fb3e2053ee2280fca217 /source/blender/blenkernel/intern/lattice.c | |
parent | 8962195f21bc7bb1b7ea70290fff93176c03eb9f (diff) |
- split mesh_deform off from object_deform
- changed mesh_modifier, sbObjectStep, object_deform to take vertexCo
argument instead of operating on mesh
- fixed bug where a derived mesh would not be returned in editmode
- removed object_wave, replaced by init_wave_deform and calc_wave_deform
- moved cached DerivedMesh to Object, not Mesh... fixes heisenbugs
with linked objects
Diffstat (limited to 'source/blender/blenkernel/intern/lattice.c')
-rw-r--r-- | source/blender/blenkernel/intern/lattice.c | 124 |
1 files changed, 54 insertions, 70 deletions
diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c index 12a86dcc651..eff9d813afd 100644 --- a/source/blender/blenkernel/intern/lattice.c +++ b/source/blender/blenkernel/intern/lattice.c @@ -516,70 +516,79 @@ static void calc_curve_deform(Object *par, float *co, short axis, CurveDeform *c } -/* Mesh now applies on mesh itself, others do displist */ -int object_deform(Object *ob) +int mesh_deform(Object *ob, float (*vertexCos)[3]) { - Mesh *me; - Curve *cu; - DispList *dl; - MVert *mvert; - float *fp; - int a, tot, flag; + Mesh *me = ob->data; + int a; - if(ob->parent==NULL) return 0; + if(ob->parent==NULL || ob->type!=OB_MESH || !me->totvert) return 0; - /* always try to do the entire deform in this function: apply! */ - - if(ob->parent->type==OB_CURVE) { + if(ob->parent->type==OB_CURVE && ob->partype==PARSKEL) { + Curve *cu = ob->parent->data; + int flag = cu->flag; CurveDeform cd; - if (ob->partype != PARSKEL){ - return 0; - } - cu= ob->parent->data; - flag= cu->flag; cu->flag |= (CU_PATH|CU_FOLLOW); // needed for path & bevlist - - if(ob->type==OB_MESH) { - - me= ob->data; - if(me->totvert==0) return 0; - - /* init deform */ - init_curve_deform(ob->parent, ob, &cd); + + init_curve_deform(ob->parent, ob, &cd); /* transformation to curve space, and min max*/ - INIT_MINMAX(cd.dmin, cd.dmax); + INIT_MINMAX(cd.dmin, cd.dmax); - for(a=0, mvert=me->mvert; a<me->totvert; a++, mvert++) { - Mat4MulVecfl(cd.curvespace, mvert->co); - DO_MINMAX(mvert->co, cd.dmin, cd.dmax); - } + for(a=0; a<me->totvert; a++) { + Mat4MulVecfl(cd.curvespace, vertexCos[a]); + DO_MINMAX(vertexCos[a], cd.dmin, cd.dmax); + } - mvert= me->mvert; - for(a=0; a<me->totvert; a++, mvert++) { - calc_curve_deform(ob->parent, mvert->co, ob->trackflag, &cd); - /* move coord back to objectspace */ - Mat4MulVecfl(cd.objectspace, mvert->co); - } + for(a=0; a<me->totvert; a++) { + calc_curve_deform(ob->parent, vertexCos[a], ob->trackflag, &cd); + Mat4MulVecfl(cd.objectspace, vertexCos[a]); /* move coord back to objectspace */ } - /* restore */ + cu->flag = flag; + return 1; } else if(ob->parent->type==OB_LATTICE) { - init_latt_deform(ob->parent, ob); - if(ob->type==OB_MESH) { - me= ob->data; - - mvert= me->mvert; - for(a=0; a<me->totvert; a++, mvert++) { - calc_latt_deform(mvert->co); + for(a=0; a<me->totvert; a++) { + calc_latt_deform(vertexCos[a]); } } - else if(ob->type==OB_MBALL) { + end_latt_deform(); + + return 1; + } + else if(ob->parent->type==OB_ARMATURE && ob->partype==PARSKEL) { + if (ob->parent==G.obedit) // misleading making displists... very bad + return 1; + + init_armature_deform (ob->parent, ob); + + for(a=0; a<me->totvert; a++) { + calc_armature_deform(ob->parent, vertexCos[a], a); + } + + return 1; + } + + return 0; +} + +int object_deform(Object *ob) +{ + Curve *cu; + DispList *dl; + float *fp; + int a, tot; + + if(ob->parent==NULL) return 0; + + if(ob->parent->type==OB_LATTICE) { + init_latt_deform(ob->parent, ob); + + if(ob->type==OB_MBALL) { dl=ob->disp.first; while(dl) { fp = dl->verts; @@ -609,31 +618,6 @@ int object_deform(Object *ob) end_latt_deform(); return 1; } - else if(ob->parent->type==OB_ARMATURE) { - if (ob->partype != PARSKEL) - return 0; - - if (ob->parent==G.obedit) // misleading making displists... very bad - return 1; - - init_armature_deform (ob->parent, ob); - - switch (ob->type){ - case OB_MESH: - me= ob->data; - - mvert= me->mvert; - for(a=0; a<me->totvert; a++, mvert++) { - calc_armature_deform(ob->parent, mvert->co, a); - } - break; - case OB_CURVE: - case OB_SURF: - break; - } - - return 1; - } return 0; |