14 const TokenPose&
left,
const TokenPose&
right)
noexcept
21 const PieceIdleDisplayContext& context,
24 return context.movingPlayer == player ||
25 context.paddywagonPlayer == player ||
26 context.idleMovingOut == player ||
27 context.idleMovingIn == player;
30 std::expected<std::optional<TokenPose>, std::string>
31 PieceIdleDisplay::desiredPose(
32 const rules::GameState&
state,
34 const PieceIdleDisplayContext& context,
38 return std::unexpected(
"persistent idle player is out of range");
39 if (!context.boardVisible || player >=
state.numberOfPlayers ||
41 return std::optional<TokenPose>{};
44 if (
source.currentSquare >= 41)
45 return std::optional<TokenPose>{};
47 return std::unexpected(
"persistent idle token is out of range");
49 return std::unexpected(
"persistent idle occupancy is not initialized");
55 return std::unexpected(
"persistent center idle square is invalid");
58 const auto square =
source.currentSquare;
59 const auto& slots =
idleState.occupancy()[square];
60 std::optional<std::uint8_t> restingSlot;
63 if (slots[
slot] && *slots[
slot] == player)
67 return std::unexpected(
"persistent resting idle has no occupied slot");
70 square, *restingSlot,
source.token);
72 return std::unexpected(
"persistent resting idle pose is invalid");
80 return shown_[player];
86 for (
auto&
pose : poses_)
pose.reset();
101 const auto priority =
static_cast<std::uint16_t
>(
108 if (!stopped)
return std::unexpected(stopped.error());
110 poses_[player].reset();
120 return std::unexpected(
"persistent idle sequence tag overflow");
124 (*wanted)->yaw, 1.0F, (*wanted)->x, (*wanted)->z);
127 const std::optional<data::DataId>
previous =
129 std::optional<data::DataId>(shown_[player]);
137 poses_[player] = **
wanted;
144 if (!moved)
return std::unexpected(moved.error());
145 poses_[player] = **
wanted;
std::atomic< float > left
std::atomic< float > right
std::shared_ptr< const data::HmdTextureImage > source
data::DataId shownSequence(rules::PlayerNumber player) const noexcept
std::expected< PieceIdleDisplayUpdate, std::string > sync(const rules::GameState &state, const PieceIdleState &idleState, const PieceIdleDisplayContext &context, engine::SequencePlayback &playback)
constexpr DataId EmptyDataId
constexpr DataId packDataId(std::uint16_t group, DataTag tag) noexcept
constexpr std::uint8_t LoopToBeginning
std::optional< TokenPose > tokenOrientation(std::uint8_t boardSquare) noexcept
constexpr std::uint8_t RestingPositionCount
constexpr data::DataTag IdleAnimationsPerToken
constexpr std::uint16_t PersistentIdlePriority
constexpr data::DataTag PersistentIdleBaseTag
std::optional< TokenPose > tokenRestingOrientation(std::uint8_t boardSquare, std::uint8_t restingPosition, std::uint8_t token) noexcept
std::uint8_t PlayerNumber
constexpr std::size_t MaxTokens
constexpr PlayerNumber MaxPlayers
Matrix3D moveRySTxzTransform(float yaw, float scale, float x, float z) noexcept