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