BodyAccess.h 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #pragma once
  5. #ifdef JPH_ENABLE_ASSERTS
  6. JPH_NAMESPACE_BEGIN
  7. class JPH_EXPORT BodyAccess
  8. {
  9. public:
  10. /// Access rules, used to detect race conditions during simulation
  11. enum class EAccess : uint8
  12. {
  13. None = 0,
  14. Read = 1,
  15. ReadWrite = 3,
  16. };
  17. /// Grant a scope specific access rights on the current thread
  18. class Grant
  19. {
  20. public:
  21. inline Grant(EAccess inVelocity, EAccess inPosition)
  22. {
  23. EAccess &velocity = sVelocityAccess();
  24. EAccess &position = sPositionAccess();
  25. JPH_ASSERT(velocity == EAccess::ReadWrite);
  26. JPH_ASSERT(position == EAccess::ReadWrite);
  27. velocity = inVelocity;
  28. position = inPosition;
  29. }
  30. inline ~Grant()
  31. {
  32. sVelocityAccess() = EAccess::ReadWrite;
  33. sPositionAccess() = EAccess::ReadWrite;
  34. }
  35. };
  36. /// Check if we have permission
  37. static inline bool sCheckRights(EAccess inRights, EAccess inDesiredRights)
  38. {
  39. return (uint8(inRights) & uint8(inDesiredRights)) == uint8(inDesiredRights);
  40. }
  41. /// Access to read/write velocities
  42. static inline EAccess & sVelocityAccess()
  43. {
  44. static thread_local EAccess sAccess = BodyAccess::EAccess::ReadWrite;
  45. return sAccess;
  46. }
  47. /// Access to read/write positions
  48. static inline EAccess & sPositionAccess()
  49. {
  50. static thread_local EAccess sAccess = BodyAccess::EAccess::ReadWrite;
  51. return sAccess;
  52. }
  53. };
  54. JPH_NAMESPACE_END
  55. #endif // JPH_ENABLE_ASSERTS