6#include <PhosphorAnimation/phosphoranimation_export.h>
12#include <QMutexLocker>
72 std::memset(&m_data, 0,
sizeof(m_data));
79 m_data.iAnchorRectInTexture[2] = 1.0f;
80 m_data.iAnchorRectInTexture[3] = 1.0f;
85 return static_cast<int>(
sizeof(m_data));
88 void write(
char* buffer,
int offset)
const override
90 QMutexLocker lock(&m_mutex);
91 std::memcpy(buffer + offset, &m_data,
sizeof(m_data));
96 return m_dirty.load(std::memory_order_acquire);
101 m_dirty.store(
false, std::memory_order_release);
132 QMutexLocker lock(&m_mutex);
133 if (m_data.iSurfaceScreenPos[0] == pos.x() && m_data.iSurfaceScreenPos[1] == pos.y()
134 && m_data.iSurfaceScreenPos[2] == pos.z() && m_data.iSurfaceScreenPos[3] == pos.w()) {
137 m_data.iSurfaceScreenPos[0] =
static_cast<float>(pos.x());
138 m_data.iSurfaceScreenPos[1] =
static_cast<float>(pos.y());
139 m_data.iSurfaceScreenPos[2] =
static_cast<float>(pos.z());
140 m_data.iSurfaceScreenPos[3] =
static_cast<float>(pos.w());
141 m_dirty.store(
true, std::memory_order_release);
157 QMutexLocker lock(&m_mutex);
158 const float w =
static_cast<float>(size.width());
159 const float h =
static_cast<float>(size.height());
160 if (m_data.iAnchorSize[0] == w && m_data.iAnchorSize[1] == h) {
163 m_data.iAnchorSize[0] = w;
164 m_data.iAnchorSize[1] = h;
165 m_dirty.store(
true, std::memory_order_release);
194 QMutexLocker lock(&m_mutex);
195 const float x =
static_cast<float>(pos.x());
196 const float y =
static_cast<float>(pos.y());
197 if (m_data.iAnchorPosInFbo[0] == x && m_data.iAnchorPosInFbo[1] == y) {
200 m_data.iAnchorPosInFbo[0] = x;
201 m_data.iAnchorPosInFbo[1] = y;
202 m_dirty.store(
true, std::memory_order_release);
221 QMutexLocker lock(&m_mutex);
222 if (m_data.iAnchorRectInTexture[0] == rect.x() && m_data.iAnchorRectInTexture[1] == rect.y()
223 && m_data.iAnchorRectInTexture[2] == rect.z() && m_data.iAnchorRectInTexture[3] == rect.w()) {
226 m_data.iAnchorRectInTexture[0] =
static_cast<float>(rect.x());
227 m_data.iAnchorRectInTexture[1] =
static_cast<float>(rect.y());
228 m_data.iAnchorRectInTexture[2] =
static_cast<float>(rect.z());
229 m_data.iAnchorRectInTexture[3] =
static_cast<float>(rect.w());
230 m_dirty.store(
true, std::memory_order_release);
241 struct alignas(16) AnimationExtensionData
243 float iSurfaceScreenPos[4];
244 float iAnchorSize[2];
245 float iAnchorPosInFbo[2];
249 float iAnchorRectInTexture[4];
254 static_assert(
sizeof(AnimationExtensionData) == 48,
255 "AnimationExtensionData must be exactly 48 bytes — std140 vec4-aligned, no trailing pad");
257 "BaseUniforms + AnimationExtensionData must total 720 bytes — matches the trailing-field "
258 "layout declared in data/animations/shared/animation_uniforms.glsl");
260 "BaseUniforms must remain at 672 bytes — growing it shifts ZoneUniformExtension's "
261 "zoneRects offset and breaks every zone shader compiled against `data/shaders/shared/"
262 "common.glsl`. AnimationUniformExtension exists precisely to avoid that growth.");
264 AnimationExtensionData m_data;
265 mutable QMutex m_mutex;
266 std::atomic<bool> m_dirty{
true};
Definition AnimatedValue.h:31