#pragma once #include "game/World.h" #include "render/Renderer.h" #include "render/VertexCache.h" #include "render/gui/TowerPlacePopup.h" #include "render/gui/TowerUpgradePopup.h" #include "render/gui/MobTooltip.h" #include "render/gui/CastleTooltip.h" #include "render/gui/imgui/imgui.h" namespace td { namespace client { class ClientGame; } // namespace client namespace render { class WorldRenderer : public game::WorldListener { private: client::ClientGame* m_Client; Renderer* m_Renderer; game::World* m_World; std::unique_ptr m_WorldVao; std::unique_ptr m_MobModel, m_SelectTileModel; Vec2f m_CamPos; Vec2f m_CursorPos; Vec2f m_HoldCursorPos; Vec2f m_LastClicked; float m_Zoom; float m_CamSensibility = 1; bool m_PopupOpened = false; VertexCache m_TowersCache; std::unique_ptr m_TowerPlacePopup; std::unique_ptr m_TowerUpgradePopup; std::unique_ptr m_MobTooltip; std::unique_ptr m_CastleTooltip; public: WorldRenderer(game::World* world, client::ClientGame* client); ~WorldRenderer(); void LoadModels(); static ImVec4 GetImGuiTeamColor(game::TeamColor color); void Update(); void Render(); void SetCamPos(float camX, float camY); void MoveCam(float relativeX, float relativeY); void ChangeZoom(float zoom); // WorldListener virtual void OnTowerAdd(game::TowerPtr tower); virtual void OnTowerRemove(game::TowerPtr tower); private: void Click(); void RenderWorld() const; void RenderTowers() const; void RenderMobs() const; void RenderTileSelect() const; void RenderPopups(); void RenderMobTooltip() const; void RenderCastleTooltip() const; void DetectClick(); void DetectMobHovering() const; void DetectCastleHovering() const; void RenderTooltips() const; void RemoveTower(); Vec2f GetCursorWorldPos() const; Vec2f GetClickWorldPos() const; void UpdateCursorPos(); }; } // namespace render } // namespace td