SoftBodyCreationSettings.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2023 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #pragma once
  5. #include <Jolt/Physics/SoftBody/SoftBodySharedSettings.h>
  6. #include <Jolt/Physics/Collision/ObjectLayer.h>
  7. #include <Jolt/Physics/Collision/CollisionGroup.h>
  8. #include <Jolt/ObjectStream/SerializableObject.h>
  9. #include <Jolt/Core/StreamUtils.h>
  10. JPH_NAMESPACE_BEGIN
  11. /// This class contains the information needed to create a soft body object
  12. /// Note: Soft bodies are still in development and come with several caveats. Read the Architecture and API documentation for more information!
  13. class JPH_EXPORT SoftBodyCreationSettings
  14. {
  15. JPH_DECLARE_SERIALIZABLE_NON_VIRTUAL(JPH_EXPORT, SoftBodyCreationSettings)
  16. public:
  17. /// Constructor
  18. SoftBodyCreationSettings() = default;
  19. SoftBodyCreationSettings(const SoftBodySharedSettings *inSettings, RVec3Arg inPosition, QuatArg inRotation, ObjectLayer inObjectLayer) : mSettings(inSettings), mPosition(inPosition), mRotation(inRotation), mObjectLayer(inObjectLayer) { }
  20. /// Saves the state of this object in binary form to inStream. Doesn't store the shared settings nor the group filter.
  21. void SaveBinaryState(StreamOut &inStream) const;
  22. /// Restore the state of this object from inStream. Doesn't restore the shared settings nor the group filter.
  23. void RestoreBinaryState(StreamIn &inStream);
  24. using GroupFilterToIDMap = StreamUtils::ObjectToIDMap<GroupFilter>;
  25. using IDToGroupFilterMap = StreamUtils::IDToObjectMap<GroupFilter>;
  26. using SharedSettingsToIDMap = SoftBodySharedSettings::SharedSettingsToIDMap;
  27. using IDToSharedSettingsMap = SoftBodySharedSettings::IDToSharedSettingsMap;
  28. using MaterialToIDMap = StreamUtils::ObjectToIDMap<PhysicsMaterial>;
  29. using IDToMaterialMap = StreamUtils::IDToObjectMap<PhysicsMaterial>;
  30. /// Save this body creation settings, its shared settings and group filter. Pass in an empty map in ioSharedSettingsMap / ioMaterialMap / ioGroupFilterMap or reuse the same map while saving multiple shapes to the same stream in order to avoid writing duplicates.
  31. /// Pass nullptr to ioSharedSettingsMap and ioMaterial map to skip saving shared settings and materials
  32. /// Pass nullptr to ioGroupFilterMap to skip saving group filters
  33. void SaveWithChildren(StreamOut &inStream, SharedSettingsToIDMap *ioSharedSettingsMap, MaterialToIDMap *ioMaterialMap, GroupFilterToIDMap *ioGroupFilterMap) const;
  34. using SBCSResult = Result<SoftBodyCreationSettings>;
  35. /// Restore a shape, all its children and materials. Pass in an empty map in ioSharedSettingsMap / ioMaterialMap / ioGroupFilterMap or reuse the same map while reading multiple shapes from the same stream in order to restore duplicates.
  36. static SBCSResult sRestoreWithChildren(StreamIn &inStream, IDToSharedSettingsMap &ioSharedSettingsMap, IDToMaterialMap &ioMaterialMap, IDToGroupFilterMap &ioGroupFilterMap);
  37. RefConst<SoftBodySharedSettings> mSettings; ///< Defines the configuration of this soft body
  38. RVec3 mPosition { RVec3::sZero() }; ///< Initial position of the soft body
  39. Quat mRotation { Quat::sIdentity() }; ///< Initial rotation of the soft body
  40. /// User data value (can be used by application)
  41. uint64 mUserData = 0;
  42. ///@name Collision settings
  43. ObjectLayer mObjectLayer = 0; ///< The collision layer this body belongs to (determines if two objects can collide)
  44. CollisionGroup mCollisionGroup; ///< The collision group this body belongs to (determines if two objects can collide)
  45. uint32 mNumIterations = 5; ///< Number of solver iterations
  46. float mLinearDamping = 0.1f; ///< Linear damping: dv/dt = -mLinearDamping * v
  47. float mMaxLinearVelocity = 500.0f; ///< Maximum linear velocity that a vertex can reach (m/s)
  48. float mRestitution = 0.0f; ///< Restitution when colliding
  49. float mFriction = 0.2f; ///< Friction coefficient when colliding
  50. float mPressure = 0.0f; ///< n * R * T, amount of substance * ideal gas constant * absolute temperature, see https://en.wikipedia.org/wiki/Pressure
  51. float mGravityFactor = 1.0f; ///< Value to multiply gravity with for this body
  52. float mVertexRadius = 0.0f; ///< How big the particles are, can be used to push the vertices a little bit away from the surface of other bodies to prevent z-fighting
  53. bool mUpdatePosition = true; ///< Update the position of the body while simulating (set to false for something that is attached to the static world)
  54. bool mMakeRotationIdentity = true; ///< Bake specified mRotation in the vertices and set the body rotation to identity (simulation is slightly more accurate if the rotation of a soft body is kept to identity)
  55. bool mAllowSleeping = true; ///< If this body can go to sleep or not
  56. bool mFacesDoubleSided = false; ///< If the faces in this soft body should be treated as double sided for the purpose of collision detection (ray cast / collide shape / cast shape)
  57. };
  58. JPH_NAMESPACE_END