= Fix for softbody collision mode selector =

This commit makes all softbody collision modes work as they should.

Thanks to Genscher for noticing the issue.

bjornmose, please check this commit.
This commit is contained in:
Juho Vepsalainen 2007-11-16 12:23:00 +00:00
parent 6dbe745396
commit fd3764f9a4
3 changed files with 24 additions and 16 deletions

@ -782,21 +782,21 @@ static void calculate_collision_balls(Object *ob)
}
if (akku_count > 0) {
if (sb->sbc_mode == 0){
if (sb->sbc_mode == SBC_MODE_MANUAL){
bp->colball=sb->colball;
}
if (sb->sbc_mode == 1){
bp->colball = akku/(float)akku_count*sb->colball;
}
if (sb->colball == 2){
if (sb->sbc_mode == SBC_MODE_AVG){
bp->colball = akku/(float)akku_count*sb->colball;
}
if (sb->sbc_mode == SBC_MODE_MIN){
bp->colball=min*sb->colball;
}
if (sb->colball == 3){
}
if (sb->sbc_mode == SBC_MODE_MAX){
bp->colball=max*sb->colball;
}
if (sb->colball == 4){
bp->colball = (min + max)/2.0f*sb->colball;
}
}
if (sb->sbc_mode == SBC_MODE_AVGMINMAX){
bp->colball = (min + max)/2.0f*sb->colball;
}
}
else bp->colball=0;
}/*for bp*/

@ -143,9 +143,17 @@ typedef struct SoftBody {
#define OB_SB_EDGECOLL 2048
#define OB_SB_COLLFINAL 4096
/* sb->solverflags */
#define SBSO_MONITOR 1
#define SBSO_OLDERR 2
/* sb->sbc_mode */
#define SBC_MODE_MANUAL 0
#define SBC_MODE_AVG 1
#define SBC_MODE_MIN 2
#define SBC_MODE_MAX 3
#define SBC_MODE_AVGMINMAX 4
#ifdef __cplusplus
}
#endif

@ -2900,11 +2900,11 @@ static void object_softbodies_II(Object *ob)
uiDefButBitS(block, TOG, OB_SB_SELF, B_SOFTBODY_CHANGE, "Self Collision", 10,170,150,20, &ob->softflag, 0, 0, 0, 0, "enable naive vertex ball self collision");
if(ob->softflag & OB_SB_SELF){
uiDefButF(block, NUM, B_SOFTBODY_CHANGE, "Ball Size:", 160,170,150,20, &sb->colball, -10.0, 10.0, 10, 0, "Absolute ball size or factor if not manual adjusted");
uiDefButS(block, ROW, B_DIFF, "Man",10,150,60,20, &sb->sbc_mode, 4.0,(float)0, 0, 0, "Manual adjust");
uiDefButS(block, ROW, B_DIFF, "Av",70,150,60,20, &sb->sbc_mode, 4.0,(float)1, 0, 0, "Average Spring lenght * Ball Size");
uiDefButS(block, ROW, B_DIFF, "Min",130,150,60,20, &sb->sbc_mode, 4.0,(float)2, 0, 0, "Minimal Spring lenght * Ball Size");
uiDefButS(block, ROW, B_DIFF, "Max",190,150,60,20, &sb->sbc_mode, 4.0,(float)3, 0, 0, "Maximal Spring lenght * Ball Size");
uiDefButS(block, ROW, B_DIFF, "AvMiMa",250,150,60,20, &sb->sbc_mode, 4.0,(float)4, 0, 0, "(Min+Max)/2 * Ball Size");
uiDefButS(block, ROW, B_DIFF, "Man",10,150,60,20, &sb->sbc_mode, 4.0,SBC_MODE_MANUAL, 0, 0, "Manual adjust");
uiDefButS(block, ROW, B_DIFF, "Av",70,150,60,20, &sb->sbc_mode, 4.0,SBC_MODE_AVG, 0, 0, "Average Spring lenght * Ball Size");
uiDefButS(block, ROW, B_DIFF, "Min",130,150,60,20, &sb->sbc_mode, 4.0,SBC_MODE_MIN, 0, 0, "Minimal Spring lenght * Ball Size");
uiDefButS(block, ROW, B_DIFF, "Max",190,150,60,20, &sb->sbc_mode, 4.0,SBC_MODE_MAX, 0, 0, "Maximal Spring lenght * Ball Size");
uiDefButS(block, ROW, B_DIFF, "AvMiMa",250,150,60,20, &sb->sbc_mode, 4.0,SBC_MODE_AVGMINMAX, 0, 0, "(Min+Max)/2 * Ball Size");
uiDefButF(block, NUM, B_DIFF, "B Stiff:", 10,130,150,20, &sb->ballstiff, 0.001, 100.0, 10, 0, "Ball inflating presure");
uiDefButF(block, NUM, B_DIFF, "B Damp:", 160,130,150,20, &sb->balldamp, 0.001, 1.0, 10, 0, "Blending to inelastic collision");
}