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
64 static int Run(std::unique_ptr<Application> application);
65
66 // [Public Lifecycle Functions]
67
78 Application(int argc, char* argv[], log::Level logLevel = log::Level::Info);
79
80 Application(const Application&) = delete;
81 Application& operator=(const Application&) = delete;
82
83 Application(Application&&) = delete;
84 Application& operator=(Application&&) = delete;
85
86 virtual ~Application();
87
88 protected:
89 // [Protected Types]
90
92 using SceneCommand = std::function<void(Scene&)>;
93
94 // [Protected Member Functions]
95
105 virtual std::unique_ptr<Scene> init() = 0;
106
114
121 virtual bool shouldContinue(const Scene& scene);
122
129 virtual void didShutdown();
130
137
143 const Runner& runner() const;
144
151
157 const Scene& scene() const;
158
167
176
178 const std::vector<std::string>& args() const;
179
187
194 Scene& scene,
195 InputContext& inputContext,
197
204 virtual void sceneWillStep(Runner& runner, Scene& scene, const Scene::StepInfo& info);
205
212 virtual void sceneDidStep(Runner& runner, Scene& scene, const Scene::StepInfo& info);
213
220 Scene& scene,
221 VisualWorld& visualWorld,
222 const VisualWorld::RenderInfo& info);
223
230 Scene& scene,
231 PhysicsWorld& physicsWorld,
232 const PhysicsContact& contact);
233
240 Scene& scene,
241 PhysicsWorld& physicsWorld,
242 const PhysicsContact& contact);
243
250 Scene& scene,
251 PhysicsWorld& physicsWorld,
252 const PhysicsContact& contact);
253
254 private:
255 // [Private Member Functions]
256
257 void initLog(log::Level level);
258 void prepare();
259 bool update();
260 void shutdown() noexcept;
261 void registerCallbacks();
262
263 void executeSceneCommands(std::vector<SceneCommand>& queue, Scene& scene);
264
265 void dispatchRunnerUpdate(Runner& runner, const Runner::UpdateInfo& info);
266 void dispatchInputContextDidUpdate(InputContext& inputContext, const InputContext::UpdateInfo& info);
267 void dispatchSceneWillStep(Scene& scene, const Scene::StepInfo& info);
268 void dispatchSceneDidStep(Scene& scene, const Scene::StepInfo& info);
269 void dispatchDidBeginFrame(VisualWorld& visualWorld, const VisualWorld::RenderInfo& info);
270 void dispatchContactDidBegin(PhysicsWorld& physicsWorld, const PhysicsContact& contact);
271 void dispatchContactDidContinue(PhysicsWorld& physicsWorld, const PhysicsContact& contact);
272 void dispatchContactDidEnd(PhysicsWorld& physicsWorld, const PhysicsContact& contact);
273
274 // [Private Member Variables]
275
276 std::vector<std::string> _args;
277 std::unique_ptr<Scene> _scene;
278 std::unique_ptr<Runner> _runner; // Runner must be destroyed before Scene
279 std::vector<SceneCommand> _scenePreStepQueue;
280 std::vector<SceneCommand> _scenePostStepQueue;
281 bool _didShutdown;
282 util::Timer _startupTimer;
283
284 // [Test Access]
285
286 //friend class testing::ApplicationTestAccess;
287 };
288
289}
290
291#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:92
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:64