| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- #include "BsPhysics.h"
- #include "BsRigidbody.h"
- namespace BansheeEngine
- {
- Physics::Physics()
- {
- memset(mCollisionMap, 1, CollisionMapSize * CollisionMapSize * sizeof(bool));
- }
- void Physics::toggleCollision(UINT64 groupA, UINT64 groupB, bool enabled)
- {
- assert(groupA < CollisionMapSize && groupB < CollisionMapSize);
- mMutex.lock();
- mCollisionMap[groupA][groupB] = enabled;
- }
- bool Physics::isCollisionEnabled(UINT64 groupA, UINT64 groupB) const
- {
- assert(groupA < CollisionMapSize && groupB < CollisionMapSize);
- mMutex.lock();
- return mCollisionMap[groupA][groupB];
- }
- void Physics::registerRigidbody(Rigidbody* body, UINT32 priority)
- {
- assert(priority <= MAX_PRIORITY && "Priority value too high");
- if (mRigidbodies.size() <= priority)
- mRigidbodies.resize(priority + 1);
- UINT32 nextId = (UINT32)mRigidbodies[priority].size();
- mRigidbodies[priority].push_back(body);
- body->_setPhysicsId(nextId);
- }
- void Physics::unregisterRigidbody(UINT32 id, UINT32 priority)
- {
- assert(mRigidbodies.size() >= priority);
- auto& rigidbodies = mRigidbodies[priority];
- UINT32 lastId = (UINT32)rigidbodies.size();
- if (id != lastId)
- {
- rigidbodies[id] = rigidbodies[lastId];
- rigidbodies[id]->_setPhysicsId(id);
- }
- rigidbodies.erase(rigidbodies.begin() + lastId);
- }
- void Physics::updatePriority(UINT32 id, UINT32 oldPriority, UINT32 newPriority)
- {
- assert(newPriority <= MAX_PRIORITY && "Priority value too high");
- if (oldPriority == newPriority)
- return;
- assert(mRigidbodies.size() >= oldPriority);
- auto& rigidbodies = mRigidbodies[oldPriority];
- Rigidbody* rigidbody = rigidbodies[id];
- unregisterRigidbody(id, oldPriority);
- registerRigidbody(rigidbody, newPriority);
- }
- Physics& gPhysics()
- {
- return Physics::instance();
- }
- }
|