Bicameral Engine
GPU-resident engine for a magic-research open-world game
Loading...
Searching...
No Matches
time_control.cpp
Go to the documentation of this file.
1// time_control.cpp — エディタの時間の操作(T-0023)。考え方は time_control.h。
3
4#include <algorithm>
5
6namespace bicameral::editor {
7
8 void TimeControl::Apply(const TimeRequest& request, frame::SimScheduler& scheduler) {
9 // --- 速さ ---
10 if (request.resetSpeed)
12
13 const auto lastIndex = static_cast<int32_t>(TIME_SPEEDS.size()) - 1;
14 m_speedIndex = static_cast<uint32_t>(
15 std::clamp(static_cast<int32_t>(m_speedIndex) + request.speedSteps, 0, lastIndex));
16
17 // --- 止める / 動かす ---
18 if (request.togglePause) {
20 // 止めた時に溜まっている刻み(最大で約 133 ms 分)を捨てる。残すと止めた後も数刻み進んでしまう
21 if (m_paused)
22 scheduler.ClearBacklog();
23 }
24
25 // --- 1 刻み進める(止めている間だけ)---
26 if (m_paused && request.stepTicks > 0) {
27 scheduler.AddTicks(request.stepTicks);
28 m_steppedTicks += request.stepTicks;
29 }
30 }
31
32 void TimeControl::AdvanceRealTime(double seconds, frame::SimScheduler& scheduler, double gameSpeed) const {
33 if (m_paused)
34 return;
35
36 scheduler.AddRealTime(seconds, Speed() * gameSpeed);
37 }
38
39} // namespace bicameral::editor
void Apply(const TimeRequest &request, frame::SimScheduler &scheduler)
void AdvanceRealTime(double seconds, frame::SimScheduler &scheduler, double gameSpeed=1.0) const
void AddRealTime(double seconds, double speedScale=1.0)
void AddTicks(uint32_t ticks)
constexpr std::array< double, 7 > TIME_SPEEDS
constexpr uint32_t NORMAL_SPEED_INDEX