Revision: 16274
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16274
Author: ben2610
Date: 2008-08-27 21:16:21 +0200 (Wed, 27 Aug 2008)
Log Message:
-----------
Bullet patch: option to return true face normal, complete triangle information
and broad phase filter. This patch is needed to support enhanced ray cast
function in the BGE. I have proposed it to the Bullet forum for inclusion in
the next Bullet version.
Modified Paths:
--------------
trunk/blender/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp
trunk/blender/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.h
trunk/blender/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp
trunk/blender/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h
Modified:
trunk/blender/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp
===================================================================
---
trunk/blender/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp
2008-08-27 19:12:08 UTC (rev 16273)
+++
trunk/blender/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp
2008-08-27 19:16:21 UTC (rev 16274)
@@ -181,7 +181,9 @@
btCollisionObject* collisionObject,
const btCollisionShape*
collisionShape,
const btTransform&
colObjWorldTransform,
- RayResultCallback&
resultCallback,short int collisionFilterMask)
+ RayResultCallback& resultCallback,
+ short int collisionFilterMask,
+ bool faceNormal)
{
btSphereShape pointShape(btScalar(0.0));
@@ -191,14 +193,16 @@
collisionObject,
collisionShape,
colObjWorldTransform,
- resultCallback,collisionFilterMask);
+
resultCallback,collisionFilterMask,faceNormal);
}
void btCollisionWorld::objectQuerySingle(const btConvexShape*
castShape,const btTransform& rayFromTrans,const btTransform& rayToTrans,
btCollisionObject* collisionObject,
const btCollisionShape*
collisionShape,
const btTransform&
colObjWorldTransform,
- RayResultCallback&
resultCallback,short int collisionFilterMask)
+ RayResultCallback& resultCallback,
+ short int collisionFilterMask,
+ bool faceNormal)
{
@@ -257,9 +261,9 @@
btCollisionObject*
m_collisionObject;
btTriangleMeshShape*
m_triangleMesh;
-
BridgeTriangleRaycastCallback( const btVector3& from,const btVector3& to,
-
btCollisionWorld::RayResultCallback* resultCallback, btCollisionObject*
collisionObject,btTriangleMeshShape* triangleMesh):
-
btTriangleRaycastCallback(from,to),
+
BridgeTriangleRaycastCallback( const btVector3& from,const btVector3& to,bool
faceNormal,
+
btCollisionWorld::RayResultCallback* resultCallback, btCollisionObject*
collisionObject,btTriangleMeshShape* triangleMesh):
+
btTriangleRaycastCallback(from,to,faceNormal),
m_resultCallback(resultCallback),
m_collisionObject(collisionObject),
m_triangleMesh(triangleMesh)
@@ -272,6 +276,7 @@
btCollisionWorld::LocalShapeInfo shapeInfo;
shapeInfo.m_shapePart = partId;
shapeInfo.m_triangleIndex = triangleIndex;
+
shapeInfo.m_triangleShape = m_triangleMesh;
btCollisionWorld::LocalRayResult rayResult
(m_collisionObject,
@@ -287,7 +292,7 @@
};
- BridgeTriangleRaycastCallback
rcb(rayFromLocal,rayToLocal,&resultCallback,collisionObject,triangleMesh);
+ BridgeTriangleRaycastCallback
rcb(rayFromLocal,rayToLocal,faceNormal,&resultCallback,collisionObject,triangleMesh);
rcb.m_hitFraction =
resultCallback.m_closestHitFraction;
btVector3 rayAabbMinLocal =
rayFromLocal;
@@ -313,7 +318,7 @@
collisionObject,
childCollisionShape,
childWorldTrans,
-
resultCallback, collisionFilterMask);
+
resultCallback, collisionFilterMask, faceNormal);
}
@@ -323,7 +328,7 @@
}
}
-void btCollisionWorld::rayTest(const btVector3& rayFromWorld, const
btVector3& rayToWorld, RayResultCallback& resultCallback,short int
collisionFilterMask)
+void btCollisionWorld::rayTest(const btVector3& rayFromWorld, const
btVector3& rayToWorld, RayResultCallback& resultCallback,short int
collisionFilterMask, bool faceNormal)
{
@@ -350,11 +355,17 @@
btVector3 hitNormal;
if
(btRayAabb(rayFromWorld,rayToWorld,collisionObjectAabbMin,collisionObjectAabbMax,hitLambda,hitNormal))
{
- rayTestSingle(rayFromTrans,rayToTrans,
- collisionObject,
-
collisionObject->getCollisionShape(),
-
collisionObject->getWorldTransform(),
- resultCallback);
+ // before testing this object, verify that it
is not filtered out
+ if (resultCallback.NeedRayCast(collisionObject))
+ {
+ rayTestSingle(rayFromTrans,rayToTrans,
+ collisionObject,
+
collisionObject->getCollisionShape(),
+
collisionObject->getWorldTransform(),
+ resultCallback,
+ collisionFilterMask,
+ faceNormal);
+ }
}
}
}
Modified:
trunk/blender/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.h
===================================================================
---
trunk/blender/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.h
2008-08-27 19:12:08 UTC (rev 16273)
+++
trunk/blender/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.h
2008-08-27 19:16:21 UTC (rev 16274)
@@ -125,8 +125,8 @@
{
int m_shapePart;
int m_triangleIndex;
-
- //const btCollisionShape* m_shapeTemp;
+ // needed in case of compound shape
+ const btCollisionShape* m_triangleShape;
//const btTransform* m_shapeLocalTransform;
};
@@ -166,6 +166,10 @@
:m_closestHitFraction(btScalar(1.))
{
}
+ virtual bool NeedRayCast(btCollisionObject* object)
+ {
+ return true;
+ }
virtual btScalar AddSingleResult(LocalRayResult&
rayResult) = 0;
};
@@ -209,7 +213,7 @@
/// rayTest performs a raycast on all objects in the btCollisionWorld,
and calls the resultCallback
/// This allows for several queries: first hit, all hits, any hit,
dependent on the value returned by the callback.
- void rayTest(const btVector3& rayFromWorld, const btVector3&
rayToWorld, RayResultCallback& resultCallback, short int
collisionFilterMask=-1);
+ void rayTest(const btVector3& rayFromWorld, const btVector3&
rayToWorld, RayResultCallback& resultCallback, short int
collisionFilterMask=-1, bool faceNormal=false);
/// rayTestSingle performs a raycast call and calls the resultCallback.
It is used internally by rayTest.
/// In a future implementation, we consider moving the ray test as a
virtual method in btCollisionShape.
@@ -218,14 +222,18 @@
btCollisionObject* collisionObject,
const btCollisionShape*
collisionShape,
const btTransform&
colObjWorldTransform,
- RayResultCallback& resultCallback,
short int collisionFilterMask=-1);
+ RayResultCallback& resultCallback,
+ short int collisionFilterMask=-1,
+ bool faceNormal=false);
/// objectQuerySingle performs a collision detection query and calls
the resultCallback. It is used internally by rayTest.
static void objectQuerySingle(const btConvexShape* castShape, const
btTransform& rayFromTrans,const btTransform& rayToTrans,
btCollisionObject* collisionObject,
const btCollisionShape*
collisionShape,
const btTransform&
colObjWorldTransform,
- RayResultCallback& resultCallback,
short int collisionFilterMask=-1);
+ RayResultCallback& resultCallback,
+ short int collisionFilterMask=-1,
+ bool faceNormal=false);
void addCollisionObject(btCollisionObject* collisionObject,short int
collisionFilterGroup=1,short int collisionFilterMask=1);
Modified:
trunk/blender/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp
===================================================================
---
trunk/blender/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp
2008-08-27 19:12:08 UTC (rev 16273)
+++
trunk/blender/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp
2008-08-27 19:16:21 UTC (rev 16274)
@@ -16,10 +16,11 @@
#include "btRaycastCallback.h"
-btTriangleRaycastCallback::btTriangleRaycastCallback(const btVector3&
from,const btVector3& to)
+btTriangleRaycastCallback::btTriangleRaycastCallback(const btVector3&
from,const btVector3& to,bool faceNormal)
:
m_from(from),
m_to(to),
+ m_faceNormal(faceNormal),
m_hitFraction(btScalar(1.))
{
@@ -84,8 +85,7 @@
if (
(btScalar)(cp2.dot(triangleNormal)) >=edge_tolerance)
{
-
- if ( dist_a > 0 )
+ if (m_faceNormal || dist_a > 0)
{
m_hitFraction =
reportHit(triangleNormal,distance,partId,triangleIndex);
}
Modified:
trunk/blender/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h
===================================================================
---
trunk/blender/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h
2008-08-27 19:12:08 UTC (rev 16273)
+++
trunk/blender/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h
2008-08-27 19:16:21 UTC (rev 16274)
@@ -27,10 +27,11 @@
//input
btVector3 m_from;
btVector3 m_to;
+ bool m_faceNormal;
btScalar m_hitFraction;
- btTriangleRaycastCallback(const btVector3& from,const btVector3& to);
+ btTriangleRaycastCallback(const btVector3& from,const btVector3&
to,bool faceNormal);
virtual void processTriangle(btVector3* triangle, int partId, int
triangleIndex);
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs