aboutsummaryrefslogtreecommitdiff
path: root/src/crepe/facade
diff options
context:
space:
mode:
Diffstat (limited to 'src/crepe/facade')
-rw-r--r--src/crepe/facade/CMakeLists.txt13
-rw-r--r--src/crepe/facade/SdlContext.cpp57
-rw-r--r--src/crepe/facade/SdlContext.h33
-rw-r--r--src/crepe/facade/Sound.cpp60
-rw-r--r--src/crepe/facade/Sound.h82
-rw-r--r--src/crepe/facade/SoundContext.cpp20
-rw-r--r--src/crepe/facade/SoundContext.h26
-rw-r--r--src/crepe/facade/Texture.cpp31
-rw-r--r--src/crepe/facade/Texture.h25
-rw-r--r--src/crepe/facade/touch0
10 files changed, 347 insertions, 0 deletions
diff --git a/src/crepe/facade/CMakeLists.txt b/src/crepe/facade/CMakeLists.txt
new file mode 100644
index 0000000..1263683
--- /dev/null
+++ b/src/crepe/facade/CMakeLists.txt
@@ -0,0 +1,13 @@
+target_sources(crepe PUBLIC
+ Sound.cpp
+ SoundContext.cpp
+ Texture.cpp
+ SdlContext.cpp
+)
+
+target_sources(crepe PUBLIC FILE_SET HEADERS FILES
+ Sound.h
+ SoundContext.h
+ Texture.h
+ SdlContext.h
+)
diff --git a/src/crepe/facade/SdlContext.cpp b/src/crepe/facade/SdlContext.cpp
new file mode 100644
index 0000000..fc68b40
--- /dev/null
+++ b/src/crepe/facade/SdlContext.cpp
@@ -0,0 +1,57 @@
+
+
+#include "SdlContext.h"
+#include <SDL2/SDL.h>
+#include <SDL2/SDL_render.h>
+#include <SDL2/SDL_surface.h>
+#include <SDL2/SDL_video.h>
+#include <SDL2/SDL_image.h>
+
+using namespace crepe;
+
+
+SdlContext& SdlContext::get_instance(){
+ static SdlContext instance;
+ return instance;
+}
+
+
+SdlContext::SdlContext(){
+ if (SDL_Init(SDL_INIT_VIDEO) < 0) {
+ std::cerr << "SDL could not initialize! SDL_Error: " << SDL_GetError() << std::endl;
+ return;
+ }
+
+ m_game_window = SDL_CreateWindow("Crepe Game Engine", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_SHOWN);
+ if (!m_game_window) {
+ std::cerr << "Window could not be created! SDL_Error: " << SDL_GetError() << std::endl;
+ }
+
+ m_game_renderer = SDL_CreateRenderer(m_game_window, -1, SDL_RENDERER_ACCELERATED);
+ if (!m_game_renderer) {
+ std::cerr << "Renderer could not be created! SDL_Error: " << SDL_GetError() << std::endl;
+ SDL_DestroyWindow(m_game_window);
+ return;
+ }
+
+ IMG_Init(IMG_INIT_PNG);
+}
+
+SdlContext::~SdlContext(){
+ if(m_game_renderer)
+ SDL_DestroyRenderer(m_game_renderer);
+
+ if (m_game_window) {
+ SDL_DestroyWindow(m_game_window);
+ }
+ IMG_Quit();
+}
+
+
+SDL_Texture* SdlContext::setTextureFromPath(const char* path){
+ SDL_Surface* tmp = IMG_Load(path);
+ SDL_Texture* CreatedTexture = SDL_CreateTextureFromSurface(m_game_renderer, tmp);
+ SDL_FreeSurface(tmp);
+
+ return CreatedTexture;
+}
diff --git a/src/crepe/facade/SdlContext.h b/src/crepe/facade/SdlContext.h
new file mode 100644
index 0000000..c275300
--- /dev/null
+++ b/src/crepe/facade/SdlContext.h
@@ -0,0 +1,33 @@
+#pragma once
+
+#include "Texture.h"
+#include <SDL2/SDL_render.h>
+#include <SDL2/SDL_video.h>
+#include <string>
+
+namespace crepe {
+
+class SdlContext {
+
+private:
+ SdlContext();
+ virtual ~SdlContext();
+
+ // singleton
+ static SdlContext & get_instance();
+ SdlContext(const SdlContext &) = delete;
+ SdlContext(SdlContext &&) = delete;
+ SdlContext & operator=(const SdlContext &) = delete;
+ SdlContext & operator=(SdlContext &&) = delete;
+
+ SDL_Texture* setTextureFromPath(const char*);
+
+private:
+ friend class Texture;
+
+ SDL_Window* m_game_window;
+ SDL_Renderer* m_game_renderer;
+};
+
+} //
+
diff --git a/src/crepe/facade/Sound.cpp b/src/crepe/facade/Sound.cpp
new file mode 100644
index 0000000..e1150ac
--- /dev/null
+++ b/src/crepe/facade/Sound.cpp
@@ -0,0 +1,60 @@
+#include "util/log.h"
+
+#include "Sound.h"
+#include "SoundContext.h"
+
+using namespace crepe;
+
+Sound::Sound(std::unique_ptr<api::Resource> res) {
+ dbg_trace();
+ this->load(std::move(res));
+}
+
+Sound::Sound(const char * src) {
+ dbg_trace();
+ this->load(std::make_unique<api::Resource>(src));
+}
+
+void Sound::load(std::unique_ptr<api::Resource> res) {
+ this->sample.load(res->canonical());
+}
+
+void Sound::play() {
+ SoundContext & ctx = SoundContext::get_instance();
+ if (ctx.engine.getPause(this->handle)) {
+ // resume if paused
+ ctx.engine.setPause(this->handle, false);
+ } else {
+ // or start new sound
+ this->handle = ctx.engine.play(this->sample, this->volume);
+ ctx.engine.setLooping(this->handle, this->looping);
+ }
+}
+
+void Sound::pause() {
+ SoundContext & ctx = SoundContext::get_instance();
+ if (ctx.engine.getPause(this->handle)) return;
+ ctx.engine.setPause(this->handle, true);
+}
+
+void Sound::rewind() {
+ SoundContext & ctx = SoundContext::get_instance();
+ if (!ctx.engine.isValidVoiceHandle(this->handle)) return;
+ ctx.engine.seek(this->handle, 0);
+}
+
+void Sound::set_volume(float volume) {
+ this->volume = volume;
+
+ SoundContext & ctx = SoundContext::get_instance();
+ if (!ctx.engine.isValidVoiceHandle(this->handle)) return;
+ ctx.engine.setVolume(this->handle, this->volume);
+}
+
+void Sound::set_looping(bool looping) {
+ this->looping = looping;
+
+ SoundContext & ctx = SoundContext::get_instance();
+ if (!ctx.engine.isValidVoiceHandle(this->handle)) return;
+ ctx.engine.setLooping(this->handle, this->looping);
+}
diff --git a/src/crepe/facade/Sound.h b/src/crepe/facade/Sound.h
new file mode 100644
index 0000000..ac93991
--- /dev/null
+++ b/src/crepe/facade/Sound.h
@@ -0,0 +1,82 @@
+#pragma once
+
+#include <soloud.h>
+#include <soloud_wav.h>
+
+#include <memory>
+
+#include "api/Resource.h"
+
+namespace crepe {
+
+class Sound {
+public:
+ /**
+ * \brief Pause this sample
+ *
+ * Pauses this sound if it is playing, or does nothing if it is already
+ * paused. The playhead position is saved, such that calling \c play() after
+ * this function makes the sound resume.
+ */
+ void pause();
+ /**
+ * \brief Play this sample
+ *
+ * Resume playback if this sound is paused, or start from the beginning of
+ * the sample.
+ *
+ * \note This class only saves a reference to the most recent 'voice' of this
+ * sound. Calling \c play() while the sound is already playing causes
+ * multiple instances of the sample to play simultaniously. The sample
+ * started last is the one that is controlled afterwards.
+ */
+ void play();
+ /**
+ * \brief Reset playhead position
+ *
+ * Resets the playhead position so that calling \c play() after this function
+ * makes it play from the start of the sample. If the sound is not paused
+ * before calling this function, this function will stop playback.
+ */
+ void rewind();
+ /**
+ * \brief Set playback volume / gain
+ *
+ * \param volume Volume (0 = muted, 1 = full volume)
+ */
+ void set_volume(float volume);
+ /**
+ * \brief Get playback volume / gain
+ *
+ * \return Volume
+ */
+ float get_volume() const { return this->volume; }
+ /**
+ * \brief Set looping behavior for this sample
+ *
+ * \param looping Looping behavior (false = one-shot, true = loop)
+ */
+ void set_looping(bool looping);
+ /**
+ * \brief Get looping behavior
+ *
+ * \return true if looping, false if one-shot
+ */
+ bool get_looping() const { return this->looping; }
+
+public:
+ Sound(const char * src);
+ Sound(std::unique_ptr<api::Resource> res);
+
+private:
+ void load(std::unique_ptr<api::Resource> res);
+
+private:
+ SoLoud::Wav sample;
+ SoLoud::handle handle;
+
+ float volume = 1.0f;
+ bool looping = false;
+};
+
+} // namespace crepe
diff --git a/src/crepe/facade/SoundContext.cpp b/src/crepe/facade/SoundContext.cpp
new file mode 100644
index 0000000..72047d2
--- /dev/null
+++ b/src/crepe/facade/SoundContext.cpp
@@ -0,0 +1,20 @@
+#include "util/log.h"
+
+#include "SoundContext.h"
+
+using namespace crepe;
+
+SoundContext & SoundContext::get_instance() {
+ static SoundContext instance;
+ return instance;
+}
+
+SoundContext::SoundContext() {
+ dbg_trace();
+ engine.init();
+}
+
+SoundContext::~SoundContext() {
+ dbg_trace();
+ engine.deinit();
+}
diff --git a/src/crepe/facade/SoundContext.h b/src/crepe/facade/SoundContext.h
new file mode 100644
index 0000000..090966d
--- /dev/null
+++ b/src/crepe/facade/SoundContext.h
@@ -0,0 +1,26 @@
+#pragma once
+
+#include <soloud.h>
+
+#include "Sound.h"
+
+namespace crepe {
+
+class SoundContext {
+private:
+ SoundContext();
+ virtual ~SoundContext();
+
+ // singleton
+ static SoundContext & get_instance();
+ SoundContext(const SoundContext &) = delete;
+ SoundContext(SoundContext &&) = delete;
+ SoundContext & operator=(const SoundContext &) = delete;
+ SoundContext & operator=(SoundContext &&) = delete;
+
+private:
+ SoLoud::Soloud engine;
+ friend class Sound;
+};
+
+} // namespace crepe
diff --git a/src/crepe/facade/Texture.cpp b/src/crepe/facade/Texture.cpp
new file mode 100644
index 0000000..c24312a
--- /dev/null
+++ b/src/crepe/facade/Texture.cpp
@@ -0,0 +1,31 @@
+
+
+#include "util/log.h"
+
+#include "Texture.h"
+#include "SdlContext.h"
+#include <SDL2/SDL_render.h>
+
+using namespace crepe;
+
+Texture::Texture(std::unique_ptr<api::Resource> res) {
+ dbg_trace();
+ this->load(std::move(res));
+}
+
+Texture::Texture(const char * src) {
+ dbg_trace();
+ this->load(std::make_unique<api::Resource>(src));
+}
+
+Texture::~Texture(){
+ dbg_trace();
+ if(this->m_texture){
+ SDL_DestroyTexture(m_texture);
+ }
+}
+void Texture::load(std::unique_ptr<api::Resource> res) {
+ SdlContext& ctx = SdlContext::get_instance();
+ m_texture = ctx.setTextureFromPath(res->canonical());
+}
+
diff --git a/src/crepe/facade/Texture.h b/src/crepe/facade/Texture.h
new file mode 100644
index 0000000..3677f6e
--- /dev/null
+++ b/src/crepe/facade/Texture.h
@@ -0,0 +1,25 @@
+#pragma once
+
+#include "api/Resource.h"
+#include <SDL2/SDL_render.h>
+#include <memory>
+
+
+namespace crepe {
+
+class Texture {
+
+public:
+ Texture(const char * src);
+ Texture(std::unique_ptr<api::Resource> res);
+ ~Texture();
+
+private:
+ void load(std::unique_ptr<api::Resource> res);
+
+private:
+ SDL_Texture* m_texture;
+};
+
+} // namespace crepe
+
diff --git a/src/crepe/facade/touch b/src/crepe/facade/touch
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/crepe/facade/touch