blob: f96e3fb9f9f60e58a1dd621637190f4c2fed33c1 [file] [log] [blame]
#ifndef _RIVE_ELASTIC_SCROLL_PHYSICS_HPP_
#define _RIVE_ELASTIC_SCROLL_PHYSICS_HPP_
#include "rive/generated/constraints/scrolling/elastic_scroll_physics_base.hpp"
#include <stdio.h>
namespace rive
{
class ElasticScrollPhysicsHelper
{
private:
float m_friction = 8.0f;
float m_speedMultiplier = 1.0f;
float m_elasticFactor = 0.66f;
float m_target = 0;
float m_current = 0;
float m_speed = 0;
float m_runRange = 0;
bool m_isRunning = false;
public:
ElasticScrollPhysicsHelper(float friction,
float speedMultiplier,
float elasticFactor)
{
m_friction = friction;
m_speedMultiplier = speedMultiplier;
m_elasticFactor = elasticFactor;
}
bool isRunning() { return m_isRunning; }
float clamp(float range, float value);
void run(float acceleration,
float range,
float value,
std::vector<float> snappingPoints);
float advance(float elapsedSeconds);
};
class ElasticScrollPhysics : public ElasticScrollPhysicsBase
{
private:
ElasticScrollPhysicsHelper* m_physicsX;
ElasticScrollPhysicsHelper* m_physicsY;
public:
bool enabled() override
{
return m_physicsX != nullptr || m_physicsY != nullptr;
}
bool isRunning() override
{
return (m_physicsX != nullptr && m_physicsX->isRunning()) ||
(m_physicsY != nullptr && m_physicsY->isRunning());
}
Vec2D advance(float elapsedSeconds) override;
Vec2D clamp(Vec2D range, Vec2D value) override;
void run(Vec2D range,
Vec2D value,
std::vector<Vec2D> snappingPoints) override;
void prepare(DraggableConstraintDirection dir) override;
void reset() override;
};
} // namespace rive
#endif