avoid a lot of dynamic allocations in btDbvt/btSoftBody (re-use stack)

add Maya 2009 to Dynamica msvc projectfiles
This commit is contained in:
erwin.coumans
2008-10-29 06:27:40 +00:00
parent 50930cec5c
commit 487cc1cdf1
5 changed files with 59 additions and 58 deletions

View File

@@ -51,7 +51,7 @@
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalOptions="/GR /GS /EHsc" AdditionalOptions="/GR /GS /EHsc"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories=".;"C:\Program Files\Autodesk\Maya2008\include";"C:\Program Files\Alias\Maya8.0\include";../../src;../../Extras\GIMPACT\include" AdditionalIncludeDirectories=".;"C:\Program Files\Autodesk\Maya2009\include";"C:\Program Files\Autodesk\Maya2008\include";"C:\Program Files\Alias\Maya8.0\include";../../src;../../Extras\GIMPACT\include"
PreprocessorDefinitions="_DEBUG;WIN32;_WINDOWS;NT_PLUGIN;REQUIRE_IOSTREAM" PreprocessorDefinitions="_DEBUG;WIN32;_WINDOWS;NT_PLUGIN;REQUIRE_IOSTREAM"
RuntimeLibrary="3" RuntimeLibrary="3"
AssemblerListingLocation=".\Debug/" AssemblerListingLocation=".\Debug/"
@@ -80,7 +80,7 @@
OutputFile="./BulletMayaPluginDebug.mll" OutputFile="./BulletMayaPluginDebug.mll"
LinkIncremental="2" LinkIncremental="2"
SuppressStartupBanner="true" SuppressStartupBanner="true"
AdditionalLibraryDirectories="..\..\lib;"C:\Program Files\Autodesk\Maya2008\lib";C:\develop\disney_bulletmaya\boost_1_35_0\lib;"C:\Program Files\Alias\Maya8.0\lib"" AdditionalLibraryDirectories="..\..\lib;"C:\Program Files\Autodesk\Maya2009\lib";"C:\Program Files\Autodesk\Maya2008\lib";C:\develop\disney_bulletmaya\boost_1_35_0\lib;"C:\Program Files\Alias\Maya8.0\lib""
GenerateDebugInformation="true" GenerateDebugInformation="true"
ProgramDatabaseFile=".\Debug/BulletMayaPlugin.pdb" ProgramDatabaseFile=".\Debug/BulletMayaPlugin.pdb"
SubSystem="2" SubSystem="2"
@@ -147,7 +147,7 @@
AdditionalOptions="/GR /GS /EHsc" AdditionalOptions="/GR /GS /EHsc"
Optimization="2" Optimization="2"
InlineFunctionExpansion="1" InlineFunctionExpansion="1"
AdditionalIncludeDirectories=".;"C:\Program Files\Autodesk\Maya2008\include";"C:\Program Files\Autodesk\Maya8.5\include";"C:\Program Files\Alias\Maya8.0\include";../../src;../../Extras\GIMPACT\include" AdditionalIncludeDirectories=".;"C:\Program Files\Autodesk\Maya2009\include";"C:\Program Files\Autodesk\Maya2008\include";"C:\Program Files\Autodesk\Maya8.5\include";"C:\Program Files\Alias\Maya8.0\include";../../src;../../Extras\GIMPACT\include"
PreprocessorDefinitions="NDEBUG;WIN32;_WINDOWS;NT_PLUGIN;REQUIRE_IOSTREAM" PreprocessorDefinitions="NDEBUG;WIN32;_WINDOWS;NT_PLUGIN;REQUIRE_IOSTREAM"
StringPooling="true" StringPooling="true"
RuntimeLibrary="2" RuntimeLibrary="2"
@@ -177,7 +177,7 @@
OutputFile=".\BulletMayaPlugin.mll" OutputFile=".\BulletMayaPlugin.mll"
LinkIncremental="1" LinkIncremental="1"
SuppressStartupBanner="true" SuppressStartupBanner="true"
AdditionalLibraryDirectories="..\..\lib;"C:\Program Files\Autodesk\Maya2008\lib";"C:\Program Files\Autodesk\Maya8.5\lib";"C:\Program Files\Alias\Maya8.0\lib";C:\develop\disney_bulletmaya\boost_1_35_0\lib;$(NOINHERIT)" AdditionalLibraryDirectories="..\..\lib;"C:\Program Files\Autodesk\Maya2009\lib";"C:\Program Files\Autodesk\Maya2008\lib";"C:\Program Files\Autodesk\Maya8.5\lib";"C:\Program Files\Alias\Maya8.0\lib";C:\develop\disney_bulletmaya\boost_1_35_0\lib;$(NOINHERIT)"
ProgramDatabaseFile=".\Release/BulletMayaPlugin.pdb" ProgramDatabaseFile=".\Release/BulletMayaPlugin.pdb"
SubSystem="2" SubSystem="2"
ImportLibrary=".\Release/BulletMayaPlugin.lib" ImportLibrary=".\Release/BulletMayaPlugin.lib"

View File

@@ -265,6 +265,8 @@ struct btDbvt
unsigned m_opath; unsigned m_opath;
mutable btAlignedObjectArray<const btDbvtNode*> m_stack; mutable btAlignedObjectArray<const btDbvtNode*> m_stack;
mutable btAlignedObjectArray<sStkNN> m_stkStack;
// Methods // Methods
btDbvt(); btDbvt();
@@ -299,22 +301,22 @@ struct btDbvt
static void enumLeaves( const btDbvtNode* root, static void enumLeaves( const btDbvtNode* root,
DBVT_IPOLICY); DBVT_IPOLICY);
DBVT_PREFIX DBVT_PREFIX
static void collideTT( const btDbvtNode* root0, void collideTT( const btDbvtNode* root0,
const btDbvtNode* root1, const btDbvtNode* root1,
DBVT_IPOLICY); DBVT_IPOLICY);
DBVT_PREFIX DBVT_PREFIX
static void collideTT( const btDbvtNode* root0, void collideTT( const btDbvtNode* root0,
const btDbvtNode* root1, const btDbvtNode* root1,
const btTransform& xform, const btTransform& xform,
DBVT_IPOLICY); DBVT_IPOLICY);
DBVT_PREFIX DBVT_PREFIX
static void collideTT( const btDbvtNode* root0, void collideTT( const btDbvtNode* root0,
const btTransform& xform0, const btTransform& xform0,
const btDbvtNode* root1, const btDbvtNode* root1,
const btTransform& xform1, const btTransform& xform1,
DBVT_IPOLICY); DBVT_IPOLICY);
DBVT_PREFIX DBVT_PREFIX
static void collideTV( const btDbvtNode* root, void collideTV( const btDbvtNode* root,
const btDbvtVolume& volume, const btDbvtVolume& volume,
DBVT_IPOLICY); DBVT_IPOLICY);
///rayTest is a re-entrant ray test, and can be called in parallel as long as the btAlignedAlloc is thread-safe (uses locking etc) ///rayTest is a re-entrant ray test, and can be called in parallel as long as the btAlignedAlloc is thread-safe (uses locking etc)
@@ -723,25 +725,24 @@ inline void btDbvt::collideTT( const btDbvtNode* root0,
DBVT_CHECKTYPE DBVT_CHECKTYPE
if(root0&&root1) if(root0&&root1)
{ {
btAlignedObjectArray<sStkNN> stack;
int depth=1; int depth=1;
int treshold=DOUBLE_STACKSIZE-4; int treshold=DOUBLE_STACKSIZE-4;
stack.resize(DOUBLE_STACKSIZE); m_stkStack.resize(DOUBLE_STACKSIZE);
stack[0]=sStkNN(root0,root1); m_stkStack[0]=sStkNN(root0,root1);
do { do {
sStkNN p=stack[--depth]; sStkNN p=m_stkStack[--depth];
if(depth>treshold) if(depth>treshold)
{ {
stack.resize(stack.size()*2); m_stkStack.resize(m_stkStack.size()*2);
treshold=stack.size()-4; treshold=m_stkStack.size()-4;
} }
if(p.a==p.b) if(p.a==p.b)
{ {
if(p.a->isinternal()) if(p.a->isinternal())
{ {
stack[depth++]=sStkNN(p.a->childs[0],p.a->childs[0]); m_stkStack[depth++]=sStkNN(p.a->childs[0],p.a->childs[0]);
stack[depth++]=sStkNN(p.a->childs[1],p.a->childs[1]); m_stkStack[depth++]=sStkNN(p.a->childs[1],p.a->childs[1]);
stack[depth++]=sStkNN(p.a->childs[0],p.a->childs[1]); m_stkStack[depth++]=sStkNN(p.a->childs[0],p.a->childs[1]);
} }
} }
else if(Intersect(p.a->volume,p.b->volume)) else if(Intersect(p.a->volume,p.b->volume))
@@ -750,23 +751,23 @@ inline void btDbvt::collideTT( const btDbvtNode* root0,
{ {
if(p.b->isinternal()) if(p.b->isinternal())
{ {
stack[depth++]=sStkNN(p.a->childs[0],p.b->childs[0]); m_stkStack[depth++]=sStkNN(p.a->childs[0],p.b->childs[0]);
stack[depth++]=sStkNN(p.a->childs[1],p.b->childs[0]); m_stkStack[depth++]=sStkNN(p.a->childs[1],p.b->childs[0]);
stack[depth++]=sStkNN(p.a->childs[0],p.b->childs[1]); m_stkStack[depth++]=sStkNN(p.a->childs[0],p.b->childs[1]);
stack[depth++]=sStkNN(p.a->childs[1],p.b->childs[1]); m_stkStack[depth++]=sStkNN(p.a->childs[1],p.b->childs[1]);
} }
else else
{ {
stack[depth++]=sStkNN(p.a->childs[0],p.b); m_stkStack[depth++]=sStkNN(p.a->childs[0],p.b);
stack[depth++]=sStkNN(p.a->childs[1],p.b); m_stkStack[depth++]=sStkNN(p.a->childs[1],p.b);
} }
} }
else else
{ {
if(p.b->isinternal()) if(p.b->isinternal())
{ {
stack[depth++]=sStkNN(p.a,p.b->childs[0]); m_stkStack[depth++]=sStkNN(p.a,p.b->childs[0]);
stack[depth++]=sStkNN(p.a,p.b->childs[1]); m_stkStack[depth++]=sStkNN(p.a,p.b->childs[1]);
} }
else else
{ {
@@ -788,41 +789,40 @@ inline void btDbvt::collideTT( const btDbvtNode* root0,
DBVT_CHECKTYPE DBVT_CHECKTYPE
if(root0&&root1) if(root0&&root1)
{ {
btAlignedObjectArray<sStkNN> stack;
int depth=1; int depth=1;
int treshold=DOUBLE_STACKSIZE-4; int treshold=DOUBLE_STACKSIZE-4;
stack.resize(DOUBLE_STACKSIZE); m_stkStack.resize(DOUBLE_STACKSIZE);
stack[0]=sStkNN(root0,root1); m_stkStack[0]=sStkNN(root0,root1);
do { do {
sStkNN p=stack[--depth]; sStkNN p=stack[--depth];
if(Intersect(p.a->volume,p.b->volume,xform)) if(Intersect(p.a->volume,p.b->volume,xform))
{ {
if(depth>treshold) if(depth>treshold)
{ {
stack.resize(stack.size()*2); m_stkStack.resize(stack.size()*2);
treshold=stack.size()-4; treshold=stack.size()-4;
} }
if(p.a->isinternal()) if(p.a->isinternal())
{ {
if(p.b->isinternal()) if(p.b->isinternal())
{ {
stack[depth++]=sStkNN(p.a->childs[0],p.b->childs[0]); m_stkStack[depth++]=sStkNN(p.a->childs[0],p.b->childs[0]);
stack[depth++]=sStkNN(p.a->childs[1],p.b->childs[0]); m_stkStack[depth++]=sStkNN(p.a->childs[1],p.b->childs[0]);
stack[depth++]=sStkNN(p.a->childs[0],p.b->childs[1]); m_stkStack[depth++]=sStkNN(p.a->childs[0],p.b->childs[1]);
stack[depth++]=sStkNN(p.a->childs[1],p.b->childs[1]); m_stkStack[depth++]=sStkNN(p.a->childs[1],p.b->childs[1]);
} }
else else
{ {
stack[depth++]=sStkNN(p.a->childs[0],p.b); m_stkStack[depth++]=sStkNN(p.a->childs[0],p.b);
stack[depth++]=sStkNN(p.a->childs[1],p.b); m_stkStack[depth++]=sStkNN(p.a->childs[1],p.b);
} }
} }
else else
{ {
if(p.b->isinternal()) if(p.b->isinternal())
{ {
stack[depth++]=sStkNN(p.a,p.b->childs[0]); m_stkStack[depth++]=sStkNN(p.a,p.b->childs[0]);
stack[depth++]=sStkNN(p.a,p.b->childs[1]); m_stkStack[depth++]=sStkNN(p.a,p.b->childs[1]);
} }
else else
{ {
@@ -856,25 +856,26 @@ inline void btDbvt::collideTV( const btDbvtNode* root,
if(root) if(root)
{ {
ATTRIBUTE_ALIGNED16(btDbvtVolume) volume(vol); ATTRIBUTE_ALIGNED16(btDbvtVolume) volume(vol);
btAlignedObjectArray<const btDbvtNode*> stack;
stack.reserve(SIMPLE_STACKSIZE); m_stack.resize(0);
stack.push_back(root); m_stack.reserve(SIMPLE_STACKSIZE);
m_stack.push_back(root);
do { do {
const btDbvtNode* n=stack[stack.size()-1]; const btDbvtNode* n=m_stack[m_stack.size()-1];
stack.pop_back(); m_stack.pop_back();
if(Intersect(n->volume,volume)) if(Intersect(n->volume,volume))
{ {
if(n->isinternal()) if(n->isinternal())
{ {
stack.push_back(n->childs[0]); m_stack.push_back(n->childs[0]);
stack.push_back(n->childs[1]); m_stack.push_back(n->childs[1]);
} }
else else
{ {
policy.Process(n); policy.Process(n);
} }
} }
} while(stack.size()>0); } while(m_stack.size()>0);
} }
} }

View File

@@ -182,8 +182,8 @@ btBroadphaseProxy* btDbvtBroadphase::createProxy( const btVector3& aabbMin,
{ {
btDbvtTreeCollider collider(this); btDbvtTreeCollider collider(this);
collider.proxy=proxy; collider.proxy=proxy;
btDbvt::collideTV(m_sets[0].m_root,aabb,collider); m_sets[0].collideTV(m_sets[0].m_root,aabb,collider);
btDbvt::collideTV(m_sets[1].m_root,aabb,collider); m_sets[1].collideTV(m_sets[1].m_root,aabb,collider);
} }
return(proxy); return(proxy);
} }
@@ -307,8 +307,8 @@ void btDbvtBroadphase::setAabb( btBroadphaseProxy* absproxy,
if(!m_deferedcollide) if(!m_deferedcollide)
{ {
btDbvtTreeCollider collider(this); btDbvtTreeCollider collider(this);
btDbvt::collideTT(m_sets[1].m_root,proxy->leaf,collider); m_sets[1].collideTT(m_sets[1].m_root,proxy->leaf,collider);
btDbvt::collideTT(m_sets[0].m_root,proxy->leaf,collider); m_sets[0].collideTT(m_sets[0].m_root,proxy->leaf,collider);
} }
} }
} }
@@ -382,12 +382,12 @@ void btDbvtBroadphase::collide(btDispatcher* dispatcher)
if(m_deferedcollide) if(m_deferedcollide)
{ {
SPC(m_profiling.m_fdcollide); SPC(m_profiling.m_fdcollide);
btDbvt::collideTT(m_sets[0].m_root,m_sets[1].m_root,collider); m_sets[0].collideTT(m_sets[0].m_root,m_sets[1].m_root,collider);
} }
if(m_deferedcollide) if(m_deferedcollide)
{ {
SPC(m_profiling.m_ddcollide); SPC(m_profiling.m_ddcollide);
btDbvt::collideTT(m_sets[0].m_root,m_sets[0].m_root,collider); m_sets[0].collideTT(m_sets[0].m_root,m_sets[0].m_root,collider);
} }
} }
/* clean up */ /* clean up */

View File

@@ -2584,7 +2584,7 @@ void btSoftBody::defaultCollisionHandler(btCollisionObject* pco)
docollide.prb = prb; docollide.prb = prb;
docollide.dynmargin = basemargin+timemargin; docollide.dynmargin = basemargin+timemargin;
docollide.stamargin = basemargin; docollide.stamargin = basemargin;
btDbvt::collideTV(m_ndbvt.m_root,volume,docollide); m_ndbvt.collideTV(m_ndbvt.m_root,volume,docollide);
} }
break; break;
case fCollision::CL_RS: case fCollision::CL_RS:
@@ -2617,13 +2617,13 @@ void btSoftBody::defaultCollisionHandler(btSoftBody* psb)
/* psb0 nodes vs psb1 faces */ /* psb0 nodes vs psb1 faces */
docollide.psb[0]=this; docollide.psb[0]=this;
docollide.psb[1]=psb; docollide.psb[1]=psb;
btDbvt::collideTT( docollide.psb[0]->m_ndbvt.m_root, docollide.psb[0]->m_ndbvt.collideTT( docollide.psb[0]->m_ndbvt.m_root,
docollide.psb[1]->m_fdbvt.m_root, docollide.psb[1]->m_fdbvt.m_root,
docollide); docollide);
/* psb1 nodes vs psb0 faces */ /* psb1 nodes vs psb0 faces */
docollide.psb[0]=psb; docollide.psb[0]=psb;
docollide.psb[1]=this; docollide.psb[1]=this;
btDbvt::collideTT( docollide.psb[0]->m_ndbvt.m_root, docollide.psb[0]->m_ndbvt.collideTT( docollide.psb[0]->m_ndbvt.m_root,
docollide.psb[1]->m_fdbvt.m_root, docollide.psb[1]->m_fdbvt.m_root,
docollide); docollide);
} }

View File

@@ -752,7 +752,7 @@ struct btSoftColliders
pr->getCollisionShape()->getAabb(pr->getInterpolationWorldTransform(),mins,maxs); pr->getCollisionShape()->getAabb(pr->getInterpolationWorldTransform(),mins,maxs);
volume=btDbvtVolume::FromMM(mins,maxs); volume=btDbvtVolume::FromMM(mins,maxs);
volume.Expand(btVector3(1,1,1)*margin); volume.Expand(btVector3(1,1,1)*margin);
btDbvt::collideTV(ps->m_cdbvt.m_root,volume,*this); ps->m_cdbvt.collideTV(ps->m_cdbvt.m_root,volume,*this);
} }
}; };
// //
@@ -789,7 +789,7 @@ struct btSoftColliders
friction = btMin(psa->m_cfg.kDF,psb->m_cfg.kDF); friction = btMin(psa->m_cfg.kDF,psb->m_cfg.kDF);
bodies[0] = psa; bodies[0] = psa;
bodies[1] = psb; bodies[1] = psb;
btDbvt::collideTT(psa->m_cdbvt.m_root,psb->m_cdbvt.m_root,*this); psa->m_cdbvt.collideTT(psa->m_cdbvt.m_root,psb->m_cdbvt.m_root,*this);
} }
}; };
// //