Avara3D 0.2.0
C++ API reference
Application.h
1//
2// Application.h
3// avara3d
4//
5// Created by Morgan Davis on 7/17/26.
6// Copyright © 2026 Morgan K Davis. All rights reserved.
7//
8
9#ifndef AVARA3D_APPLICATION_H
10#define AVARA3D_APPLICATION_H
11
12#include <functional>
13#include <memory>
14#include <vector>
15
16#include "a3d/Runner.h"
17#include "a3d/SimulationConfig.h"
18#include "a3d/input/InputContext.h"
19#include "a3d/physics/PhysicsWorld.h"
20#include "a3d/physics/PhysicsContact.h"
21#include "a3d/scene/Scene.h"
22#include "a3d/util/Timer.h"
23#include "a3d/visual/VisualWorld.h"
24#include "log/Log.h"
25
26// #include "a3d/TestAccessFwd.h"
27
28namespace a3d {
29
47
48 public:
49 // [Public Static Member Functions]
50
62 static int Run(std::unique_ptr<Application> application);
63
64 // [Public Lifecycle Functions]
65
76 Application(int argc, char* argv[], log::Level logLevel = log::Level::Info);
77
78 Application(const Application&) = delete;
79 Application& operator=(const Application&) = delete;
80
81 Application(Application&&) = delete;
82 Application& operator=(Application&&) = delete;
83
84 virtual ~Application();
85
86 protected:
87 // [Protected Types]
88
90 using SceneCommand = std::function<void(Scene&)>;
91
92 // [Protected Member Functions]
93
103 virtual std::unique_ptr<Scene> init() = 0;
104
112
119 virtual bool shouldContinue(const Scene& scene);
120
127 virtual void didShutdown();
128
135
141 const Runner& runner() const;
142
149
155 const Scene& scene() const;
156
165
174
176 const std::vector<std::string>& args() const;
177
185
192 Scene& scene,
193 InputContext& inputContext,
195
202 virtual void sceneWillStep(Runner& runner, Scene& scene, const Scene::StepInfo& info);
203
210 virtual void sceneDidStep(Runner& runner, Scene& scene, const Scene::StepInfo& info);
211
218 Scene& scene,
219 VisualWorld& visualWorld,
220 const VisualWorld::RenderInfo& info);
221
228 Scene& scene,
229 PhysicsWorld& physicsWorld,
230 const PhysicsContact& contact);
231
238 Scene& scene,
239 PhysicsWorld& physicsWorld,
240 const PhysicsContact& contact);
241
248 Scene& scene,
249 PhysicsWorld& physicsWorld,
250 const PhysicsContact& contact);
251
252 private:
253 // [Private Member Functions]
254
255 void initLog(log::Level level);
256 void prepare();
257 bool update();
258 void shutdown() noexcept;
259 void registerCallbacks();
260
261 void executeSceneCommands(std::vector<SceneCommand>& queue, Scene& scene);
262
263 void dispatchRunnerUpdate(Runner& runner, const Runner::UpdateInfo& info);
264 void dispatchInputContextDidUpdate(InputContext& inputContext, const InputContext::UpdateInfo& info);
265 void dispatchSceneWillStep(Scene& scene, const Scene::StepInfo& info);
266 void dispatchSceneDidStep(Scene& scene, const Scene::StepInfo& info);
267 void dispatchDidBeginFrame(VisualWorld& visualWorld, const VisualWorld::RenderInfo& info);
268 void dispatchContactDidBegin(PhysicsWorld& physicsWorld, const PhysicsContact& contact);
269 void dispatchContactDidContinue(PhysicsWorld& physicsWorld, const PhysicsContact& contact);
270 void dispatchContactDidEnd(PhysicsWorld& physicsWorld, const PhysicsContact& contact);
271
272 // [Private Member Variables]
273
274 std::vector<std::string> _args;
275 std::unique_ptr<Scene> _scene;
276 std::unique_ptr<Runner> _runner; // Runner must be destroyed before Scene
277 std::vector<SceneCommand> _scenePreStepQueue;
278 std::vector<SceneCommand> _scenePostStepQueue;
279 bool _didShutdown;
280 util::Timer _startupTimer;
281
282 // [Test Access]
283
284 //friend class testing::ApplicationTestAccess;
285 };
286
287}
288
289#endif // AVARA3D_APPLICATION_H
Base class and top-level entry point for A3D applications.
Definition: Application.h:46
void queueScenePostStepCommand(SceneCommand command)
Queues command to run after the next simulation step.
virtual void inputDidUpdate(Runner &runner, Scene &scene, InputContext &inputContext, const InputContext::UpdateInfo &)
Called after the InputContext has processed the current host update.
virtual void sceneDidStep(Runner &runner, Scene &scene, const Scene::StepInfo &info)
Called immediately after each Scene simulation step.
Runner & runner()
Returns the application's Runner after initialization.
virtual bool shouldContinue(const Scene &scene)
Determines whether the application host loop should continue.
virtual SimulationConfig simulationConfig() const
Supplies the initial simulation scheduling configuration.
virtual void runnerUpdate(Runner &runner, Scene &scene, const Runner::UpdateInfo &info)
Called near the beginning of each Runner host update.
void queueScenePreStepCommand(SceneCommand command)
Queues command to run before the next simulation step.
const std::vector< std::string > & args() const
Returns process command-line arguments excluding the executable name.
Application(int argc, char *argv[], log::Level logLevel=log::Level::Info)
Creates application state from process arguments and configures logging.
virtual void sceneWillStep(Runner &runner, Scene &scene, const Scene::StepInfo &info)
Called immediately before each Scene simulation step.
virtual void contactDidBegin(Runner &runner, Scene &scene, PhysicsWorld &physicsWorld, const PhysicsContact &contact)
Called when the PhysicsWorld reports the beginning of a contact.
static int Run(std::unique_ptr< Application > application)
Runs application using the platform host loop.
Scene & scene()
Returns the application's Scene after initialization.
const Scene & scene() const
Returns the application's Scene after initialization.
std::function< void(Scene &)> SceneCommand
Callable queued for execution at a simulation-step boundary.
Definition: Application.h:90
virtual void contactDidEnd(Runner &runner, Scene &scene, PhysicsWorld &physicsWorld, const PhysicsContact &contact)
Called when the PhysicsWorld reports the end of a contact.
virtual void contactDidContinue(Runner &runner, Scene &scene, PhysicsWorld &physicsWorld, const PhysicsContact &contact)
Called when the PhysicsWorld reports a continuing contact.
const Runner & runner() const
Returns the application's Runner after initialization.
virtual std::unique_ptr< Scene > init()=0
Creates the initial Scene for the application.
virtual void frameDidBegin(Runner &runner, Scene &scene, VisualWorld &visualWorld, const VisualWorld::RenderInfo &info)
Called after a render frame begins and before scene traversal and drawing.
virtual void didShutdown()
Called after the Runner and Scene have been destroyed during shutdown.
Base interface for Scene input state updated once per Runner host update.
Definition: InputContext.h:27
Describes a contact between two physics bodies.
Simulates rigid bodies and performs physics collision queries for a Scene.
Definition: PhysicsWorld.h:39
Drives host updates, fixed-step simulation, and rendering for a Scene.
Definition: Runner.h:45
Owns a scene graph and the worlds used to simulate and render it.
Definition: Scene.h:44
Manages the visual presentation, camera, and visual queries for a Scene.
Definition: VisualWorld.h:53
Timing information for one input update.
Definition: InputContext.h:33
Timing information supplied to each host update callback.
Definition: Runner.h:58
Timing information for one simulation step.
Definition: Scene.h:87
Initial simulation scheduling parameters supplied to a Runner.
Timing and progression information associated with a rendered frame.
Definition: VisualWorld.h:70