2
0

LinearCurve.cpp 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #include <Jolt/Jolt.h>
  4. #include <Jolt/Core/LinearCurve.h>
  5. #include <Jolt/Core/StreamIn.h>
  6. #include <Jolt/Core/StreamOut.h>
  7. #include <Jolt/ObjectStream/TypeDeclarations.h>
  8. JPH_NAMESPACE_BEGIN
  9. JPH_IMPLEMENT_SERIALIZABLE_NON_VIRTUAL(LinearCurve::Point)
  10. {
  11. JPH_ADD_ATTRIBUTE(Point, mX)
  12. JPH_ADD_ATTRIBUTE(Point, mY)
  13. }
  14. JPH_IMPLEMENT_SERIALIZABLE_NON_VIRTUAL(LinearCurve)
  15. {
  16. JPH_ADD_ATTRIBUTE(LinearCurve, mPoints)
  17. }
  18. float LinearCurve::GetValue(float inX) const
  19. {
  20. if (mPoints.empty())
  21. return 0.0f;
  22. Points::const_iterator i2 = lower_bound(mPoints.begin(), mPoints.end(), inX, [](const Point &inPoint, float inValue) { return inPoint.mX < inValue; });
  23. if (i2 == mPoints.begin())
  24. return mPoints.front().mY;
  25. else if (i2 == mPoints.end())
  26. return mPoints.back().mY;
  27. Points::const_iterator i1 = i2 - 1;
  28. return i1->mY + (inX - i1->mX) * (i2->mY - i1->mY) / (i2->mX - i1->mX);
  29. }
  30. void LinearCurve::SaveBinaryState(StreamOut &inStream) const
  31. {
  32. inStream.Write(mPoints);
  33. }
  34. void LinearCurve::RestoreBinaryState(StreamIn &inStream)
  35. {
  36. inStream.Read(mPoints);
  37. }
  38. JPH_NAMESPACE_END