Wavelength
Privacy-focused, cross-platform, and open-source communication application
Loading...
Searching...
No Matches
blob_physics.h
Go to the documentation of this file.
1#ifndef BLOBPHYSICS_H
2#define BLOBPHYSICS_H
3
4#include <QThreadPool>
5#include <QVector2D>
6#include <vector>
7
8class QPointF;
9
10namespace BlobConfig {
11 struct PhysicsParameters;
12 struct BlobParameters;
13}
14
25public:
31
43 static void InitializeBlob(std::vector<QPointF> &control_points,
44 std::vector<QPointF> &target_points,
45 std::vector<QPointF> &velocity,
46 QPointF &blob_center,
47 const BlobConfig::BlobParameters &params,
48 int width, int height);
49
61 static void UpdatePhysicsOptimized(std::vector<QPointF> &control_points, const std::vector<QPointF> &target_points,
62 std::vector<QPointF> &velocity, const QPointF &blob_center,
63 const BlobConfig::BlobParameters &params,
64 const BlobConfig::PhysicsParameters &physics_params);
65
78 void UpdatePhysicsParallel(std::vector<QPointF> &control_points, std::vector<QPointF> &target_points,
79 std::vector<QPointF> &velocity, const QPointF &blob_center,
80 const BlobConfig::BlobParameters &params,
81 const BlobConfig::PhysicsParameters &physics_params);
82
94 static void UpdatePhysics(std::vector<QPointF> &control_points,
95 const std::vector<QPointF> &target_points,
96 std::vector<QPointF> &velocity,
97 const QPointF &blob_center,
98 const BlobConfig::BlobParameters &params,
99 const BlobConfig::PhysicsParameters &physics_params);
100
112 static void HandleBorderCollisions(std::vector<QPointF> &control_points,
113 std::vector<QPointF> &velocity,
114 QPointF &blob_center,
115 int width, int height,
116 double restitution,
117 int padding);
118
127 static void ConstrainNeighborDistances(std::vector<QPointF> &control_points,
128 std::vector<QPointF> &velocity,
129 double min_distance,
130 double max_distance);
131
137 static void SmoothBlobShape(std::vector<QPointF> &control_points);
138
147 static void StabilizeBlob(std::vector<QPointF> &control_points,
148 const QPointF &blob_center,
149 double blob_radius,
150 double stabilization_rate);
151
161 static bool ValidateAndRepairControlPoints(std::vector<QPointF> &control_points,
162 std::vector<QPointF> &velocity,
163 const QPointF &blob_center,
164 double blob_radius);
165
172 QVector2D CalculateWindowVelocity(const QPointF &current_position);
173
178 void SetLastWindowPos(const QPointF &position);
179
184 [[nodiscard]] QPointF GetLastWindowPos() const;
185
190 [[nodiscard]] QVector2D GetLastWindowVelocity() const;
191
192private:
194 QElapsedTimer physics_timer_;
200 QThreadPool thread_pool_;
201};
202
203#endif // BLOBPHYSICS_H
BlobPhysics()
Constructs a BlobPhysics object. Initializes the internal thread pool and starts the physics timer.
Definition blob_physics.cpp:12
void SetLastWindowPos(const QPointF &position)
Sets the last known position of the window. Used by CalculateWindowVelocity.
Definition blob_physics.cpp:660
void UpdatePhysicsParallel(std::vector< QPointF > &control_points, std::vector< QPointF > &target_points, std::vector< QPointF > &velocity, const QPointF &blob_center, const BlobConfig::BlobParameters &params, const BlobConfig::PhysicsParameters &physics_params)
Updates the blob physics using QtConcurrent for parallel processing across multiple threads....
Definition blob_physics.cpp:157
QVector2D last_window_velocity_
Stores the last calculated window velocity.
Definition blob_physics.h:198
static void InitializeBlob(std::vector< QPointF > &control_points, std::vector< QPointF > &target_points, std::vector< QPointF > &velocity, QPointF &blob_center, const BlobConfig::BlobParameters &params, int width, int height)
Initializes the blob's state vectors (control points, target points, velocity) and center position....
Definition blob_physics.cpp:17
QThreadPool thread_pool_
Thread pool used for parallel physics updates (UpdatePhysicsParallel).
Definition blob_physics.h:200
static bool ValidateAndRepairControlPoints(std::vector< QPointF > &control_points, std::vector< QPointF > &velocity, const QPointF &blob_center, double blob_radius)
Checks if any control points or velocities contain invalid values (NaN, infinity)....
Definition blob_physics.cpp:598
QVector2D CalculateWindowVelocity(const QPointF &current_position)
Calculates the approximate velocity of the window based on position changes over time....
Definition blob_physics.cpp:631
static void UpdatePhysicsOptimized(std::vector< QPointF > &control_points, const std::vector< QPointF > &target_points, std::vector< QPointF > &velocity, const QPointF &blob_center, const BlobConfig::BlobParameters &params, const BlobConfig::PhysicsParameters &physics_params)
Updates the blob physics using an optimized Structure-of-Arrays (SoA) approach with OpenMP paralleliz...
Definition blob_physics.cpp:34
static void UpdatePhysics(std::vector< QPointF > &control_points, const std::vector< QPointF > &target_points, std::vector< QPointF > &velocity, const QPointF &blob_center, const BlobConfig::BlobParameters &params, const BlobConfig::PhysicsParameters &physics_params)
Updates the blob physics using a standard sequential approach. Iterates through each control point,...
Definition blob_physics.cpp:385
QPointF last_window_position_
Stores the last known window position for velocity calculation.
Definition blob_physics.h:196
QPointF GetLastWindowPos() const
Gets the last recorded window position.
Definition blob_physics.cpp:664
QElapsedTimer physics_timer_
Timer used for calculating delta time in velocity calculations.
Definition blob_physics.h:194
QVector2D GetLastWindowVelocity() const
Gets the last calculated window velocity.
Definition blob_physics.cpp:668
static void SmoothBlobShape(std::vector< QPointF > &control_points)
Applies a smoothing filter to the blob's shape. Moves each control point slightly towards the average...
Definition blob_physics.cpp:533
static void ConstrainNeighborDistances(std::vector< QPointF > &control_points, std::vector< QPointF > &velocity, double min_distance, double max_distance)
Enforces minimum and maximum distance constraints between neighboring control points....
Definition blob_physics.cpp:500
static void HandleBorderCollisions(std::vector< QPointF > &control_points, std::vector< QPointF > &velocity, QPointF &blob_center, int width, int height, double restitution, int padding)
Handles collisions between blob control points and the widget borders. Adjusts positions and reverses...
Definition blob_physics.cpp:463
static void StabilizeBlob(std::vector< QPointF > &control_points, const QPointF &blob_center, double blob_radius, double stabilization_rate)
Gradually moves control points towards an ideal circular/organic shape when the blob is idle....
Definition blob_physics.cpp:551
Namespace containing configuration structures and enums for the Blob animation.
Definition blob_config.h:12
Structure holding parameters related to the blob's visual appearance and basic geometry.
Definition blob_config.h:25
Structure holding parameters controlling the physics simulation of the blob.
Definition blob_config.h:51