diff options
-rw-r--r-- | source/blender/blenkernel/BKE_lattice.h | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/anim.c | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/lattice.c | 46 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/modifier.c | 8 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/particle.c | 12 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/particle_system.c | 16 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/drawobject.c | 4 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_lattice_types.h | 4 | ||||
-rw-r--r-- | source/blender/render/intern/source/convertblender.c | 4 |
9 files changed, 57 insertions, 47 deletions
diff --git a/source/blender/blenkernel/BKE_lattice.h b/source/blender/blenkernel/BKE_lattice.h index 181c0cec45a..c0a6dc48d47 100644 --- a/source/blender/blenkernel/BKE_lattice.h +++ b/source/blender/blenkernel/BKE_lattice.h @@ -47,9 +47,11 @@ struct Lattice *copy_lattice(struct Lattice *lt); void free_lattice(struct Lattice *lt); void make_local_lattice(struct Lattice *lt); void calc_lat_fudu(int flag, int res, float *fu, float *du); + void init_latt_deform(struct Object *oblatt, struct Object *ob); -void calc_latt_deform(float *co, float weight); -void end_latt_deform(void); +void calc_latt_deform(struct Object *, float *co, float weight); +void end_latt_deform(struct Object *); + int object_deform_mball(struct Object *ob); void outside_lattice(struct Lattice *lt); diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c index 2845867b920..6a6d8c46f9e 100644 --- a/source/blender/blenkernel/intern/anim.c +++ b/source/blender/blenkernel/intern/anim.c @@ -946,8 +946,8 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p MEM_freeN(obcopylist); if(psys->lattice) { - end_latt_deform(); - psys->lattice = 0; + end_latt_deform(psys->lattice); + psys->lattice = NULL; } } diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c index 85256045d49..46e7022c718 100644 --- a/source/blender/blenkernel/intern/lattice.c +++ b/source/blender/blenkernel/intern/lattice.c @@ -74,7 +74,6 @@ //XXX #include "BIF_editdeform.h" Lattice *editLatt=0; -static float *latticedata=0, latmat[4][4]; void calc_lat_fudu(int flag, int res, float *fu, float *du) { @@ -303,23 +302,23 @@ void init_latt_deform(Object *oblatt, Object *ob) if(lt->editlatt) lt= lt->editlatt; bp = lt->def; - fp= latticedata= MEM_mallocN(sizeof(float)*3*lt->pntsu*lt->pntsv*lt->pntsw, "latticedata"); + fp= lt->latticedata= MEM_mallocN(sizeof(float)*3*lt->pntsu*lt->pntsv*lt->pntsw, "latticedata"); /* for example with a particle system: ob==0 */ - if(ob==0) { + if(ob==NULL) { /* in deformspace, calc matrix */ - Mat4Invert(latmat, oblatt->obmat); + Mat4Invert(lt->latmat, oblatt->obmat); /* back: put in deform array */ - Mat4Invert(imat, latmat); + Mat4Invert(imat, lt->latmat); } else { /* in deformspace, calc matrix */ Mat4Invert(imat, oblatt->obmat); - Mat4MulMat4(latmat, ob->obmat, imat); + Mat4MulMat4(lt->latmat, ob->obmat, imat); /* back: put in deform array */ - Mat4Invert(imat, latmat); + Mat4Invert(imat, lt->latmat); } for(w=0,fw=lt->fw; w<lt->pntsw; w++,fw+=lt->dw) { @@ -341,19 +340,20 @@ void init_latt_deform(Object *oblatt, Object *ob) } } -void calc_latt_deform(float *co, float weight) +void calc_latt_deform(Object *ob, float *co, float weight) { - Lattice *lt; + Lattice *lt= ob->data; float u, v, w, tu[4], tv[4], tw[4]; float *fpw, *fpv, *fpu, vec[3]; int ui, vi, wi, uu, vv, ww; - if(latticedata==0) return; + if(lt->editlatt) lt= lt->editlatt; + if(lt->latticedata==NULL) return; /* co is in local coords, treat with latmat */ VECCOPY(vec, co); - Mat4MulVecfl(latmat, vec); + Mat4MulVecfl(lt->latmat, vec); /* u v w coords */ @@ -395,10 +395,10 @@ void calc_latt_deform(float *co, float weight) if(w!=0.0) { if(ww>0) { - if(ww<lt->pntsw) fpw= latticedata + 3*ww*lt->pntsu*lt->pntsv; - else fpw= latticedata + 3*(lt->pntsw-1)*lt->pntsu*lt->pntsv; + if(ww<lt->pntsw) fpw= lt->latticedata + 3*ww*lt->pntsu*lt->pntsv; + else fpw= lt->latticedata + 3*(lt->pntsw-1)*lt->pntsu*lt->pntsv; } - else fpw= latticedata; + else fpw= lt->latticedata; for(vv= vi-1; vv<=vi+2; vv++) { v= w*tv[vv-vi+1]; @@ -431,11 +431,15 @@ void calc_latt_deform(float *co, float weight) } } -void end_latt_deform() +void end_latt_deform(Object *ob) { - - MEM_freeN(latticedata); - latticedata= 0; + Lattice *lt= ob->data; + + if(lt->editlatt) lt= lt->editlatt; + + if(lt->latticedata) + MEM_freeN(lt->latticedata); + lt->latticedata= NULL; } /* calculations is in local space of deformed object @@ -767,17 +771,17 @@ void lattice_deform_verts(Object *laOb, Object *target, DerivedMesh *dm, if(dm) dvert = dm->getVertData(dm, a, CD_MDEFORMVERT); for(j = 0; j < dvert->totweight; j++) { if (dvert->dw[j].def_nr == index) { - calc_latt_deform(vertexCos[a], dvert->dw[j].weight); + calc_latt_deform(laOb, vertexCos[a], dvert->dw[j].weight); } } } } } else { for(a = 0; a < numVerts; a++) { - calc_latt_deform(vertexCos[a], 1.0f); + calc_latt_deform(laOb, vertexCos[a], 1.0f); } } - end_latt_deform(); + end_latt_deform(laOb); } int object_deform_mball(Object *ob) diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index 069f909289d..56868be6358 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -6491,8 +6491,8 @@ static DerivedMesh * particleInstanceModifier_applyModifier( CDDM_calc_normals(result); if(psys->lattice){ - end_latt_deform(); - psys->lattice=0; + end_latt_deform(psys->lattice); + psys->lattice= NULL; } return result; @@ -7267,8 +7267,8 @@ static DerivedMesh * explodeModifier_explodeMesh(ExplodeModifierData *emd, CDDM_calc_normals(explode); if(psmd->psys->lattice){ - end_latt_deform(); - psmd->psys->lattice=0; + end_latt_deform(psmd->psys->lattice); + psmd->psys->lattice= NULL; } return explode; diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index ff4d934ab3d..783881f25bf 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -2584,7 +2584,7 @@ void psys_cache_paths(Scene *scene, Object *ob, ParticleSystem *psys, float cfra /* apply lattice */ if(psys->lattice && edit==0) - calc_latt_deform(ca->co, 1.0f); + calc_latt_deform(psys->lattice, ca->co, 1.0f); /* figure out rotation */ @@ -2664,8 +2664,8 @@ void psys_cache_paths(Scene *scene, Object *ob, ParticleSystem *psys, float cfra psys->totcached = totpart; if(psys && psys->lattice){ - end_latt_deform(); - psys->lattice=0; + end_latt_deform(psys->lattice); + psys->lattice= NULL; } if(vg_effector) @@ -3473,7 +3473,7 @@ void psys_get_particle_on_path(Scene *scene, Object *ob, ParticleSystem *psys, i } if(psys->lattice && edit==0) - calc_latt_deform(state->co,1.0f); + calc_latt_deform(psys->lattice, state->co,1.0f); } } } @@ -3696,7 +3696,7 @@ int psys_get_particle_state(struct Scene *scene, Object *ob, ParticleSystem *psy do_clump(state,key1,t,part->clumpfac,part->clumppow,1.0); if(psys->lattice) - calc_latt_deform(state->co,1.0f); + calc_latt_deform(psys->lattice, state->co,1.0f); } else{ if (pa) { /* TODO PARTICLE - should this ever be NULL? - Campbell */ @@ -3748,7 +3748,7 @@ int psys_get_particle_state(struct Scene *scene, Object *ob, ParticleSystem *psy } if(psys->lattice) - calc_latt_deform(state->co,1.0f); + calc_latt_deform(psys->lattice, state->co,1.0f); } } diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index 336b7037600..8fd12ea50d0 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -1495,8 +1495,8 @@ void psys_threads_free(ParticleThread *threads) MEM_freeN(ctx->vg_roughe); if(ctx->psys->lattice){ - end_latt_deform(); - ctx->psys->lattice=0; + end_latt_deform(ctx->psys->lattice); + ctx->psys->lattice= NULL; } /* distribution */ @@ -2629,8 +2629,8 @@ void do_effectors(int pa_no, ParticleData *pa, ParticleKey *state, Object *ob, P } if(epsys->lattice){ - end_latt_deform(); - epsys->lattice=0; + end_latt_deform(epsys->lattice); + epsys->lattice= NULL; } } } @@ -4254,8 +4254,8 @@ static void cached_step(Scene *scene, Object *ob, ParticleSystemModifierData *ps } if(psys->lattice){ - end_latt_deform(); - psys->lattice=0; + end_latt_deform(psys->lattice); + psys->lattice= NULL; } if(pa->r_rot[0] > disp) @@ -4630,8 +4630,8 @@ static void system_step(Scene *scene, Object *ob, ParticleSystem *psys, Particle if(vg_size) MEM_freeN(vg_size); if(psys->lattice){ - end_latt_deform(); - psys->lattice=0; + end_latt_deform(psys->lattice); + psys->lattice= NULL; } } diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index ccd6e52f577..dfb4e0dea55 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -3480,8 +3480,8 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, Base *base, Part psys->flag &= ~PSYS_DRAWING; if(psys->lattice){ - end_latt_deform(); - psys->lattice=0; + end_latt_deform(psys->lattice); + psys->lattice= NULL; } wmLoadMatrix(v3d->viewmat); diff --git a/source/blender/makesdna/DNA_lattice_types.h b/source/blender/makesdna/DNA_lattice_types.h index 3f45a3c1fb0..a2748617f18 100644 --- a/source/blender/makesdna/DNA_lattice_types.h +++ b/source/blender/makesdna/DNA_lattice_types.h @@ -53,6 +53,10 @@ typedef struct Lattice { struct MDeformVert *dvert; + /* used while deforming, always free and NULL after use */ + float *latticedata; + float latmat[4][4]; + struct Lattice *editlatt; } Lattice; diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 3149b711a27..4de6c770cdc 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -2043,8 +2043,8 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem psys->flag &= ~PSYS_DRAWING; if(psys->lattice){ - end_latt_deform(); - psys->lattice=0; + end_latt_deform(psys->lattice); + psys->lattice= NULL; } if(path && (ma->mode_l & MA_TANGENT_STR)==0) |