11 Matrix2D
scale2D(
float x,
float y)
noexcept
13 Matrix3D
scale3D(
float x,
float y,
float z)
noexcept
14 {
auto m =
identity3D();
m.values[0] =
x;
m.values[5] =
y;
m.values[10] =
z;
return m; }
18 m.values[0] =
m.values[4] = std::cos(
angle);
19 m.values[1] = std::sin(
angle);
20 m.values[3] = -
m.values[1];
26 m.values[5] =
m.values[10] = std::cos(
angle);
27 m.values[6] = std::sin(
angle);
m.values[9] = -
m.values[6];
33 m.values[0] =
m.values[10] = std::cos(
angle);
34 m.values[2] = -std::sin(
angle);
m.values[8] = -
m.values[2];
40 m.values[0] =
m.values[5] = std::cos(
angle);
41 m.values[1] = std::sin(
angle);
m.values[4] = -
m.values[1];
44 Matrix2D
osrt(
const data::Sequence2DOriginScaleRotateOffsetAttribute&
value)
noexcept
47 if (
value.scaleX != 1.0F ||
value.scaleY != 1.0F)
54 Matrix3D
osrt(
const data::Sequence3DOriginScaleRotateOffsetAttribute&
value)
noexcept
57 if (
value.scaleX != 1.0F ||
value.scaleY != 1.0F ||
value.scaleZ != 1.0F)
62 if (
value.offsetX != 0.0F ||
value.offsetY != 0.0F ||
value.offsetZ != 0.0F)
68 return std::holds_alternative<data::Sequence2DOffsetAttribute>(
attribute) ||
69 std::holds_alternative<data::Sequence2DMatrixAttribute>(
attribute) ||
70 std::holds_alternative<data::Sequence2DOriginScaleRotateOffsetAttribute>(
attribute);
74 return std::holds_alternative<data::Sequence3DOffsetAttribute>(
attribute) ||
75 std::holds_alternative<data::Sequence3DMatrixAttribute>(
attribute) ||
76 std::holds_alternative<data::Sequence3DOriginScaleRotateOffsetAttribute>(
attribute);
81 std::holds_alternative<data::Sequence2DBoundingBoxAttribute>(
attribute);
86 std::holds_alternative<data::Sequence3DBoundingBoxAttribute>(
attribute) ||
87 std::holds_alternative<data::Sequence3DBoundingSphereAttribute>(
attribute) ||
88 std::holds_alternative<data::Sequence3DMeshChoiceAttribute>(
attribute);
93 std::int32_t second)
noexcept
95 static_cast<float>(
first),
static_cast<float>(second))); }
106 for (std::size_t
row = 0;
row < 3; ++
row)
108 for (std::size_t
k = 0;
k < 3; ++
k)
116 for (std::size_t
row = 0;
row < 4; ++
row)
118 for (std::size_t
k = 0;
k < 4; ++
k)
130 if (
x == 0 &&
y == 0)
return std::monostate{};
135 std::int32_t
x, std::int32_t
y,
136 float scale,
float rotate)
noexcept
145 float x,
float z)
noexcept
147 auto result =
scale3D(scale, scale, scale);
149 if (
x != 0.0F ||
z != 0.0F)
159 std::uint8_t dimensionality{};
160 if (std::holds_alternative<data::SequenceTweekerData>(record.data) ||
161 std::holds_alternative<data::SequencePreloaderData>(record.data))
163 else if (std::holds_alternative<data::SequenceBitmapData>(record.data) ||
164 std::holds_alternative<data::SequenceVideoData>(record.data)) dimensionality = 2;
165 else if (std::holds_alternative<data::SequenceModelData>(record.data) ||
166 std::holds_alternative<data::SequenceMeshData>(record.data)) dimensionality = 3;
170 const auto prefixSize = std::min(attributes.values.size(),
171 attributes.firstChildAttributeIndex.value_or(attributes.values.size()));
176 std::get_if<data::SequenceDimensionalityAttribute>(&
attribute))
186 for (
const auto&
attribute : attributes.values)
188 if (dimensionality == 2)
190 if (
const auto*
value = std::get_if<data::Sequence2DOffsetAttribute>(&
attribute))
192 if (
const auto*
value = std::get_if<data::Sequence2DMatrixAttribute>(&
attribute))
194 if (
const auto*
value = std::get_if<data::Sequence2DOriginScaleRotateOffsetAttribute>(&
attribute))
195 { local =
osrt(*
value); positioned =
true;
break; }
197 else if (dimensionality == 3)
199 if (
const auto*
value = std::get_if<data::Sequence3DOffsetAttribute>(&
attribute))
201 if (
const auto*
value = std::get_if<data::Sequence3DMatrixAttribute>(&
attribute))
203 if (
const auto*
value = std::get_if<data::Sequence3DOriginScaleRotateOffsetAttribute>(&
attribute))
204 { local =
osrt(*
value); positioned =
true;
break; }
207 return {dimensionality, std::move(local), positioned};
214 if (dimensionality == 2)
216 const auto&
own = std::get<Matrix2D>(local);
221 if (dimensionality == 3)
223 const auto&
own = std::get<Matrix3D>(local);
228 return std::monostate{};
235 for (
const auto&
attribute : attributes.values)
237 if (std::holds_alternative<data::SequenceDimensionalityAttribute>(
attribute) ||
238 std::holds_alternative<data::SequenceFileNameAttribute>(
attribute) ||
239 std::holds_alternative<data::SequenceUnsupportedAttribute>(
attribute))
251 std::expected<EvaluatedTweekerTransform, TweekerTransformError>
253 std::uint8_t interpolationType, std::int32_t clock,
256 if (interpolationType > 2)
258 if (interpolationType == 0)
271 const bool linear = interpolationType == 2 && second &&
272 endTime < 1'234'567'890;
273 const float proportion = linear ?
static_cast<float>(clock) /
274 static_cast<float>(endTime) : 0.0F;
275 return std::visit([&](
const auto&
initial)
276 -> std::expected<EvaluatedTweekerTransform, TweekerTransformError>
279 if constexpr (std::is_same_v<Attribute, data::Sequence2DOffsetAttribute>)
284 const auto&
final = std::get<Attribute>(*second);
290 else if constexpr (std::is_same_v<Attribute, data::Sequence2DMatrixAttribute>)
295 const auto&
final = std::get<Attribute>(*second);
296 for (std::size_t
i = 0;
i <
value.values.size(); ++
i)
301 else if constexpr (std::is_same_v<Attribute, data::Sequence2DOriginScaleRotateOffsetAttribute>)
306 const auto&
final = std::get<Attribute>(*second);
317 else if constexpr (std::is_same_v<Attribute, data::Sequence3DOffsetAttribute>)
322 const auto&
final = std::get<Attribute>(*second);
329 else if constexpr (std::is_same_v<Attribute, data::Sequence3DMatrixAttribute>)
334 const auto&
final = std::get<Attribute>(*second);
335 for (std::size_t
i = 0;
i <
value.values.size(); ++
i)
340 else if constexpr (std::is_same_v<Attribute, data::Sequence3DOriginScaleRotateOffsetAttribute>)
345 const auto&
final = std::get<Attribute>(*second);
std::atomic< float > left
std::atomic< float > right
std::variant< SequenceDimensionalityAttribute, Sequence2DOffsetAttribute, Sequence2DMatrixAttribute, Sequence2DOriginScaleRotateOffsetAttribute, Sequence3DOffsetAttribute, Sequence3DMatrixAttribute, Sequence3DOriginScaleRotateOffsetAttribute, Sequence2DBoundingBoxAttribute, Sequence3DBoundingBoxAttribute, Sequence3DBoundingSphereAttribute, Sequence3DMeshChoiceAttribute, SequenceLabelAttribute, SequenceSoundPitchAttribute, SequenceSoundVolumeAttribute, SequenceSoundPanningAttribute, SequenceCameraFieldOfViewAttribute, SequenceFileNameAttribute, SequenceUnsupportedAttribute > LegacySequenceAttribute
std::expected< EvaluatedTweekerTransform, TweekerTransformError > evaluateTweekerTransform(const data::LegacySequenceAttributes &attributes, std::uint8_t interpolationType, std::int32_t clock, std::int32_t endTime, std::uint8_t parentDimensionality) noexcept
Matrix3D moveRySTxzTransform(float yaw, float scale, float x, float z) noexcept
Matrix2D identity2D() noexcept
Matrix2D translate2D(std::int32_t x, std::int32_t y) noexcept
std::variant< std::monostate, Matrix2D, Matrix3D > SequenceTransform
Matrix3D translate3D(float x, float y, float z) noexcept
TweekerKeys selectTweekerKeys(const data::LegacySequenceAttributes &attributes) noexcept
Matrix2D moveXYSRTransform(std::int32_t x, std::int32_t y, float scale, float rotate) noexcept
SequenceTransform composeSequenceWorld(const SequenceTransform &local, std::uint8_t dimensionality, const SequenceTransform &parentWorld, std::uint8_t parentDimensionality) noexcept
Matrix3D identity3D() noexcept
SequenceTransform moveXYTransform(std::int32_t x, std::int32_t y) noexcept
InitialSequenceTransform initialSequenceTransform(const data::LegacySequenceRecord &record, const data::LegacySequenceAttributes &attributes, std::uint8_t parentDimensionality) noexcept
Matrix2D multiply(const Matrix2D &left, const Matrix2D &right) noexcept
std::array< float, 9 > values
std::array< float, 16 > values
const data::LegacySequenceAttribute * first