From 5ac0d4fd26e9b670d83b8e9431707f9260c66bc6 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Tue, 28 Sep 2004 16:18:22 +0000 Subject: [PATCH] Cleaned the apply deform code in Blender. Now also using the modifier code. Right now, it works for Meshes (all deformers including Curve) and for Curve/Surfaces (only hooks). More follows. --- source/blender/blenkernel/BKE_lattice.h | 1 - source/blender/blenkernel/intern/deform.c | 15 +++++++--- source/blender/blenkernel/intern/lattice.c | 4 --- source/blender/include/BIF_editdeform.h | 2 ++ source/blender/include/BIF_editlattice.h | 1 - source/blender/src/editdeform.c | 33 ++++++++++++++++++++++ source/blender/src/editlattice.c | 27 ------------------ source/blender/src/editobject.c | 14 +++++---- source/blender/src/toolbox.c | 4 +-- 9 files changed, 56 insertions(+), 45 deletions(-) diff --git a/source/blender/blenkernel/BKE_lattice.h b/source/blender/blenkernel/BKE_lattice.h index a9a3ee2d6f9..9186850e583 100644 --- a/source/blender/blenkernel/BKE_lattice.h +++ b/source/blender/blenkernel/BKE_lattice.h @@ -51,7 +51,6 @@ void init_latt_deform(struct Object *oblatt, struct Object *ob); void calc_latt_deform(float *co); void end_latt_deform(void); int object_deform(struct Object *ob); -int object_apply_deform(struct Object *ob); struct BPoint *latt_bp(struct Lattice *lt, int u, int v, int w); void outside_lattice(struct Lattice *lt); diff --git a/source/blender/blenkernel/intern/deform.c b/source/blender/blenkernel/intern/deform.c index 290538013eb..8149d4540d8 100644 --- a/source/blender/blenkernel/intern/deform.c +++ b/source/blender/blenkernel/intern/deform.c @@ -199,7 +199,7 @@ void hook_object_deform(Object *ob, int index, float *vec) /* modifiers: hooks, deform, softbody - mode=='s' is start, 'e' end + mode=='s' is start, 'e' is end , 'a' is apply */ int mesh_modifier(Object *ob, char mode) @@ -258,13 +258,17 @@ int mesh_modifier(Object *ob, char mode) } } - else { // end + else if(mode=='e') { // end if(mvert) { - MEM_freeN(me->mvert); + if(me->mvert) MEM_freeN(me->mvert); me->mvert= mvert; mvert= NULL; } } + else if(mode=='a') { // apply + if(mvert) MEM_freeN(mvert); + mvert= NULL; + } return done; } @@ -327,11 +331,14 @@ int curve_modifier(Object *ob, char mode) } } } - else { + else if(mode=='e') { /* paste */ freeNurblist(&cu->nurb); cu->nurb= nurb; } + else if(mode=='a') { + freeNurblist(&nurb); + } return done; } diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c index 0516db04a63..074bd8f561b 100644 --- a/source/blender/blenkernel/intern/lattice.c +++ b/source/blender/blenkernel/intern/lattice.c @@ -663,10 +663,6 @@ int object_deform(Object *ob) { return _object_deform(ob, 0); } -int object_apply_deform(Object *ob) -{ - return _object_deform(ob, 1); -} BPoint *latt_bp(Lattice *lt, int u, int v, int w) diff --git a/source/blender/include/BIF_editdeform.h b/source/blender/include/BIF_editdeform.h index c45bdbccd24..3720e8e3d8a 100644 --- a/source/blender/include/BIF_editdeform.h +++ b/source/blender/include/BIF_editdeform.h @@ -61,5 +61,7 @@ void remove_vert_defgroup (struct Object *ob, struct bDeformGroup *dg, int vertnum); void create_dverts(Mesh *me); +extern void object_apply_deform(struct Object *ob); + #endif diff --git a/source/blender/include/BIF_editlattice.h b/source/blender/include/BIF_editlattice.h index 738eb14847c..c882013576d 100644 --- a/source/blender/include/BIF_editlattice.h +++ b/source/blender/include/BIF_editlattice.h @@ -33,7 +33,6 @@ #ifndef BIF_EDITLATTICE_H #define BIF_EDITLATTICE_H -void apply_lattice(void); void free_editLatt(void); void make_editLatt(void); void load_editLatt(void); diff --git a/source/blender/src/editdeform.c b/source/blender/src/editdeform.c index dfdfdf943cb..c42ea250f6d 100644 --- a/source/blender/src/editdeform.c +++ b/source/blender/src/editdeform.c @@ -29,12 +29,14 @@ * * ***** END GPL/BL DUAL LICENSE BLOCK ***** * Creator-specific support for vertex deformation groups + * Added: apply deform function (ton) */ #include #include "MEM_guardedalloc.h" +#include "DNA_curve_types.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" @@ -44,6 +46,7 @@ #include "BKE_global.h" #include "BKE_deform.h" +#include "BKE_displist.h" #include "BKE_mesh.h" #include "BIF_editdeform.h" @@ -645,3 +648,33 @@ void unique_vertexgroup_name (bDeformGroup *dg, Object *ob) } } } + +/* ******************* other deform edit stuff ********** */ + +void object_apply_deform(Object *ob) +{ + char *err= NULL; + + if(ob->type==OB_MESH) { + Mesh *me= ob->data; + if(me->id.us>1) { + err= "Can't apply deformation to Mesh with other users"; + } + mesh_modifier(ob, 's'); // start + mesh_modifier(ob, 'a'); // apply and end + freedisplist(&ob->disp); + } + else if (ob->type==OB_CURVE || ob->type==OB_SURF) { + Curve *cu= ob->data; + if(cu->id.us>1) { + err= "Can't apply deformation to Curve with other users"; + } + curve_modifier(ob, 's'); // start + curve_modifier(ob, 'a'); // apply and end + freedisplist(&ob->disp); + } + + if(err) error(err); + +} + diff --git a/source/blender/src/editlattice.c b/source/blender/src/editlattice.c index 8aebfdfedc5..18bed249da4 100644 --- a/source/blender/src/editlattice.c +++ b/source/blender/src/editlattice.c @@ -76,35 +76,8 @@ #include "BKE_armature.h" -void apply_lattice(void) -{ - Base *base; - Object *par; - - if(okee("Apply lattice deformation")==0) return; - - base= FIRSTBASE; - while(base) { - if TESTBASELIB(base) { - if( (par= base->object->parent) ) { - if(par->type==OB_LATTICE) { - object_apply_deform(base->object); - - base->object->parent= 0; - } - } - } - base= base->next; - } - - allqueue(REDRAWVIEW3D, 0); -} - /* ***************************** */ - - - void free_editLatt(void) { if(editLatt) { diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c index 27c562b3aa9..6b58e260e2d 100644 --- a/source/blender/src/editobject.c +++ b/source/blender/src/editobject.c @@ -812,9 +812,7 @@ void clear_parent(void) } if(par) { - if(par->type==OB_LATTICE) makeDispList(base->object); - if(par->type==OB_IKA) makeDispList(base->object); - if(par->type==OB_ARMATURE) makeDispList(base->object); + makeDispList(base->object); // just always..., checks are not available well (ton) } } base= base->next; @@ -2865,9 +2863,13 @@ void apply_object() if(ob==0) return; if(ob->transflag & OB_DUPLI) make_duplilist_real(); - else if(ob->parent && ob->parent->type==OB_LATTICE) apply_lattice(); - - return; + else { + if(okee("Apply deformation")==0) return; + object_apply_deform(ob); + allqueue(REDRAWVIEW3D, 0); + + return; + } } if(okee("Apply size and rotation")==0) return; diff --git a/source/blender/src/toolbox.c b/source/blender/src/toolbox.c index 646c1d5f431..bfa41163934 100644 --- a/source/blender/src/toolbox.c +++ b/source/blender/src/toolbox.c @@ -82,6 +82,7 @@ #include "BIF_toolbox.h" #include "BIF_mywindow.h" #include "BIF_editarmature.h" +#include "BIF_editdeform.h" #include "BIF_editfont.h" #include "BIF_editmesh.h" #include "BIF_editseq.h" @@ -1943,8 +1944,7 @@ static void tb_do_transform_clearapply(void *arg, int event) apply_object(); break; case 4: /* apply deformation */ - if (ob->parent && ob->parent->type==OB_LATTICE) apply_lattice(); - else error("The active object is not the child of a lattice"); + object_apply_deform(ob); break; case 5: /* make duplicates real */ if (ob->transflag & OB_DUPLI) make_duplilist_real();