From f4bb6d57cc88a7e25b3a5f43faafa49a7f500b7c Mon Sep 17 00:00:00 2001 From: Loek Le Blansch Date: Sat, 5 Oct 2024 14:16:57 +0200 Subject: restructure unit tests and dummies --- src/example/CMakeLists.txt | 3 +++ src/example/audio_internal.cpp | 46 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 src/example/CMakeLists.txt create mode 100644 src/example/audio_internal.cpp (limited to 'src/example') diff --git a/src/example/CMakeLists.txt b/src/example/CMakeLists.txt new file mode 100644 index 0000000..bcc9271 --- /dev/null +++ b/src/example/CMakeLists.txt @@ -0,0 +1,3 @@ +add_executable(audio_internal EXCLUDE_FROM_ALL audio_internal.cpp) +target_link_libraries(audio_internal PUBLIC crepe) + diff --git a/src/example/audio_internal.cpp b/src/example/audio_internal.cpp new file mode 100644 index 0000000..09bd55c --- /dev/null +++ b/src/example/audio_internal.cpp @@ -0,0 +1,46 @@ +/** \file + * + * Standalone example for usage of the internal \c Sound class. + */ + +#include +#include + +#include +#include + +using namespace crepe; +using namespace std; +using namespace std::chrono_literals; +using std::make_unique; + +int main() { + dbg_trace(); + + auto bgm = Sound("../mwe/audio/bgm.ogg"); + auto sfx1 = Sound("../mwe/audio/sfx1.wav"); + auto sfx2 = Sound("../mwe/audio/sfx2.wav"); + auto sfx3 = Sound("../mwe/audio/sfx3.wav"); + + bgm.play(); + + // play each sample sequentially + this_thread::sleep_for(500ms); + sfx1.play(); + this_thread::sleep_for(500ms); + sfx2.play(); + bgm.pause(); + this_thread::sleep_for(500ms); + sfx3.play(); + bgm.play(); + this_thread::sleep_for(500ms); + + // play all samples simultaniously + sfx1.play(); + sfx2.play(); + sfx3.play(); + this_thread::sleep_for(1000ms); + + return 0; +} + -- cgit v1.2.3 From e54ebc7e74f3ca94de3467a03397c0aad2aed079 Mon Sep 17 00:00:00 2001 From: Loek Le Blansch Date: Sat, 5 Oct 2024 14:50:49 +0200 Subject: `make format` + clang-tidy --- makefile | 3 +-- src/crepe/Sound.cpp | 1 - src/crepe/api/AudioSource.h | 2 +- src/crepe/util/log.h | 3 +++ src/example/audio_internal.cpp | 1 - src/makefile | 6 ++++++ src/test/audio.cpp | 23 ++--------------------- src/test/dummy.cpp | 1 - 8 files changed, 13 insertions(+), 27 deletions(-) create mode 100644 src/makefile (limited to 'src/example') diff --git a/makefile b/makefile index 737e7a8..dd7c587 100644 --- a/makefile +++ b/makefile @@ -6,6 +6,5 @@ doxygen: Doxyfile FORCE FMT += $(shell git ls-files '*.c' '*.cpp' '*.h' '*.hpp') format: FORCE clang-format -i $(FMT) -# clang tidy doesn't work that well :/ -# clang-tidy --fix-errors $(FMT) + $(MAKE) -C src $@ diff --git a/src/crepe/Sound.cpp b/src/crepe/Sound.cpp index 73ad69c..64fa281 100644 --- a/src/crepe/Sound.cpp +++ b/src/crepe/Sound.cpp @@ -58,4 +58,3 @@ void Sound::set_looping(bool looping) { if (!ctx.engine.isValidVoiceHandle(this->handle)) return; ctx.engine.setLooping(this->handle, this->looping); } - diff --git a/src/crepe/api/AudioSource.h b/src/crepe/api/AudioSource.h index 9dfaf46..2002d1a 100644 --- a/src/crepe/api/AudioSource.h +++ b/src/crepe/api/AudioSource.h @@ -2,8 +2,8 @@ #include -#include "Component.h" #include "Asset.h" +#include "Component.h" namespace crepe { class Sound; diff --git a/src/crepe/util/log.h b/src/crepe/util/log.h index 4cab338..bfe7291 100644 --- a/src/crepe/util/log.h +++ b/src/crepe/util/log.h @@ -12,9 +12,12 @@ __FILE_NAME__, __LINE__, crepe::util::color::RESET, \ __VA_ARGS__) +// very illegal global function-style macros +// NOLINTBEGIN #define dbg_logf(fmt, ...) _crepe_logf_here(": " fmt, __VA_ARGS__) #define dbg_log(str) _crepe_logf_here(": %s", str) #define dbg_trace() _crepe_logf_here("%s", "") +// NOLINTEND #endif diff --git a/src/example/audio_internal.cpp b/src/example/audio_internal.cpp index 09bd55c..1199e2d 100644 --- a/src/example/audio_internal.cpp +++ b/src/example/audio_internal.cpp @@ -43,4 +43,3 @@ int main() { return 0; } - diff --git a/src/makefile b/src/makefile new file mode 100644 index 0000000..c1ef601 --- /dev/null +++ b/src/makefile @@ -0,0 +1,6 @@ +.PHONY: FORCE + +FMT += $(shell git ls-files '*.c' '*.cpp' '*.h' '*.hpp') +format: FORCE + clang-tidy -p build/compile_commands.json --fix-errors $(FMT) + diff --git a/src/test/audio.cpp b/src/test/audio.cpp index 1d84551..d6ff689 100644 --- a/src/test/audio.cpp +++ b/src/test/audio.cpp @@ -1,29 +1,10 @@ #include -#include - -#include -#include - -#include -#include using namespace std; using namespace std::chrono_literals; -using namespace crepe::api; +// using namespace crepe; // TODO: mock internal audio class -TEST(audio, play) { - auto res = std::make_unique("../mwe/audio/bgm.ogg"); - auto bgm = AudioSource(std::move(res)); - - bgm.play(); - - this_thread::sleep_for(2s); - - bgm.stop(); - - ASSERT_TRUE(true); -} - +TEST(audio, play) { ASSERT_TRUE(true); } diff --git a/src/test/dummy.cpp b/src/test/dummy.cpp index 7f4c083..a00a9c6 100644 --- a/src/test/dummy.cpp +++ b/src/test/dummy.cpp @@ -1,4 +1,3 @@ #include TEST(dummy, foo) { ASSERT_TRUE(1); } - -- cgit v1.2.3 From 39815f58e3842bb28e644e83111a619bd1374855 Mon Sep 17 00:00:00 2001 From: Loek Le Blansch Date: Sun, 6 Oct 2024 15:12:01 +0200 Subject: add components_internal example --- src/crepe/ComponentManager.cpp | 2 +- src/crepe/ComponentManager.h | 11 +++++--- src/crepe/GameObject.cpp | 2 +- src/crepe/GameObject.h | 3 ++ src/example/CMakeLists.txt | 18 ++++++++++-- src/example/components_internal.cpp | 56 +++++++++++++++++++++++++++++++++++++ 6 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 src/example/components_internal.cpp (limited to 'src/example') diff --git a/src/crepe/ComponentManager.cpp b/src/crepe/ComponentManager.cpp index b080c9d..9a3fec7 100644 --- a/src/crepe/ComponentManager.cpp +++ b/src/crepe/ComponentManager.cpp @@ -7,7 +7,7 @@ ComponentManager & ComponentManager::get_instance() { return instance; } -void ComponentManager::delete_all_components_of_id(std::uint32_t id) { +void ComponentManager::delete_all_components_of_id(uint32_t id) { // Loop through all the types (in the unordered_map<>) for (auto & [type, componentArray] : components) { // Make sure that the id (that we are looking for) is within the boundaries of the vector<> diff --git a/src/crepe/ComponentManager.h b/src/crepe/ComponentManager.h index cf6edad..9e559dd 100644 --- a/src/crepe/ComponentManager.h +++ b/src/crepe/ComponentManager.h @@ -23,22 +23,22 @@ public: public: //! Add a component of a specific type template - void add_component(std::uint32_t id, Args &&... args); + void add_component(uint32_t id, Args &&... args); //! Deletes all components of a specific type and id template - void delete_components_by_id(std::uint32_t id); + void delete_components_by_id(uint32_t id); //! Deletes all components of a specific type template void delete_components(); //! Deletes all components of a specific id - void delete_all_components_of_id(std::uint32_t id); + void delete_all_components_of_id(uint32_t id); //! Deletes all components void delete_all_components(); //! Get a vector<> of all components at specific type and id template std::vector> - get_components_by_id(std::uint32_t id) const; + get_components_by_id(uint32_t id) const; //! Get a vector<> of all components of a specific type template std::vector> get_components_by_type() const; @@ -58,3 +58,6 @@ private: }; } // namespace crepe + +#include "ComponentManager.hpp" + diff --git a/src/crepe/GameObject.cpp b/src/crepe/GameObject.cpp index 304f75a..de3beb6 100644 --- a/src/crepe/GameObject.cpp +++ b/src/crepe/GameObject.cpp @@ -2,6 +2,6 @@ using namespace crepe; -GameObject::GameObject(std::uint32_t id, std::string name, std::string tag, +GameObject::GameObject(uint32_t id, std::string name, std::string tag, int layer) : id(id), name(name), tag(tag), active(true), layer(layer) {} diff --git a/src/crepe/GameObject.h b/src/crepe/GameObject.h index 114990c..d5a7c36 100644 --- a/src/crepe/GameObject.h +++ b/src/crepe/GameObject.h @@ -20,3 +20,6 @@ public: }; } // namespace crepe + +#include "GameObject.hpp" + diff --git a/src/example/CMakeLists.txt b/src/example/CMakeLists.txt index bcc9271..eef38fd 100644 --- a/src/example/CMakeLists.txt +++ b/src/example/CMakeLists.txt @@ -1,3 +1,17 @@ -add_executable(audio_internal EXCLUDE_FROM_ALL audio_internal.cpp) -target_link_libraries(audio_internal PUBLIC crepe) +# add_example(target_name [SOURCES...]) +function(add_example target_name) + # if SOURCES is not specified + if(NOT ARGV1) + # A .cpp file with target_name exists, and should be used + set(sources ${target_name}.cpp) + else() + set(sources ${ARGV}) + endif() + + add_executable(${target_name} EXCLUDE_FROM_ALL ${sources}) + target_link_libraries(${target_name} PUBLIC crepe) +endfunction() + +add_example(audio_internal) +add_example(components_internal) diff --git a/src/example/components_internal.cpp b/src/example/components_internal.cpp new file mode 100644 index 0000000..821a7de --- /dev/null +++ b/src/example/components_internal.cpp @@ -0,0 +1,56 @@ +/** \file + * + * Standalone example for usage of the internal ECS + */ + +#include +#include + +#include +#include +#include +#include + +using namespace crepe; +using namespace std; + +#define OBJ_COUNT 100000 + +int main() { + dbg_trace(); + + auto & mgr = ComponentManager::get_instance(); + + auto start_adding = chrono::high_resolution_clock::now(); + + GameObject * game_object[OBJ_COUNT]; + + for (int i = 0; i < OBJ_COUNT; ++i) { + game_object[i] = new GameObject(i, "Name", "Tag", 0); + + game_object[i]->add_component("test"); + game_object[i]->add_component(0, 0, i); + game_object[i]->add_component(i); + } + + auto stop_adding = chrono::high_resolution_clock::now(); + + auto sprites = mgr.get_components_by_type(); + for (auto sprite : sprites) { + assert(sprite.get().path == "test"); + } + + auto stop_looping = chrono::high_resolution_clock::now(); + + for (int i = 0; i < OBJ_COUNT; ++i) { + delete game_object[i]; + } + + auto add_time = chrono::duration_cast(stop_adding - start_adding); + auto loop_time = chrono::duration_cast(stop_looping - stop_adding); + printf("add time: %ldus\n", add_time.count()); + printf("loop time: %ldus\n", loop_time.count()); + + return 0; +} + -- cgit v1.2.3 From aa8755148cbca29b584f7a146636b506070717f9 Mon Sep 17 00:00:00 2001 From: Loek Le Blansch Date: Sun, 6 Oct 2024 15:28:12 +0200 Subject: move components to separate files --- contributing.md | 1 + src/crepe/CMakeLists.txt | 10 ++++++++-- src/crepe/Collider.cpp | 6 ++++++ src/crepe/Collider.h | 15 ++++++++++++++ src/crepe/Component.cpp | 6 ++++++ src/crepe/Component.h | 15 ++++++++++++++ src/crepe/ComponentManager.h | 2 +- src/crepe/Components.cpp | 13 ------------- src/crepe/Components.h | 39 ------------------------------------- src/crepe/Rigidbody.cpp | 7 +++++++ src/crepe/Rigidbody.h | 16 +++++++++++++++ src/crepe/Sprite.cpp | 9 +++++++++ src/crepe/Sprite.h | 17 ++++++++++++++++ src/example/components_internal.cpp | 5 ++++- 14 files changed, 105 insertions(+), 56 deletions(-) create mode 100644 src/crepe/Collider.cpp create mode 100644 src/crepe/Collider.h create mode 100644 src/crepe/Component.cpp create mode 100644 src/crepe/Component.h delete mode 100644 src/crepe/Components.cpp delete mode 100644 src/crepe/Components.h create mode 100644 src/crepe/Rigidbody.cpp create mode 100644 src/crepe/Rigidbody.h create mode 100644 src/crepe/Sprite.cpp create mode 100644 src/crepe/Sprite.h (limited to 'src/example') diff --git a/contributing.md b/contributing.md index 933f1bf..b79f7a7 100644 --- a/contributing.md +++ b/contributing.md @@ -17,6 +17,7 @@ # Code style - ASCII only +- Class names are always singular - Explanatory comments are placed above the line(s) they are explaining - Source files should only contain comments that plainly state what the code is supposed to do diff --git a/src/crepe/CMakeLists.txt b/src/crepe/CMakeLists.txt index 5840208..d7d563e 100644 --- a/src/crepe/CMakeLists.txt +++ b/src/crepe/CMakeLists.txt @@ -3,8 +3,11 @@ target_sources(crepe PUBLIC Sound.cpp SoundContext.cpp ComponentManager.cpp - Components.cpp + Component.cpp GameObject.cpp + Collider.cpp + Rigidbody.cpp + Sprite.cpp ) target_sources(crepe PUBLIC FILE_SET HEADERS FILES @@ -13,9 +16,12 @@ target_sources(crepe PUBLIC FILE_SET HEADERS FILES SoundContext.h ComponentManager.h ComponentManager.hpp - Components.h + Component.h GameObject.h GameObject.hpp + Collider.h + Rigidbody.h + Sprite.h ) add_subdirectory(api) diff --git a/src/crepe/Collider.cpp b/src/crepe/Collider.cpp new file mode 100644 index 0000000..b7040eb --- /dev/null +++ b/src/crepe/Collider.cpp @@ -0,0 +1,6 @@ +#include "Collider.h" + +using namespace crepe; + +Collider::Collider(int size) : size(size) {} + diff --git a/src/crepe/Collider.h b/src/crepe/Collider.h new file mode 100644 index 0000000..666386d --- /dev/null +++ b/src/crepe/Collider.h @@ -0,0 +1,15 @@ +#pragma once + +#include "Component.h" + +namespace crepe { + +class Collider : public Component { +public: + Collider(int size); + + int size; +}; + +} + diff --git a/src/crepe/Component.cpp b/src/crepe/Component.cpp new file mode 100644 index 0000000..9a7731a --- /dev/null +++ b/src/crepe/Component.cpp @@ -0,0 +1,6 @@ +#include "Component.h" + +using namespace crepe; + +Component::Component() : active(true) {} + diff --git a/src/crepe/Component.h b/src/crepe/Component.h new file mode 100644 index 0000000..6e23d93 --- /dev/null +++ b/src/crepe/Component.h @@ -0,0 +1,15 @@ +#pragma once + +namespace crepe { + +class Component { +public: + Component(); + // TODO: shouldn't this constructor be deleted because this class will never + // directly be instantiated? + + bool active; +}; + +} // namespace crepe + diff --git a/src/crepe/ComponentManager.h b/src/crepe/ComponentManager.h index 9e559dd..9463558 100644 --- a/src/crepe/ComponentManager.h +++ b/src/crepe/ComponentManager.h @@ -7,7 +7,7 @@ #include #include -#include "Components.h" +#include "Component.h" namespace crepe { diff --git a/src/crepe/Components.cpp b/src/crepe/Components.cpp deleted file mode 100644 index f27c7a4..0000000 --- a/src/crepe/Components.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include "Components.h" - -using namespace crepe; -using namespace std; - -Component::Component() : active(true) {} - -Sprite::Sprite(string path) : path(path) {} - -Rigidbody::Rigidbody(int mass, int gravityScale, int bodyType) - : mass(mass), gravity_scale(gravityScale), body_type(bodyType) {} - -Collider::Collider(int size) : size(size) {} diff --git a/src/crepe/Components.h b/src/crepe/Components.h deleted file mode 100644 index 139599c..0000000 --- a/src/crepe/Components.h +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once - -#include - -namespace crepe { - -class Component { -public: - Component(); - - bool active; -}; - -// TODO: these should be in separate files - -class Sprite : public Component { -public: - Sprite(std::string path); - - std::string path; -}; - -class Rigidbody : public Component { -public: - Rigidbody(int mass, int gravityScale, int bodyType); - - int mass; - int gravity_scale; - int body_type; -}; - -class Collider : public Component { -public: - Collider(int size); - - int size; -}; - -} // namespace crepe diff --git a/src/crepe/Rigidbody.cpp b/src/crepe/Rigidbody.cpp new file mode 100644 index 0000000..1518d28 --- /dev/null +++ b/src/crepe/Rigidbody.cpp @@ -0,0 +1,7 @@ +#include "Rigidbody.h" + +using namespace crepe; + +Rigidbody::Rigidbody(int mass, int gravityScale, int bodyType) + : mass(mass), gravity_scale(gravityScale), body_type(bodyType) {} + diff --git a/src/crepe/Rigidbody.h b/src/crepe/Rigidbody.h new file mode 100644 index 0000000..67edb03 --- /dev/null +++ b/src/crepe/Rigidbody.h @@ -0,0 +1,16 @@ +#pragma once + +#include "Component.h" + +namespace crepe { + +class Rigidbody : public Component { +public: + Rigidbody(int mass, int gravityScale, int bodyType); + + int mass; + int gravity_scale; + int body_type; +}; + +} diff --git a/src/crepe/Sprite.cpp b/src/crepe/Sprite.cpp new file mode 100644 index 0000000..c835d83 --- /dev/null +++ b/src/crepe/Sprite.cpp @@ -0,0 +1,9 @@ +#include + +#include "Sprite.h" + +using namespace crepe; +using namespace std; + +Sprite::Sprite(string path) : path(path) {} + diff --git a/src/crepe/Sprite.h b/src/crepe/Sprite.h new file mode 100644 index 0000000..029064b --- /dev/null +++ b/src/crepe/Sprite.h @@ -0,0 +1,17 @@ +#pragma once + +#include + +#include "Component.h" + +namespace crepe { + +class Sprite : public Component { +public: + Sprite(std::string path); + + std::string path; +}; + +} + diff --git a/src/example/components_internal.cpp b/src/example/components_internal.cpp index 821a7de..4246dd7 100644 --- a/src/example/components_internal.cpp +++ b/src/example/components_internal.cpp @@ -9,7 +9,10 @@ #include #include #include -#include +#include +#include +#include +#include using namespace crepe; using namespace std; -- cgit v1.2.3 From 8a509ad4c5e15fbf7eaade1c8bf4834f0d0069c5 Mon Sep 17 00:00:00 2001 From: Loek Le Blansch Date: Sun, 6 Oct 2024 15:29:39 +0200 Subject: `make format` --- src/crepe/Collider.cpp | 1 - src/crepe/Collider.h | 3 +-- src/crepe/Component.cpp | 1 - src/crepe/Component.h | 1 - src/crepe/ComponentManager.h | 1 - src/crepe/GameObject.h | 1 - src/crepe/Rigidbody.cpp | 1 - src/crepe/Rigidbody.h | 2 +- src/crepe/Sprite.cpp | 1 - src/crepe/Sprite.h | 3 +-- src/example/components_internal.cpp | 47 +++++++++++++++++++------------------ 11 files changed, 27 insertions(+), 35 deletions(-) (limited to 'src/example') diff --git a/src/crepe/Collider.cpp b/src/crepe/Collider.cpp index b7040eb..3f12afd 100644 --- a/src/crepe/Collider.cpp +++ b/src/crepe/Collider.cpp @@ -3,4 +3,3 @@ using namespace crepe; Collider::Collider(int size) : size(size) {} - diff --git a/src/crepe/Collider.h b/src/crepe/Collider.h index 666386d..120da05 100644 --- a/src/crepe/Collider.h +++ b/src/crepe/Collider.h @@ -11,5 +11,4 @@ public: int size; }; -} - +} // namespace crepe diff --git a/src/crepe/Component.cpp b/src/crepe/Component.cpp index 9a7731a..d14159c 100644 --- a/src/crepe/Component.cpp +++ b/src/crepe/Component.cpp @@ -3,4 +3,3 @@ using namespace crepe; Component::Component() : active(true) {} - diff --git a/src/crepe/Component.h b/src/crepe/Component.h index 6e23d93..16a4ce5 100644 --- a/src/crepe/Component.h +++ b/src/crepe/Component.h @@ -12,4 +12,3 @@ public: }; } // namespace crepe - diff --git a/src/crepe/ComponentManager.h b/src/crepe/ComponentManager.h index 9463558..2ab9dc8 100644 --- a/src/crepe/ComponentManager.h +++ b/src/crepe/ComponentManager.h @@ -60,4 +60,3 @@ private: } // namespace crepe #include "ComponentManager.hpp" - diff --git a/src/crepe/GameObject.h b/src/crepe/GameObject.h index d5a7c36..3588d9a 100644 --- a/src/crepe/GameObject.h +++ b/src/crepe/GameObject.h @@ -22,4 +22,3 @@ public: } // namespace crepe #include "GameObject.hpp" - diff --git a/src/crepe/Rigidbody.cpp b/src/crepe/Rigidbody.cpp index 1518d28..495d908 100644 --- a/src/crepe/Rigidbody.cpp +++ b/src/crepe/Rigidbody.cpp @@ -4,4 +4,3 @@ using namespace crepe; Rigidbody::Rigidbody(int mass, int gravityScale, int bodyType) : mass(mass), gravity_scale(gravityScale), body_type(bodyType) {} - diff --git a/src/crepe/Rigidbody.h b/src/crepe/Rigidbody.h index 67edb03..63a8877 100644 --- a/src/crepe/Rigidbody.h +++ b/src/crepe/Rigidbody.h @@ -13,4 +13,4 @@ public: int body_type; }; -} +} // namespace crepe diff --git a/src/crepe/Sprite.cpp b/src/crepe/Sprite.cpp index c835d83..a5a5e68 100644 --- a/src/crepe/Sprite.cpp +++ b/src/crepe/Sprite.cpp @@ -6,4 +6,3 @@ using namespace crepe; using namespace std; Sprite::Sprite(string path) : path(path) {} - diff --git a/src/crepe/Sprite.h b/src/crepe/Sprite.h index 029064b..143e702 100644 --- a/src/crepe/Sprite.h +++ b/src/crepe/Sprite.h @@ -13,5 +13,4 @@ public: std::string path; }; -} - +} // namespace crepe diff --git a/src/example/components_internal.cpp b/src/example/components_internal.cpp index 4246dd7..54ce295 100644 --- a/src/example/components_internal.cpp +++ b/src/example/components_internal.cpp @@ -6,13 +6,13 @@ #include #include -#include +#include +#include #include #include -#include -#include #include -#include +#include +#include using namespace crepe; using namespace std; @@ -24,36 +24,37 @@ int main() { auto & mgr = ComponentManager::get_instance(); - auto start_adding = chrono::high_resolution_clock::now(); + auto start_adding = chrono::high_resolution_clock::now(); - GameObject * game_object[OBJ_COUNT]; + GameObject * game_object[OBJ_COUNT]; - for (int i = 0; i < OBJ_COUNT; ++i) { - game_object[i] = new GameObject(i, "Name", "Tag", 0); + for (int i = 0; i < OBJ_COUNT; ++i) { + game_object[i] = new GameObject(i, "Name", "Tag", 0); - game_object[i]->add_component("test"); - game_object[i]->add_component(0, 0, i); - game_object[i]->add_component(i); - } + game_object[i]->add_component("test"); + game_object[i]->add_component(0, 0, i); + game_object[i]->add_component(i); + } - auto stop_adding = chrono::high_resolution_clock::now(); + auto stop_adding = chrono::high_resolution_clock::now(); - auto sprites = mgr.get_components_by_type(); - for (auto sprite : sprites) { + auto sprites = mgr.get_components_by_type(); + for (auto sprite : sprites) { assert(sprite.get().path == "test"); - } + } - auto stop_looping = chrono::high_resolution_clock::now(); + auto stop_looping = chrono::high_resolution_clock::now(); - for (int i = 0; i < OBJ_COUNT; ++i) { - delete game_object[i]; - } + for (int i = 0; i < OBJ_COUNT; ++i) { + delete game_object[i]; + } - auto add_time = chrono::duration_cast(stop_adding - start_adding); - auto loop_time = chrono::duration_cast(stop_looping - stop_adding); + auto add_time = chrono::duration_cast(stop_adding + - start_adding); + auto loop_time = chrono::duration_cast(stop_looping + - stop_adding); printf("add time: %ldus\n", add_time.count()); printf("loop time: %ldus\n", loop_time.count()); return 0; } - -- cgit v1.2.3 From 2969fe8c0fca4826ca129fe12d2e125bb7955c78 Mon Sep 17 00:00:00 2001 From: Loek Le Blansch Date: Sun, 6 Oct 2024 17:39:15 +0200 Subject: WIP ScriptSystem --- src/crepe/CMakeLists.txt | 4 ++++ src/crepe/ComponentManager.hpp | 14 ++++++++++---- src/crepe/Script.cpp | 7 +++++++ src/crepe/Script.h | 16 ++++++++++++++++ src/crepe/ScriptSystem.cpp | 22 ++++++++++++++++++++++ src/crepe/ScriptSystem.h | 18 ++++++++++++++++++ src/crepe/System.h | 23 +++++++++++++++++++++++ src/crepe/api/BehaviorScript.cpp | 10 ++++++++++ src/crepe/api/BehaviorScript.h | 17 +++++++++++++++++ src/crepe/api/CMakeLists.txt | 5 +++-- src/crepe/api/Component.h | 10 ---------- src/example/CMakeLists.txt | 1 + src/example/script.cpp | 33 +++++++++++++++++++++++++++++++++ 13 files changed, 164 insertions(+), 16 deletions(-) create mode 100644 src/crepe/Script.cpp create mode 100644 src/crepe/Script.h create mode 100644 src/crepe/ScriptSystem.cpp create mode 100644 src/crepe/ScriptSystem.h create mode 100644 src/crepe/System.h create mode 100644 src/crepe/api/BehaviorScript.cpp create mode 100644 src/crepe/api/BehaviorScript.h delete mode 100644 src/crepe/api/Component.h create mode 100644 src/example/script.cpp (limited to 'src/example') diff --git a/src/crepe/CMakeLists.txt b/src/crepe/CMakeLists.txt index d7d563e..d85aef0 100644 --- a/src/crepe/CMakeLists.txt +++ b/src/crepe/CMakeLists.txt @@ -8,6 +8,8 @@ target_sources(crepe PUBLIC Collider.cpp Rigidbody.cpp Sprite.cpp + ScriptSystem.cpp + Script.cpp ) target_sources(crepe PUBLIC FILE_SET HEADERS FILES @@ -22,6 +24,8 @@ target_sources(crepe PUBLIC FILE_SET HEADERS FILES Collider.h Rigidbody.h Sprite.h + System.h + ScriptSystem.h ) add_subdirectory(api) diff --git a/src/crepe/ComponentManager.hpp b/src/crepe/ComponentManager.hpp index 999cdcf..084cd33 100644 --- a/src/crepe/ComponentManager.hpp +++ b/src/crepe/ComponentManager.hpp @@ -1,13 +1,17 @@ #pragma once +#include + #include "ComponentManager.h" namespace crepe { -template +template void ComponentManager::add_component(uint32_t id, Args &&... args) { using namespace std; + static_assert(is_base_of::value, "add_component must recieve a derivative class of Component"); + // Determine the type of T (this is used as the key of the unordered_map<>) type_index type = typeid(T); @@ -23,9 +27,11 @@ void ComponentManager::add_component(uint32_t id, Args &&... args) { components[type].resize(id + 1); } - // Create a new component of type T using perfect forwarding and store its - // unique_ptr in the vector<> - components[type][id].push_back(make_unique(forward(args)...)); + // Create a new component of type T (arguments directly forwarded). The + // constructor must be called by ComponentManager. + T * instance = new T(forward(args)...); + // store its unique_ptr in the vector<> + components[type][id].push_back(unique_ptr(instance)); } template diff --git a/src/crepe/Script.cpp b/src/crepe/Script.cpp new file mode 100644 index 0000000..42e3666 --- /dev/null +++ b/src/crepe/Script.cpp @@ -0,0 +1,7 @@ +#include "Script.h" + +using namespace crepe; + +void Script::init() { } +void Script::update() { } + diff --git a/src/crepe/Script.h b/src/crepe/Script.h new file mode 100644 index 0000000..ba4073a --- /dev/null +++ b/src/crepe/Script.h @@ -0,0 +1,16 @@ +#pragma once + +namespace crepe { + +class Script { +protected: + virtual void init(); + virtual void update(); + // NOTE: additional *events* (like unity's OnDisable and OnEnable) should be + // implemented as member methods in derivative user script classes and + // registered in init(), otherwise this class will balloon in size with each + // added event. +}; + +} + diff --git a/src/crepe/ScriptSystem.cpp b/src/crepe/ScriptSystem.cpp new file mode 100644 index 0000000..e301c71 --- /dev/null +++ b/src/crepe/ScriptSystem.cpp @@ -0,0 +1,22 @@ +#include "util/log.h" + +#include "ScriptSystem.h" + +using namespace crepe; + +ScriptSystem::ScriptSystem() { + dbg_trace(); +} +ScriptSystem::~ScriptSystem() { + dbg_trace(); +} + +ScriptSystem & ScriptSystem::get_instance() { + static ScriptSystem instance; + return instance; +} + +void ScriptSystem::update() { + dbg_trace(); +} + diff --git a/src/crepe/ScriptSystem.h b/src/crepe/ScriptSystem.h new file mode 100644 index 0000000..e1ed290 --- /dev/null +++ b/src/crepe/ScriptSystem.h @@ -0,0 +1,18 @@ +#pragma once + +#include "System.h" + +namespace crepe { + +class ScriptSystem : public System { +public: + static ScriptSystem & get_instance(); + virtual void update(); + +private: + ScriptSystem(); + ~ScriptSystem(); +}; + +} + diff --git a/src/crepe/System.h b/src/crepe/System.h new file mode 100644 index 0000000..3fe3d66 --- /dev/null +++ b/src/crepe/System.h @@ -0,0 +1,23 @@ +#pragma once + +namespace crepe { + +class System { +public: + static System & get_instance(); + virtual void update() = 0; + +protected: + System() { }; + virtual ~System() { }; + +private: + // singleton + System(const System &) = delete; + System(System &&) = delete; + System & operator=(const System &) = delete; + System & operator=(System &&) = delete; +}; + +} + diff --git a/src/crepe/api/BehaviorScript.cpp b/src/crepe/api/BehaviorScript.cpp new file mode 100644 index 0000000..2dd933e --- /dev/null +++ b/src/crepe/api/BehaviorScript.cpp @@ -0,0 +1,10 @@ +#include "../util/log.h" + +#include "BehaviorScript.h" + +using namespace crepe::api; + +BehaviorScript::BehaviorScript() { + dbg_trace(); +} + diff --git a/src/crepe/api/BehaviorScript.h b/src/crepe/api/BehaviorScript.h new file mode 100644 index 0000000..e9542c1 --- /dev/null +++ b/src/crepe/api/BehaviorScript.h @@ -0,0 +1,17 @@ +#pragma once + +#include "../Script.h" +#include "../Component.h" + +namespace crepe::api { + +class BehaviorScript : public Script, public Component { + // only allow ComponentManager to instantiate scripts + friend class ComponentManager; + +protected: + BehaviorScript(); +}; + +} + diff --git a/src/crepe/api/CMakeLists.txt b/src/crepe/api/CMakeLists.txt index 9548594..86623de 100644 --- a/src/crepe/api/CMakeLists.txt +++ b/src/crepe/api/CMakeLists.txt @@ -1,9 +1,10 @@ target_sources(crepe PUBLIC # AudioSource.cpp + BehaviorScript.cpp ) target_sources(crepe PUBLIC FILE_SET HEADERS FILES - AudioSource.h - Component.h + # AudioSource.h + BehaviorScript.h ) diff --git a/src/crepe/api/Component.h b/src/crepe/api/Component.h deleted file mode 100644 index d5e0499..0000000 --- a/src/crepe/api/Component.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -namespace crepe::api { - -class Component { -public: - bool active; -}; - -} // namespace crepe::api diff --git a/src/example/CMakeLists.txt b/src/example/CMakeLists.txt index eef38fd..6df4ce7 100644 --- a/src/example/CMakeLists.txt +++ b/src/example/CMakeLists.txt @@ -14,4 +14,5 @@ endfunction() add_example(audio_internal) add_example(components_internal) +add_example(script) diff --git a/src/example/script.cpp b/src/example/script.cpp new file mode 100644 index 0000000..28605c7 --- /dev/null +++ b/src/example/script.cpp @@ -0,0 +1,33 @@ +/** \file + * + * Standalone example for usage of the script component and system + */ + +#include +#include +#include +#include + +#include + +using namespace crepe; +using namespace std; + +class MyScript : public api::BehaviorScript { + void update() { + dbg_trace(); + } +}; + +int main() { + dbg_trace(); + + auto obj = GameObject(0, "name", "tag", 0); + obj.add_component(); + + auto & sys = ScriptSystem::get_instance(); + sys.update(); // -> MyScript::update + + return 0; +} + -- cgit v1.2.3 From f9aa198eef7b85eeba3bac4c4fe2d4578b836bbf Mon Sep 17 00:00:00 2001 From: Loek Le Blansch Date: Sun, 13 Oct 2024 20:52:08 +0200 Subject: WIP behavior script (problems) --- src/crepe/ComponentManager.hpp | 1 + src/crepe/ScriptSystem.cpp | 11 +++++++++++ src/crepe/api/BehaviorScript.h | 1 + src/crepe/util/CMakeLists.txt | 2 ++ src/crepe/util/fmt.cpp | 34 ++++++++++++++++++++++++++++++++++ src/crepe/util/fmt.h | 10 ++++++++++ src/crepe/util/log.cpp | 27 +++++++++------------------ src/crepe/util/log.h | 2 +- src/example/script.cpp | 3 ++- 9 files changed, 71 insertions(+), 20 deletions(-) create mode 100644 src/crepe/util/fmt.cpp create mode 100644 src/crepe/util/fmt.h (limited to 'src/example') diff --git a/src/crepe/ComponentManager.hpp b/src/crepe/ComponentManager.hpp index 8fc1cba..c872594 100644 --- a/src/crepe/ComponentManager.hpp +++ b/src/crepe/ComponentManager.hpp @@ -3,6 +3,7 @@ #include #include "ComponentManager.h" +#include "api/BehaviorScript.h" namespace crepe { diff --git a/src/crepe/ScriptSystem.cpp b/src/crepe/ScriptSystem.cpp index e301c71..e40909e 100644 --- a/src/crepe/ScriptSystem.cpp +++ b/src/crepe/ScriptSystem.cpp @@ -1,3 +1,7 @@ +#include +#include "ComponentManager.h" +#include "api/BehaviorScript.h" +#include "util/fmt.h" #include "util/log.h" #include "ScriptSystem.h" @@ -17,6 +21,13 @@ ScriptSystem & ScriptSystem::get_instance() { } void ScriptSystem::update() { + using namespace std; dbg_trace(); + + ComponentManager & mgr = ComponentManager::get_instance(); + vector> scripts = mgr.get_components_by_type(); + + dbg_logf("script count: %lu", scripts.size()); + } diff --git a/src/crepe/api/BehaviorScript.h b/src/crepe/api/BehaviorScript.h index ba60a8c..dd04dc0 100644 --- a/src/crepe/api/BehaviorScript.h +++ b/src/crepe/api/BehaviorScript.h @@ -14,6 +14,7 @@ public: // but allow uniqe_ptr to call the destructor (THIS IS VERY IMPORTANT) virtual ~BehaviorScript() = default; + static BehaviorScript * component; }; } diff --git a/src/crepe/util/CMakeLists.txt b/src/crepe/util/CMakeLists.txt index 100f028..e2cffaf 100644 --- a/src/crepe/util/CMakeLists.txt +++ b/src/crepe/util/CMakeLists.txt @@ -1,9 +1,11 @@ target_sources(crepe PUBLIC log.cpp + fmt.cpp ) target_sources(crepe PUBLIC FILE_SET HEADERS FILES color.h log.h + fmt.h ) diff --git a/src/crepe/util/fmt.cpp b/src/crepe/util/fmt.cpp new file mode 100644 index 0000000..3a43a6f --- /dev/null +++ b/src/crepe/util/fmt.cpp @@ -0,0 +1,34 @@ +#include +#include +#include + +#include "fmt.h" + +using namespace std; + +string crepe::util::va_stringf(va_list args, const char * fmt) { + va_list args_copy; + va_copy(args_copy, args); + + size_t sz = vsnprintf(NULL, 0, fmt, args_copy) + 1; + char * msg = (char *) malloc(sz); + va_end(args_copy); + + vsnprintf(msg, sz, fmt, args); + + string out = msg; + free(msg); + + va_end(args); + + return out; +} + +string crepe::util::stringf(const char * fmt, ...) { + va_list args; + va_start(args, fmt); + string out = va_stringf(args, fmt); + va_end(args); + return out; +} + diff --git a/src/crepe/util/fmt.h b/src/crepe/util/fmt.h new file mode 100644 index 0000000..5c45703 --- /dev/null +++ b/src/crepe/util/fmt.h @@ -0,0 +1,10 @@ +#pragma once + +#include + +namespace crepe::util { + +std::string va_stringf(va_list args, const char * fmt); +std::string stringf(const char * fmt, ...); + +} diff --git a/src/crepe/util/log.cpp b/src/crepe/util/log.cpp index f91d52c..b46620d 100644 --- a/src/crepe/util/log.cpp +++ b/src/crepe/util/log.cpp @@ -4,6 +4,7 @@ #include #include "log.h" +#include "fmt.h" using namespace crepe::util; @@ -14,37 +15,27 @@ static const char * const LOG_PREFIX[] = { [log_level::ERROR] = "[ERR] ", }; -static void va_logf(enum log_level level, va_list args, const std::string fmt) { - va_list args_copy; - va_copy(args_copy, args); - - // prepend log level and ensure newline - std::string format_fixed = LOG_PREFIX[level] + fmt; - if (!format_fixed.ends_with("\n")) format_fixed += "\n"; - - size_t sz = vsnprintf(NULL, 0, format_fixed.c_str(), args_copy) + 1; - char * msg = (char *) malloc(sz); - va_end(args_copy); - - vsnprintf(msg, sz, format_fixed.c_str(), args); +static void log(enum log_level level, const std::string msg) { + using namespace std; + string final = string(LOG_PREFIX[level]) + msg; + if (!final.ends_with("\n")) final += "\n"; // TODO: also log to file or smth - printf("%s", msg); + printf("%s", final.c_str()); fflush(stdout); - - free(msg); } void crepe::util::logf(const char * fmt, ...) { va_list args; va_start(args, fmt); - va_logf(crepe::util::log_level::DEBUG, args, fmt); + log(log_level::DEBUG, va_stringf(args, fmt)); va_end(args); } void crepe::util::logf(log_level level, const char * fmt, ...) { va_list args; va_start(args, fmt); - va_logf(level, args, fmt); + log(level, va_stringf(args, fmt)); va_end(args); } + diff --git a/src/crepe/util/log.h b/src/crepe/util/log.h index fa5f633..3e36f0a 100644 --- a/src/crepe/util/log.h +++ b/src/crepe/util/log.h @@ -7,7 +7,7 @@ // utility macros #define _crepe_logf_here(fmt, ...) \ - crepe::util::logf(util::log_level::DEBUG, "%s%s (%s:%d)" fmt "\n", \ + crepe::util::logf(util::log_level::DEBUG, "%s%s (%s:%d)%s" fmt "\n", \ crepe::util::color::FG_WHITE, __PRETTY_FUNCTION__, \ __FILE_NAME__, __LINE__, crepe::util::color::RESET, \ __VA_ARGS__) diff --git a/src/example/script.cpp b/src/example/script.cpp index 28605c7..b8b3c8d 100644 --- a/src/example/script.cpp +++ b/src/example/script.cpp @@ -11,9 +11,10 @@ #include using namespace crepe; +using namespace crepe::api; using namespace std; -class MyScript : public api::BehaviorScript { +class MyScript : public BehaviorScript { void update() { dbg_trace(); } -- cgit v1.2.3 From 1f82ffa4d3ee8355215d43bf43edf8cecaca0d1d Mon Sep 17 00:00:00 2001 From: Loek Le Blansch Date: Wed, 16 Oct 2024 17:21:04 +0200 Subject: fix user script implementation --- src/crepe/CMakeLists.txt | 1 - src/crepe/ComponentManager.h | 2 +- src/crepe/ComponentManager.hpp | 5 +++-- src/crepe/GameObject.h | 2 +- src/crepe/GameObject.hpp | 4 ++-- src/crepe/Script.cpp | 7 ------- src/crepe/Script.h | 16 ---------------- src/crepe/ScriptSystem.cpp | 27 ++++++++++++++++++++++----- src/crepe/ScriptSystem.h | 12 +++++++++++- src/crepe/api/BehaviorScript.h | 24 ++++++++++++++++++------ src/crepe/api/BehaviorScript.hpp | 18 ++++++++++++++++++ src/crepe/api/CMakeLists.txt | 2 ++ src/crepe/api/Script.cpp | 5 +++++ src/crepe/api/Script.h | 21 +++++++++++++++++++++ src/example/script.cpp | 7 ++++--- 15 files changed, 108 insertions(+), 45 deletions(-) delete mode 100644 src/crepe/Script.cpp delete mode 100644 src/crepe/Script.h create mode 100644 src/crepe/api/BehaviorScript.hpp create mode 100644 src/crepe/api/Script.cpp create mode 100644 src/crepe/api/Script.h (limited to 'src/example') diff --git a/src/crepe/CMakeLists.txt b/src/crepe/CMakeLists.txt index d85aef0..8323490 100644 --- a/src/crepe/CMakeLists.txt +++ b/src/crepe/CMakeLists.txt @@ -9,7 +9,6 @@ target_sources(crepe PUBLIC Rigidbody.cpp Sprite.cpp ScriptSystem.cpp - Script.cpp ) target_sources(crepe PUBLIC FILE_SET HEADERS FILES diff --git a/src/crepe/ComponentManager.h b/src/crepe/ComponentManager.h index eab9b45..38f32e4 100644 --- a/src/crepe/ComponentManager.h +++ b/src/crepe/ComponentManager.h @@ -23,7 +23,7 @@ public: public: //! Add a component of a specific type template - void add_component(uint32_t id, Args &&... args); + T & add_component(uint32_t id, Args &&... args); //! Deletes all components of a specific type and id template void delete_components_by_id(uint32_t id); diff --git a/src/crepe/ComponentManager.hpp b/src/crepe/ComponentManager.hpp index c872594..e0242a2 100644 --- a/src/crepe/ComponentManager.hpp +++ b/src/crepe/ComponentManager.hpp @@ -3,12 +3,11 @@ #include #include "ComponentManager.h" -#include "api/BehaviorScript.h" namespace crepe { template -void ComponentManager::add_component(uint32_t id, Args &&... args) { +T & ComponentManager::add_component(uint32_t id, Args &&... args) { using namespace std; static_assert(is_base_of::value, "add_component must recieve a derivative class of Component"); @@ -33,6 +32,8 @@ void ComponentManager::add_component(uint32_t id, Args &&... args) { T * instance = new T(forward(args)...); // store its unique_ptr in the vector<> components[type][id].push_back(unique_ptr(instance)); + + return *instance; } template diff --git a/src/crepe/GameObject.h b/src/crepe/GameObject.h index 3588d9a..b5d6399 100644 --- a/src/crepe/GameObject.h +++ b/src/crepe/GameObject.h @@ -10,7 +10,7 @@ public: GameObject(uint32_t id, std::string name, std::string tag, int layer); template - void add_component(Args &&... args); + T & add_component(Args &&... args); uint32_t id; std::string name; diff --git a/src/crepe/GameObject.hpp b/src/crepe/GameObject.hpp index 5966fbf..8cd1abe 100644 --- a/src/crepe/GameObject.hpp +++ b/src/crepe/GameObject.hpp @@ -7,9 +7,9 @@ namespace crepe { template -void GameObject::add_component(Args &&... args) { +T & GameObject::add_component(Args &&... args) { auto & mgr = ComponentManager::get_instance(); - mgr.add_component(id, std::forward(args)...); + return mgr.add_component(id, std::forward(args)...); } } // namespace crepe diff --git a/src/crepe/Script.cpp b/src/crepe/Script.cpp deleted file mode 100644 index 42e3666..0000000 --- a/src/crepe/Script.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include "Script.h" - -using namespace crepe; - -void Script::init() { } -void Script::update() { } - diff --git a/src/crepe/Script.h b/src/crepe/Script.h deleted file mode 100644 index ba4073a..0000000 --- a/src/crepe/Script.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -namespace crepe { - -class Script { -protected: - virtual void init(); - virtual void update(); - // NOTE: additional *events* (like unity's OnDisable and OnEnable) should be - // implemented as member methods in derivative user script classes and - // registered in init(), otherwise this class will balloon in size with each - // added event. -}; - -} - diff --git a/src/crepe/ScriptSystem.cpp b/src/crepe/ScriptSystem.cpp index e40909e..0537c16 100644 --- a/src/crepe/ScriptSystem.cpp +++ b/src/crepe/ScriptSystem.cpp @@ -1,12 +1,16 @@ +#include +#include #include + +#include "ScriptSystem.h" #include "ComponentManager.h" #include "api/BehaviorScript.h" -#include "util/fmt.h" +#include "api/Script.h" #include "util/log.h" -#include "ScriptSystem.h" - +using namespace std; using namespace crepe; +using namespace crepe::api; ScriptSystem::ScriptSystem() { dbg_trace(); @@ -24,10 +28,23 @@ void ScriptSystem::update() { using namespace std; dbg_trace(); + forward_list