#pragma once #include "game/World.h" #include "render/Renderer.h" #include "render/VertexCache.h" #include namespace td { namespace client { class ClientGame; } // namespace client namespace render { class WorldRenderer { private: client::ClientGame* m_Client; Renderer* m_Renderer; game::World* m_World; std::unique_ptr m_WorldVao, m_MobVao, m_SelectTileVao; glm::vec2 m_CamPos; glm::vec2 m_CursorPos; glm::vec2 m_HoldCursorPos; float m_Zoom; float m_CamSensibility = 1; bool m_TowerPlacePopupOpened = false; VertexCache m_TowersCache; public: WorldRenderer(game::World* world, client::ClientGame* client); ~WorldRenderer(); void loadModels(); void addTower(game::TowerPtr tower); void removeTower(game::TowerPtr tower); void update(); void render(); void setCamPos(float camX, float camY); void moveCam(float relativeX, float relativeY, float aspectRatio); void changeZoom(float zoom); private: void click(); void renderWorld() const; void renderTowers() const; void renderMobs() const; void renderTileSelect() const; void renderPopups() const; void detectClick(); glm::vec2 getCursorWorldPos() const; glm::vec2 getClickWorldPos() const; void updateCursorPos(); }; } // namespace render } // namespace td