Monopoly — Portage moderne 0.1.0
Portage moderne C/C++23 du Monopoly de 1999
Loading...
Searching...
No Matches
SequencePlayback.hpp
Go to the documentation of this file.
1#pragma once
2
7#include "TextureCatalog.hpp"
8
9#include <array>
10#include <vector>
11#include <filesystem>
12#include <functional>
13#include <map>
14#include <tuple>
15
16namespace monopoly::engine
17{
18 class MeshGPUCache;
20 {
21 public:
23 std::shared_ptr<const data::ResourceSnapshot> resources,
25 : meshes_(
26 std::move(resources),
27 {},
28 {},
29 std::move(modernMeshResolver)),
30 commands_(runtime_) {}
31
32 [[nodiscard]] std::expected<void, std::string> start(
33 data::DataId id, std::uint16_t priority = 0,
34 std::uint8_t labelOverride = 0);
35 [[nodiscard]] std::expected<void, std::string> startXY(
36 data::DataId id, std::uint16_t priority,
37 std::int32_t x, std::int32_t y, bool dropFrames = false,
38 std::uint8_t labelOverride = 0);
39 [[nodiscard]] std::expected<void, std::string> startXYDrop(
40 data::DataId id, std::uint16_t priority,
41 std::int32_t x, std::int32_t y,
42 bool dropFrames = true,
43 std::uint8_t labelOverride = 0);
44 [[nodiscard]] std::expected<void, std::string> startXYSR(
45 data::DataId id, std::uint16_t priority,
46 std::int32_t x, std::int32_t y,
47 float scale, float rotate);
48 [[nodiscard]] std::expected<void, std::string> startRySTxz(
49 data::DataId id, std::uint16_t priority,
50 float yaw, float scale, float x, float z);
51 [[nodiscard]] std::expected<void, std::string> startRySTxzDrop(
52 data::DataId id, std::uint16_t priority,
53 float yaw, float scale, float x, float z,
54 bool dropFrames);
55 [[nodiscard]] std::expected<void, std::string> transitionXY(
56 std::optional<data::DataId> previousId, data::DataId id,
57 std::uint16_t priority, std::int32_t x, std::int32_t y,
58 bool dropFrames = false);
59 [[nodiscard]] std::expected<void, std::string> setEndingAction(
60 data::DataId id, std::uint16_t priority, std::uint8_t action);
61 [[nodiscard]] std::expected<void, std::string> setVolume(
62 data::DataId id, std::uint16_t priority, std::uint8_t volume);
63 [[nodiscard]] std::expected<void, std::string> setPitch(
64 data::DataId id, std::uint16_t priority, std::uint16_t pitch);
65 [[nodiscard]] std::expected<void, std::string> setPanning(
66 data::DataId id, std::uint16_t priority, std::int8_t panning);
67 [[nodiscard]] std::expected<void, std::string> forceRedraw(
68 data::DataId id, std::uint16_t priority);
69 [[nodiscard]] std::expected<void, std::string> startMoved(
70 data::DataId id, std::uint16_t priority,
72 [[nodiscard]] std::expected<void, std::string> stop(
73 data::DataId id, std::uint16_t priority);
74 [[nodiscard]] std::expected<void, std::string> move(
75 data::DataId id, std::uint16_t priority,
77 [[nodiscard]] std::expected<void, std::string> transitionMovedDrop(
78 std::optional<data::DataId> previousId, data::DataId id,
79 std::uint16_t priority, sequence::SequenceTransform transform,
80 std::uint8_t endingAction);
81 [[nodiscard]] std::expected<void, std::string> transitionRySTxzDropStayAtEnd(
82 std::optional<data::DataId> previousId, data::DataId id,
83 std::uint16_t priority, float yaw, float scale, float x, float z);
84 [[nodiscard]] std::expected<void, std::string> setViewport3D(
85 World3DRect viewport);
86 [[nodiscard]] std::expected<void, std::string> setCamera3D(
87 const World3DCamera& camera);
88 [[nodiscard]] std::expected<void, std::string> setCameraNumber(
89 std::uint8_t cameraNumber);
90 [[nodiscard]] std::expected<int, std::string> collectCommands();
91 [[nodiscard]] std::expected<int, std::string> executeCommands();
92 [[nodiscard]] std::expected<void, std::string> processUserCommands();
93 [[nodiscard]] std::expected<void, std::string> stopAll();
94 [[nodiscard]] std::expected<void, std::string> update(std::int32_t tick);
95 // Optional native decorations share render slots, not gameplay sequences.
96 [[nodiscard]] std::expected<void, std::string> setNativeSceneItems(
97 std::vector<sequence::SequenceMeshRenderItem> items);
98 // Reject failed modern GPU uploads before frame submission and republish
99 // complete retail sequence poses through the existing CPU mesh cache.
100 [[nodiscard]] std::expected<void, std::string> prepareModernMeshes(MeshGPUCache& cache,
101 const std::function<void(const data::MeshRenderData*)>& rejectPack = {});
102 [[nodiscard]] std::expected<void, std::string> configureBoardTextures(
104 int city, int currency, const std::filesystem::path& customRoot = {});
105 [[nodiscard]] std::expected<data::DataId, std::string> createVideoObject(
106 std::string fileName, data::SequenceVideoData options,
107 data::Sequence2DBoundingBoxAttribute bounds,
108 bool binkDoubleSize = false);
109 [[nodiscard]] bool freeRuntimeSequence(data::DataId id) noexcept;
112 SequenceWorld3DSlot& world() noexcept { return world_; }
113 SequenceWorld2DSlot& world2D() noexcept { return world2D_; }
114 [[nodiscard]] std::optional<std::int32_t> soundScreenCenterX2D(
115 sequence::SequenceNodeId node) const noexcept;
116 data::RuntimeBitmapStore& runtimeBitmaps() noexcept { return runtimeBitmaps_; }
117 const data::RuntimeBitmapStore& runtimeBitmaps() const noexcept { return runtimeBitmaps_; }
118 std::shared_ptr<const data::ResourceSnapshot> resources() const noexcept
119 { return meshes_.resources(); }
120 // All deed owners share one generated Europe catalog. Static USA IDs
121 // remain unchanged; runtime IDs are replaced as one complete set.
122 void setEuropeanDeeds(const std::array<data::DataId, 56>& ids);
123 [[nodiscard]] data::DataId deedDataId(int square, bool front,
124 data::DataId staticFallback) const noexcept;
125 [[nodiscard]] std::expected<std::shared_ptr<const sequence::SequenceProgram>, std::string>
127 private:
128 static constexpr std::uint16_t RuntimeVideoGroup = 0xFFFCU;
129 std::array<data::DataId, 56> europeanDeeds_{};
130 std::vector<data::DataId> retiredDeeds_;
131 std::map<data::DataId, std::shared_ptr<const sequence::SequenceProgram>>
132 runtimePrograms_;
133 data::DataTag nextRuntimeVideoTag_{1};
134
135 data::MeshRuntimeCache meshes_;
136 std::vector<sequence::SequenceMeshRenderItem> nativeSceneItems_;
137 using BoardTextureSelection = std::tuple<data::BoardMeshKind,
139 std::filesystem::path>;
140 std::optional<BoardTextureSelection> boardTextureSelection_;
141 [[nodiscard]] std::expected<void, std::string> publishRuntimeViews();
142 data::RuntimeBitmapStore runtimeBitmaps_;
143 sequence::SequenceRuntime runtime_;
144 sequence::SequenceCommandQueue commands_;
145 SequenceWorld3DSlot world_;
146 data::BitmapRuntimeCache bitmaps_;
147 SequenceWorld2DSlot world2D_;
148 struct SpatialSound2D
149 {
150 std::uint64_t movementRevision{};
151 std::int32_t screenCenterX{};
152 };
153 std::map<sequence::SequenceNodeId, SpatialSound2D> spatialSounds2D_;
154 };
155}
std::uint16_t priority
unsigned index
float yaw
int z
std::uint16_t pitch
std::uint8_t volume
std::int8_t panning
std::shared_ptr< const ResourceSnapshot > resources() const noexcept
std::optional< std::int32_t > soundScreenCenterX2D(sequence::SequenceNodeId node) const noexcept
std::expected< void, std::string > move(data::DataId id, std::uint16_t priority, sequence::SequenceTransform transform)
std::expected< int, std::string > collectCommands()
const data::RuntimeBitmapStore & runtimeBitmaps() const noexcept
std::expected< void, std::string > forceRedraw(data::DataId id, std::uint16_t priority)
std::expected< void, std::string > setNativeSceneItems(std::vector< sequence::SequenceMeshRenderItem > items)
std::expected< void, std::string > setViewport3D(World3DRect viewport)
std::expected< void, std::string > setVolume(data::DataId id, std::uint16_t priority, std::uint8_t volume)
std::expected< void, std::string > configureBoardTextures(data::BoardMeshKind mesh, data::TextureResolution resolution, int city, int currency, const std::filesystem::path &customRoot={})
std::expected< void, std::string > start(data::DataId id, std::uint16_t priority=0, std::uint8_t labelOverride=0)
SequenceWorld3DSlot & world() noexcept
std::expected< void, std::string > transitionXY(std::optional< data::DataId > previousId, data::DataId id, std::uint16_t priority, std::int32_t x, std::int32_t y, bool dropFrames=false)
std::expected< void, std::string > startMoved(data::DataId id, std::uint16_t priority, sequence::SequenceTransform transform)
std::expected< void, std::string > transitionMovedDrop(std::optional< data::DataId > previousId, data::DataId id, std::uint16_t priority, sequence::SequenceTransform transform, std::uint8_t endingAction)
std::expected< void, std::string > prepareModernMeshes(MeshGPUCache &cache, const std::function< void(const data::MeshRenderData *)> &rejectPack={})
std::expected< void, std::string > update(std::int32_t tick)
std::expected< void, std::string > startRySTxzDrop(data::DataId id, std::uint16_t priority, float yaw, float scale, float x, float z, bool dropFrames)
data::RuntimeBitmapStore & runtimeBitmaps() noexcept
std::expected< void, std::string > setEndingAction(data::DataId id, std::uint16_t priority, std::uint8_t action)
std::expected< void, std::string > setCamera3D(const World3DCamera &camera)
std::expected< void, std::string > stop(data::DataId id, std::uint16_t priority)
std::expected< void, std::string > startXYDrop(data::DataId id, std::uint16_t priority, std::int32_t x, std::int32_t y, bool dropFrames=true, std::uint8_t labelOverride=0)
std::expected< void, std::string > transitionRySTxzDropStayAtEnd(std::optional< data::DataId > previousId, data::DataId id, std::uint16_t priority, float yaw, float scale, float x, float z)
std::expected< std::shared_ptr< const sequence::SequenceProgram >, std::string > loadProgram(data::DataId id)
bool freeRuntimeSequence(data::DataId id) noexcept
data::DataId deedDataId(int square, bool front, data::DataId staticFallback) const noexcept
std::expected< void, std::string > setCameraNumber(std::uint8_t cameraNumber)
SequenceWorld2DSlot & world2D() noexcept
std::expected< void, std::string > startXYSR(data::DataId id, std::uint16_t priority, std::int32_t x, std::int32_t y, float scale, float rotate)
sequence::SequenceRuntime & runtime() noexcept
std::expected< int, std::string > executeCommands()
sequence::SequenceCommandQueue & commands() noexcept
std::expected< void, std::string > setPitch(data::DataId id, std::uint16_t priority, std::uint16_t pitch)
std::expected< void, std::string > stopAll()
std::expected< void, std::string > startXY(data::DataId id, std::uint16_t priority, std::int32_t x, std::int32_t y, bool dropFrames=false, std::uint8_t labelOverride=0)
std::expected< void, std::string > setPanning(data::DataId id, std::uint16_t priority, std::int8_t panning)
std::expected< void, std::string > processUserCommands()
std::expected< void, std::string > startRySTxz(data::DataId id, std::uint16_t priority, float yaw, float scale, float x, float z)
std::shared_ptr< const data::ResourceSnapshot > resources() const noexcept
std::expected< data::DataId, std::string > createVideoObject(std::string fileName, data::SequenceVideoData options, data::Sequence2DBoundingBoxAttribute bounds, bool binkDoubleSize=false)
void setEuropeanDeeds(const std::array< data::DataId, 56 > &ids)
SequencePlayback(std::shared_ptr< const data::ResourceSnapshot > resources, data::ModernMeshResolver modernMeshResolver={})
std::uint32_t DataId
Definition DataBanks.hpp:10
std::uint16_t DataTag
Definition DataBanks.hpp:11
std::function< std::expected< std::optional< std::shared_ptr< const MeshRenderData > >, MeshRuntimeError >(DataId, std::optional< DataId > rootSequenceDataId, std::uint16_t priority)> ModernMeshResolver
std::variant< std::monostate, Matrix2D, Matrix3D > SequenceTransform
std::uint64_t SequenceNodeId