Bicameral Engine
GPU-resident engine for a magic-research open-world game
Loading...
Searching...
No Matches
reaction_hot_reload.h
Go to the documentation of this file.
1// reaction_hot_reload.h — 反応表のホットリロード(エディタと実験室。T-0139・ADR-0047・13 §2)。
2//
3// データの流れ: パッケージのフォルダ(と型の定義)のファイルの中身の指紋を Poll のたびに取る
4// → 変わって、次の Poll でも同じ指紋なら(書きかけを読まない)読み直す: LoadReactionTable(型検査 → 殻 → ベイクの検査)
5// → 今の世界に当てられるか(物質の一覧が同じか。CheckHotReloadCompatible)
6// → 通れば新しい表を返す(呼び手が刻みの境界で世界のコマンドとして当てる。sim::ProbeFrameInput::tableSwap)。
7// 落ちたら古い表のまま、誤り(どのファイルの何行目か・どの物質か)を返す。
8// 指紋はファイルの相対パスと中身だけで決める(時刻を使わない)。ここは CPU だけ(原則 2: 表は CPU でベイクして GPU へ渡す)。
9// 読み直しは呼んだスレッドで同期して行う(今の表で数十 ms。エディタのフレームが 1 回止まる)。
10#pragma once
11
12#include <cstdint>
13#include <expected>
14#include <memory>
15#include <string>
16
17#include "core/aliases.h"
19#include "sim/reaction_table.h"
20
21namespace bicameral::script {
22
23 // フォルダの下の全部のファイルの指紋(相対パスのバイト順に、パスと中身を混ぜる)。読めないファイル・フォルダが無い時は
24 // 中身の代わりにその印を混ぜる(読めるようになれば変わる)
25 [[nodiscard]] uint64_t DirectoryFingerprint(const fs::path& root);
26
27 // 新しい表を今の世界に当てられるか: 物質の一覧(名前・並び = ID・元素の組み立て)が同じなら当てられる。
28 // 違えば、セルの物質 ID の意味が変わるので当てない(足した・消した物質の名前を理由に書く。世界を作り直す道は ADR-0047)
29 [[nodiscard]] std::expected<void, std::string> CheckHotReloadCompatible(const sim::BakedReactionTable& current,
30 const sim::BakedReactionTable& next);
31
32 enum class HotReloadState : uint8_t {
33 Unchanged, // ファイルが変わっていない(か、変わったが表の版が同じ)
34 Waiting, // 変わったのを見た。次の Poll で同じなら読み直す
35 Reloaded, // 新しい表を読めた(table)。今の表はこれになった
36 Failed, // 読めない・型検査・ベイクの検査・当てられない(message)。今の表のまま
37 };
38
41 std::shared_ptr<const LoadedReactionTable> table; // Reloaded のとき
42 std::string message; // Failed のときの理由(Reloaded でも読まなかった Mod があれば)
43 };
44
46 public:
47 // current: 今の世界の表(起動時に読んだもの)。指紋はここで取る(作った時の中身を「見た」とする)
48 ReactionTableHotReload(ReactionTableSource source, std::shared_ptr<const LoadedReactionTable> current);
49
50 [[nodiscard]] HotReloadResult Poll();
51
52 [[nodiscard]] const std::shared_ptr<const LoadedReactionTable>& Current() const { return m_current; }
53
54 private:
55 [[nodiscard]] uint64_t Fingerprint() const;
56 [[nodiscard]] HotReloadResult Reload();
57
59 std::shared_ptr<const LoadedReactionTable> m_current;
60 uint64_t m_seen = 0; // 最後に読み直した(か作った時の)指紋
61 uint64_t m_pending = 0; // 変わったのを見た指紋(次の Poll で同じなら読み直す)
62 };
63
64} // namespace bicameral::script
const std::shared_ptr< const LoadedReactionTable > & Current() const
ReactionTableHotReload(ReactionTableSource source, std::shared_ptr< const LoadedReactionTable > current)
std::shared_ptr< const LoadedReactionTable > m_current
uint64_t DirectoryFingerprint(const fs::path &root)
std::expected< void, std::string > CheckHotReloadCompatible(const sim::BakedReactionTable &current, const sim::BakedReactionTable &next)
std::shared_ptr< const LoadedReactionTable > table