From 02e838c99bd967e17872f048ffa81a6e41c89cb4 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Sat, 6 Nov 2004 21:59:35 +0000 Subject: [PATCH] - Pending Hook work; falloff value for soft hook deformation. Falloff= distance where influence becomes zero. --- source/blender/blenkernel/intern/deform.c | 21 +++++++++++++++------ source/blender/blenkernel/intern/displist.c | 1 + source/blender/makesdna/DNA_object_types.h | 2 +- source/blender/src/buttons_object.c | 19 ++++++++++++------- source/blender/src/drawobject.c | 7 ++++--- 5 files changed, 33 insertions(+), 17 deletions(-) diff --git a/source/blender/blenkernel/intern/deform.c b/source/blender/blenkernel/intern/deform.c index fbf13cba810..bf64c1451aa 100644 --- a/source/blender/blenkernel/intern/deform.c +++ b/source/blender/blenkernel/intern/deform.c @@ -36,6 +36,7 @@ */ #include +#include #include "MEM_guardedalloc.h" @@ -178,14 +179,21 @@ void hook_object_deform(Object *ob, int index, float *vec) } if( hook->indexar[hook->curindex]==index ) { - float fac= hook->force; - - totforce+= fac; + float fac= hook->force, len; VecMat4MulVecfl(vect, hook->mat, vec); - vectot[0]+= fac*vect[0]; - vectot[1]+= fac*vect[1]; - vectot[2]+= fac*vect[2]; + + if(hook->falloff!=0.0) { + len= VecLenf(vect, hook->parent->obmat[3]); + if(len > hook->falloff) fac= 0.0; + else if(len>0.0) fac*= sqrt(1.0 - len/hook->falloff); + } + if(fac!=0.0) { + totforce+= fac; + vectot[0]+= fac*vect[0]; + vectot[1]+= fac*vect[1]; + vectot[2]+= fac*vect[2]; + } } } } @@ -256,6 +264,7 @@ int mesh_modifier(Object *ob, char mode) float *fp; if(dl->verts) MEM_freeN(dl->verts); + if(dl->nors) MEM_freeN(dl->nors); dl->nr= me->totvert; if(dl->nr) { diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index 876d5c52d3c..eabe3e80b3f 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -817,6 +817,7 @@ void addnormalsDispList(Object *ob, ListBase *lb) dl->nr= me->totface; BLI_addtail(&me->disp, dl); } + else return; if(dl->nors==0) { dl->nors= MEM_mallocN(sizeof(float)*3*me->totface, "meshnormals"); diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index 923e76f4153..95ca75bdb4a 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -210,7 +210,7 @@ typedef struct ObHook { float parentinv[4][4]; /* matrix making current transform unmodified */ float mat[4][4]; /* temp matrix while hooking */ float cent[3]; /* visualization of hook */ - int pad; + float falloff; /* if not zero, falloff is distance where influence zero */ char name[32]; diff --git a/source/blender/src/buttons_object.c b/source/blender/src/buttons_object.c index d6a4aab311f..8368937bd66 100644 --- a/source/blender/src/buttons_object.c +++ b/source/blender/src/buttons_object.c @@ -1063,7 +1063,8 @@ void object_panel_hooks(Object *ob) if(hook->active<1 || hook->active > tothook) hook->active= 1; active= hook->active; - uiDefButS(block, MENU, B_REDR, cp, 10,180,150,19, &hook->active, 0, 0, 0, 0, "Set active hook"); + uiBlockBeginAlign(block); + uiDefButS(block, MENU, B_REDR, cp, 10,180,150,19, &hook->active, 0, 0, 0, 0, "Set active hook"); MEM_freeN(cp); for(nr=1, hook= ob->hooks.first; hook; hook= hook->next, nr++) { @@ -1071,14 +1072,18 @@ void object_panel_hooks(Object *ob) } if(hook==NULL) printf("error in object_panel_hooks\n"); - uiBlockBeginAlign(block); - uiDefButC(block, TEX, B_REDR, "Name: ", 160,180,150,19, hook->name, 0, 32, 0, 0, "Set name of hook"); - uiDefIDPoinBut(block, test_obpoin_but, B_CLR_HOOK, "Parent:", 160, 160, 150, 19, &hook->parent, "Parent Object for hook, also recalculates and clears offset"); - uiDefButF(block, NUMSLI, B_MAKEDISP, "Force: ", 160,140,150,19, &hook->force, 0.0, 1.0, 100, 0, "Set force of hook"); + uiDefBut(block, TEX, B_REDR, "Name: ", 160,180,150,19, hook->name, 0, 31, 0, 0, "Set name of hook"); uiBlockBeginAlign(block); - uiDefBut(block, BUT, B_DEL_HOOK, "Delete", 10,100,150,19, NULL, 0.0, 0.0, 0, 0, "Delete hook"); - uiDefBut(block, BUT, B_CLR_HOOK, "Clear offset", 160,100,150,19, NULL, 0.0, 0.0, 0, 0, "Recalculate and clear offset (transform) of hook"); + uiDefButF(block, NUM, B_MAKEDISP, "Falloff: ", 160,140,150,19, &hook->falloff, 0.0, 100.0, 100, 0, "If not zero, the distance from hook where influence ends"); + uiDefButF(block, NUMSLI, B_MAKEDISP, "Force: ", 160,120,150,19, &hook->force, 0.0, 1.0, 100, 0, "Set relative force of hook"); + uiBlockEndAlign(block); + + uiDefIDPoinBut(block, test_obpoin_but, B_CLR_HOOK, "Parent:", 10, 120, 150, 19, &hook->parent, "Parent Object for hook, also recalculates and clears offset"); + + uiBlockBeginAlign(block); + uiDefBut(block, BUT, B_DEL_HOOK, "Delete", 10,80,150,19, NULL, 0.0, 0.0, 0, 0, "Delete hook"); + uiDefBut(block, BUT, B_CLR_HOOK, "Clear offset", 160,80,150,19, NULL, 0.0, 0.0, 0, 0, "Recalculate and clear offset (transform) of hook"); } diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c index 4a5b54d25fc..84f2845ad00 100644 --- a/source/blender/src/drawobject.c +++ b/source/blender/src/drawobject.c @@ -2179,11 +2179,12 @@ static void drawDispList(Object *ob, int dt) if(dt==OB_SOLID ) { lb= &me->disp; - if(lb->first==0) addnormalsDispList(ob, lb); + if(lb->first==NULL) addnormalsDispList(ob, lb); dl= lb->first; - if(dl==0) return; - + if(dl==NULL) return; + if(dl->nors==NULL) addnormalsDispList(ob, lb); + if(mesh_uses_displist(me)) { int vertexpaint= (G.f & (G_VERTEXPAINT+G_FACESELECT+G_TEXTUREPAINT+G_WEIGHTPAINT)) && (ob==((G.scene->basact) ? (G.scene->basact->object) : 0));