Constraint.cpp 2.6 KB

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