Path: blob/master/thirdparty/jolt_physics/Jolt/Physics/Body/BodyLockInterface.h
9912 views
// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)1// SPDX-FileCopyrightText: 2021 Jorrit Rouwe2// SPDX-License-Identifier: MIT345#pragma once67#include <Jolt/Physics/Body/Body.h>8#include <Jolt/Physics/Body/BodyManager.h>9#include <Jolt/Physics/PhysicsLock.h>10#include <Jolt/Core/Mutex.h>1112JPH_NAMESPACE_BEGIN1314/// Base class interface for locking a body. Usually you will use BodyLockRead / BodyLockWrite / BodyLockMultiRead / BodyLockMultiWrite instead.15class BodyLockInterface : public NonCopyable16{17public:18/// Redefine MutexMask19using MutexMask = BodyManager::MutexMask;2021/// Constructor22explicit BodyLockInterface(BodyManager &inBodyManager) : mBodyManager(inBodyManager) { }23virtual ~BodyLockInterface() = default;2425///@name Locking functions26///@{27virtual SharedMutex * LockRead(const BodyID &inBodyID) const = 0;28virtual void UnlockRead(SharedMutex *inMutex) const = 0;29virtual SharedMutex * LockWrite(const BodyID &inBodyID) const = 0;30virtual void UnlockWrite(SharedMutex *inMutex) const = 0;31///@}3233/// Get the mask needed to lock all bodies34inline MutexMask GetAllBodiesMutexMask() const35{36return mBodyManager.GetAllBodiesMutexMask();37}3839///@name Batch locking functions40///@{41virtual MutexMask GetMutexMask(const BodyID *inBodies, int inNumber) const = 0;42virtual void LockRead(MutexMask inMutexMask) const = 0;43virtual void UnlockRead(MutexMask inMutexMask) const = 0;44virtual void LockWrite(MutexMask inMutexMask) const = 0;45virtual void UnlockWrite(MutexMask inMutexMask) const = 0;46///@}4748/// Convert body ID to body49inline Body * TryGetBody(const BodyID &inBodyID) const { return mBodyManager.TryGetBody(inBodyID); }5051protected:52BodyManager & mBodyManager;53};5455/// Implementation that performs no locking (assumes the lock has already been taken)56class BodyLockInterfaceNoLock final : public BodyLockInterface57{58public:59using BodyLockInterface::BodyLockInterface;6061///@name Locking functions62virtual SharedMutex * LockRead([[maybe_unused]] const BodyID &inBodyID) const override { return nullptr; }63virtual void UnlockRead([[maybe_unused]] SharedMutex *inMutex) const override { /* Nothing to do */ }64virtual SharedMutex * LockWrite([[maybe_unused]] const BodyID &inBodyID) const override { return nullptr; }65virtual void UnlockWrite([[maybe_unused]] SharedMutex *inMutex) const override { /* Nothing to do */ }6667///@name Batch locking functions68virtual MutexMask GetMutexMask([[maybe_unused]] const BodyID *inBodies, [[maybe_unused]] int inNumber) const override { return 0; }69virtual void LockRead([[maybe_unused]] MutexMask inMutexMask) const override { /* Nothing to do */ }70virtual void UnlockRead([[maybe_unused]] MutexMask inMutexMask) const override { /* Nothing to do */ }71virtual void LockWrite([[maybe_unused]] MutexMask inMutexMask) const override { /* Nothing to do */ }72virtual void UnlockWrite([[maybe_unused]] MutexMask inMutexMask) const override { /* Nothing to do */ }73};7475/// Implementation that uses the body manager to lock the correct mutex for a body76class BodyLockInterfaceLocking final : public BodyLockInterface77{78public:79using BodyLockInterface::BodyLockInterface;8081///@name Locking functions82virtual SharedMutex * LockRead(const BodyID &inBodyID) const override83{84SharedMutex &mutex = mBodyManager.GetMutexForBody(inBodyID);85PhysicsLock::sLockShared(mutex JPH_IF_ENABLE_ASSERTS(, &mBodyManager, EPhysicsLockTypes::PerBody));86return &mutex;87}8889virtual void UnlockRead(SharedMutex *inMutex) const override90{91PhysicsLock::sUnlockShared(*inMutex JPH_IF_ENABLE_ASSERTS(, &mBodyManager, EPhysicsLockTypes::PerBody));92}9394virtual SharedMutex * LockWrite(const BodyID &inBodyID) const override95{96SharedMutex &mutex = mBodyManager.GetMutexForBody(inBodyID);97PhysicsLock::sLock(mutex JPH_IF_ENABLE_ASSERTS(, &mBodyManager, EPhysicsLockTypes::PerBody));98return &mutex;99}100101virtual void UnlockWrite(SharedMutex *inMutex) const override102{103PhysicsLock::sUnlock(*inMutex JPH_IF_ENABLE_ASSERTS(, &mBodyManager, EPhysicsLockTypes::PerBody));104}105106///@name Batch locking functions107virtual MutexMask GetMutexMask(const BodyID *inBodies, int inNumber) const override108{109return mBodyManager.GetMutexMask(inBodies, inNumber);110}111112virtual void LockRead(MutexMask inMutexMask) const override113{114mBodyManager.LockRead(inMutexMask);115}116117virtual void UnlockRead(MutexMask inMutexMask) const override118{119mBodyManager.UnlockRead(inMutexMask);120}121122virtual void LockWrite(MutexMask inMutexMask) const override123{124mBodyManager.LockWrite(inMutexMask);125}126127virtual void UnlockWrite(MutexMask inMutexMask) const override128{129mBodyManager.UnlockWrite(inMutexMask);130}131};132133JPH_NAMESPACE_END134135136