aboutsummaryrefslogtreecommitdiff
path: root/src/crepe/system
diff options
context:
space:
mode:
Diffstat (limited to 'src/crepe/system')
-rw-r--r--src/crepe/system/AnimatorSystem.cpp8
-rw-r--r--src/crepe/system/AudioSystem.cpp71
-rw-r--r--src/crepe/system/AudioSystem.h45
-rw-r--r--src/crepe/system/CMakeLists.txt2
-rw-r--r--src/crepe/system/ParticleSystem.cpp8
-rw-r--r--src/crepe/system/PhysicsSystem.cpp4
-rw-r--r--src/crepe/system/RenderSystem.cpp8
-rw-r--r--src/crepe/system/ScriptSystem.cpp4
-rw-r--r--src/crepe/system/System.cpp4
-rw-r--r--src/crepe/system/System.h6
10 files changed, 139 insertions, 21 deletions
diff --git a/src/crepe/system/AnimatorSystem.cpp b/src/crepe/system/AnimatorSystem.cpp
index 4c40940..8bb6465 100644
--- a/src/crepe/system/AnimatorSystem.cpp
+++ b/src/crepe/system/AnimatorSystem.cpp
@@ -1,15 +1,15 @@
#include <cstdint>
-#include "api/Animator.h"
-#include "facade/SDLContext.h"
+#include "../api/Animator.h"
+#include "../facade/SDLContext.h"
+#include "../manager/ComponentManager.h"
#include "AnimatorSystem.h"
-#include "ComponentManager.h"
using namespace crepe;
void AnimatorSystem::update() {
- ComponentManager & mgr = this->component_manager;
+ ComponentManager & mgr = this->mediator.component_manager;
RefVector<Animator> animations = mgr.get_components_by_type<Animator>();
diff --git a/src/crepe/system/AudioSystem.cpp b/src/crepe/system/AudioSystem.cpp
new file mode 100644
index 0000000..84a101a
--- /dev/null
+++ b/src/crepe/system/AudioSystem.cpp
@@ -0,0 +1,71 @@
+#include "AudioSystem.h"
+
+#include "../manager/ComponentManager.h"
+#include "../manager/ResourceManager.h"
+#include "../types.h"
+
+using namespace crepe;
+using namespace std;
+
+void AudioSystem::update() {
+ ComponentManager & component_manager = this->mediator.component_manager;
+ ResourceManager & resource_manager = this->mediator.resource_manager;
+ RefVector<AudioSource> components = component_manager.get_components_by_type<AudioSource>();
+
+ for (AudioSource & component : components) {
+ Sound & resource = resource_manager.get<Sound>(component.source);
+
+ if (component.private_data.empty()) {
+ auto & data = component.private_data.set<ComponentPrivate>();
+ this->update_last(component, data);
+ data.last_active = false;
+ }
+ auto & data = component.private_data.get<ComponentPrivate>();
+
+ this->diff_update(component, data, resource);
+
+ this->update_last(component, data);
+ }
+}
+
+void AudioSystem::diff_update(AudioSource & component, ComponentPrivate & data, Sound & resource) {
+ SoundContext & context = this->get_context();
+
+ if (component.active != data.last_active) {
+ if (component.active) {
+ component.oneshot_play = component.play_on_awake;
+ } else {
+ context.stop(data.handle);
+ return;
+ }
+ }
+ if (!component.active) return;
+
+ if (component.oneshot_play) {
+ data.handle = context.play(resource);
+ component.oneshot_play = false;
+ }
+ if (component.oneshot_stop) {
+ context.stop(data.handle);
+ component.oneshot_stop = false;
+ }
+ if (component.volume != data.last_volume) {
+ context.set_volume(resource, data.handle, component.volume);
+ }
+ if (component.loop != data.last_loop) {
+ context.set_loop(resource, data.handle, component.loop);
+ }
+}
+
+void AudioSystem::update_last(const AudioSource & component, ComponentPrivate & data) {
+ data.last_active = component.active;
+ data.last_loop = component.loop;
+ data.last_volume = component.volume;
+}
+
+SoundContext & AudioSystem::get_context() {
+ if (this->context.empty())
+ this->context.set<SoundContext>();
+ return this->context.get<SoundContext>();
+}
+
diff --git a/src/crepe/system/AudioSystem.h b/src/crepe/system/AudioSystem.h
new file mode 100644
index 0000000..a004c60
--- /dev/null
+++ b/src/crepe/system/AudioSystem.h
@@ -0,0 +1,45 @@
+#pragma once
+
+#include "../facade/SoundContext.h"
+#include "../facade/Sound.h"
+#include "../api/AudioSource.h"
+
+#include "System.h"
+
+namespace crepe {
+
+class AudioSystem : public System {
+public:
+ using System::System;
+ void update() override;
+
+private:
+ /**
+ * \brief Private data stored by AudioSystem on AudioSource component
+ */
+ struct ComponentPrivate {
+ //! This sample's voice handle
+ Sound::Handle handle;
+
+ /**
+ * \name State diffing variables
+ * \{
+ */
+ typeof(AudioSource::active) last_active;
+ typeof(AudioSource::volume) last_volume;
+ typeof(AudioSource::loop) last_loop;
+ //! \}
+ };
+
+ void update_last(const AudioSource & component, ComponentPrivate & data);
+
+ void diff_update(AudioSource & component, ComponentPrivate & data, Sound & resource);
+
+protected:
+ virtual SoundContext & get_context();
+private:
+ Private context;
+};
+
+} // namespace crepe
+
diff --git a/src/crepe/system/CMakeLists.txt b/src/crepe/system/CMakeLists.txt
index d658b25..f507b90 100644
--- a/src/crepe/system/CMakeLists.txt
+++ b/src/crepe/system/CMakeLists.txt
@@ -5,6 +5,7 @@ target_sources(crepe PUBLIC
PhysicsSystem.cpp
CollisionSystem.cpp
RenderSystem.cpp
+ AudioSystem.cpp
AnimatorSystem.cpp
)
@@ -14,5 +15,6 @@ target_sources(crepe PUBLIC FILE_SET HEADERS FILES
PhysicsSystem.h
CollisionSystem.h
RenderSystem.h
+ AudioSystem.h
AnimatorSystem.h
)
diff --git a/src/crepe/system/ParticleSystem.cpp b/src/crepe/system/ParticleSystem.cpp
index 0e62a57..b14c52f 100644
--- a/src/crepe/system/ParticleSystem.cpp
+++ b/src/crepe/system/ParticleSystem.cpp
@@ -2,17 +2,17 @@
#include <cstdlib>
#include <ctime>
-#include "api/ParticleEmitter.h"
-#include "api/Transform.h"
+#include "../api/ParticleEmitter.h"
+#include "../api/Transform.h"
+#include "../manager/ComponentManager.h"
-#include "ComponentManager.h"
#include "ParticleSystem.h"
using namespace crepe;
void ParticleSystem::update() {
// Get all emitters
- ComponentManager & mgr = this->component_manager;
+ ComponentManager & mgr = this->mediator.component_manager;
RefVector<ParticleEmitter> emitters = mgr.get_components_by_type<ParticleEmitter>();
for (ParticleEmitter & emitter : emitters) {
diff --git a/src/crepe/system/PhysicsSystem.cpp b/src/crepe/system/PhysicsSystem.cpp
index 514a4b3..eba9dfa 100644
--- a/src/crepe/system/PhysicsSystem.cpp
+++ b/src/crepe/system/PhysicsSystem.cpp
@@ -1,6 +1,6 @@
#include <cmath>
-#include "../ComponentManager.h"
+#include "../manager/ComponentManager.h"
#include "../api/Config.h"
#include "../api/Rigidbody.h"
#include "../api/Transform.h"
@@ -11,7 +11,7 @@
using namespace crepe;
void PhysicsSystem::update() {
- ComponentManager & mgr = this->component_manager;
+ ComponentManager & mgr = this->mediator.component_manager;
RefVector<Rigidbody> rigidbodies = mgr.get_components_by_type<Rigidbody>();
RefVector<Transform> transforms = mgr.get_components_by_type<Transform>();
diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp
index c196bb1..4e97b3e 100644
--- a/src/crepe/system/RenderSystem.cpp
+++ b/src/crepe/system/RenderSystem.cpp
@@ -5,7 +5,7 @@
#include <stdexcept>
#include <vector>
-#include "../ComponentManager.h"
+#include "../manager/ComponentManager.h"
#include "../api/Camera.h"
#include "../api/ParticleEmitter.h"
#include "../api/Sprite.h"
@@ -22,7 +22,7 @@ void RenderSystem::clear_screen() { this->context.clear_screen(); }
void RenderSystem::present_screen() { this->context.present_screen(); }
const Camera & RenderSystem::update_camera() {
- ComponentManager & mgr = this->component_manager;
+ ComponentManager & mgr = this->mediator.component_manager;
RefVector<Camera> cameras = mgr.get_components_by_type<Camera>();
@@ -62,7 +62,7 @@ void RenderSystem::update() {
bool RenderSystem::render_particle(const Sprite & sprite, const Camera & cam,
const double & scale) {
- ComponentManager & mgr = this->component_manager;
+ ComponentManager & mgr = this->mediator.component_manager;
vector<reference_wrapper<ParticleEmitter>> emitters
= mgr.get_components_by_id<ParticleEmitter>(sprite.game_object_id);
@@ -102,7 +102,7 @@ void RenderSystem::render_normal(const Sprite & sprite, const Camera & cam,
}
void RenderSystem::render() {
- ComponentManager & mgr = this->component_manager;
+ ComponentManager & mgr = this->mediator.component_manager;
const Camera & cam = this->update_camera();
RefVector<Sprite> sprites = mgr.get_components_by_type<Sprite>();
diff --git a/src/crepe/system/ScriptSystem.cpp b/src/crepe/system/ScriptSystem.cpp
index 20a83f7..2e16eb0 100644
--- a/src/crepe/system/ScriptSystem.cpp
+++ b/src/crepe/system/ScriptSystem.cpp
@@ -1,4 +1,4 @@
-#include "../ComponentManager.h"
+#include "../manager/ComponentManager.h"
#include "../api/BehaviorScript.h"
#include "../api/Script.h"
@@ -10,7 +10,7 @@ using namespace crepe;
void ScriptSystem::update() {
dbg_trace();
- ComponentManager & mgr = this->component_manager;
+ ComponentManager & mgr = this->mediator.component_manager;
RefVector<BehaviorScript> behavior_scripts = mgr.get_components_by_type<BehaviorScript>();
for (BehaviorScript & behavior_script : behavior_scripts) {
diff --git a/src/crepe/system/System.cpp b/src/crepe/system/System.cpp
index 937a423..ecc740d 100644
--- a/src/crepe/system/System.cpp
+++ b/src/crepe/system/System.cpp
@@ -1,7 +1,5 @@
-#include "../util/Log.h"
-
#include "System.h"
using namespace crepe;
-System::System(ComponentManager & mgr) : component_manager(mgr) { dbg_trace(); }
+System::System(const Mediator & mediator) : mediator(mediator) {}
diff --git a/src/crepe/system/System.h b/src/crepe/system/System.h
index 28ea20e..4e7fc6d 100644
--- a/src/crepe/system/System.h
+++ b/src/crepe/system/System.h
@@ -1,5 +1,7 @@
#pragma once
+#include "../manager/Mediator.h"
+
namespace crepe {
class ComponentManager;
@@ -19,11 +21,11 @@ public:
virtual void update() = 0;
public:
- System(ComponentManager &);
+ System(const Mediator & m);
virtual ~System() = default;
protected:
- ComponentManager & component_manager;
+ const Mediator & mediator;
};
} // namespace crepe