//called by Physics World just before rigid body is added to world. //the current rigid body properties are used to rebuild the rigid body. internal virtual bool _BuildCollisionObject() { BPhysicsWorld world = BPhysicsWorld.Get(); if (m_collisionObject != null) { if (isInWorld && world != null) { world.RemoveCollisionObject(this); } } if (transform.localScale != UnityEngine.Vector3.one) { Debug.LogError("The local scale on this collision shape is not one. Bullet physics does not support scaling on a rigid body world transform. Instead alter the dimensions of the CollisionShape."); } m_collisionShape = GetComponent <BCollisionShape>(); if (m_collisionShape == null) { Debug.LogError("There was no collision shape component attached to this BRigidBody. " + name); return(false); } CollisionShape cs = m_collisionShape.GetCollisionShape(); //rigidbody is dynamic if and only if mass is non zero, otherwise static if (m_collisionObject == null) { m_collisionObject = new CollisionObject(); m_collisionObject.CollisionShape = cs; m_collisionObject.UserObject = this; BulletSharp.Math.Matrix worldTrans; BulletSharp.Math.Quaternion q = transform.rotation.ToBullet(); BulletSharp.Math.Matrix.RotationQuaternion(ref q, out worldTrans); worldTrans.Origin = transform.position.ToBullet(); m_collisionObject.WorldTransform = worldTrans; m_collisionObject.CollisionFlags = m_collisionFlags; } else { m_collisionObject.CollisionShape = cs; BulletSharp.Math.Matrix worldTrans; BulletSharp.Math.Quaternion q = transform.rotation.ToBullet(); BulletSharp.Math.Matrix.RotationQuaternion(ref q, out worldTrans); worldTrans.Origin = transform.position.ToBullet(); m_collisionObject.WorldTransform = worldTrans; m_collisionObject.CollisionFlags = m_collisionFlags; } return(true); }
//called by Physics World just before constraint is added to world. //the current constraint properties are used to rebuild the constraint. internal override bool _BuildConstraint() { BPhysicsWorld world = BPhysicsWorld.Get(); if (constraintPtr != null) { if (isInWorld && world != null) { isInWorld = false; world.RemoveConstraint(constraintPtr); } } if (targetRigidBodyA == null) { Debug.LogError("Constraint target rigid body was not set."); return(false); } RigidBody rba = (RigidBody)targetRigidBodyA.GetCollisionObject(); if (rba == null) { Debug.LogError("Constraint could not get bullet RigidBody from target rigid body"); return(false); } if (constraintType == ConstraintType.constrainToAnotherBody) { RigidBody rbb = (RigidBody)targetRigidBodyB.GetCollisionObject(); if (rbb == null) { Debug.LogError("Constraint could not get bullet RigidBody from target rigid body"); return(false); } BulletSharp.Math.Matrix frameInA = BulletSharp.Math.Matrix.AffineTransformation(1f, Quaternion.LookRotation(localForwardInA, localUpInA).ToBullet(), localPointInA.ToBullet()); BulletSharp.Math.Matrix frameInB = BulletSharp.Math.Matrix.AffineTransformation(1f, Quaternion.LookRotation(localForwardInB, localUpInB).ToBullet(), localPointInB.ToBullet()); constraintPtr = new Generic6DofConstraint(rba, rbb, frameInA, frameInB, false); } else { BulletSharp.Math.Matrix frameInA = BulletSharp.Math.Matrix.AffineTransformation(1f, Quaternion.LookRotation(localForwardInA, localUpInA).ToBullet(), localPointInA.ToBullet()); constraintPtr = new Generic6DofConstraint(rba, frameInA, false); } constraintPtr.Userobject = this; Generic6DofConstraint sl = (Generic6DofConstraint)constraintPtr; sl.LinearLowerLimit = linearLimitLower.ToBullet(); sl.LinearUpperLimit = linearLimitUpper.ToBullet(); sl.AngularLowerLimit = angularLimitLower.ToBullet(); sl.AngularUpperLimit = angularLimitUpper.ToBullet(); sl.TranslationalLimitMotor.TargetVelocity = motorLinearTargetVelocity.ToBullet(); sl.TranslationalLimitMotor.MaxMotorForce = motorLinearMaxMotorForce.ToBullet(); return(true); }
protected override void RemoveObjectFromBulletWorld() { BPhysicsWorld pw = BPhysicsWorld.Get(); if (pw != null && m_rigidBody != null && isInWorld) { Debug.Assert(m_rigidBody.NumConstraintRefs == 0, "Removing rigid body that still had constraints. Remove constraints first."); //constraints must be removed before rigid body is removed pw.RemoveRigidBody((RigidBody)m_collisionObject); } }
//called by Physics World just before constraint is added to world. //the current constraint properties are used to rebuild the constraint. internal override bool _BuildConstraint() { BPhysicsWorld world = BPhysicsWorld.Get(); if (constraintPtr != null) { if (isInWorld && world != null) { isInWorld = false; world.RemoveConstraint(constraintPtr); } } if (targetRigidBodyA == null) { Debug.LogError("Constraint target rigid body was not set."); return(false); } RigidBody rba = targetRigidBodyA.GetRigidBody(); if (rba == null) { Debug.LogError("Constraint could not get bullet RigidBody from target rigid body"); return(false); } if (constraintType == ConstraintType.constrainToAnotherBody) { RigidBody rbb = targetRigidBodyB.GetRigidBody(); if (rbb == null) { Debug.LogError("Constraint could not get bullet RigidBody from target rigid body"); return(false); } BulletSharp.Math.Matrix frameInA = BulletSharp.Math.Matrix.AffineTransformation(1f, Quaternion.LookRotation(localForwardInA, localUpInA).ToBullet(), localPointInA.ToBullet()); BulletSharp.Math.Matrix frameInB = BulletSharp.Math.Matrix.AffineTransformation(1f, Quaternion.LookRotation(localForwardInB, localUpInB).ToBullet(), localPointInB.ToBullet()); constraintPtr = new SliderConstraint(rba, rbb, frameInA, frameInB, false); } else { BulletSharp.Math.Matrix frameInA = BulletSharp.Math.Matrix.AffineTransformation(1f, Quaternion.LookRotation(localForwardInA, localUpInA).ToBullet(), localPointInA.ToBullet()); constraintPtr = new SliderConstraint(rba, frameInA, false); } SliderConstraint sl = (SliderConstraint)constraintPtr; sl.LowerLinearLimit = lowerLinearLimit; sl.UpperLinearLimit = upperLinearLimit; sl.LowerAngularLimit = lowerAngularLimit; sl.UpperAngularLimit = upperAngularLimit; return(true); }
protected virtual void AddToBulletWorld() { if (!m_isInWorld) { Debug.Assert(m_thisRigidBody.isInWorld, "Constrained bodies must be added to world before constraints " + this); if (m_constraintType == ConstraintType.constrainToAnotherBody) { Debug.Assert(m_otherRigidBody.isInWorld, "Constrained bodies must be added to world before constraints " + this); } BPhysicsWorld.Get().AddConstraint(this); } }
//called by Physics World just before constraint is added to world. //the current constraint properties are used to rebuild the constraint. internal override bool _BuildConstraint() { BPhysicsWorld world = BPhysicsWorld.Get(); if (constraintPtr != null) { if (isInWorld && world != null) { isInWorld = false; world.RemoveConstraint(constraintPtr); } } if (targetRigidBodyA == null) { Debug.LogError("Constraint target rigid body was not set."); return(false); } if (localPivotAxisA == Vector3.zero) { Debug.LogError("Constaint axis cannot be zero vector"); return(false); } RigidBody rba = targetRigidBodyA.GetRigidBody(); if (rba == null) { Debug.LogError("Constraint could not get bullet RigidBody from target rigid body"); return(false); } if (constraintType == ConstraintType.constrainToAnotherBody) { RigidBody rbb = targetRigidBodyB.GetRigidBody(); if (rbb == null) { Debug.LogError("Constraint could not get bullet RigidBody from target rigid body"); return(false); } constraintPtr = new HingeConstraint(rba, rbb, localPointOnHingeOffsetA.ToBullet(), localPointOnHingeOffsetB.ToBullet(), localPivotAxisA.ToBullet(), localPivotAxisB.ToBullet()); } else { constraintPtr = new HingeConstraint(rba, localPointOnHingeOffsetA.ToBullet(), localPivotAxisA.ToBullet()); } if (enableMotor) { ((HingeConstraint)constraintPtr).EnableAngularMotor(true, targetMotorAngularVelocity, maxMotorImpulse); } if (setLimit) { ((HingeConstraint)constraintPtr).SetLimit(lowLimitAngleRadians, highLimitAngleRadians, limitSoftness, limitBiasFactor); } return(true); }
protected virtual void Dispose(bool isdisposing) { if (isInWorld && isdisposing && m_collisionObject != null) { BPhysicsWorld pw = BPhysicsWorld.Get(); if (pw != null && pw.world != null) { ((DiscreteDynamicsWorld)pw.world).RemoveCollisionObject(m_collisionObject); } } if (m_collisionObject != null) { m_collisionObject.Dispose(); m_collisionObject = null; } }
/* public override CollisionObject GetCollisionObject() * { * return m_collisionObject; * }*/ protected override void Dispose(bool isdisposing) { if (m_multiBody != null) { if (isInWorld && isdisposing) { BPhysicsWorld pw = BPhysicsWorld.Get(); if (pw != null && pw.world != null) { ((MultiBodyDynamicsWorld)pw.world).RemoveMultiBody(m_multiBody); } } m_multiBody.Dispose(); m_multiBody = null; } }
void OnEnable() { objsIWasInContactWithLastFrame.Clear(); BRigidBody brb = GetComponent <BRigidBody>(); if (brb == null) { Debug.LogError("BCollisionCallback must be attached to a game object with a BRigidBody component."); return; } rigidBody = brb.GetRigidBody(); world = BPhysicsWorld.Get().World; if (contactCallback == null) { contactCallback = new ContactResultCallbackUnity(this); } }
//called by Physics World just before multi body is added to world. //the current multi body properties are used to rebuild the multi body. internal override bool _BuildCollisionObject() { BPhysicsWorld world = BPhysicsWorld.Get(); if (m_multiBody != null && isInWorld && world != null) { isInWorld = false; world.RemoveMultiBody(m_multiBody); } if (transform.localScale != UnityEngine.Vector3.one) { Debug.LogErrorFormat("The local scale on {0} rigid body is not one. Bullet physics does not support scaling on a rigid body world transform. Instead alter the dimensions of the CollisionShape.", name); return(false); } return(CreateMultiBody(ref m_multiBody, ref _localInertia, GetComponent <BCollisionShape>().GetCollisionShape())); }
//called by Physics World just before rigid body is added to world. //the current rigid body properties are used to rebuild the rigid body. internal override bool _BuildCollisionObject() { BPhysicsWorld world = BPhysicsWorld.Get(); if (m_rigidBody != null && isInWorld && world != null) { isInWorld = false; world.RemoveRigidBody(m_rigidBody); } if (transform.localScale != UnityEngine.Vector3.one) { Debug.LogErrorFormat("The local scale on {0} rigid body is not one. Bullet physics does not support scaling on a rigid body world transform. Instead alter the dimensions of the CollisionShape.", name); } m_collisionShape = GetComponent <BCollisionShape>(); if (m_collisionShape == null) { Debug.LogErrorFormat("There was no collision shape component attached to this BRigidBody. {0}", name); return(false); } CollisionShape cs = m_collisionShape.GetCollisionShape(); if (m_motionState == null) { m_motionState = new BGameObjectMotionState(transform); } BulletSharp.RigidBody rb = (BulletSharp.RigidBody)m_collisionObject; CreateOrConfigureRigidBody(ref rb, ref _localInertia, cs, m_motionState); m_collisionObject = rb; m_collisionObject.UserObject = this; // gRally //if (!isDynamic()) { transform.position = Native.UtoB(transform.position); transform.rotation = Native.UtoB(transform.rotation); transform.localScale = Native.UtoB(transform.localScale); } return(true); }
public static BPhysicsWorld Get() { if (singleton == null && !_isDisposed) { BPhysicsWorld[] ws = FindObjectsOfType<BPhysicsWorld>(); if (ws.Length == 1) { singleton = ws[0]; } else if (ws.Length == 0) { Debug.LogError("Need to add a dynamics world to the scene"); } else { Debug.LogError("Found more than one dynamics world."); singleton = ws[0]; for (int i = 1; i < ws.Length; i++) { GameObject.Destroy(ws[i].gameObject); } } } if (singleton.World == null && !singleton.isDisposed) singleton._InitializePhysicsWorld(); return singleton; }
protected override void Dispose(bool isdisposing) { if (isInWorld && isdisposing && m_rigidBody != null) { BPhysicsWorld pw = BPhysicsWorld.Get(); if (pw != null && pw.world != null) { ((DiscreteDynamicsWorld)pw.world).RemoveRigidBody(m_rigidBody); } } if (m_rigidBody != null) { if (m_rigidBody.MotionState != null) { m_rigidBody.MotionState.Dispose(); } m_rigidBody.Dispose(); m_rigidBody = null; } }
//called by Physics World just before constraint is added to world. //the current constraint properties are used to rebuild the constraint. internal override bool _BuildConstraint() { BPhysicsWorld world = BPhysicsWorld.Get(); if (constraintPtr != null) { if (isInWorld && world != null) { isInWorld = false; world.RemoveConstraint(constraintPtr); } } if (targetRigidBodyA == null) { Debug.LogError("Constraint target rigid body was not set."); return(false); } RigidBody rba = (RigidBody)targetRigidBodyA.GetCollisionObject(); if (rba == null) { Debug.LogError("Constraint could not get bullet RigidBody from target rigid body A"); return(false); } if (constraintType == ConstraintType.constrainToAnotherBody) { RigidBody rbb = (RigidBody)targetRigidBodyB.GetCollisionObject(); if (rbb == null) { Debug.LogError("Constraint could not get bullet RigidBody from target rigid body B"); return(false); } constraintPtr = new Point2PointConstraint(rba, rbb, pivotInA.ToBullet(), pivotInB.ToBullet()); } else { constraintPtr = new Point2PointConstraint(rba, pivotInA.ToBullet()); } constraintPtr.Userobject = this; return(true); }
protected virtual void Dispose(bool isdisposing) { if (isInWorld && isdisposing && m_Brigidbody != null) { BPhysicsWorld pw = BPhysicsWorld.Get(); if (pw != null && pw.World != null) { pw.World.RemoveRigidBody(m_Brigidbody); } } if (m_Brigidbody != null) { if (m_Brigidbody.MotionState != null) { m_Brigidbody.MotionState.Dispose(); } m_Brigidbody.Dispose(); m_Brigidbody = null; } Debug.Log("Destroying RigidBody " + name); }
//called by Physics World just before constraint is added to world. //the current constraint properties are used to rebuild the constraint. internal override bool _BuildConstraint() { BPhysicsWorld world = BPhysicsWorld.Get(); if (constraintPtr != null) { if (isInWorld && world != null) { isInWorld = false; world.RemoveConstraint(constraintPtr); } } if (targetRigidBodyA == null) { Debug.LogError("Constraint target rigid body was not set."); return(false); } RigidBody rba = (RigidBody)targetRigidBodyA.GetCollisionObject(); if (rba == null) { Debug.LogError("Constraint could not get bullet RigidBody from target rigid body"); return(false); } RigidBody rbb = (RigidBody)targetRigidBodyB.GetCollisionObject(); if (rbb == null) { Debug.LogError("Constraint could not get bullet RigidBody from target rigid body"); return(false); } BulletSharp.Math.Matrix frameInA = BulletSharp.Math.Matrix.Translation(localPointInA.ToBullet()); BulletSharp.Math.Matrix frameInB = BulletSharp.Math.Matrix.Translation(localPointInB.ToBullet()); constraintPtr = new FixedConstraint(rba, rbb, frameInA, frameInB); constraintPtr.Userobject = this; return(true); }
//todo should be properties so can capture changes and propagate to scene //called by Physics World just before constraint is added to world. //the current constraint properties are used to rebuild the constraint. internal override bool _BuildConstraint() { if (m_constraintType == ConstraintType.constrainToPointInSpace) { Debug.LogError("A FixedConstraint can only be constrained to another object."); return(false); } BPhysicsWorld world = BPhysicsWorld.Get(); if (m_constraintPtr != null) { if (m_isInWorld && world != null) { m_isInWorld = false; world.RemoveConstraint(m_constraintPtr); } } BRigidBody targetRigidBodyA = GetComponent <BRigidBody>(); if (targetRigidBodyA == null) { Debug.LogError("Fixed Constraint needs to be added to a component with a BRigidBody."); return(false); } if (!targetRigidBodyA.isInWorld) { world.AddRigidBody(targetRigidBodyA); } RigidBody rba = (RigidBody)targetRigidBodyA.GetCollisionObject(); if (rba == null) { Debug.LogError("Constraint could not get bullet RigidBody from target rigid body"); return(false); } if (m_otherRigidBody == null) { Debug.LogError("Other rigid body is not set"); return(false); } if (!m_otherRigidBody.isInWorld) { world.AddRigidBody(m_otherRigidBody); } RigidBody rbb = (RigidBody)m_otherRigidBody.GetCollisionObject(); if (rbb == null) { Debug.LogError("Constraint could not get bullet RigidBody from target rigid body"); return(false); } BM.Matrix frameInA, frameInOther; string errormsg = ""; if (CreateFramesA_B(m_localConstraintAxisX, m_localConstraintAxisY, m_localConstraintPoint, out frameInA, out frameInOther, ref errormsg)) { m_constraintPtr = new FixedConstraint(rbb, rba, frameInOther, frameInA); } else { Debug.LogError(errormsg); return(false); } m_constraintPtr.Userobject = this; m_constraintPtr.DebugDrawSize = m_debugDrawSize; m_constraintPtr.BreakingImpulseThreshold = m_breakingImpulseThreshold; return(true); }
public override void BOnTriggerStay(CollisionObject other, AlignedManifoldArray manifoldArray) { Debug.Log("Stay with " + other.UserObject + " fixedFrame " + BPhysicsWorld.Get().frameCount); }
public override void BOnTriggerExit(CollisionObject other) { Debug.Log("Exit with " + other.UserObject + " fixedFrame " + BPhysicsWorld.Get().frameCount); }
protected override void RemoveObjectFromBulletWorld() { BPhysicsWorld.Get().RemoveRigidBody((RigidBody)m_collisionObject); }
protected void Dispose(bool disposing) { if (debugType >= BDebug.DebugType.Debug) Debug.Log("BDynamicsWorld Disposing physics."); if (lateUpdateHelper != null) { lateUpdateHelper.m_ddWorld = null; lateUpdateHelper.m_world = null; } if (m_world != null) { //remove/dispose constraints int i; if (_ddWorld != null) { if (debugType >= BDebug.DebugType.Debug) Debug.LogFormat("Removing Constraints {0}", _ddWorld.NumConstraints); for (i = _ddWorld.NumConstraints - 1; i >= 0; i--) { TypedConstraint constraint = _ddWorld.GetConstraint(i); _ddWorld.RemoveConstraint(constraint); if (constraint.Userobject is BTypedConstraint) ((BTypedConstraint)constraint.Userobject).m_isInWorld = false; if (debugType >= BDebug.DebugType.Debug) Debug.LogFormat("Removed Constaint {0}", constraint.Userobject); constraint.Dispose(); } } if (debugType >= BDebug.DebugType.Debug) Debug.LogFormat("Removing Collision Objects {0}", _ddWorld.NumCollisionObjects); //remove the rigidbodies from the dynamics world and delete them for (i = m_world.NumCollisionObjects - 1; i >= 0; i--) { CollisionObject obj = m_world.CollisionObjectArray[i]; RigidBody body = obj as RigidBody; if (body != null && body.MotionState != null) { Debug.Assert(body.NumConstraintRefs == 0, "Rigid body still had constraints"); body.MotionState.Dispose(); } m_world.RemoveCollisionObject(obj); if (obj.UserObject is BCollisionObject) ((BCollisionObject)obj.UserObject).isInWorld = false; if (debugType >= BDebug.DebugType.Debug) Debug.LogFormat("Removed CollisionObject {0}", obj.UserObject); obj.Dispose(); } if (m_world.DebugDrawer != null) { if (m_world.DebugDrawer is IDisposable) { IDisposable dis = (IDisposable)m_world.DebugDrawer; dis.Dispose(); } } m_world.Dispose(); Broadphase.Dispose(); Dispatcher.Dispose(); CollisionConf.Dispose(); _ddWorld = null; m_world = null; } if (Broadphase != null) { Broadphase.Dispose(); Broadphase = null; } if (Dispatcher != null) { Dispatcher.Dispose(); Dispatcher = null; } if (CollisionConf != null) { CollisionConf.Dispose(); CollisionConf = null; } if (Solver != null) { Solver.Dispose(); Solver = null; } if (softBodyWorldInfo != null) { softBodyWorldInfo.Dispose(); softBodyWorldInfo = null; } _isDisposed = true; singleton = null; }
protected virtual void RemoveObjectFromBulletWorld() { BPhysicsWorld.Get().RemoveCollisionObject(m_collisionObject); }
protected override void AddObjectToBulletWorld() { BPhysicsWorld.Get().AddRigidBody(this); }
internal override bool _BuildConstraint() { BPhysicsWorld world = BPhysicsWorld.Get(); if (m_constraintPtr != null) { if (m_isInWorld && world != null) { m_isInWorld = false; world.RemoveConstraint(m_constraintPtr); } } BRigidBody targetRigidBodyA = GetComponent <BRigidBody>(); if (targetRigidBodyA == null) { Debug.LogError("BGeneric6DofSpringConstraint needs to be added to a component with a BRigidBody."); return(false); } if (!targetRigidBodyA.isInWorld) { world.AddRigidBody(targetRigidBodyA); } if (m_localConstraintAxisX == Vector3.zero) { Debug.LogError("Constaint axis cannot be zero vector"); return(false); } RigidBody rba = (RigidBody)targetRigidBodyA.GetCollisionObject(); if (rba == null) { Debug.LogError("Constraint could not get bullet RigidBody from target rigid body"); return(false); } if (m_constraintType == ConstraintType.constrainToAnotherBody) { if (m_otherRigidBody == null) { Debug.LogError("Other rigid body must not be null"); return(false); } if (!m_otherRigidBody.isInWorld) { world.AddRigidBody(m_otherRigidBody); } RigidBody rbb = (RigidBody)m_otherRigidBody.GetCollisionObject(); if (rbb == null) { Debug.LogError("Constraint could not get bullet RigidBody from target rigid body"); return(false); } BM.Matrix frameInA, frameInOther; string errormsg = ""; if (CreateFramesA_B(m_localConstraintAxisX, m_localConstraintAxisY, m_localConstraintPoint, out frameInA, out frameInOther, ref errormsg)) { m_constraintPtr = new Generic6DofSpringConstraint(rba, rbb, frameInA, frameInOther, true); } else { Debug.LogError(errormsg); return(false); } } else { // TODO // m_constraintPtr = new Generic6DofSpringConstraint(rba, m_localConstraintPoint.ToBullet(), m_localConstraintAxisX.ToBullet(), false); } if (m_setLimit) { ((Generic6DofSpringConstraint)m_constraintPtr).SetLimit((int)m_springAxis, m_lowLimit, m_highLimit); } ((Generic6DofSpringConstraint)m_constraintPtr).EnableSpring((int)m_springAxis, true); ((Generic6DofSpringConstraint)m_constraintPtr).SetStiffness((int)m_springAxis, m_stiffness); ((Generic6DofSpringConstraint)m_constraintPtr).SetDamping((int)m_springAxis, m_damping); m_constraintPtr.Userobject = this; m_constraintPtr.DebugDrawSize = m_debugDrawSize; m_constraintPtr.BreakingImpulseThreshold = m_breakingImpulseThreshold; m_constraintPtr.OverrideNumSolverIterations = m_overrideNumSolverIterations; return(true); }
//It is critical that Awake be called before any other scripts call BPhysicsWorld.Get() //Set this script and any derived classes very early in script execution order. protected virtual void Awake() { _isDisposed = false; singleton = BPhysicsWorld.Get(); }
//called by Physics World just before rigid body is added to world. //the current rigid body properties are used to rebuild the rigid body. internal override bool _BuildCollisionObject() { BPhysicsWorld world = BPhysicsWorld.Get(); if (m_rigidBody != null) { if (isInWorld && world != null) { isInWorld = false; world.RemoveRigidBody(m_rigidBody); } } if (transform.localScale != UnityEngine.Vector3.one) { BDebug.LogError(debugType, "The local scale on this rigid body is not one. Bullet physics does not support scaling on a rigid body world transform. Instead alter the dimensions of the CollisionShape."); } m_collisionShape = GetComponent <BCollisionShape>(); if (m_collisionShape == null) { BDebug.LogError(debugType, "There was no collision shape component attached to this BRigidBody. {0}", name); return(false); } CollisionShape cs = m_collisionShape.GetCollisionShape(); //rigidbody is dynamic if and only if mass is non zero, otherwise static _localInertia = BulletSharp.Math.Vector3.Zero; if (isDynamic()) { cs.CalculateLocalInertia(_mass, out _localInertia); } if (m_rigidBody == null) { m_motionState = new BGameObjectMotionState(transform); RigidBodyConstructionInfo rbInfo; if (isDynamic()) { rbInfo = new RigidBodyConstructionInfo(_mass, m_motionState, cs, _localInertia); } else { rbInfo = new RigidBodyConstructionInfo(0, m_motionState, cs, localInertia); } m_rigidBody = new RigidBody(rbInfo); m_rigidBody.UserObject = this; rbInfo.Dispose(); m_rigidBody.CollisionFlags = m_collisionFlags; } else { float usedMass = 0f; if (isDynamic()) { usedMass = _mass; } m_rigidBody.SetMassProps(usedMass, localInertia); m_rigidBody.CollisionShape = cs; m_rigidBody.CollisionFlags = m_collisionFlags; } //if kinematic then disable deactivation if ((m_collisionFlags & BulletSharp.CollisionFlags.KinematicObject) != 0) { m_rigidBody.ActivationState = ActivationState.DisableDeactivation; } return(true); }
protected void Dispose(bool disposing) { if (debugType >= BDebug.DebugType.Debug) { Debug.Log("BDynamicsWorld Disposing physics."); } /* NU * if (lateUpdateHelper != null) * { * lateUpdateHelper.m_ddWorld = null; * lateUpdateHelper.m_world = null; * } */ if (m_world != null) { //remove/dispose constraints int i; if (_ddWorld != null) { if (debugType >= BDebug.DebugType.Debug) { Debug.LogFormat("Removing Constraints {0}", _ddWorld.NumConstraints); } for (i = _ddWorld.NumConstraints - 1; i >= 0; i--) { TypedConstraint constraint = _ddWorld.GetConstraint(i); _ddWorld.RemoveConstraint(constraint); if (constraint.Userobject is BTypedConstraint) { ((BTypedConstraint)constraint.Userobject).m_isInWorld = false; } if (debugType >= BDebug.DebugType.Debug) { Debug.LogFormat("Removed Constaint {0}", constraint.Userobject); } constraint.Dispose(); } } /* gRally * if (debugType >= BDebug.DebugType.Debug) Debug.LogFormat("Removing Collision Objects {0}", _ddWorld.NumCollisionObjects); * //remove the rigidbodies from the dynamics world and delete them * for (i = m_world.NumCollisionObjects - 1; i >= 0; i--) * { * CollisionObject obj = m_world.CollisionObjectArray[i]; * RigidBody body = obj as RigidBody; * if (body != null && body.MotionState != null) * { * Debug.Assert(body.NumConstraintRefs == 0, "Rigid body still had constraints"); * body.MotionState.Dispose(); * } * m_world.RemoveCollisionObject(obj); * if (obj.UserObject is BCollisionObject) ((BCollisionObject)obj.UserObject).isInWorld = false; * if (debugType >= BDebug.DebugType.Debug) Debug.LogFormat("Removed CollisionObject {0}", obj.UserObject); * obj.Dispose(); * } * */ if (m_world.DebugDrawer != null) { if (m_world.DebugDrawer is IDisposable) { IDisposable dis = (IDisposable)m_world.DebugDrawer; dis.Dispose(); } } m_world.Dispose(); Broadphase.Dispose(); Dispatcher.Dispose(); CollisionConf.Dispose(); _ddWorld = null; m_world = null; } if (Broadphase != null) { Broadphase.Dispose(); Broadphase = null; } if (Dispatcher != null) { Dispatcher.Dispose(); Dispatcher = null; } if (CollisionConf != null) { CollisionConf.Dispose(); CollisionConf = null; } if (Solver != null) { Solver.Dispose(); Solver = null; } if (softBodyWorldInfo != null) { softBodyWorldInfo.Dispose(); softBodyWorldInfo = null; } _isDisposed = true; singleton = null; }
protected virtual void AddObjectToBulletWorld() { BPhysicsWorld.Get().AddCollisionObject(this); }
//called by Physics World just before constraint is added to world. //the current constraint properties are used to rebuild the constraint. internal override bool _BuildConstraint() { BPhysicsWorld world = BPhysicsWorld.Get(); if (m_constraintPtr != null) { if (m_isInWorld && world != null) { m_isInWorld = false; world.RemoveConstraint(m_constraintPtr); } } BRigidBody targetRigidBodyA = GetComponent <BRigidBody>(); if (targetRigidBodyA == null) { Debug.LogError("BSliderConstraint needs to be added to a component with a BRigidBody."); return(false); } if (!targetRigidBodyA.isInWorld) { world.AddRigidBody(targetRigidBodyA); } RigidBody rba = (RigidBody)targetRigidBodyA.GetCollisionObject(); if (rba == null) { Debug.LogError("Constraint could not get bullet RigidBody from target rigid body"); return(false); } if (m_constraintType == ConstraintType.constrainToAnotherBody) { if (m_otherRigidBody == null) { Debug.LogError("Other rigid body was not set"); return(false); } if (!m_otherRigidBody.isInWorld) { world.AddRigidBody(m_otherRigidBody); } RigidBody rbb = (RigidBody)m_otherRigidBody.GetCollisionObject(); if (rbb == null) { Debug.LogError("Constraint could not get bullet RigidBody from target rigid body"); return(false); } BM.Matrix frameInA, frameInOther; string errormsg = ""; if (CreateFramesA_B(m_localConstraintAxisX, m_localConstraintAxisY, m_localConstraintPoint, out frameInA, out frameInOther, ref errormsg)) { m_constraintPtr = new SliderConstraint(rbb, rba, frameInOther, frameInA, true); } else { Debug.LogError(errormsg); return(false); } } else { BulletSharp.Math.Matrix frameInA = BM.Matrix.Identity; string errormsg = ""; if (CreateFrame(m_localConstraintAxisX, m_localConstraintAxisY, m_localConstraintPoint, ref frameInA, ref errormsg)) { m_constraintPtr = new SliderConstraint(rba, frameInA, true); } else { Debug.LogError(errormsg); return(false); } } SliderConstraint sl = (SliderConstraint)m_constraintPtr; sl.LowerLinearLimit = m_lowerLinearLimit; sl.UpperLinearLimit = m_upperLinearLimit; sl.LowerAngularLimit = m_lowerAngularLimitRadians; sl.UpperAngularLimit = m_upperAngularLimitRadians; m_constraintPtr.Userobject = this; m_constraintPtr.DebugDrawSize = m_debugDrawSize; m_constraintPtr.BreakingImpulseThreshold = m_breakingImpulseThreshold; return(true); }
void FixedUpdate() { CollisionWorld collisionWorld = BPhysicsWorld.Get().world; collisionWorld.Dispatcher.DispatchAllCollisionPairs(m_ghostObject.OverlappingPairCache, collisionWorld.DispatchInfo, collisionWorld.Dispatcher); //m_currentPosition = m_ghostObject.WorldTransform.Origin; //float maxPen = 0f; objsCurrentlyInContactWith.Clear(); for (int i = 0; i < m_ghostObject.OverlappingPairCache.NumOverlappingPairs; i++) { manifoldArray.Clear(); BroadphasePair collisionPair = m_ghostObject.OverlappingPairCache.OverlappingPairArray[i]; CollisionObject obj0 = collisionPair.Proxy0.ClientObject as CollisionObject; CollisionObject obj1 = collisionPair.Proxy1.ClientObject as CollisionObject; if ((obj0 != null && !obj0.HasContactResponse) || (obj1 != null && !obj1.HasContactResponse)) { continue; } if (collisionPair.Algorithm != null) { collisionPair.Algorithm.GetAllContactManifolds(manifoldArray); } CollisionObject otherObj = null; if (manifoldArray.Count > 0) { PersistentManifold pm = manifoldArray[0]; if (pm.Body0 == m_collisionObject) { otherObj = pm.Body1; } else { otherObj = pm.Body0; } } else { continue; } objsCurrentlyInContactWith.Add(otherObj); if (!objsIWasInContactWithLastFrame.Contains(otherObj)) { BOnTriggerEnter(otherObj, manifoldArray); } else { BOnTriggerStay(otherObj, manifoldArray); } } objsIWasInContactWithLastFrame.ExceptWith(objsCurrentlyInContactWith); foreach (CollisionObject co in objsIWasInContactWithLastFrame) { BOnTriggerExit(co); } //swap the hashsets so objsIWasInContactWithLastFrame now contains the list of objs. HashSet <CollisionObject> temp = objsIWasInContactWithLastFrame; objsIWasInContactWithLastFrame = objsCurrentlyInContactWith; objsCurrentlyInContactWith = temp; }
//It is critical that Awake be called before any other scripts call BPhysicsWorld.Get() //Set this script and any derived classes very early in script execution order. protected virtual void Awake() { _isDisposed = false; singleton = BPhysicsWorld.Get(); }
protected void Dispose(bool disposing) { if (debugType >= BDebug.DebugType.Debug) { Debug.Log("BDynamicsWorld Disposing physics."); } if (PhysicsWorldHelper != null) { PhysicsWorldHelper.m_ddWorld = null; PhysicsWorldHelper.m_world = null; } if (m_world != null) { //remove/dispose constraints int i; if (_ddWorld != null) { if (debugType >= BDebug.DebugType.Debug) { Debug.LogFormat("Removing Constraints {0}", _ddWorld.NumConstraints); } for (i = _ddWorld.NumConstraints - 1; i >= 0; i--) { TypedConstraint constraint = _ddWorld.GetConstraint(i); _ddWorld.RemoveConstraint(constraint); if (constraint.Userobject is BTypedConstraint) { ((BTypedConstraint)constraint.Userobject).m_isInWorld = false; } if (debugType >= BDebug.DebugType.Debug) { Debug.LogFormat("Removed Constaint {0}", constraint.Userobject); } constraint.Dispose(); } } if (debugType >= BDebug.DebugType.Debug) { Debug.LogFormat("Removing Collision Objects {0}", m_world.NumCollisionObjects); } //remove the rigidbodies from the dynamics world and delete them for (i = m_world.NumCollisionObjects - 1; i >= 0; i--) { CollisionObject obj = m_world.CollisionObjectArray[i]; RigidBody body = obj as RigidBody; if (body != null && body.MotionState != null) { Debug.Assert(body.NumConstraintRefs == 0, "Rigid body still had constraints"); body.MotionState.Dispose(); } m_world.RemoveCollisionObject(obj); if (obj.UserObject is BCollisionObject) { ((BCollisionObject)obj.UserObject).isInWorld = false; } if (debugType >= BDebug.DebugType.Debug) { Debug.LogFormat("Removed CollisionObject {0}", obj.UserObject); } obj.Dispose(); } MultiBodyDynamicsWorld _mbdWorld = m_world as MultiBodyDynamicsWorld; if (_mbdWorld != null) { if (debugType >= BDebug.DebugType.Debug) { Debug.LogFormat("Removing MultiBody Constraints {0}", _mbdWorld.NumMultiBodyConstraints); } for (i = _mbdWorld.NumMultiBodyConstraints - 1; i >= 0; i--) { MultiBodyConstraint constraint = _mbdWorld.GetMultiBodyConstraint(i); _mbdWorld.RemoveMultiBodyConstraint(constraint); /* if (constraint.Userobject is BTypedConstraint) ((BTypedConstraint)constraint.Userobject).m_isInWorld = false; * if (debugType >= BDebug.DebugType.Debug) Debug.LogFormat("Removed Constaint {0}", constraint.Userobject);*/ constraint.Dispose(); } if (debugType >= BDebug.DebugType.Debug) { Debug.LogFormat("Removing Multibodies {0}", _mbdWorld.NumMultibodies); } //remove the rigidbodies from the dynamics world and delete them for (i = _mbdWorld.NumMultibodies - 1; i >= 0; i--) { MultiBody mb = _mbdWorld.GetMultiBody(i); _mbdWorld.RemoveMultiBody(mb); if (mb.UserObject is BMultiBody bmb) { bmb.isInWorld = false; } if (debugType >= BDebug.DebugType.Debug) { Debug.LogFormat("Removed CollisionObject {0}", mb.UserObject); } mb.Dispose(); } } if (m_world.DebugDrawer != null) { if (m_world.DebugDrawer is IDisposable) { IDisposable dis = (IDisposable)m_world.DebugDrawer; dis.Dispose(); } } m_world.Dispose(); Broadphase.Dispose(); Dispatcher.Dispose(); CollisionConf.Dispose(); _ddWorld = null; m_world = null; } if (Broadphase != null) { Broadphase.Dispose(); Broadphase = null; } if (Dispatcher != null) { Dispatcher.Dispose(); Dispatcher = null; } if (CollisionConf != null) { CollisionConf.Dispose(); CollisionConf = null; } if (constraintSolver != null) { constraintSolver.Dispose(); constraintSolver = null; } if (softBodyWorldInfo != null) { softBodyWorldInfo.Dispose(); softBodyWorldInfo = null; } _isDisposed = true; singleton = null; }
//called by Physics World just before rigid body is added to world. //the current rigid body properties are used to rebuild the rigid body. internal bool _BuildRigidBody() { BPhysicsWorld world = BPhysicsWorld.Get(); if (m_Brigidbody != null) { if (isInWorld && world != null) { isInWorld = false; world.RemoveRigidBody(m_Brigidbody); } } if (transform.localScale != UnityEngine.Vector3.one) { Debug.LogError("The local scale on this rigid body is not one. Bullet physics does not support scaling on a rigid body world transform. Instead alter the dimensions of the CollisionShape."); } m_collisionShape = GetComponent <BCollisionShape>(); if (m_collisionShape == null) { Debug.LogError("There was no collision shape component attached to this BRigidBody. " + name); return(false); } CollisionShape cs = m_collisionShape.GetCollisionShape(); //rigidbody is dynamic if and only if mass is non zero, otherwise static _localInertia = BulletSharp.Math.Vector3.Zero; if (_type == RBType.dynamic) { cs.CalculateLocalInertia(_mass, out _localInertia); } if (m_Brigidbody == null) { m_motionState = new BGameObjectMotionState(transform); RigidBodyConstructionInfo rbInfo; if (_type == RBType.dynamic) { rbInfo = new RigidBodyConstructionInfo(_mass, m_motionState, cs, _localInertia); } else { rbInfo = new RigidBodyConstructionInfo(0, m_motionState, cs, localInertia); } m_Brigidbody = new RigidBody(rbInfo); rbInfo.Dispose(); } else { m_Brigidbody.SetMassProps(_mass, localInertia); m_Brigidbody.CollisionShape = cs; } if (_type == RBType.kinematic) { m_Brigidbody.CollisionFlags = m_Brigidbody.CollisionFlags | BulletSharp.CollisionFlags.KinematicObject; m_Brigidbody.ActivationState = ActivationState.DisableDeactivation; } if (_isTrigger) { m_Brigidbody.CollisionFlags = m_Brigidbody.CollisionFlags | BulletSharp.CollisionFlags.NoContactResponse; } return(true); }