<div dir="ltr">this commit breaks blender building with scons and cmake.<br>Looks like bullets Extras/ConvexDecomposition is missing from blenders source.<br><br>this is the error when linking.<br><br>../../lib/libextern_bullet.a(btSoftBodyHelpers.cpp.o): In function `btSoftBodyHelpers::CreateFromConvexHull(btSoftBodyWorldInfo&, btVector3 const*, int)':<br>
/blender/blender/extern/bullet2/src/BulletSoftBody/btSoftBodyHelpers.cpp:637: undefined reference to `HullLibrary::CreateConvexHull(HullDesc const&, HullResult&)'<br>/blender/blender/extern/bullet2/src/BulletSoftBody/btSoftBodyHelpers.cpp:650: undefined reference to `HullLibrary::ReleaseResult(HullResult&)'<br>
../../lib/libextern_bullet.a(btSoftBodyHelpers.cpp.o): In function `btSoftBodyHelpers::Draw(btSoftBody*, btIDebugDraw*, int)':<br>/blender/blender/extern/bullet2/src/BulletSoftBody/btSoftBodyHelpers.cpp:281: undefined reference to `HullLibrary::CreateConvexHull(HullDesc const&, HullResult&)'<br>
/blender/blender/extern/bullet2/src/BulletSoftBody/btSoftBodyHelpers.cpp:294: undefined reference to `HullLibrary::ReleaseResult(HullResult&)'<br><br><br><div class="gmail_quote">On Wed, Sep 17, 2008 at 12:31 PM, Erwin Coumans <span dir="ltr"><<a href="mailto:blender@erwincoumans.com">blender@erwincoumans.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Revision: 16569<br>
<a href="http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16569" target="_blank">http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16569</a><br>
Author: erwin<br>
Date: 2008-09-17 04:30:19 +0200 (Wed, 17 Sep 2008)<br>
<br>
Log Message:<br>
-----------<br>
Applied some fixes from Bullet: issues with btDbvtBroadphase, and btSoftBody, and better fix for 64-bit issue in btCompoundCollisionAlgorithm.<br>
<br>
Modified Paths:<br>
--------------<br>
trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvt.h<br>
trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvtBroadphase.cpp<br>
trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvtBroadphase.h<br>
trunk/blender/extern/bullet2/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.cpp<br>
trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftBody.cpp<br>
trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftBody.h<br>
<br>
Modified: trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvt.h<br>
===================================================================<br>
--- trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvt.h 2008-09-17 01:49:47 UTC (rev 16568)<br>
+++ trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvt.h 2008-09-17 02:30:19 UTC (rev 16569)<br>
@@ -188,6 +188,7 @@<br>
union {<br>
btDbvtNode* childs[2];<br>
void* data;<br>
+ int dataAsInt;<br>
};<br>
};<br>
<br>
<br>
Modified: trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvtBroadphase.cpp<br>
===================================================================<br>
--- trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvtBroadphase.cpp 2008-09-17 01:49:47 UTC (rev 16568)<br>
+++ trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvtBroadphase.cpp 2008-09-17 02:30:19 UTC (rev 16569)<br>
@@ -20,17 +20,18 @@<br>
// Profiling<br>
//<br>
<br>
+#if DBVT_BP_PROFILE||DBVT_BP_ENABLE_BENCHMARK<br>
+#include <stdio.h><br>
+#endif<br>
+<br>
#if DBVT_BP_PROFILE<br>
-#include <stdio.h><br>
struct ProfileScope<br>
{<br>
- ProfileScope(btClock& clock,unsigned long& value)<br>
+ __forceinline ProfileScope(btClock& clock,unsigned long& value) :<br>
+ m_clock(&clock),m_value(&value),m_base(clock.getTimeMicroseconds())<br>
{<br>
- m_clock=&clock;<br>
- m_value=&value;<br>
- m_base=clock.getTimeMicroseconds();<br>
}<br>
- ~ProfileScope()<br>
+ __forceinline ~ProfileScope()<br>
{<br>
(*m_value)+=m_clock->getTimeMicroseconds()-m_base;<br>
}<br>
@@ -90,19 +91,25 @@<br>
struct btDbvtTreeCollider : btDbvt::ICollide<br>
{<br>
btDbvtBroadphase* pbp;<br>
+btDbvtProxy* proxy;<br>
btDbvtTreeCollider(btDbvtBroadphase* p) : pbp(p) {}<br>
void Process(const btDbvtNode* na,const btDbvtNode* nb)<br>
{<br>
- btDbvtProxy* pa=(btDbvtProxy*)na->data;<br>
- btDbvtProxy* pb=(btDbvtProxy*)nb->data;<br>
- #if DBVT_BP_DISCRETPAIRS<br>
- if(Intersect(pa->aabb,pb->aabb))<br>
- #endif<br>
+ if(na!=nb)<br>
{<br>
+ btDbvtProxy* pa=(btDbvtProxy*)na->data;<br>
+ btDbvtProxy* pb=(btDbvtProxy*)nb->data;<br>
+ #if DBVT_BP_SORTPAIRS<br>
if(pa>pb) btSwap(pa,pb);<br>
+ #endif<br>
pbp->m_paircache->addOverlappingPair(pa,pb);<br>
+ ++pbp->m_newpairs;<br>
}<br>
}<br>
+void Process(const btDbvtNode* n)<br>
+ {<br>
+ Process(n,proxy->leaf);<br>
+ }<br>
};<br>
<br>
//<br>
@@ -112,16 +119,25 @@<br>
//<br>
btDbvtBroadphase::btDbvtBroadphase(btOverlappingPairCache* paircache)<br>
{<br>
+m_deferedcollide = false;<br>
+m_needcleanup = true;<br>
m_releasepaircache = (paircache!=0)?false:true;<br>
-m_predictedframes = 2;<br>
+m_prediction = 1/(btScalar)2;<br>
m_stageCurrent = 0;<br>
+m_fixedleft = 0;<br>
m_fupdates = 1;<br>
-m_dupdates = 1;<br>
+m_dupdates = 0;<br>
+m_cupdates = 10;<br>
+m_newpairs = 1;<br>
+m_updates_call = 0;<br>
+m_updates_done = 0;<br>
+m_updates_ratio = 0;<br>
m_paircache = paircache?<br>
- paircache :<br>
- new(btAlignedAlloc(sizeof(btHashedOverlappingPairCache),16)) btHashedOverlappingPairCache();<br>
+ paircache :<br>
+ new(btAlignedAlloc(sizeof(btHashedOverlappingPairCache),16)) btHashedOverlappingPairCache();<br>
m_gid = 0;<br>
m_pid = 0;<br>
+m_cid = 0;<br>
for(int i=0;i<=STAGECOUNT;++i)<br>
{<br>
m_stageRoots[i]=0;<br>
@@ -148,17 +164,23 @@<br>
void* userPtr,<br>
short int collisionFilterGroup,<br>
short int collisionFilterMask,<br>
- btDispatcher* /*dispatcher*/,<br>
+ btDispatcher* dispatcher,<br>
void* /*multiSapProxy*/)<br>
{<br>
-btDbvtProxy* proxy=new(btAlignedAlloc(sizeof(btDbvtProxy),16)) btDbvtProxy( userPtr,<br>
- collisionFilterGroup,<br>
- collisionFilterMask);<br>
+btDbvtProxy* proxy=new(btAlignedAlloc(sizeof(btDbvtProxy),16)) btDbvtProxy( userPtr,<br>
+ collisionFilterGroup,<br>
+ collisionFilterMask);<br>
proxy->aabb = btDbvtVolume::FromMM(aabbMin,aabbMax);<br>
-proxy->leaf = m_sets[0].insert(proxy->aabb,proxy);<br>
proxy->stage = m_stageCurrent;<br>
proxy->m_uniqueId = ++m_gid;<br>
+proxy->leaf = m_sets[0].insert(proxy->aabb,proxy);<br>
listappend(proxy,m_stageRoots[m_stageCurrent]);<br>
+if(!m_deferedcollide)<br>
+ {<br>
+ btDbvtTreeCollider collider(this);<br>
+ collider.proxy=proxy;<br>
+ btDbvt::collideTV(m_sets[0].m_root,proxy->aabb,collider);<br>
+ }<br>
return(proxy);<br>
}<br>
<br>
@@ -174,6 +196,7 @@<br>
listremove(proxy,m_stageRoots[proxy->stage]);<br>
m_paircache->removeOverlappingPairsContainingProxy(proxy,dispatcher);<br>
btAlignedFree(proxy);<br>
+m_needcleanup=true;<br>
}<br>
<br>
//<br>
@@ -182,35 +205,62 @@<br>
const btVector3& aabbMax,<br>
btDispatcher* /*dispatcher*/)<br>
{<br>
-btDbvtProxy* proxy=(btDbvtProxy*)absproxy;<br>
-btDbvtVolume aabb=btDbvtVolume::FromMM(aabbMin,aabbMax);<br>
+btDbvtProxy* proxy=(btDbvtProxy*)absproxy;<br>
+ATTRIBUTE_ALIGNED16(btDbvtVolume) aabb=btDbvtVolume::FromMM(aabbMin,aabbMax);<br>
+#if DBVT_BP_PREVENTFALSEUPDATE<br>
if(NotEqual(aabb,proxy->leaf->volume))<br>
+#endif<br>
{<br>
+ bool docollide=false;<br>
if(proxy->stage==STAGECOUNT)<br>
{/* fixed -> dynamic set */<br>
m_sets[1].remove(proxy->leaf);<br>
proxy->leaf=m_sets[0].insert(aabb,proxy);<br>
+ docollide=true;<br>
}<br>
else<br>
{/* dynamic set */<br>
+ ++m_updates_call;<br>
if(Intersect(proxy->leaf->volume,aabb))<br>
{/* Moving */<br>
- const btVector3 delta=(aabbMin+aabbMax)/2-proxy->aabb.Center();<br>
- #ifdef DBVT_BP_MARGIN<br>
- m_sets[0].update(proxy->leaf,aabb,delta*m_predictedframes,DBVT_BP_MARGIN);<br>
- #else<br>
- m_sets[0].update(proxy->leaf,aabb,delta*m_predictedframes);<br>
- #endif<br>
+ const btVector3 delta=aabbMin-proxy->aabb.Mins();<br>
+ btVector3 velocity(aabb.Extents()*m_prediction);<br>
+ if(delta[0]<0) velocity[0]=-velocity[0];<br>
+ if(delta[1]<0) velocity[1]=-velocity[1];<br>
+ if(delta[2]<0) velocity[2]=-velocity[2];<br>
+ if (<br>
+ #ifdef DBVT_BP_MARGIN<br>
+ m_sets[0].update(proxy->leaf,aabb,velocity,DBVT_BP_MARGIN)<br>
+ #else<br>
+ m_sets[0].update(proxy->leaf,aabb,velocity)<br>
+ #endif<br>
+ )<br>
+ {<br>
+ ++m_updates_done;<br>
+ docollide=true;<br>
+ }<br>
}<br>
else<br>
{/* Teleporting */<br>
- m_sets[0].update(proxy->leaf,aabb);<br>
+ m_sets[0].update(proxy->leaf,aabb);<br>
+ ++m_updates_done;<br>
+ docollide=true;<br>
}<br>
}<br>
listremove(proxy,m_stageRoots[proxy->stage]);<br>
proxy->aabb = aabb;<br>
proxy->stage = m_stageCurrent;<br>
listappend(proxy,m_stageRoots[m_stageCurrent]);<br>
+ if(docollide)<br>
+ {<br>
+ m_needcleanup=true;<br>
+ if(!m_deferedcollide)<br>
+ {<br>
+ btDbvtTreeCollider collider(this);<br>
+ btDbvt::collideTT(m_sets[1].m_root,proxy->leaf,collider);<br>
+ btDbvt::collideTT(m_sets[0].m_root,proxy->leaf,collider);<br>
+ }<br>
+ }<br>
}<br>
}<br>
<br>
@@ -245,7 +295,12 @@<br>
SPC(m_profiling.m_total);<br>
/* optimize */<br>
m_sets[0].optimizeIncremental(1+(m_sets[0].m_leaves*m_dupdates)/100);<br>
-m_sets[1].optimizeIncremental(1+(m_sets[1].m_leaves*m_fupdates)/100);<br>
+if(m_fixedleft)<br>
+ {<br>
+ const int count=1+(m_sets[1].m_leaves*m_fupdates)/100;<br>
+ m_sets[1].optimizeIncremental(1+(m_sets[1].m_leaves*m_fupdates)/100);<br>
+ m_fixedleft=btMax<int>(0,m_fixedleft-count);<br>
+ }<br>
/* dynamic -> fixed set */<br>
m_stageCurrent=(m_stageCurrent+1)%STAGECOUNT;<br>
btDbvtProxy* current=m_stageRoots[m_stageCurrent];<br>
@@ -256,46 +311,69 @@<br>
btDbvtProxy* next=current->links[1];<br>
listremove(current,m_stageRoots[current->stage]);<br>
listappend(current,m_stageRoots[STAGECOUNT]);<br>
- btDbvt::collideTT(m_sets[1].m_root,current->leaf,collider);<br>
+ #if DBVT_BP_ACCURATESLEEPING<br>
+ m_paircache->removeOverlappingPairsContainingProxy(current,dispatcher);<br>
+ collider.proxy=current;<br>
+ btDbvt::collideTV(m_sets[0].m_root,current->aabb,collider);<br>
+ btDbvt::collideTV(m_sets[1].m_root,current->aabb,collider);<br>
+ #endif<br>
m_sets[0].remove(current->leaf);<br>
current->leaf = m_sets[1].insert(current->aabb,current);<br>
current->stage = STAGECOUNT;<br>
current = next;<br>
} while(current);<br>
+ m_fixedleft=m_sets[1].m_leaves;<br>
+ m_needcleanup=true;<br>
}<br>
/* collide dynamics */<br>
{<br>
btDbvtTreeCollider collider(this);<br>
+ if(m_deferedcollide)<br>
{<br>
SPC(m_profiling.m_fdcollide);<br>
btDbvt::collideTT(m_sets[0].m_root,m_sets[1].m_root,collider);<br>
}<br>
+ if(m_deferedcollide)<br>
{<br>
SPC(m_profiling.m_ddcollide);<br>
btDbvt::collideTT(m_sets[0].m_root,m_sets[0].m_root,collider);<br>
}<br>
}<br>
/* clean up */<br>
+if(m_needcleanup)<br>
{<br>
SPC(m_profiling.m_cleanup);<br>
btBroadphasePairArray& pairs=m_paircache->getOverlappingPairArray();<br>
if(pairs.size()>0)<br>
{<br>
- for(int i=0,ni=pairs.size();i<ni;++i)<br>
+ const int ci=pairs.size();<br>
+ int ni=btMin(ci,btMax<int>(m_newpairs,(ci*m_cupdates)/100));<br>
+ for(int i=0;i<ni;++i)<br>
{<br>
- btBroadphasePair& p=pairs[i];<br>
- btDbvtProxy* pa=(btDbvtProxy*)p.m_pProxy0;<br>
- btDbvtProxy* pb=(btDbvtProxy*)p.m_pProxy1;<br>
- if(!Intersect(pa->aabb,pb->aabb))<br>
+ btBroadphasePair& p=pairs[(m_cid+i)%ci];<br>
+ btDbvtProxy* pa=(btDbvtProxy*)p.m_pProxy0;<br>
+ btDbvtProxy* pb=(btDbvtProxy*)p.m_pProxy1;<br>
+ if(!Intersect(pa->leaf->volume,pb->leaf->volume))<br>
{<br>
+ #if DBVT_BP_SORTPAIRS<br>
if(pa>pb) btSwap(pa,pb);<br>
+ #endif<br>
m_paircache->removeOverlappingPair(pa,pb,dispatcher);<br>
--ni;--i;<br>
}<br>
}<br>
+ if(pairs.size()>0) m_cid=(m_cid+ni)%pairs.size(); else m_cid=0;<br>
}<br>
}<br>
++m_pid;<br>
+m_newpairs=1;<br>
+m_needcleanup=false;<br>
+if(m_updates_call>0)<br>
+ { m_updates_ratio=m_updates_done/(btScalar)m_updates_call; }<br>
+ else<br>
+ { m_updates_ratio=0; }<br>
+m_updates_done/=2;<br>
+m_updates_call/=2;<br>
}<br>
<br>
//<br>
@@ -339,6 +417,131 @@<br>
void btDbvtBroadphase::printStats()<br>
{}<br>
<br>
+//<br>
+#if DBVT_BP_ENABLE_BENCHMARK<br>
+<br>
+struct btBroadphaseBenchmark<br>
+ {<br>
+ struct Experiment<br>
+ {<br>
+ const char* name;<br>
+ int object_count;<br>
+ int update_count;<br>
+ int spawn_count;<br>
+ int iterations;<br>
+ btScalar speed;<br>
+ btScalar amplitude;<br>
+ };<br>
+ struct Object<br>
+ {<br>
+ btVector3 center;<br>
+ btVector3 extents;<br>
+ btBroadphaseProxy* proxy;<br>
+ btScalar time;<br>
+ void update(btScalar speed,btScalar amplitude,btBroadphaseInterface* pbi)<br>
+ {<br>
+ time += speed;<br>
+ center[0] = btCos(time*(btScalar)2.17)*amplitude+<br>
+ btSin(time)*amplitude/2;<br>
+ center[1] = btCos(time*(btScalar)1.38)*amplitude+<br>
+ btSin(time)*amplitude;<br>
+ center[2] = btSin(time*(btScalar)0.777)*amplitude;<br>
+ pbi->setAabb(proxy,center-extents,center+extents,0);<br>
+ }<br>
+ };<br>
+ static int UnsignedRand(int range=RAND_MAX-1) { return(rand()%(range+1)); }<br>
+ static btScalar UnitRand() { return(UnsignedRand(16384)/(btScalar)16384); }<br>
+ static void OutputTime(const char* name,btClock& c,unsigned count=0)<br>
+ {<br>
+ const unsigned long us=c.getTimeMicroseconds();<br>
+ const unsigned long ms=(us+500)/1000;<br>
+ const btScalar sec=us/(btScalar)(1000*1000);<br>
+ if(count>0)<br>
+ printf("%s : %u us (%u ms), %.2f/s\r\n",name,us,ms,count/sec);<br>
+ else<br>
+ printf("%s : %u us (%u ms)\r\n",name,us,ms);<br>
+ }<br>
+ };<br>
+<br>
<br>
@@ Diff output truncated at 10240 characters. @@<br>
<br>
_______________________________________________<br>
Bf-blender-cvs mailing list<br>
<a href="mailto:Bf-blender-cvs@blender.org">Bf-blender-cvs@blender.org</a><br>
<a href="http://lists.blender.org/mailman/listinfo/bf-blender-cvs" target="_blank">http://lists.blender.org/mailman/listinfo/bf-blender-cvs</a><br>
</blockquote></div><br><br clear="all"><br>-- <br>- Campbell<br>
</div>