aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--code-style-example/style.cpp15
-rw-r--r--code-style-example/style.h58
-rw-r--r--contributing.md216
-rw-r--r--resource-manager/Audio_asset.cpp0
-rw-r--r--resource-manager/Audio_asset.h12
-rw-r--r--resource-manager/CMakeLists.txt34
-rw-r--r--resource-manager/Image_asset.cpp12
-rw-r--r--resource-manager/Image_asset.h19
-rw-r--r--resource-manager/Untitled.jpegbin0 -> 6756 bytes
-rw-r--r--resource-manager/constants.cpp10
-rw-r--r--resource-manager/constants.h16
-rw-r--r--resource-manager/img.pngbin0 -> 92742 bytes
-rw-r--r--resource-manager/main.cpp57
-rw-r--r--resource-manager/resource.h11
-rw-r--r--resource-manager/resource_fabricator.cpp30
-rw-r--r--resource-manager/resource_fabricator.h23
-rw-r--r--resource-manager/resource_manager.cpp48
-rw-r--r--resource-manager/resource_manager.h32
18 files changed, 593 insertions, 0 deletions
diff --git a/code-style-example/style.cpp b/code-style-example/style.cpp
new file mode 100644
index 0000000..a42fca8
--- /dev/null
+++ b/code-style-example/style.cpp
@@ -0,0 +1,15 @@
+
+
+#include "style.h"
+
+MyClass::MyClass(int t_value) : m_value(t_value) {}
+
+MyClass::MyClass() { m_value = 0; }
+
+MyClass::~MyClass() {}
+
+const int MyClass::get_value() const { return m_value; }
+
+void MyClass::set_value(const int t_value) { m_value = t_value; }
+
+void MyClass::increment() { m_value += 1; }
diff --git a/code-style-example/style.h b/code-style-example/style.h
new file mode 100644
index 0000000..2a4022b
--- /dev/null
+++ b/code-style-example/style.h
@@ -0,0 +1,58 @@
+/*! @file MyClass.h */
+
+#ifndef MYPROJECT_MYCLASS_HPP
+#define MYPROJECT_MYCLASS_HPP
+
+/**
+ * @brief example class
+ */
+class MyClass {
+
+public:
+ /**
+ * @brief example constructor
+ *
+ * @param[integer] t_value example first argument
+ */
+ MyClass(int t_value);
+
+ /**
+ * @brief constructor example
+ *
+ */
+ MyClass();
+
+ /**
+ * @brief deconstuctor example
+ *
+ */
+ ~MyClass();
+
+ /**
+ * @brief setter example with correct const implementation
+ *
+ * @param[const integer] t_value first argument
+ */
+ void set_value(const int t_value);
+
+ /**
+ * @brief getter example with correct const implementation
+ *
+ * @return const integer
+ */
+ const int get_value() const;
+
+ /**
+ * @brief increment member m_value
+ *
+ */
+ void increment();
+
+private:
+ /**
+ * @m_value basic member example
+ */
+ int m_value;
+};
+
+#endif
diff --git a/contributing.md b/contributing.md
index 40e1edd..0c24560 100644
--- a/contributing.md
+++ b/contributing.md
@@ -14,6 +14,7 @@
- TODO: tagging / versions
+
# Code style
- Formatting nitty-gritty is handled by clang-format/clang-tidy
@@ -21,6 +22,215 @@
- When using libraries of which the header include order is important, make
sure to separate the include statements using a blank line (clang-format may
sort include statements, but does not sort across empty lines).
+- [Cpp practices](https://lefticus.gitbooks.io/cpp-best-practices/content/)
+- [C++ core guidelines](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines)
+- [Google c++ style](https://google.github.io/styleguide/cppguide.html)
+
+
+- .h basic code style with doxygen
+```cpp
+// code-style-example/style.cpp
+/*! @file MyClass.h */
+
+#ifndef MYPROJECT_MYCLASS_HPP
+#define MYPROJECT_MYCLASS_HPP
+
+/**
+ * @brief example class
+ */
+class MyClass {
+
+public:
+ /**
+ * @brief example constructor
+ *
+ * @param[integer] t_value example first argument
+ */
+ MyClass(int t_value);
+
+ /**
+ * @brief constructor example
+ *
+ */
+ MyClass();
+
+ /**
+ * @brief deconstuctor example
+ *
+ */
+ ~MyClass();
+
+ /**
+ * @brief setter example with correct const implementation
+ *
+ * @param[const integer] t_value first argument
+ */
+ void set_value(const int t_value);
+
+ /**
+ * @brief getter example with correct const implementation
+ *
+ * @return const integer
+ */
+ const int get_value() const;
+
+ /**
+ * @brief increment member m_value
+ *
+ */
+ void increment();
+
+private:
+ /**
+ * @m_value basic member example
+ */
+ int m_value;
+};
+
+#endif
+```
+
+- .cpp basic code style
+```cpp
+// code-style-example/style.cpp
+
+#include "style.h"
+
+MyClass::MyClass(int t_value) : m_value(t_value) {}
+
+MyClass::MyClass() { m_value = 0; }
+
+MyClass::~MyClass() {}
+
+const int MyClass::get_value() const { return m_value; }
+
+void MyClass::set_value(const int t_value) { m_value = t_value; }
+
+void MyClass::increment() { m_value += 1; }
+```
+
+- when to use references
+
+-- If the input parameter in the function cannot accept a nullptr
+```cpp
+void foo::function(const std::string& name){};
+```
+-- Use a reference when you know that the object will exist for the lifetime of the reference and when nullability is not a concern.
+```cpp
+int x = 10;
+int& ref = x;
+ref = 20;
+```
+
+-- If a function should return a reference to an object that exists elsewhere (such as a member of a class or an element in a container), you can return a reference.
+```cpp
+container& get_element(std::vector<container>& vec, size_t index){
+ return vec[index];
+}
+```
+- When to use pointers
+
+-- Use pointers when dealing with dynamic memory
+```cpp
+int* ptr = new int(5);
+delete ptr;
+```
+
+-- Pointers can be nullptr, allowing them to represent "no object." Use pointers when you need to express optional ownership or reference.
+```cpp
+void foo::function(int* ptr){
+ if(ptr){
+ // ptr is not null
+ }
+}
+```
+
+-- When dealing with polymorphism.
+```cpp
+class Base {};
+class Derived : public Base {};
+
+Base* obj = new Derived();
+obj->function();
+```
+
+
+- Do not use auto
+
+-- Instead of doing this
+```cpp
+auto s = "Hello";
+auto x = "42"s;
+auto x = 42;
+auto x = 42.f;
+```
+-- Do this.
+```cpp
+std::string s = "Hello";
+std::string x = "42"s;
+int x = 42;
+float x = 42.f;
+```
+- Do not define constants as define but instead directly declare it.
+-- This is wrong.
+```cpp
+#define PI 3.14159;
+```
+
+-- Do this.
+```cpp
+namespace my_project {
+ class Constants {
+ public:
+ static constexpr double PI = 3.14159;
+ };
+}
+```
+- Use enum class instead of using enum only to prevent bugs
+```cpp
+void Print_color(int color);
+
+enum Web_color { red = 0xFF0000, green = 0x00FF00, blue = 0x0000FF };
+enum Product_info { red = 0, purple = 1, blue = 2 };
+
+Web_color webby = Web_color::blue;
+
+// Clearly at least one of these calls is buggy.
+Print_color(webby);
+Print_color(Product_info::blue);
+```
+- Instead use an enum class:
+```cpp
+
+void Print_color(int color);
+
+enum class Web_color { red = 0xFF0000, green = 0x00FF00, blue = 0x0000FF };
+enum class Product_info { red = 0, purple = 1, blue = 2 };
+
+Web_color webby = Web_color::blue;
+Print_color(webby); // Error: cannot convert Web_color to int.
+Print_color(Product_info::red); // Error: cannot convert Product_info to int.
+
+```
+
+- Think about using size_t instead of using int for preventing processor mismatching. This might prevent a bug in the future.
+```cpp
+std::size_t i = 0; // use this instead of using a int
+double x = 0.0;
+```
+- comment style guide, you can use TODO:, FIXME:, NOTE:, or HACK: as admonitions when needed.
+
+-- Bad example
+```cpp
+// Draw loading screen.
+draw_load_screen();
+```
+-- Better
+```cpp
+// Compute the first 10,000 decimals of Pi.
+// FIXME: Don't crash when computing the 1,337th decimal due to `increment`
+// being negative.
+```
## CMakeLists specific
@@ -29,9 +239,15 @@
resolving merge conflicts when multiple sources were added by different
people to the same CMakeLists.txt easier.
+## Doxygen style
+
+- [a C-style doxygen example](https://www.cs.cmu.edu/~410/doc/doxygen.html)
+
+
# Documentation
- All documentation is written in U.S. English
+- [stanford latex style](https://web.stanford.edu/class/ee364b/latex_templates/template_notes.pdf)
- TODO
# Libraries
diff --git a/resource-manager/Audio_asset.cpp b/resource-manager/Audio_asset.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/resource-manager/Audio_asset.cpp
diff --git a/resource-manager/Audio_asset.h b/resource-manager/Audio_asset.h
new file mode 100644
index 0000000..87fa762
--- /dev/null
+++ b/resource-manager/Audio_asset.h
@@ -0,0 +1,12 @@
+#pragma once
+
+
+#include "resource.h"
+
+
+class Audio : public Resource {
+
+
+
+
+};
diff --git a/resource-manager/CMakeLists.txt b/resource-manager/CMakeLists.txt
new file mode 100644
index 0000000..5c2c962
--- /dev/null
+++ b/resource-manager/CMakeLists.txt
@@ -0,0 +1,34 @@
+cmake_minimum_required(VERSION 3.28)
+
+# Set C and C++ standards
+set(CMAKE_C_STANDARD 11)
+set(CMAKE_CXX_STANDARD 20)
+set(CMAKE_EXPORT_COMPILE_COMMANDS 1)
+
+# Enable debug features
+set(CMAKE_BUILD_TYPE Debug)
+add_compile_definitions(DEBUG)
+
+# Project name and supported languages
+project(crepe C CXX)
+
+# Find SDL2
+find_package(SDL2 REQUIRED)
+find_package(SDL2_image REQUIRED)
+
+# Add all source files to the executable
+add_executable(main
+ main.cpp
+ Audio_asset.cpp
+ Image_asset.cpp
+ resource_fabricator.cpp
+ resource_manager.cpp
+ constants.cpp
+)
+
+# Include directories for headers
+target_include_directories(main PRIVATE ${SDL2_INCLUDE_DIRS} ${SDL2_IMAGE_INCLUDE_DIRS} .)
+
+# Link SDL2 library
+target_link_libraries(main PRIVATE ${SDL2_LIBRARIES} SDL2_image::SDL2_image)
+
diff --git a/resource-manager/Image_asset.cpp b/resource-manager/Image_asset.cpp
new file mode 100644
index 0000000..77eee2f
--- /dev/null
+++ b/resource-manager/Image_asset.cpp
@@ -0,0 +1,12 @@
+
+
+#include "Image_asset.h"
+#include <SDL2/SDL_surface.h>
+
+
+
+Image::~Image(){
+ if (surface) {
+ SDL_FreeSurface(surface);
+ }
+}
diff --git a/resource-manager/Image_asset.h b/resource-manager/Image_asset.h
new file mode 100644
index 0000000..e7d13e9
--- /dev/null
+++ b/resource-manager/Image_asset.h
@@ -0,0 +1,19 @@
+#pragma once
+
+
+
+#include "resource.h"
+#include <SDL_surface.h>
+
+
+
+
+
+class Image : public Resource {
+
+public:
+ SDL_Surface* surface = nullptr;
+
+ ~Image();
+
+};
diff --git a/resource-manager/Untitled.jpeg b/resource-manager/Untitled.jpeg
new file mode 100644
index 0000000..aa4d289
--- /dev/null
+++ b/resource-manager/Untitled.jpeg
Binary files differ
diff --git a/resource-manager/constants.cpp b/resource-manager/constants.cpp
new file mode 100644
index 0000000..f9fbf5b
--- /dev/null
+++ b/resource-manager/constants.cpp
@@ -0,0 +1,10 @@
+#include "constants.h"
+#include <string>
+
+
+
+namespace crepe {
+
+ const std::string Constants::PNG_EXT = ".png";
+ const std::string Constants::OGG_EXT = ".ogg";
+}
diff --git a/resource-manager/constants.h b/resource-manager/constants.h
new file mode 100644
index 0000000..620ddf3
--- /dev/null
+++ b/resource-manager/constants.h
@@ -0,0 +1,16 @@
+
+#pragma once
+
+#include <string>
+namespace crepe {
+
+ class Constants {
+ public:
+ using FILE_PATH = std::string;
+
+
+ static const std::string PNG_EXT;
+ static const std::string OGG_EXT;
+
+ };
+}
diff --git a/resource-manager/img.png b/resource-manager/img.png
new file mode 100644
index 0000000..43b1eca
--- /dev/null
+++ b/resource-manager/img.png
Binary files differ
diff --git a/resource-manager/main.cpp b/resource-manager/main.cpp
new file mode 100644
index 0000000..62426d1
--- /dev/null
+++ b/resource-manager/main.cpp
@@ -0,0 +1,57 @@
+
+
+#include "Image_asset.h"
+#include "resource_manager.h"
+#include <SDL.h>
+#include <SDL2/SDL_image.h>
+#include <SDL_events.h>
+#include <SDL_render.h>
+#include <SDL_surface.h>
+#include <SDL_timer.h>
+#include <SDL_video.h>
+#include <cstddef>
+
+
+int main(){
+ SDL_Init(SDL_INIT_VIDEO);
+ ResourceManager* rm = new ResourceManager;
+
+
+ Image* img = static_cast<Image*>(rm->Load("../img.png"));
+ //Resource* sound = rm->Load("/sound.ogg");
+
+
+ bool quit = false;
+
+ SDL_Event event;
+
+ SDL_Window* window = SDL_CreateWindow("Tessting resources", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0);
+
+ SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0);
+ SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, img->surface);
+
+
+ while (!quit) {
+ SDL_WaitEvent(&event);
+
+ switch (event.type) {
+ case SDL_QUIT:
+ quit = true;
+ break;
+ }
+
+ SDL_RenderCopy(renderer, texture, NULL, NULL);
+ SDL_RenderPresent(renderer);
+
+ SDL_Delay(100);
+
+ }
+ SDL_DestroyTexture(texture);
+ SDL_DestroyRenderer(renderer);
+ SDL_DestroyWindow(window);
+ SDL_Quit();
+
+
+
+ return 0;
+}
diff --git a/resource-manager/resource.h b/resource-manager/resource.h
new file mode 100644
index 0000000..6bc44ed
--- /dev/null
+++ b/resource-manager/resource.h
@@ -0,0 +1,11 @@
+#pragma once
+
+
+
+
+class Resource{
+public:
+
+ virtual ~Resource() =default;
+
+};
diff --git a/resource-manager/resource_fabricator.cpp b/resource-manager/resource_fabricator.cpp
new file mode 100644
index 0000000..03e3f74
--- /dev/null
+++ b/resource-manager/resource_fabricator.cpp
@@ -0,0 +1,30 @@
+
+
+#include <filesystem>
+#include <string>
+
+#include "resource_fabricator.h"
+#include "resource.h"
+#include "Image_asset.h"
+#include "Audio_asset.h"
+
+#include <SDL2/SDL_image.h>
+
+
+Resource* ResourceFactory::create_resource(const Constants::FILE_PATH &file_path){
+
+ std::string extension = std::filesystem::path(file_path).extension();
+
+
+
+ if( extension == Constants::PNG_EXT ) {
+ Image* img = new Image;
+ img->surface = IMG_Load(file_path.c_str());
+ return img;
+ }
+ else if ( extension == Constants::OGG_EXT ){
+ return new Audio;
+ }
+
+ return nullptr;
+}
diff --git a/resource-manager/resource_fabricator.h b/resource-manager/resource_fabricator.h
new file mode 100644
index 0000000..3489341
--- /dev/null
+++ b/resource-manager/resource_fabricator.h
@@ -0,0 +1,23 @@
+#pragma once
+
+
+
+#include "resource.h"
+#include "constants.h"
+
+
+using namespace crepe;
+
+
+class ResourceFactory {
+
+public:
+
+ static Resource* create_resource(const Constants::FILE_PATH& file_path);
+
+
+};
+
+
+
+
diff --git a/resource-manager/resource_manager.cpp b/resource-manager/resource_manager.cpp
new file mode 100644
index 0000000..ce4d5dc
--- /dev/null
+++ b/resource-manager/resource_manager.cpp
@@ -0,0 +1,48 @@
+
+
+#include "resource_manager.h"
+#include "constants.h"
+#include "resource.h"
+#include "resource_fabricator.h"
+#include <SDL2/SDL_image.h>
+#include <unordered_map>
+
+
+ResourceManager::ResourceManager(){
+ IMG_Init(IMG_INIT_PNG);
+}
+
+ResourceManager::~ResourceManager(){
+
+ for(auto pair : m_resources){
+ delete pair.second;
+ }
+
+ m_resources.clear();
+
+ IMG_Quit();
+}
+
+
+Resource* ResourceManager::Load(const Constants::FILE_PATH& file_path){
+
+ if(m_resources.find(file_path) != m_resources.end( )){
+ return m_resources[file_path];
+ }
+
+ Resource* res = ResourceFactory::create_resource(file_path);
+ if(res){
+ m_resources[file_path] = std::move(res);
+ }
+
+ return m_resources[file_path];
+}
+
+
+void ResourceManager::Unload(const Constants::FILE_PATH& file_path){
+ std::unordered_map<Constants::FILE_PATH, Resource* >::iterator itr = m_resources.find(file_path);
+ if(itr != m_resources.end()){
+ delete itr->second;
+ m_resources.erase(itr);
+ }
+}
diff --git a/resource-manager/resource_manager.h b/resource-manager/resource_manager.h
new file mode 100644
index 0000000..7a86360
--- /dev/null
+++ b/resource-manager/resource_manager.h
@@ -0,0 +1,32 @@
+#pragma once
+
+
+
+#include <string>
+#include <unordered_map>
+
+
+#include "resource.h"
+#include "constants.h"
+
+using namespace crepe;
+
+
+
+class ResourceManager{
+
+public:
+
+ ResourceManager();
+ ~ResourceManager();
+
+ Resource* Load(const Constants::FILE_PATH& file_path);
+ void Unload(const Constants::FILE_PATH& file_path);
+
+
+private:
+ std::unordered_map<Constants::FILE_PATH, Resource*> m_resources;
+
+
+
+};