|
|
@@ -39,11 +39,14 @@
|
|
|
|
|
|
#include <BulletCollision/BroadphaseCollision/btDbvtBroadphase.h>
|
|
|
#include <BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h>
|
|
|
+#include <BulletCollision/CollisionDispatch/btInternalEdgeUtility.h>
|
|
|
#include <BulletCollision/CollisionShapes/btBoxShape.h>
|
|
|
#include <BulletCollision/CollisionShapes/btSphereShape.h>
|
|
|
#include <BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h>
|
|
|
#include <BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h>
|
|
|
|
|
|
+extern ContactAddedCallback gContactAddedCallback;
|
|
|
+
|
|
|
namespace Urho3D
|
|
|
{
|
|
|
|
|
|
@@ -69,6 +72,16 @@ void InternalTickCallback(btDynamicsWorld *world, btScalar timeStep)
|
|
|
static_cast<PhysicsWorld*>(world->getWorldUserInfo())->PostStep(timeStep);
|
|
|
}
|
|
|
|
|
|
+static bool CustomMaterialCombinerCallback(btManifoldPoint& cp, const btCollisionObjectWrapper* colObj0Wrap, int partId0, int index0, const btCollisionObjectWrapper* colObj1Wrap, int partId1, int index1)
|
|
|
+{
|
|
|
+ btAdjustInternalEdgeContacts(cp, colObj1Wrap, colObj0Wrap, partId1, index1);
|
|
|
+
|
|
|
+ cp.m_combinedFriction = colObj0Wrap->getCollisionObject()->getFriction() * colObj1Wrap->getCollisionObject()->getFriction();
|
|
|
+ cp.m_combinedRestitution = colObj0Wrap->getCollisionObject()->getRestitution() * colObj1Wrap->getCollisionObject()->getRestitution();
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
/// Callback for physics world queries.
|
|
|
struct PhysicsQueryCallback : public btCollisionWorld::ContactResultCallback
|
|
|
{
|
|
|
@@ -110,6 +123,8 @@ PhysicsWorld::PhysicsWorld(Context* context) :
|
|
|
debugRenderer_(0),
|
|
|
debugMode_(btIDebugDraw::DBG_DrawWireframe | btIDebugDraw::DBG_DrawConstraints | btIDebugDraw::DBG_DrawConstraintLimits)
|
|
|
{
|
|
|
+ gContactAddedCallback = CustomMaterialCombinerCallback;
|
|
|
+
|
|
|
collisionConfiguration_ = new btDefaultCollisionConfiguration();
|
|
|
collisionDispatcher_ = new btCollisionDispatcher(collisionConfiguration_);
|
|
|
broadphase_ = new btDbvtBroadphase();
|