25 struct StagedSourceStamp {
26 std::optional<DungeonRoomDocument> document;
28 std::array<uint8_t, 16> blocks{};
29 uint8_t main_blockset = 0xff;
30 uint64_t palette_revision = 0;
31 uint64_t revision = 0;
33 auto staged_stamp = std::make_shared<StagedSourceStamp>();
36 staged_stamp]() -> absl::StatusOr<uint64_t> {
39 return absl::FailedPreconditionError(
"Dungeon source session changed");
42 if (!source || !source->IsLoaded())
43 return absl::FailedPreconditionError(
"Dungeon source room changed");
49 for (
const auto sheet : source->blocks()) {
50 if (!owner->sheet_store.HasSheet(sheet))
52 const auto pixels = owner->sheet_store.Sheet(sheet);
53 sheets.emplace(sheet, std::vector<uint8_t>(pixels.begin(), pixels.end()));
55 const auto palette_revision =
57 if (!staged_stamp->document ||
59 staged_stamp->sheets != sheets ||
60 staged_stamp->blocks != source->blocks() ||
61 staged_stamp->main_blockset != source->resolved_main_blockset() ||
62 staged_stamp->palette_revision != palette_revision) {
63 staged_stamp->document = std::move(document);
64 staged_stamp->sheets = std::move(sheets);
65 staged_stamp->blocks = source->blocks();
66 staged_stamp->main_blockset = source->resolved_main_blockset();
67 staged_stamp->palette_revision = palette_revision;
68 ++staged_stamp->revision;
70 return staged_stamp->revision;
74 resolve_live_source = std::move(resolve_live_source)](
76 -> absl::StatusOr<usage_preview::PreviewImage> {
80 return absl::FailedPreconditionError(
"Dungeon source session changed");
82 if (!source || !source->IsLoaded())
83 return absl::FailedPreconditionError(
"Dungeon source room changed");
88 detached.SetGameData(owner);
89 detached.EnsureObjectsLoaded();
91 detached.SetRenderEntranceBlockset(source->render_entrance_blockset());
92 detached.SetGraphicsSheetOverrides(sheets);
93 detached.PrepareForRender();
99 detached.RenderComposite(layers, composite);