2
0

SoftBodyCreationSettings.cpp 4.3 KB

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