3
0

ClothConstraints.h 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #pragma once
  9. #include <AzCore/std/smart_ptr/unique_ptr.h>
  10. #include <AzCore/Component/EntityId.h>
  11. #include <NvCloth/Types.h>
  12. namespace NvCloth
  13. {
  14. //! Manages motion and separation constraints for cloth.
  15. class ClothConstraints
  16. {
  17. public:
  18. AZ_TYPE_INFO(ClothConstraints, "{EB14ED7C-37FD-4CA3-9137-EC6590712E50}");
  19. static AZStd::unique_ptr<ClothConstraints> Create(
  20. const AZStd::vector<float>& motionConstraintsData,
  21. const float motionConstraintsMaxDistance,
  22. const AZStd::vector<AZ::Vector2>& backstopData,
  23. const float backstopMaxRadius,
  24. const float backstopMaxBackOffset,
  25. const float backstopMaxFrontOffset,
  26. const AZStd::vector<SimParticleFormat>& simParticles,
  27. const AZStd::vector<SimIndexType>& simIndices,
  28. const AZStd::vector<int>& meshRemappedVertices);
  29. ClothConstraints() = default;
  30. void CalculateConstraints(
  31. const AZStd::vector<SimParticleFormat>& simParticles,
  32. const AZStd::vector<SimIndexType>& simIndices);
  33. const AZStd::vector<AZ::Vector4>& GetMotionConstraints() const;
  34. const AZStd::vector<AZ::Vector4>& GetSeparationConstraints() const;
  35. void SetMotionConstraintMaxDistance(float distance);
  36. void SetBackstopMaxRadius(float radius);
  37. void SetBackstopMaxOffsets(float backOffset, float frontOffset);
  38. private:
  39. void CalculateMotionConstraints();
  40. void CalculateSeparationConstraints();
  41. AZ::Vector3 CalculateBackstopSpherePosition(
  42. const AZ::Vector3& position,
  43. const AZ::Vector3& normal,
  44. float offset,
  45. float radius) const;
  46. // Simulation Particles
  47. AZStd::vector<SimParticleFormat> m_simParticles;
  48. // Motion constraints data
  49. AZStd::vector<float> m_motionConstraintsData;
  50. float m_motionConstraintsMaxDistance = 0.0f;
  51. // Backstop data
  52. AZStd::vector<AZ::Vector2> m_backstopData;
  53. float m_backstopMaxRadius = 0.0f;
  54. float m_backstopMaxBackOffset = 0.0f;
  55. float m_backstopMaxFrontOffset = 0.0f;
  56. AZStd::vector<AZ::Vector3> m_normals;
  57. // The current positions and radius of motion constraints.
  58. AZStd::vector<AZ::Vector4> m_motionConstraints;
  59. // The current positions and radius of separation constraints.
  60. AZStd::vector<AZ::Vector4> m_separationConstraints;
  61. };
  62. } // namespace NvCloth