SoftBodyCreationSettings.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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, mVertexRadius)
  26. JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mUpdatePosition)
  27. JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mMakeRotationIdentity)
  28. JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mAllowSleeping)
  29. JPH_ADD_ATTRIBUTE(SoftBodyCreationSettings, mFacesDoubleSided)
  30. }
  31. void SoftBodyCreationSettings::SaveBinaryState(StreamOut &inStream) const
  32. {
  33. inStream.Write(mPosition);
  34. inStream.Write(mRotation);
  35. inStream.Write(mUserData);
  36. inStream.Write(mObjectLayer);
  37. mCollisionGroup.SaveBinaryState(inStream);
  38. inStream.Write(mNumIterations);
  39. inStream.Write(mLinearDamping);
  40. inStream.Write(mMaxLinearVelocity);
  41. inStream.Write(mRestitution);
  42. inStream.Write(mFriction);
  43. inStream.Write(mPressure);
  44. inStream.Write(mGravityFactor);
  45. inStream.Write(mVertexRadius);
  46. inStream.Write(mUpdatePosition);
  47. inStream.Write(mMakeRotationIdentity);
  48. inStream.Write(mAllowSleeping);
  49. inStream.Write(mFacesDoubleSided);
  50. }
  51. void SoftBodyCreationSettings::RestoreBinaryState(StreamIn &inStream)
  52. {
  53. inStream.Read(mPosition);
  54. inStream.Read(mRotation);
  55. inStream.Read(mUserData);
  56. inStream.Read(mObjectLayer);
  57. mCollisionGroup.RestoreBinaryState(inStream);
  58. inStream.Read(mNumIterations);
  59. inStream.Read(mLinearDamping);
  60. inStream.Read(mMaxLinearVelocity);
  61. inStream.Read(mRestitution);
  62. inStream.Read(mFriction);
  63. inStream.Read(mPressure);
  64. inStream.Read(mGravityFactor);
  65. inStream.Read(mVertexRadius);
  66. inStream.Read(mUpdatePosition);
  67. inStream.Read(mMakeRotationIdentity);
  68. inStream.Read(mAllowSleeping);
  69. inStream.Read(mFacesDoubleSided);
  70. }
  71. void SoftBodyCreationSettings::SaveWithChildren(StreamOut &inStream, SharedSettingsToIDMap *ioSharedSettingsMap, MaterialToIDMap *ioMaterialMap, GroupFilterToIDMap *ioGroupFilterMap) const
  72. {
  73. // Save creation settings
  74. SaveBinaryState(inStream);
  75. // Save shared settings
  76. if (ioSharedSettingsMap != nullptr && ioMaterialMap != nullptr)
  77. mSettings->SaveWithMaterials(inStream, *ioSharedSettingsMap, *ioMaterialMap);
  78. else
  79. inStream.Write(~uint32(0));
  80. // Save group filter
  81. StreamUtils::SaveObjectReference(inStream, mCollisionGroup.GetGroupFilter(), ioGroupFilterMap);
  82. }
  83. SoftBodyCreationSettings::SBCSResult SoftBodyCreationSettings::sRestoreWithChildren(StreamIn &inStream, IDToSharedSettingsMap &ioSharedSettingsMap, IDToMaterialMap &ioMaterialMap, IDToGroupFilterMap &ioGroupFilterMap)
  84. {
  85. SBCSResult result;
  86. // Read creation settings
  87. SoftBodyCreationSettings settings;
  88. settings.RestoreBinaryState(inStream);
  89. if (inStream.IsEOF() || inStream.IsFailed())
  90. {
  91. result.SetError("Error reading body creation settings");
  92. return result;
  93. }
  94. // Read shared settings
  95. SoftBodySharedSettings::SettingsResult settings_result = SoftBodySharedSettings::sRestoreWithMaterials(inStream, ioSharedSettingsMap, ioMaterialMap);
  96. if (settings_result.HasError())
  97. {
  98. result.SetError(settings_result.GetError());
  99. return result;
  100. }
  101. settings.mSettings = settings_result.Get();
  102. // Read group filter
  103. Result gfresult = StreamUtils::RestoreObjectReference(inStream, ioGroupFilterMap);
  104. if (gfresult.HasError())
  105. {
  106. result.SetError(gfresult.GetError());
  107. return result;
  108. }
  109. settings.mCollisionGroup.SetGroupFilter(gfresult.Get());
  110. result.Set(settings);
  111. return result;
  112. }
  113. JPH_NAMESPACE_END