14 const TokenPose&
left,
const TokenPose&
right)
noexcept
21 const rules::GameState&
state,
22 const PieceShadowDisplayContext& context,
25 if (!context.boardVisible || !context.lightingOn ||
26 !context.game3DOn || player >=
state.numberOfPlayers)
29 if (context.paddywagonPlayer == player &&
30 context.goingToJailStatus == 8)
33 const auto square =
state.players[player].currentSquare;
35 (player == context.currentUIPlayer &&
36 context.currentPlayerTokenSequenceActive);
40 const TokenPose&
pose)
noexcept
52 for (
auto&
pose : poses_)
pose.reset();
62 std::expected<PieceShadowDisplayUpdate, std::string>
75 std::array<Desired, rules::MaxPlayers>
desired{};
88 const auto token =
state.players[player].token;
90 return std::unexpected(
"piece shadow token is outside legacy range");
94 return std::unexpected(
"piece shadow sequence tag overflow");
101 player,
state.numberOfPlayers,
104 if (shown_[player] !=
target.id)
106 else if (!poses_[player] || !
samePose(*poses_[player],
target.pose))
111 playback.commands().pendingCount() >
113 return std::unexpected(
"piece shadow command queue capacity exceeded");
119 const auto priority =
static_cast<std::uint16_t
>(
127 if (!stopped)
return std::unexpected(stopped.error());
129 poses_[player].reset();
135 if (shown_[player] !=
target.id)
137 const std::optional<data::DataId>
previous =
139 std::optional<data::DataId>(shown_[player]);
145 shown_[player] =
target.id;
146 poses_[player] =
target.pose;
153 if (!moved)
return std::unexpected(moved.error());
154 poses_[player] =
target.pose;
std::atomic< float > left
std::atomic< float > right
data::DataId shownSequence(rules::PlayerNumber player) const noexcept
std::expected< PieceShadowDisplayUpdate, std::string > sync(const rules::GameState &state, const PieceShadowDisplayContext &context, engine::SequencePlayback &playback)
TokenPose locate(rules::PlayerNumber player, rules::PlayerNumber numberOfPlayers, const TokenRuntimeSources &sources, const sequence::SequenceRuntime &runtime) noexcept
static constexpr std::size_t Capacity
constexpr DataId EmptyDataId
constexpr DataId packDataId(std::uint16_t group, DataTag tag) noexcept
constexpr std::uint16_t ShadowPriorityBase
constexpr data::DataTag ShadowSequenceBaseTag
constexpr float ShadowGroundY
std::uint8_t PlayerNumber
constexpr std::size_t MaxTokens
constexpr PlayerNumber MaxPlayers
Matrix3D moveRySTxzTransform(float yaw, float scale, float x, float z) noexcept
TokenRuntimeSources runtimeSources