SoftBodyCreationSettings.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2023 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #include <Jolt/Jolt.h>
  5. #include <Jolt/Physics/SoftBody/SoftBodyCreationSettings.h>
  6. #include <Jolt/ObjectStream/TypeDeclarations.h>
  7. #include <Jolt/Core/StreamIn.h>
  8. #include <Jolt/Core/StreamOut.h>
  9. JPH_NAMESPACE_BEGIN
  10. JPH_IMPLEMENT_SERIALIZABLE_NON_VIRTUAL(SoftBodyCreationSettings)
  11. {
  12. JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mSettings)
  13. JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mPosition)
  14. JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mRotation)
  15. JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mUserData)
  16. JPH_ADD_ENUM_ATTRIBUTE(SoftBodyCreationSettings, mObjectLayer)
  17. JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mCollisionGroup)
  18. JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mNumIterations)
  19. JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mLinearDamping)
  20. JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mMaxLinearVelocity)
  21. JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mRestitution)
  22. JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mFriction)
  23. JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mPressure)
  24. JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mGravityFactor)
  25. JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mUpdatePosition)
  26. JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mMakeRotationIdentity)
  27. JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mAllowSleeping)
  28. }
  29. void SoftBodyCreationSettings::SaveBinaryState(StreamOut &inStream) const
  30. {
  31. inStream.Write(mPosition);
  32. inStream.Write(mRotation);
  33. inStream.Write(mUserData);
  34. inStream.Write(mObjectLayer);
  35. mCollisionGroup.SaveBinaryState(inStream);
  36. inStream.Write(mNumIterations);
  37. inStream.Write(mLinearDamping);
  38. inStream.Write(mMaxLinearVelocity);
  39. inStream.Write(mRestitution);
  40. inStream.Write(mFriction);
  41. inStream.Write(mPressure);
  42. inStream.Write(mGravityFactor);
  43. inStream.Write(mUpdatePosition);
  44. inStream.Write(mMakeRotationIdentity);
  45. inStream.Write(mAllowSleeping);
  46. }
  47. void SoftBodyCreationSettings::RestoreBinaryState(StreamIn &inStream)
  48. {
  49. inStream.Read(mPosition);
  50. inStream.Read(mRotation);
  51. inStream.Read(mUserData);
  52. inStream.Read(mObjectLayer);
  53. mCollisionGroup.RestoreBinaryState(inStream);
  54. inStream.Read(mNumIterations);
  55. inStream.Read(mLinearDamping);
  56. inStream.Read(mMaxLinearVelocity);
  57. inStream.Read(mRestitution);
  58. inStream.Read(mFriction);
  59. inStream.Read(mPressure);
  60. inStream.Read(mGravityFactor);
  61. inStream.Read(mUpdatePosition);
  62. inStream.Read(mMakeRotationIdentity);
  63. inStream.Read(mAllowSleeping);
  64. }
  65. void SoftBodyCreationSettings::SaveWithChildren(StreamOut &inStream, SharedSettingsToIDMap *ioSharedSettingsMap, MaterialToIDMap *ioMaterialMap, GroupFilterToIDMap *ioGroupFilterMap) const
  66. {
  67. // Save creation settings
  68. SaveBinaryState(inStream);
  69. // Save shared settings
  70. if (ioSharedSettingsMap != nullptr && ioMaterialMap != nullptr)
  71. mSettings->SaveWithMaterials(inStream, *ioSharedSettingsMap, *ioMaterialMap);
  72. else
  73. inStream.Write(~uint32(0));
  74. // Save group filter
  75. StreamUtils::SaveObjectReference(inStream, mCollisionGroup.GetGroupFilter(), ioGroupFilterMap);
  76. }
  77. SoftBodyCreationSettings::SBCSResult SoftBodyCreationSettings::sRestoreWithChildren(StreamIn &inStream, IDToSharedSettingsMap &ioSharedSettingsMap, IDToMaterialMap &ioMaterialMap, IDToGroupFilterMap &ioGroupFilterMap)
  78. {
  79. SBCSResult result;
  80. // Read creation settings
  81. SoftBodyCreationSettings settings;
  82. settings.RestoreBinaryState(inStream);
  83. if (inStream.IsEOF() || inStream.IsFailed())
  84. {
  85. result.SetError("Error reading body creation settings");
  86. return result;
  87. }
  88. // Read shared settings
  89. SoftBodySharedSettings::SettingsResult settings_result = SoftBodySharedSettings::sRestoreWithMaterials(inStream, ioSharedSettingsMap, ioMaterialMap);
  90. if (settings_result.HasError())
  91. {
  92. result.SetError(settings_result.GetError());
  93. return result;
  94. }
  95. settings.mSettings = settings_result.Get();
  96. // Read group filter
  97. Result gfresult = StreamUtils::RestoreObjectReference(inStream, ioGroupFilterMap);
  98. if (gfresult.HasError())
  99. {
  100. result.SetError(gfresult.GetError());
  101. return result;
  102. }
  103. settings.mCollisionGroup.SetGroupFilter(gfresult.Get());
  104. result.Set(settings);
  105. return result;
  106. }
  107. JPH_NAMESPACE_END