diff --git a/docs/diagrams/class_diagram.svg b/docs/diagrams/class_diagram.svg
new file mode 100644
index 0000000..4a5221d
--- /dev/null
+++ b/docs/diagrams/class_diagram.svg
@@ -0,0 +1 @@
+std::array T,N std::array Tarr,M std::array vec<T,N,Tag>,N std::integral_constant std::size_t,2 std::tuple_size std::tuple_size vec<T,2,Tag> std::tuple_element std::tuple_element I,vec<T,2,Tag> std::vector Tile const* std::vector std::vector<Tile const*> std::vector vec<int32_t,2,TilePosTag> std::basic_string_view char std::vector vec<float,2,WorldPosTag> std::unordered_map vec<int32_t,2,TilePosTag>,double,TilePosHash std::unordered_map vec<int32_t,2,TilePosTag>,vec<int32_t,2,TilePosTag>,TilePosHash std::string std::shared_ptr SDL_Renderer std::unique_ptr SDL_Texture,void(SDL_Texture *) std::optional vec<float,2,WorldPosTag> std::expected void,std::string std::vector UserAction std::shared_ptr Entity std::vector std::shared_ptr<Entity> std::pair vec<float,2,WindowPosTag>,vec<float,2,WindowSizeTag> std::weak_ptr Entity std::vector std::weak_ptr<Entity> std::pair std::weak_ptr<Entity>,std::weak_ptr<Entity> std::vector std::pair<std::weak_ptr<Entity>,std::weak_ptr<Entity>> std::unique_ptr pathfinder::PathFinderBase std::unique_ptr PathFindingDemo std::unique_ptr Window std::unique_ptr UserInput Any vec T,N,OtherTag vec T,size_t N,Tag=Any vec() : void vec(std::array<T,N> array) : void vec<ArgsT...>(ArgsT... args) : void vec<OtherTag>(vec<T,N,OtherTag> && other) : void operator+=(const vec<T,N,Tag> & b) : vec<T,N,Tag> & operator-=(const vec<T,N,Tag> & b) : vec<T,N,Tag> & operator/=(float scalar) : vec<T,N,Tag> & operator[](size_t index) const : const T & operator[](size_t index) : T & ChangeTag<TargetTag>() : vec<T, N, TargetTag> ChangeTag<TargetTag>() const : vec<T, N, TargetTag> Data() : std::array<T,N> & DistanceSquared(const vec<T,N,Tag> & b) const : T DistanceTo(const vec<T,N,Tag> & b) const : T DotProduct(const vec<T,N,Tag> & a, const vec<T,N,Tag> & b) : T DotProduct(const vec<T,N,Tag> & b) const : T GetNormalized() const : vec<T,N,Tag> GetOrthogonal() const : vec<T,N,Tag> Length() const : T LengthSquared() const : T Normalize() : void get<size_t I>() : T & get<size_t I>() const : const T & x() : T & x() const : const T & y() : T & y() const : const T & z() const : const T & z() : T & m_Array : std::array<T,N> WorldPosTag WorldSizeTag WindowPosTag WindowSizeTag TilePosTag TileSizeTag vec int32_t,2,TilePosTag TilePosHash operator()(const TilePos & p) const noexcept : std::size_t vec T,N,Tag Matrix T,size_t N,Tag=Any Matrix() = default : void Matrix<Tarr,size_t M>(std::array<Tarr,M> array) : void operator[](size_t index) const : const vec_type & operator[](size_t index) : vec_type & Eye() constexpr : Matrix<T,N,Tag> m_Array : std::array<vec_type,N> vec T,2,Tag Tile A : uint8_t B : uint8_t G : uint8_t R : uint8_t cost : float TileType GRASS WOOD ROAD WATER WALL vec float,2,WorldPosTag vec float,2,WorldSizeTag Map Map(int rows, int cols) : void Map() : void Map(const Map &) = deleted : void Map(Map &&) = deleted : void operator=(const Map &) = deleted : Map & operator=(Map &&) = deleted : Map & GetCost(TilePos pos) const : float GetMapTiles() const : const TileGrid & GetNeighbors(TilePos center) const : std::vector<TilePos> GetTileAt(TilePos p) const : const Tile * GetTileAt(WorldPos p) const : const Tile * GetTileSize() const : WorldSize GetTileVelocityCoeff<T>(T p) const : double IsTilePosValid(TilePos p) const : bool PaintCircle(TilePos center, unsigned int radius, TileType tile_type) : void PaintLine(TilePos start, TilePos stop, double width, TileType tile_type) : void PaintRectangle(TilePos first_corner, TilePos second_corner, TileType tile_type) : void TileEdgeToWorld(TilePos p) const : WorldPos TileToWorld(TilePos p) const : WorldPos WorldToTile(WorldPos p) const : TilePos TILE_SIZE : const float m_Cols : size_t m_Rows : size_t m_Tiles : TileGrid pathfinder::PathFinderType LINEAR BFS DIJKSTRA GBFS COUNT pathfinder::PathFinderBase PathFinderBase(const Map * m) : void PathFinderBase(const PathFinderBase &) = deleted : void PathFinderBase(PathFinderBase &&) = deleted : void ~PathFinderBase() constexpr = default : void operator=(const PathFinderBase &) = deleted : PathFinderBase & operator=(PathFinderBase &&) = deleted : PathFinderBase & CalculatePath(WorldPos start, WorldPos end) = 0 : Path GetName() const = 0 : const std::string_view & m_Map : const Map * pathfinder::LinearPathFinder LinearPathFinder(const Map * m) : void CalculatePath(WorldPos start, WorldPos end) : Path GetName() const : const std::string_view & m_Name : const std::string_view pathfinder::BFS BFS(const Map * m) : void CalculatePath(WorldPos start, WorldPos end) : Path GetName() const : const std::string_view & m_CameFrom : std::unordered_map<TilePos,TilePos,TilePosHash> m_Distance : std::unordered_map<TilePos,double,TilePosHash> m_Name : const std::string_view pathfinder::Dijkstra Dijkstra(const Map * m) : void CalculatePath(WorldPos start, WorldPos end) : Path GetName() const : const std::string_view & m_CameFrom : std::unordered_map<TilePos,TilePos,TilePosHash> m_Cost : std::unordered_map<TilePos,double,TilePosHash> m_Name : const std::string_view pathfinder::utils::QueueEntry operator>(const QueueEntry & o) const noexcept : bool cost : float tile : TilePos pathfinder::GBFS GBFS(const Map * m) : void CalculatePath(WorldPos start, WorldPos end) : Path GetName() const : const std::string_view & Heuristic(const TilePos & a, const TilePos & b) : float m_CameFrom : std::unordered_map<TilePos,TilePos,TilePosHash> m_Name : const std::string_view Log::LevelTypes CRITICAL ERROR WARNING INFO DEBUG PROFILING_DEBUG vec U,size_t M,OtherTag vec float,2,WindowPosTag vec float,2,WindowSizeTag Camera GetPan() const : WorldPos GetZoom() const : float Pan(const WorldPos & delta) : void WindowToWorld(WindowPos) const : WorldPos WindowToWorldSize(WindowSize) const : WorldSize WindowToWorldSize<T>(T window_size) const : T WorldToWindow(WorldPos) const : WindowPos WorldToWindowSize(WorldSize) const : WindowSize WorldToWindowSize<T>(T world_size) const : T Zoom(float delta) : void m_Pan : WorldPos m_Zoom : float Sprite Sprite() : void Sprite(std::string path, WorldPos center = WorldPos{}) : void Sprite(const Sprite &) = deleted : void Sprite(Sprite &&) = deleted : void ~Sprite() : void operator=(const Sprite &) = deleted : Sprite & operator=(Sprite &&) = deleted : Sprite & GetCenter() const : WorldPos GetSize() const : WorldSize GetTexture() : SDL_Texture * LoadImage(std::string path, WorldPos image_center = WorldPos{}) : void SetRenderer(std::shared_ptr<SDL_Renderer> renderer) : void m_ImageCenter : WorldPos m_Renderer : std::shared_ptr<SDL_Renderer> m_Size : WorldSize m_Texture : std::unique_ptr<SDL_Texture,decltype(&SDL_DestroyTexture)> m_TextureHeight : float m_TextureWidth : float Entity Entity(WorldPos position = = {0.0f, 0.0f}) : void Entity(const Entity &) = deleted : void Entity(Entity &&) = deleted : void operator=(const Entity &) = deleted : Entity & operator=(Entity &&) = deleted : Entity & CollidesWith(const Entity & other) const : bool Deselect() : void GetActualVelocity() const : const WorldPos & GetCollisionRadius() constexpr const = 0 : float GetCollisionRadiusSquared() constexpr const : float GetMoveTarget() : std::optional<WorldPos> GetPath() : pathfinder::Path & GetPath() const : const pathfinder::Path & GetPosition() const : const WorldPos & GetRequestedVelocity() const : const WorldPos & GetSprite() = 0 : Sprite & GetType() constexpr const = 0 : Type IsCollidable() const = 0 : bool IsCollisionBoxVisible() const : bool IsFlaggedExpired() const : bool IsMovable() const = 0 : bool IsSelected() const : bool Select() : void SetActualVelocity(const WorldPos & new_velocity) : void SetFlagExpired() : void SetPath(pathfinder::Path & path) : void SetPosition(WorldPos new_pos) : void SetRequestedVelocity(const WorldPos & new_velocity) : void Update(float time_delta) : void ZeroActualVelocityInDirection(WorldPos direction) : void m_ActualVelocity : WorldPos m_CollisionBoxVisible : bool m_FlagExpired : bool m_Path : pathfinder::Path m_Position : WorldPos m_RequestedVelocity : WorldPos m_Selected : bool Entity::Type NONE PLAYER TILE COUNT Player Player() : void GetCollisionRadius() constexpr const : float GetSprite() : Sprite & GetType() constexpr const : Entity::Type IsCollidable() const : bool IsMovable() const : bool LoadResources() : void m_Sprite : std::unique_ptr<Sprite> MouseButton LEFT MIDDLE RIGHT UserAction UserAction() : void UserAction(Type t) : void UserAction(Type t, char key) : void UserAction(Type t, WindowPos v) : void UserAction(Type t, int32_t arg) : void UserAction(Type t, float arg) : void ~UserAction() constexpr = default : void Argument : UserAction::(Argument) type : Type UserAction::Type NONE EXIT SET_MOVE_TARGET SELECT_PATHFINDER CAMERA_PAN CAMERA_ZOOM SELECTION_START SELECTION_CHANGE SELECTION_END UserAction::(Argument) float_number : float key : char number : int32_t position : WindowPos UserInput UserInput() : void UserInput(const UserInput & x) = deleted : void UserInput(UserInput && x) = deleted : void ~UserInput() : void operator=(const UserInput &) = deleted : UserInput & operator=(UserInput &&) = deleted : UserInput & GetActions() : const std::vector<UserAction> & GetActions_keyboard(const SDL_Event &) : void GetActions_mouse(const SDL_Event &) : void Init() : std::expected<void,std::string> m_Actions : std::vector<UserAction> m_SelectionActive : bool SelectionBox active : bool end : WindowPos size : WindowSize start : WindowPos PathFindingDemo PathFindingDemo(int width, int height) : void PathFindingDemo(const PathFindingDemo & m) = deleted : void PathFindingDemo(PathFindingDemo && m) = deleted : void ~PathFindingDemo() : void operator=(const PathFindingDemo &) = deleted : PathFindingDemo & operator=(PathFindingDemo &&) = deleted : PathFindingDemo & AddEntity(std::shared_ptr<Entity> e) : void CreateMap() : void DeselectEntities() : void GetCamera() const : const Camera & GetEntities() : std::vector<std::shared_ptr<Entity>> & GetEntityCollisions() : const std::vector<Collision> & GetMap() const : const Map & GetRandomPosition() const : WorldPos GetSelectedEntities() : std::vector<std::weak_ptr<Entity>> GetSelectionBoxPosSize() : std::pair<WindowPos,WindowSize> HandleActions(const std::vector<UserAction> & actions) : void IsExitRequested() const : bool IsSelectionBoxActive() const : bool SelectEntitiesInRectangle(WorldPos A, WorldPos B) : void UpdateWorld() : void m_Camera : Camera m_Entities : std::vector<std::shared_ptr<Entity>> m_ExitRequested : bool m_Map : Map m_PathFinder : std::unique_ptr<pathfinder::PathFinderBase> m_SelectedEntities : std::vector<std::weak_ptr<Entity>> m_SelectionBox : SelectionBox Window Window(int width, int height) : void Window(const Window & x) = deleted : void Window(Window && x) = deleted : void ~Window() : void operator=(const Window &) = deleted : Window & operator=(Window &&) = deleted : Window & ClearWindow() : void DrawCircle(const WindowPos & position, float radius, uint8_t R, uint8_t G, uint8_t B) : void DrawFilledRect(const WindowPos & position, const WindowSize size, uint8_t R, uint8_t G, uint8_t B, uint8_t A) : void DrawLine(const WindowPos & A, const WindowPos & B) : void DrawRect(const WindowPos & position, const WindowSize size, uint8_t R, uint8_t G, uint8_t B) : void DrawSprite(const WindowPos & position, Sprite & s, float scale = 1.0f) : void Flush() : void Init() : std::expected<void,std::string> m_Context : SDL_GLContext m_Height : uint32_t m_Renderer : std::shared_ptr<SDL_Renderer> m_Width : uint32_t m_Window : SDL_Window * GameLoop GameLoop() = default : void GameLoop(const GameLoop &) = deleted : void GameLoop(GameLoop &&) = deleted : void ~GameLoop() constexpr = default : void operator=(const GameLoop &) = deleted : GameLoop & operator=(GameLoop &&) = deleted : GameLoop & Draw() : void Run() : void SetGame(std::unique_ptr<PathFindingDemo> x) : void SetUserInput(std::unique_ptr<UserInput> x) : void SetWindow(std::unique_ptr<Window> x) : void m_Game : std::unique_ptr<PathFindingDemo> m_UserInput : std::unique_ptr<UserInput> m_Window : std::unique_ptr<Window> UserAction::(anonymous_8224030) float_number : float key : char number : int32_t position : WindowPos UserAction::(anonymous_7630584) float_number : float key : char number : int32_t position : WindowPos UserAction::(anonymous_8808080) float_number : float key : char number : int32_t position : WindowPos m_Array m_Array m_Tiles m_Map m_Name m_Name m_Distance m_CameFrom m_Name m_Cost m_CameFrom tile m_Name m_CameFrom m_Pan m_Texture m_Size m_ImageCenter m_Position m_ActualVelocity m_RequestedVelocity m_Path m_Sprite type Argument position m_Actions start end size m_Map m_Camera m_Entities m_PathFinder m_SelectedEntities m_SelectionBox m_Renderer m_Game m_Window m_UserInput position position position
\ No newline at end of file
diff --git a/docs/diagrams/include_diagram.svg b/docs/diagrams/include_diagram.svg
new file mode 100644
index 0000000..cf78dec
--- /dev/null
+++ b/docs/diagrams/include_diagram.svg
@@ -0,0 +1 @@
+cpp src pathfinder map.hpp math.hpp tile.hpp log.hpp main.cpp gameloop.hpp pathfindingdemo.hpp camera.hpp entities.hpp sprite.hpp user_input.hpp window.hpp sprite.cpp camera.cpp entities.cpp pathfindingdemo.cpp tile.cpp user_input.cpp window.cpp gameloop.cpp map.cpp base.cpp base.hpp bfs.cpp bfs.hpp dijkstra.cpp dijkstra.hpp utils.hpp gbfs.cpp gbfs.hpp utils.cpp
\ No newline at end of file