Constraint.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #include <Jolt/Jolt.h>
  5. #include <Jolt/Physics/Constraints/Constraint.h>
  6. #include <Jolt/Physics/StateRecorder.h>
  7. #include <Jolt/ObjectStream/TypeDeclarations.h>
  8. #include <Jolt/Core/StreamIn.h>
  9. #include <Jolt/Core/StreamOut.h>
  10. #include <Jolt/Core/Factory.h>
  11. JPH_NAMESPACE_BEGIN
  12. JPH_IMPLEMENT_SERIALIZABLE_VIRTUAL(ConstraintSettings)
  13. {
  14. JPH_ADD_BASE_CLASS(ConstraintSettings, SerializableObject)
  15. JPH_ADD_ATTRIBUTE(ConstraintSettings, mEnabled)
  16. JPH_ADD_ATTRIBUTE(ConstraintSettings, mDrawConstraintSize)
  17. JPH_ADD_ATTRIBUTE(ConstraintSettings, mNumVelocityStepsOverride)
  18. JPH_ADD_ATTRIBUTE(ConstraintSettings, mNumPositionStepsOverride)
  19. JPH_ADD_ATTRIBUTE(ConstraintSettings, mUserData)
  20. }
  21. void ConstraintSettings::SaveBinaryState(StreamOut &inStream) const
  22. {
  23. inStream.Write(GetRTTI()->GetHash());
  24. inStream.Write(mEnabled);
  25. inStream.Write(mDrawConstraintSize);
  26. inStream.Write(mNumVelocityStepsOverride);
  27. inStream.Write(mNumPositionStepsOverride);
  28. }
  29. void ConstraintSettings::RestoreBinaryState(StreamIn &inStream)
  30. {
  31. // Type hash read by sRestoreFromBinaryState
  32. inStream.Read(mEnabled);
  33. inStream.Read(mDrawConstraintSize);
  34. inStream.Read(mNumVelocityStepsOverride);
  35. inStream.Read(mNumPositionStepsOverride);
  36. }
  37. ConstraintSettings::ConstraintResult ConstraintSettings::sRestoreFromBinaryState(StreamIn &inStream)
  38. {
  39. ConstraintResult result;
  40. // Read the type of the constraint
  41. uint32 hash;
  42. inStream.Read(hash);
  43. if (inStream.IsEOF() || inStream.IsFailed())
  44. {
  45. result.SetError("Failed to read type id");
  46. return result;
  47. }
  48. // Get the RTTI for the shape
  49. const RTTI *rtti = Factory::sInstance->Find(hash);
  50. if (rtti == nullptr)
  51. {
  52. result.SetError("Failed to resolve type. Type not registered in factory?");
  53. return result;
  54. }
  55. // Construct and read the data of the shape
  56. Ref<ConstraintSettings> constraint = reinterpret_cast<ConstraintSettings *>(rtti->CreateObject());
  57. constraint->RestoreBinaryState(inStream);
  58. if (inStream.IsEOF() || inStream.IsFailed())
  59. {
  60. result.SetError("Failed to restore constraint");
  61. return result;
  62. }
  63. result.Set(constraint);
  64. return result;
  65. }
  66. void Constraint::SaveState(StateRecorder &inStream) const
  67. {
  68. inStream.Write(mEnabled);
  69. }
  70. void Constraint::RestoreState(StateRecorder &inStream)
  71. {
  72. inStream.Read(mEnabled);
  73. }
  74. void Constraint::ToConstraintSettings(ConstraintSettings &outSettings) const
  75. {
  76. outSettings.mEnabled = mEnabled;
  77. outSettings.mNumVelocityStepsOverride = mNumVelocityStepsOverride;
  78. outSettings.mNumPositionStepsOverride = mNumPositionStepsOverride;
  79. outSettings.mUserData = mUserData;
  80. #ifdef JPH_DEBUG_RENDERER
  81. outSettings.mDrawConstraintSize = mDrawConstraintSize;
  82. #endif // JPH_DEBUG_RENDERER
  83. }
  84. JPH_NAMESPACE_END