forked from bartvdbraak/blender
BGE: Add soft body welding parameter to the Advanced Settings panel. The values are very small so I chose to use logarithmic scale. Should be fine, it's an advanced setting after all.
This commit is contained in:
parent
c56ee09c48
commit
352eaccd5d
@ -82,6 +82,7 @@ BulletSoftBody *bsbNew(void)
|
||||
bsb->collisionflags = 0;
|
||||
//bsb->collisionflags = OB_BSB_COL_CL_RS + OB_BSB_COL_CL_SS;
|
||||
bsb->numclusteriterations = 64;
|
||||
bsb->welding = -4.f;
|
||||
|
||||
return bsb;
|
||||
}
|
||||
|
@ -119,7 +119,7 @@ typedef struct BulletSoftBody {
|
||||
float kAHR; /* Anchors hardness [0,1] */
|
||||
int collisionflags; /* Vertex/Face or Signed Distance Field(SDF) or Clusters, Soft versus Soft or Rigid */
|
||||
int numclusteriterations; /* number of iterations to refine collision clusters*/
|
||||
|
||||
float welding; /* welding limit to remove duplicate/nearby vertices, 0.0000001..0.01 */
|
||||
} BulletSoftBody;
|
||||
|
||||
/* BulletSoftBody.flag */
|
||||
|
@ -3073,19 +3073,19 @@ static uiBlock *advanced_bullet_menu(void *arg_ob)
|
||||
{
|
||||
uiBlock *block;
|
||||
Object *ob = arg_ob;
|
||||
short yco = 20, xco = 0;
|
||||
short yco, xco = 0;
|
||||
|
||||
block= uiNewBlock(&curarea->uiblocks, "advanced_bullet_options", UI_EMBOSS, UI_HELV, curarea->win);
|
||||
/* use this for a fake extra empy space around the buttons */
|
||||
|
||||
|
||||
if (ob->gameflag & OB_SOFT_BODY) {
|
||||
uiDefBut(block, LABEL, 0, "", -10, -10, 380, 60, NULL, 0, 0, 0, 0, "");
|
||||
uiDefBut(block, LABEL, 0, "", -10, -10, 380, 80, NULL, 0, 0, 0, 0, "");
|
||||
|
||||
if (ob->bsoft)
|
||||
{
|
||||
|
||||
|
||||
yco = 40;
|
||||
uiBlockBeginAlign(block);
|
||||
uiDefButBitI(block, TOG, OB_BSB_COL_CL_RS, 0, "Cluster Collision RS",
|
||||
xco, yco, 180, 19, &ob->bsoft->collisionflags, 0, 0, 0, 0,
|
||||
@ -3102,6 +3102,14 @@ static uiBlock *advanced_bullet_menu(void *arg_ob)
|
||||
xco+=180, yco, 180, 19, &ob->bsoft->piterations, 0, 10,
|
||||
0, 0, "Position solver iterations");
|
||||
uiBlockEndAlign(block);
|
||||
yco -= 20;
|
||||
xco = 0;
|
||||
if (ob->bsoft->welding == 0.f)
|
||||
ob->bsoft->welding = -4.f;
|
||||
|
||||
uiDefButF(block, NUMSLI, 0, "Welding(10^) ",
|
||||
xco, yco, 360, 19, &ob->bsoft->welding, -7.f, -2.f, 10, 2,
|
||||
"Threshold to remove duplicate/nearby vertices. Displayed in logarithmic scale for readability: linear values from 0.0000001 to 0.01");
|
||||
|
||||
/*
|
||||
//too complex tweaking, disable for now
|
||||
@ -3131,7 +3139,7 @@ static uiBlock *advanced_bullet_menu(void *arg_ob)
|
||||
|
||||
if (ob->gameflag & OB_DYNAMIC) {
|
||||
|
||||
yco = 100;
|
||||
yco = 80;
|
||||
uiDefBut(block, LABEL, 0, "", -10, -10, 380, 120, NULL, 0, 0, 0, 0, "");
|
||||
uiBlockBeginAlign(block);
|
||||
if (ob->margin < 0.001f)
|
||||
@ -3173,7 +3181,7 @@ static uiBlock *advanced_bullet_menu(void *arg_ob)
|
||||
|
||||
uiBlockEndAlign(block);
|
||||
|
||||
uiDefBut(block, LABEL, 0, "Clamp Velocity (zero disables)", xco, yco, 180*2, 19, NULL, 0, 0, 0, 0, "");
|
||||
uiDefBut(block, LABEL, 0, "Clamp Velocity (0=disabled)", xco, yco, 180*2, 19, NULL, 0, 0, 0, 0, "");
|
||||
|
||||
uiBlockBeginAlign(block);
|
||||
|
||||
@ -3215,7 +3223,7 @@ static uiBlock *advanced_bullet_menu(void *arg_ob)
|
||||
|
||||
|
||||
} else {
|
||||
|
||||
yco = 20;
|
||||
uiDefBut(block, LABEL, 0, "", -10, -10, 380, 60, NULL, 0, 0, 0, 0, "");
|
||||
uiDefButF(block, NUM, 0, "Margin",
|
||||
xco, yco, 180, 19, &ob->margin, 0.0, 1.0, 1, 0,
|
||||
|
@ -1418,6 +1418,10 @@ void BL_CreatePhysicsObjectNew(KX_GameObject* gameobj,
|
||||
objprop.m_soft_kAHR= blenderobject->bsoft->kAHR; /* Anchors hardness [0,1] */
|
||||
objprop.m_soft_collisionflags= blenderobject->bsoft->collisionflags; /* Vertex/Face or Signed Distance Field(SDF) or Clusters, Soft versus Soft or Rigid */
|
||||
objprop.m_soft_numclusteriterations= blenderobject->bsoft->numclusteriterations; /* number of iterations to refine collision clusters*/
|
||||
if (blenderobject->bsoft->welding == 0.f)
|
||||
objprop.m_soft_welding = 0.0001f; /* welding */
|
||||
else
|
||||
objprop.m_soft_welding = pow(10.f,blenderobject->bsoft->welding); /* welding */
|
||||
|
||||
} else
|
||||
{
|
||||
@ -1457,6 +1461,7 @@ void BL_CreatePhysicsObjectNew(KX_GameObject* gameobj,
|
||||
objprop.m_soft_kAHR= 0.7f;
|
||||
objprop.m_soft_collisionflags= OB_BSB_COL_SDF_RS + OB_BSB_COL_VF_SS;
|
||||
objprop.m_soft_numclusteriterations= 16;
|
||||
objprop.m_soft_welding = 0.0001f;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -124,6 +124,7 @@ struct KX_ObjectProperties
|
||||
float m_soft_kAHR; /* Anchors hardness [0,1] */
|
||||
int m_soft_collisionflags; /* Vertex/Face or Signed Distance Field(SDF) or Clusters, Soft versus Soft or Rigid */
|
||||
int m_soft_numclusteriterations; /* number of iterations to refine collision clusters*/
|
||||
float m_soft_welding; /* threshold to remove duplicate/nearby vertices */
|
||||
|
||||
/////////////////////////
|
||||
|
||||
|
@ -905,7 +905,9 @@ void KX_ConvertBulletObject( class KX_GameObject* gameobj,
|
||||
|
||||
// Soft bodies require welding. Only avoid remove doubles for non-soft bodies!
|
||||
if (objprop->m_softbody)
|
||||
shapeInfo->setVertexWeldingThreshold1(0.0001f); //todo: expose this to the UI
|
||||
{
|
||||
shapeInfo->setVertexWeldingThreshold1(objprop->m_soft_welding); //todo: expose this to the UI
|
||||
}
|
||||
|
||||
bm = shapeInfo->CreateBulletShape();
|
||||
//no moving concave meshes, so don't bother calculating inertia
|
||||
|
@ -462,11 +462,11 @@ void KX_GameObject::RemoveMeshes()
|
||||
|
||||
void KX_GameObject::UpdateTransform()
|
||||
{
|
||||
if (m_pPhysicsController1)
|
||||
// only update the transform of static object, dynamic object are handled differently
|
||||
// note that for bullet, this does not even update the transform of static object
|
||||
// HACK: saves function call for dynamic object, they are handled differently
|
||||
if (m_pPhysicsController1 && !m_pPhysicsController1->IsDyna())
|
||||
// Note that for Bullet, this does not even update the transform of static object
|
||||
// but merely sets there collision flag to "kinematic" because the synchronization is
|
||||
// done differently during physics simulation
|
||||
// done during physics simulation
|
||||
m_pPhysicsController1->SetSumoTransform(true);
|
||||
if (m_pGraphicController)
|
||||
// update the culling tree
|
||||
|
Loading…
Reference in New Issue
Block a user