From 352eaccd5d991ad8966d686ae0954c7a0b03345c Mon Sep 17 00:00:00 2001 From: Benoit Bolsee Date: Mon, 27 Apr 2009 16:44:02 +0000 Subject: [PATCH] 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. --- source/blender/blenkernel/intern/bullet.c | 1 + source/blender/makesdna/DNA_object_force.h | 2 +- source/blender/src/buttons_logic.c | 20 +++++++++++++------ .../Converter/BL_BlenderDataConversion.cpp | 5 +++++ .../Ketsji/KX_ConvertPhysicsObject.h | 1 + .../Ketsji/KX_ConvertPhysicsObjects.cpp | 4 +++- source/gameengine/Ketsji/KX_GameObject.cpp | 8 ++++---- 7 files changed, 29 insertions(+), 12 deletions(-) diff --git a/source/blender/blenkernel/intern/bullet.c b/source/blender/blenkernel/intern/bullet.c index b389f8c0536..657507ee048 100644 --- a/source/blender/blenkernel/intern/bullet.c +++ b/source/blender/blenkernel/intern/bullet.c @@ -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; } diff --git a/source/blender/makesdna/DNA_object_force.h b/source/blender/makesdna/DNA_object_force.h index 49435000820..73dd8b28d15 100644 --- a/source/blender/makesdna/DNA_object_force.h +++ b/source/blender/makesdna/DNA_object_force.h @@ -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 */ diff --git a/source/blender/src/buttons_logic.c b/source/blender/src/buttons_logic.c index 0a7bbf656b3..8b6cc457994 100644 --- a/source/blender/src/buttons_logic.c +++ b/source/blender/src/buttons_logic.c @@ -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, diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp index 962af7cc4c9..b330515c0d3 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp +++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp @@ -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; } } diff --git a/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h b/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h index 3534500e619..40c715974f9 100644 --- a/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h +++ b/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h @@ -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 */ ///////////////////////// diff --git a/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp b/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp index be3b758a14b..1943c436258 100644 --- a/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp +++ b/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp @@ -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 diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp index 297d3048a3a..53c2d6c7937 100644 --- a/source/gameengine/Ketsji/KX_GameObject.cpp +++ b/source/gameengine/Ketsji/KX_GameObject.cpp @@ -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