public bool Callback(ref ManifoldPoint cp, CollisionObject colObj0, int partId0, int index0, CollisionObject colObj1, int partId1, int index1)
        {
            bool enable = true;
           	if (enable)
	        {
		        InternalEdgeUtility.AdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1,BulletXNA.BulletCollision.CollisionDispatch.InternalEdgeUtility.InternalEdgeAdjustFlags.BT_TRIANGLE_CONVEX_BACKFACE_NONE);
		        //btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1, BT_TRIANGLE_CONVEX_BACKFACE_MODE);
		        //btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1, BT_TRIANGLE_CONVEX_DOUBLE_SIDED+BT_TRIANGLE_CONCAVE_DOUBLE_SIDED);
	        }

	        float friction0 = colObj0.GetFriction();
	        float friction1 = colObj1.GetFriction();
	        float restitution0 = colObj0.GetRestitution();
	        float restitution1 = colObj1.GetRestitution();

	        if ((colObj0.GetCollisionFlags() & CollisionFlags.CF_CUSTOM_MATERIAL_CALLBACK) != 0)
	        {
		        friction0 = 1.0f;//partId0,index0
		        restitution0 = 0.0f;
	        }
	        if ((colObj1.GetCollisionFlags() & CollisionFlags.CF_CUSTOM_MATERIAL_CALLBACK) != 0)
	        {
		        if ((index1&1) != 0)
		        {
			        friction1 = 1.0f;//partId1,index1
		        } 
                else
		        {
			        friction1 = 0.0f;
		        }
		        restitution1 = 0.0f;
	        }

	        cp.m_combinedFriction = CalculateCombinedFriction(friction0,friction1);
	        cp.m_combinedRestitution = CalculateCombinedRestitution(restitution0,restitution1);

	        //this return value is currently ignored, but to be on the safe side: return false if you don't calculate friction
	        return true;
 
        }
Beispiel #2
0
    private static void RecordCollision(CollisionWorld world, CollisionObject objA, CollisionObject objB, IndexedVector3 contact, IndexedVector3 norm)
    {
       
        IndexedVector3 contactNormal = norm;
        if ((objA.GetCollisionFlags() & BulletXNA.BulletCollision.CollisionFlags.BS_WANTS_COLLISIONS) == 0 &&
            (objB.GetCollisionFlags() & BulletXNA.BulletCollision.CollisionFlags.BS_WANTS_COLLISIONS) == 0)
        {
            return;
        }
        uint idA = (uint)objA.GetUserPointer();
        uint idB = (uint)objB.GetUserPointer();
        if (idA > idB)
        {
            uint temp = idA;
            idA = idB;
            idB = temp;
            contactNormal = -contactNormal;
        }

        ulong collisionID = ((ulong) idA << 32) | idB;

        BulletXNA.CollisionDesc cDesc = new BulletXNA.CollisionDesc()
                                            {
                                                aID = idA,
                                                bID = idB,
                                                point = contact,
                                                normal = contactNormal
                                            };
        world.UpdatedCollisions.Add(cDesc);
        m_collisionsThisFrame++;


    }
Beispiel #3
0
    private static void RecordCollision(BSAPIXNA world, CollisionObject objA, CollisionObject objB, IndexedVector3 contact, IndexedVector3 norm, float penetration)
    {

        IndexedVector3 contactNormal = norm;
        if ((objA.GetCollisionFlags() & BulletXNA.BulletCollision.CollisionFlags.BS_WANTS_COLLISIONS) == 0 &&
            (objB.GetCollisionFlags() & BulletXNA.BulletCollision.CollisionFlags.BS_WANTS_COLLISIONS) == 0)
        {
            return;
        }
        uint idA = (uint)objA.GetUserPointer();
        uint idB = (uint)objB.GetUserPointer();
        if (idA > idB)
        {
            uint temp = idA;
            idA = idB;
            idB = temp;
            contactNormal = -contactNormal;
        }

        //ulong collisionID = ((ulong) idA << 32) | idB;

        CollisionDesc cDesc = new CollisionDesc()
                                            {
                                                aID = idA,
                                                bID = idB,
                                                point = new Vector3(contact.X,contact.Y,contact.Z),
                                                normal = new Vector3(contactNormal.X,contactNormal.Y,contactNormal.Z),
                                                penetration = penetration

                                            };
        if (world.LastCollisionDesc < world.UpdatedCollisions.Length)
            world.UpdatedCollisions[world.LastCollisionDesc++] = (cDesc);
        m_collisionsThisFrame++;


    }
Beispiel #4
0
			public bool Callback(ref ManifoldPoint cp, CollisionObject colObj0, int partId0, int index0, CollisionObject colObj1, int partId1, int index1)
			{
				float friction0 = colObj0.GetFriction();
				float friction1 = colObj1.GetFriction();
				float restitution0 = colObj0.GetRestitution();
				float restitution1 = colObj1.GetRestitution();

				if ((colObj0.GetCollisionFlags() & CollisionFlags.CF_CUSTOM_MATERIAL_CALLBACK) != 0)
				{
					friction0 = 1.0f;//partId0,index0
					restitution0 = 0.0f;
				}
				if ((colObj1.GetCollisionFlags() & CollisionFlags.CF_CUSTOM_MATERIAL_CALLBACK) != 0)
				{
					if ((index1&1) != 0)
					{
						friction1 = 1.0f;//partId1,index1
					} 
					else
					{
						friction1 = 0f;
					}
					restitution1 = 0f;
				}

				cp.m_combinedFriction = CalculateCombinedFriction(friction0,friction1);
				cp.m_combinedRestitution = calculateCombinedRestitution(restitution0,restitution1);

				//this return value is currently ignored, but to be on the safe side: return false if you don't calculate friction
				return true;
			}