Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'extern/bullet2/src/BulletSoftBody')
-rw-r--r--extern/bullet2/src/BulletSoftBody/btSoftBody.cpp18
-rw-r--r--extern/bullet2/src/BulletSoftBody/btSoftBody.h2
-rw-r--r--extern/bullet2/src/BulletSoftBody/btSoftBodyHelpers.cpp6
-rw-r--r--extern/bullet2/src/BulletSoftBody/btSparseSDF.h17
4 files changed, 37 insertions, 6 deletions
diff --git a/extern/bullet2/src/BulletSoftBody/btSoftBody.cpp b/extern/bullet2/src/BulletSoftBody/btSoftBody.cpp
index e8c8fdb6402..9429d56e05a 100644
--- a/extern/bullet2/src/BulletSoftBody/btSoftBody.cpp
+++ b/extern/bullet2/src/BulletSoftBody/btSoftBody.cpp
@@ -1767,7 +1767,23 @@ void btSoftBody::predictMotion(btScalar dt)
{
Node& n=m_nodes[i];
n.m_q = n.m_x;
- n.m_v += n.m_f*n.m_im*m_sst.sdt;
+ btVector3 deltaV = n.m_f*n.m_im*m_sst.sdt;
+ {
+ btScalar maxDisplacement = m_worldInfo->m_maxDisplacement;
+ btScalar clampDeltaV = maxDisplacement/m_sst.sdt;
+ for (int c=0;c<3;c++)
+ {
+ if (deltaV[c]>clampDeltaV)
+ {
+ deltaV[c] = clampDeltaV;
+ }
+ if (deltaV[c]<-clampDeltaV)
+ {
+ deltaV[c]=-clampDeltaV;
+ }
+ }
+ }
+ n.m_v += deltaV;
n.m_x += n.m_v*m_sst.sdt;
n.m_f = btVector3(0,0,0);
}
diff --git a/extern/bullet2/src/BulletSoftBody/btSoftBody.h b/extern/bullet2/src/BulletSoftBody/btSoftBody.h
index 2116c34f06d..ee1a3d95228 100644
--- a/extern/bullet2/src/BulletSoftBody/btSoftBody.h
+++ b/extern/bullet2/src/BulletSoftBody/btSoftBody.h
@@ -45,6 +45,7 @@ struct btSoftBodyWorldInfo
btScalar air_density;
btScalar water_density;
btScalar water_offset;
+ btScalar m_maxDisplacement;
btVector3 water_normal;
btBroadphaseInterface* m_broadphase;
btDispatcher* m_dispatcher;
@@ -55,6 +56,7 @@ struct btSoftBodyWorldInfo
:air_density((btScalar)1.2),
water_density(0),
water_offset(0),
+ m_maxDisplacement(1000.f),//avoid soft body from 'exploding' so use some upper threshold of maximum motion that a node can travel per frame
water_normal(0,0,0),
m_broadphase(0),
m_dispatcher(0),
diff --git a/extern/bullet2/src/BulletSoftBody/btSoftBodyHelpers.cpp b/extern/bullet2/src/BulletSoftBody/btSoftBodyHelpers.cpp
index 0fb3560e94c..36f675a6c0c 100644
--- a/extern/bullet2/src/BulletSoftBody/btSoftBodyHelpers.cpp
+++ b/extern/bullet2/src/BulletSoftBody/btSoftBodyHelpers.cpp
@@ -911,9 +911,9 @@ btSoftBody* btSoftBodyHelpers::CreateFromConvexHull(btSoftBodyWorldInfo& worldI
&hres.m_OutputVertices[0],0);
for(int i=0;i<(int)hres.mNumFaces;++i)
{
- const int idx[]={ hres.m_Indices[i*3+0],
- hres.m_Indices[i*3+1],
- hres.m_Indices[i*3+2]};
+ const int idx[]={ static_cast<int>(hres.m_Indices[i*3+0]),
+ static_cast<int>(hres.m_Indices[i*3+1]),
+ static_cast<int>(hres.m_Indices[i*3+2])};
if(idx[0]<idx[1]) psb->appendLink( idx[0],idx[1]);
if(idx[1]<idx[2]) psb->appendLink( idx[1],idx[2]);
if(idx[2]<idx[0]) psb->appendLink( idx[2],idx[0]);
diff --git a/extern/bullet2/src/BulletSoftBody/btSparseSDF.h b/extern/bullet2/src/BulletSoftBody/btSparseSDF.h
index 180e3c218cc..bcf0c798253 100644
--- a/extern/bullet2/src/BulletSoftBody/btSparseSDF.h
+++ b/extern/bullet2/src/BulletSoftBody/btSparseSDF.h
@@ -69,6 +69,7 @@ struct btSparseSdf
btScalar voxelsz;
int puid;
int ncells;
+ int m_clampCells;
int nprobes;
int nqueries;
@@ -77,10 +78,13 @@ struct btSparseSdf
//
//
- void Initialize(int hashsize=2383)
+ void Initialize(int hashsize=2383, int clampCells = 256*1024)
{
+ //avoid a crash due to running out of memory, so clamp the maximum number of cells allocated
+ //if this limit is reached, the SDF is reset (at the cost of some performance during the reset)
+ m_clampCells = clampCells;
cells.resize(hashsize,0);
- Reset();
+ Reset();
}
//
void Reset()
@@ -181,6 +185,15 @@ struct btSparseSdf
{
++nprobes;
++ncells;
+ int sz = sizeof(Cell);
+ if (ncells>m_clampCells)
+ {
+ static int numResets=0;
+ numResets++;
+// printf("numResets=%d\n",numResets);
+ Reset();
+ }
+
c=new Cell();
c->next=root;root=c;
c->pclient=shape;