vkmEngine 1.0.0
A C++ game engine · vkmengine.com
Loading...
Searching...
No Matches
behavior_system.h
1#pragma once
2
3#include <type_traits>
4#include <vector>
5
6#include "core/system.h"
7#include "ecs/entity.h"
8#include "ecs/scene_observer.h"
9#include "system/physics/physics_events.h"
10#include "system/script/behavior.h"
11
12namespace Vkm::Engine {
13
14class Scene;
15class ResourceManager;
16class EventBus;
17
27class BehaviorSystem : public System, public ISceneObserver {
28 public:
29 BehaviorSystem() {
30 m_context.pendingDestroy = &m_pendingDestroy;
31 m_context.pendingSceneLoad = &m_pendingSceneLoad;
32 }
33 ~BehaviorSystem() override = default;
34
35 BehaviorSystem(const BehaviorSystem& other) = delete;
36 BehaviorSystem& operator=(const BehaviorSystem& other) = delete;
37
38 BehaviorSystem(BehaviorSystem && other) = delete;
39 BehaviorSystem& operator=(BehaviorSystem && other) = delete;
40
41 public:
42 void init(FrameContext& ctx) override;
43 void update(FrameContext& ctx) override;
44 void fixedUpdate(FrameContext& ctx) override;
45
51 bool isReplayed() const override { return true; }
52
53 void shutdown() override;
54
62 void onEntityDestroyed(EntityId entity) override;
63
73 void endSession(Scene& scene);
74
81 static void destroyEntityBehaviors(Scene& scene, EntityId entity);
82
83 private:
90 void ensureStarted(Behavior& behavior, EntityId entity);
91
102 void tickBehaviors(
103 FrameContext& ctx,
104 float dt,
105 const char* hookName,
106 void (Behavior::*hook)(float),
107 bool startIfNeeded
108 );
109
120 template<typename Arg>
121 void dispatchEntityHook(
122 Scene& scene,
123 EntityId target,
124 const std::remove_reference_t<Arg>& arg,
125 const char* hookName,
126 void (Behavior::*hook)(Arg)
127 );
128
134 void drainPendingDestroy(Scene& scene);
135
141 void drainPendingSceneLoad(FrameContext& ctx);
142
151 template<typename Fn>
152 static void guard(Behavior& behavior, const char* hookName, Fn&& fn);
153
161 static void fireDestroy(Behavior& behavior);
162
163 private:
164 std::vector<CollisionEvent> m_collisions;
165 std::vector<TriggerEvent> m_triggers;
166
168 std::vector<CollisionEvent> m_dispatchCollisions;
169 std::vector<TriggerEvent> m_dispatchTriggers;
170
172 ListenerId m_collisionListener = 0;
173 ListenerId m_triggerListener = 0;
174
181 std::vector<EntityId> m_tickList;
182
183 std::vector<EntityId> m_pendingDestroy;
185 std::vector<EntityId> m_destroying;
186 std::string m_pendingSceneLoad;
187
188 BehaviorContext m_context;
189};
190
191} // namespace Vkm::Engine
void onEntityDestroyed(EntityId entity) override
ISceneObserver: fire onDestroy on entity's behaviors before its ScriptComponent goes.
void shutdown() override
Called once on engine shutdown.
void init(FrameContext &ctx) override
Called once after all systems are registered, before the first update.
void endSession(Scene &scene)
End the session: onDestroy on every started behavior, reset, and discard queued requests.
bool isReplayed() const override
Re-run during a replay: it moves the world from state and command, repeatably.
Definition behavior_system.h:51
void update(FrameContext &ctx) override
Execute this system for the current frame.
void fixedUpdate(FrameContext &ctx) override
Execute this system at the fixed simulation rate.
static void destroyEntityBehaviors(Scene &scene, EntityId entity)
Fire onDestroy on entity's started behaviors, before its ScriptComponent goes.
Base class for native C++ gameplay behaviors.
Definition behavior.h:144
Typed pub/sub event dispatcher.
Definition event_bus.h:22
Open type-erased resource registry with typed handles and generational lifetimes.
Definition resource_manager.h:46
Central registry managing entities and an open set of component types.
Definition scene.h:29
Everything gameplay code may reach, bundled behind one pointer.
Definition behavior.h:42
Names one entity of one Scene, for as long as that slot holds it.
Definition entity.h:23
Per-frame state bundle passed to every system.
Definition system.h:55