LogicThreadBase class
Non-template base class for all LogicThread<> specializations.
Owns all shared data fields and provides type-erased accessors for external systems (RendererCore, OwnerNet, EditorContext) that do not need the concrete template instantiation — they hold LogicThreadBase* instead.
Derived classes
-
template<typename TNet, typename TRollback, typename TFrame>class LogicThread
- The Brain — fixed-timestep simulation coordinator for one World.
Constructors, destructors, conversion operators
- LogicThreadBase() defaulted
- ~LogicThreadBase() defaulted virtual
- LogicThreadBase(const LogicThreadBase&) deleted
Public functions
- auto operator=(const LogicThreadBase&) -> LogicThreadBase& deleted
- void Initialize(Registry* registry, const EngineConfig* config, JoltPhysics* physics, InputBuffer* simInput, InputBuffer* vizInput, TrinyxJobs::WorldQueueHandle worldQueue, const std::atomic<bool>* jobsInitialized, int windowWidth, int windowHeight) pure virtual
- Bind all non-owning pointers. Called by WorldBase::
InitBase before Start(). - void Start() pure virtual
- Spawn the Brain thread and begin the fixed-rate loop.
- void Stop() pure virtual
- Signal the Brain thread to exit after the current frame.
- void Join() pure virtual
- Block the caller until the Brain thread exits.
- void TickOnce() pure virtual
- Run one complete simulation frame synchronously on the calling thread.
- auto IsRunning() const -> bool
- Returns true while the Brain thread is running.
- auto IsResimulating() const -> bool
- Returns true while ExecuteRollback is actively resimulating frames.
- void RequestRollback(uint32_t f)
- Request a rollback to
fon the next tick. Thread-safe. - void RequestRollbackTest()
- Request a rollback determinism self-test (F5 in editor). Thread-safe.
- auto GetLastCompletedFrame() const -> uint32_t
- Last fully-published sim frame number. Render thread uses this for interpolation.
- auto GetAccumulator() const -> double
- Current accumulator depth.
- auto GetFixedAlpha() const -> double
- Normalised interpolation alpha [0, 1] between the last two completed fixed steps.
- void SetSimPaused(bool paused)
- Pause or resume the fixed-rate sim loop. Thread-safe.
- auto IsSimPaused() const -> bool
- Returns true while the sim loop is paused.
- auto GetPausedAtFrame() const -> uint32_t
- Frame number at which the sim was paused. Valid while IsSimPaused(). Editor scrubber uses this as the rewind target.
- void SetConstructRegistry(ConstructRegistry* cr)
- Inject the ConstructRegistry so Constructs can self-register at spawn time.
- auto GetConstructRegistry() const -> ConstructRegistry*
- Expose the ConstructRegistry for editor inspection (read-only).
- void SetFreeFlyCamera(SimFloat x, SimFloat y, SimFloat z, SimFloat yaw, SimFloat pitch)
- Set the free-fly camera position and orientation for editor/debug use.
- void SetLocalCameraManager(CameraManager* mgr)
- Inject the per-Soul CameraManager so the Brain resolves the active camera each frame.
- void SetEarliestValidRollbackFrame(uint32_t frame)
- Set the earliest frame a spawn-triggered rollback may target.
- auto GetLogicFPS() const -> float
- auto GetLogicFrameMs() const -> float
- auto GetFixedFPS() const -> float
- auto GetFixedFrameMs() const -> float
Public variables
- ConstructBatch ScalarPrePhysicsBatch
- Runs before PrePhysics wide sweeps each fixed step.
- ConstructBatch ScalarPostPhysicsBatch
- Runs after PostPhysics wide sweeps each fixed step.
- ConstructBatch ScalarUpdateBatch
- Runs each variadic (uncapped) logic tick.
- ConstructBatch ScalarPhysicsStepBatch
- Runs between FlushPendingBodies and the Jolt step.
Protected static variables
- static SimFloat CamMoveSpeed constexpr
- Free-fly camera speed (sim units/s).
- static SimFloat CamMouseSens constexpr
- Free-fly mouse sensitivity (rad/pixel).
Protected variables
- Registry* RegistryPtr
- const EngineConfig* ConfigPtr
- JoltPhysics* PhysicsPtr
- ComponentCacheBase* TemporalCache
- ConstructRegistry* ConstructsPtr
- CameraManager* LocalCameraManager
- TrinyxJobs::WorldQueueHandle WQHandle
- const std::atomic<bool>* JobsInitPtr
- InputBuffer* SimInput
- Non-owning; WorldBase owns the buffer.
- InputBuffer* VizInput
- Non-owning; WorldBase owns the buffer.
- Vector3 CamPos
- SimFloat CamYaw
- SimFloat CamPitch
- Vector3 LastPubCamPos
- Quat LastPubCamRot
- SimFloat LastPubCamFoV
- std::atomic<uint32_t> LastCompletedFrame
- Frame mailbox; last completed frame the Render thread may read.
- std::thread Thread
- std::atomic<bool> bIsRunning
- std::atomic<bool> bSimPaused
- std::atomic<uint32_t> PausedAtFrame
- std::atomic<double> Accumulator
- double SimulationTime
- uint32_t FrameNumber
- uint32_t PhysicsDivizor
- int WindowWidth
- int WindowHeight
- double FixedStepTimeCache
- Cached from EngineConfig at Initialize time.
- uint32_t FpsFrameCount
- double FpsTimer
- uint32_t FpsFixedCount
- double FpsFixedTimer
- double LastFPSCheck
- std::atomic<float> LogicFPS
- std::atomic<float> LogicFrameMs
- std::atomic<float> FixedFPS
- std::atomic<float> FixedFrameMs
- bool bRollbackActive
- std::atomic<uint32_t> PendingRollbackFrame
- std::atomic<bool> bRollbackTestRequested
- std::atomic<uint32_t> EarliestValidRollbackFrame
Function documentation
void LogicThreadBase:: Initialize(Registry* registry,
const EngineConfig* config,
JoltPhysics* physics,
InputBuffer* simInput,
InputBuffer* vizInput,
TrinyxJobs::WorldQueueHandle worldQueue,
const std::atomic<bool>* jobsInitialized,
int windowWidth,
int windowHeight) pure virtual
Bind all non-owning pointers. Called by WorldBase::
| Parameters | |
|---|---|
| registry | |
| config | |
| physics | |
| simInput | |
| vizInput | |
| worldQueue | World-scoped job queue; Brain submits pre/post-physics jobs here. |
| jobsInitialized | Engine jobs-ready gate; Brain spins on this before draining the queue. |
| windowWidth | |
| windowHeight | |
void LogicThreadBase:: TickOnce() pure virtual
Run one complete simulation frame synchronously on the calling thread.
Intended for editor use after level load, before the background thread starts. Advances the accumulator, runs Constructs, writes a temporal frame, and increments LastCompletedFrame.
double LogicThreadBase:: GetAccumulator() const
Current accumulator depth.
void LogicThreadBase:: SetEarliestValidRollbackFrame(uint32_t frame)
Set the earliest frame a spawn-triggered rollback may target.
Must be called once per level load on the Logic thread (inside SpawnAndWait), with a frame value strictly greater than the previous value. Prevents rollbacks from targeting frames whose Jolt snapshots predate the current level geometry.
float LogicThreadBase:: GetLogicFPS() const
Variable documentation
std::atomic<uint32_t> LogicThreadBase:: EarliestValidRollbackFrame protected
Hard floor for spawn rollback targets — set once per level load so rollbacks never target a frame whose Jolt snapshot predates the level geometry. Written on the Logic thread; relaxed ordering is sufficient because visibility is guaranteed by the spawn handshake that precedes any EnqueueSpawnRollback call.