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/deform.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/deform.c')
-rw-r--r-- | source/blender/blenkernel/intern/deform.c | 48 |
1 files changed, 34 insertions, 14 deletions
diff --git a/source/blender/blenkernel/intern/deform.c b/source/blender/blenkernel/intern/deform.c index cb2d54ed5ba..55b49744fbc 100644 --- a/source/blender/blenkernel/intern/deform.c +++ b/source/blender/blenkernel/intern/deform.c @@ -227,14 +227,14 @@ void hook_object_deform(Object *ob, int index, float *vec) } -void mesh_modifier(Object *ob, MVert **mvert_r) +void mesh_modifier(Object *ob, float (**vertexCos_r)[3]) { MVert *origMVert=NULL; Mesh *me= ob->data; - MVert *mv; int a, done=0; + float (*vertexCos)[3]; - *mvert_r = NULL; + *vertexCos_r = NULL; do_mesh_key(me); @@ -248,8 +248,11 @@ void mesh_modifier(Object *ob, MVert **mvert_r) if(me->totvert==0) return; - origMVert= MEM_dupallocN(me->mvert); - + vertexCos = MEM_mallocN(sizeof(*vertexCos)*me->totvert, "vertexcos"); + for (a=0; a<me->totvert; a++) { + VECCOPY(vertexCos[a], me->mvert[a].co); + } + /* hooks */ if(ob->hooks.first) { done= 1; @@ -257,29 +260,46 @@ void mesh_modifier(Object *ob, MVert **mvert_r) /* NULL signals initialize */ hook_object_deform(ob, 0, NULL); - for(a=0, mv= me->mvert; a<me->totvert; a++, mv++) { - hook_object_deform(ob, a, mv->co); + for(a=0; a<me->totvert; a++) { + hook_object_deform(ob, a, vertexCos[a]); } } - if(ob->effect.first) done |= object_wave(ob); + if(ob->effect.first) { + WaveEff *wav; + float ctime = bsystem_time(ob, 0, (float)G.scene->r.cfra, 0.0); + int a; + + for (wav= ob->effect.first; wav; wav= wav->next) { + if(wav->type==EFF_WAVE) { + init_wave_deform(wav); + + for(a=0; a<me->totvert; a++) { + calc_wave_deform(wav, ctime, vertexCos[a]); + } + + done = 1; + } + } + } if((ob->softflag & OB_SB_ENABLE) && !(ob->softflag & OB_SB_POSTDEF)) { done= 1; - sbObjectStep(ob, (float)G.scene->r.cfra); + sbObjectStep(ob, (float)G.scene->r.cfra, vertexCos); } /* object_deform: output for mesh is in mesh->mvert */ - done |= object_deform(ob); + done |= mesh_deform(ob, vertexCos); if((ob->softflag & OB_SB_ENABLE) && (ob->softflag & OB_SB_POSTDEF)) { done= 1; - sbObjectStep(ob, (float)G.scene->r.cfra); + sbObjectStep(ob, (float)G.scene->r.cfra, vertexCos); } if (done) { - *mvert_r = me->mvert; - me->mvert = origMVert; + *vertexCos_r = vertexCos; + } else { + MEM_freeN(vertexCos_r); } } @@ -390,7 +410,7 @@ int lattice_modifier(Object *ob, char mode) } if((ob->softflag & OB_SB_ENABLE)) { - sbObjectStep(ob, (float)G.scene->r.cfra); + sbObjectStep(ob, (float)G.scene->r.cfra, NULL); } } |