Skip to content

Commit

Permalink
Hook up MessageDispatchService to Entity Registry
Browse files Browse the repository at this point in the history
  • Loading branch information
meisekimiu committed Aug 27, 2024
1 parent 9c05d98 commit 7789811
Show file tree
Hide file tree
Showing 5 changed files with 84 additions and 65 deletions.
82 changes: 45 additions & 37 deletions src/state/EntityGameState.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,41 +2,49 @@
#include <stdexcept>

namespace Adagio {
void EntityGameState::registerSystem(SystemFn system) {
if (!system) {
throw std::invalid_argument("System cannot be null.");
}
systems.push_back(system);
}

void EntityGameState::registerRenderer(RendererFn renderer) {
if (!renderer) {
throw std::invalid_argument("Renderer cannot be null.");
}
renderers.push_back(renderer);
}

void EntityGameState::update(GameStats &stats, StateMachine *gameStates) {
if (!gameStates) {
throw std::invalid_argument("StateMachine cannot be null.");
}
for (SystemFn system : systems) {
system(registry, stats, gameStates);
}
}

void EntityGameState::draw(SpriteBatch &spriteBatch,
RenderingServices &services) {
for (RendererFn renderer : renderers) {
renderer(registry, spriteBatch, services);
}
}

const std::vector<SystemFn> *EntityGameState::getSystems() const {
return &systems;
}

const std::vector<RendererFn> *EntityGameState::getRenderers() const {
return &renderers;
}
void EntityGameState::registerSystem(SystemFn system) {
if (!system) {
throw std::invalid_argument("System cannot be null.");
}
systems.push_back(system);
}

void EntityGameState::registerRenderer(RendererFn renderer) {
if (!renderer) {
throw std::invalid_argument("Renderer cannot be null.");
}
renderers.push_back(renderer);
}

void EntityGameState::update(GameStats &stats, StateMachine *gameStates) {
if (!gameStates) {
throw std::invalid_argument("StateMachine cannot be null.");
}
for (SystemFn system: systems) {
system(registry, stats, gameStates);
}
}

void EntityGameState::draw(SpriteBatch &spriteBatch,
RenderingServices &services) {
for (RendererFn renderer: renderers) {
renderer(registry, spriteBatch, services);
}
}

const std::vector<SystemFn> *EntityGameState::getSystems() const {
return &systems;
}

const std::vector<RendererFn> *EntityGameState::getRenderers() const {
return &renderers;
}

void EntityGameState::initializeRegistryContext() {
registry.ctx().emplace<Adagio::MessageDispatchService *>(&messageService);
}

EntityGameState::EntityGameState() {
initializeRegistryContext();
}
} // namespace Adagio
41 changes: 24 additions & 17 deletions src/state/EntityGameState.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,35 +2,42 @@
#define GL_ADAGIO_ENTITYGAMESTATE_H

#include "./GameState.h"
#include "../event/MessageDispatchService.h"
#include "entt/entt.hpp"

namespace Adagio {
typedef void (*SystemFn)(entt::registry &, GameStats &, StateMachine *);
typedef void (*SystemFn)(entt::registry &, GameStats &, StateMachine *);

typedef void (*RendererFn)(entt::registry &, SpriteBatch &,
RenderingServices &);
typedef void (*RendererFn)(entt::registry &, SpriteBatch &,
RenderingServices &);

class EntityGameState : public GameState {
public:
void registerSystem(SystemFn);
class EntityGameState : public GameState {
public:
entt::registry registry;

void registerRenderer(RendererFn);
EntityGameState();

void update(GameStats &stats, StateMachine *gameStates) override;
void registerSystem(SystemFn);

void draw(SpriteBatch &spriteBatch, RenderingServices &services) override;
void registerRenderer(RendererFn);

protected:
entt::registry registry;
void update(GameStats &stats, StateMachine *gameStates) override;

[[nodiscard]] const std::vector<SystemFn> *getSystems() const;
void draw(SpriteBatch &spriteBatch, RenderingServices &services) override;

[[nodiscard]] const std::vector<RendererFn> *getRenderers() const;
protected:
MessageDispatchService messageService;

private:
std::vector<SystemFn> systems;
std::vector<RendererFn> renderers;
};
void initializeRegistryContext();

[[nodiscard]] const std::vector<SystemFn> *getSystems() const;

[[nodiscard]] const std::vector<RendererFn> *getRenderers() const;

private:
std::vector<SystemFn> systems;
std::vector<RendererFn> renderers;
};
} // namespace Adagio

#endif // GL_ADAGIO_ENTITYGAMESTATE_H
2 changes: 1 addition & 1 deletion test/event/EcsHooks.test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
#include <catch2/catch.hpp>

TEST_CASE("MessageInbox ECS Hooks", "[event]") {
Adagio::MessageDispatchService messageService;
EcsTestingHarness harness;
auto &messageService = harness.messageService;
auto &registry = harness.registry;
registry.ctx().emplace<Adagio::MessageDispatchService *>(&messageService);
registry.on_construct<MessageInbox>().connect<&RegisterInboxWithMessageService>();
Expand Down
1 change: 1 addition & 0 deletions test/game/EcsTestingHarness.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
EcsTestingHarness::EcsTestingHarness() {
renderingServices = {&spriteBatch, graphicsDevice.getTextureManager(), &stats};
stateMachine = new Adagio::StateMachine(&spriteBatch, &renderingServices);
registry.ctx().emplace<Adagio::MessageDispatchService *>(&messageService);
}

void EcsTestingHarness::reset() {
Expand Down
23 changes: 13 additions & 10 deletions test/game/EcsTestingHarness.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,28 @@
#include "../../src/state/EntityGameState.h"
#include "../../src/state/RenderingServices.h"
#include "../../src/state/StateMachine.h"
#include "../../src/event/MessageDispatchService.h"
#include "entt/entt.hpp"
#include "harness/EcsMockGraphicsDevice.h"
#include "harness/MockGameStats.h"

class EcsTestingHarness {
public:
EcsMockGraphicsDevice graphicsDevice;
Adagio::SpriteBatch spriteBatch{&graphicsDevice};
MockGameStats stats;
entt::registry registry;
Adagio::RenderingServices renderingServices{};
Adagio::StateMachine *stateMachine;
EcsMockGraphicsDevice graphicsDevice;
Adagio::SpriteBatch spriteBatch{&graphicsDevice};
MockGameStats stats;
entt::registry registry;
Adagio::RenderingServices renderingServices{};
Adagio::StateMachine *stateMachine;
Adagio::MessageDispatchService messageService;

EcsTestingHarness();
EcsTestingHarness();

void reset();
void reset();

void testRendererFrame(Adagio::RendererFn renderer);
void testSystemFrame(Adagio::SystemFn system);
void testRendererFrame(Adagio::RendererFn renderer);

void testSystemFrame(Adagio::SystemFn system);
};

#endif // GL_ADAGIO_ECSTESTINGHARNESS_H

0 comments on commit 7789811

Please sign in to comment.