6#include <PhosphorAnimation/phosphoranimation_export.h>
12#include <QMutexLocker>
77 std::memset(&m_data, 0,
sizeof(m_data));
84 m_data.iAnchorRectInTexture[2] = 1.0f;
85 m_data.iAnchorRectInTexture[3] = 1.0f;
90 return static_cast<int>(
sizeof(m_data));
93 void write(
char* buffer,
int offset)
const override
95 QMutexLocker lock(&m_mutex);
96 std::memcpy(buffer + offset, &m_data,
sizeof(m_data));
101 return m_dirty.load(std::memory_order_acquire);
106 m_dirty.store(
false, std::memory_order_release);
138 QMutexLocker lock(&m_mutex);
139 if (m_data.iSurfaceScreenPos[0] == pos.x() && m_data.iSurfaceScreenPos[1] == pos.y()
140 && m_data.iSurfaceScreenPos[2] == pos.z() && m_data.iSurfaceScreenPos[3] == pos.w()) {
143 m_data.iSurfaceScreenPos[0] =
static_cast<float>(pos.x());
144 m_data.iSurfaceScreenPos[1] =
static_cast<float>(pos.y());
145 m_data.iSurfaceScreenPos[2] =
static_cast<float>(pos.z());
146 m_data.iSurfaceScreenPos[3] =
static_cast<float>(pos.w());
147 m_dirty.store(
true, std::memory_order_release);
164 QMutexLocker lock(&m_mutex);
165 const float w =
static_cast<float>(size.width());
166 const float h =
static_cast<float>(size.height());
167 if (m_data.iAnchorSize[0] == w && m_data.iAnchorSize[1] == h) {
170 m_data.iAnchorSize[0] = w;
171 m_data.iAnchorSize[1] = h;
172 m_dirty.store(
true, std::memory_order_release);
201 QMutexLocker lock(&m_mutex);
202 const float x =
static_cast<float>(pos.x());
203 const float y =
static_cast<float>(pos.y());
204 if (m_data.iAnchorPosInFbo[0] == x && m_data.iAnchorPosInFbo[1] == y) {
207 m_data.iAnchorPosInFbo[0] = x;
208 m_data.iAnchorPosInFbo[1] = y;
209 m_dirty.store(
true, std::memory_order_release);
228 QMutexLocker lock(&m_mutex);
229 if (m_data.iAnchorRectInTexture[0] == rect.x() && m_data.iAnchorRectInTexture[1] == rect.y()
230 && m_data.iAnchorRectInTexture[2] == rect.z() && m_data.iAnchorRectInTexture[3] == rect.w()) {
233 m_data.iAnchorRectInTexture[0] =
static_cast<float>(rect.x());
234 m_data.iAnchorRectInTexture[1] =
static_cast<float>(rect.y());
235 m_data.iAnchorRectInTexture[2] =
static_cast<float>(rect.z());
236 m_data.iAnchorRectInTexture[3] =
static_cast<float>(rect.w());
237 m_dirty.store(
true, std::memory_order_release);
248 struct alignas(16) AnimationExtensionData
250 float iSurfaceScreenPos[4];
251 float iAnchorSize[2];
252 float iAnchorPosInFbo[2];
256 float iAnchorRectInTexture[4];
261 static_assert(
sizeof(AnimationExtensionData) == 48,
262 "AnimationExtensionData must be exactly 48 bytes — std140 vec4-aligned, no trailing pad");
264 "BaseUniforms + AnimationExtensionData must total 720 bytes — matches the trailing-field "
265 "layout declared in data/animations/shared/animation_uniforms.glsl");
267 "BaseUniforms must remain at 672 bytes — growing it shifts ZoneUniformExtension's "
268 "zoneRects offset and breaks every zone shader compiled against `data/overlays/shared/"
269 "common.glsl`. AnimationUniformExtension exists precisely to avoid that growth.");
271 AnimationExtensionData m_data;
272 mutable QMutex m_mutex;
273 std::atomic<bool> m_dirty{
true};
Definition AnimatedValue.h:32