GIGA REFACTOR
This commit is contained in:
@@ -12,7 +12,7 @@
|
||||
namespace td {
|
||||
namespace render {
|
||||
|
||||
ImVec4 WorldRenderer::getImGuiTeamColor(game::TeamColor color) {
|
||||
ImVec4 WorldRenderer::GetImGuiTeamColor(game::TeamColor color) {
|
||||
switch (color) {
|
||||
case td::game::TeamColor::None:
|
||||
break;
|
||||
@@ -24,41 +24,41 @@ ImVec4 WorldRenderer::getImGuiTeamColor(game::TeamColor color) {
|
||||
return ImVec4(1, 1, 1, 1);
|
||||
}
|
||||
|
||||
void WorldRenderer::loadModels() {
|
||||
void WorldRenderer::LoadModels() {
|
||||
std::cout << "World Created !\n";
|
||||
m_WorldVao = std::make_unique<GL::VertexArray>(std::move(WorldLoader::loadWorldModel(m_World)));
|
||||
m_MobVao = std::make_unique<GL::VertexArray>(std::move(WorldLoader::loadMobModel()));
|
||||
m_SelectTileVao = std::make_unique<GL::VertexArray>(std::move(WorldLoader::loadTileSelectModel()));
|
||||
std::cout << "Vertex Count : " << m_WorldVao->getVertexCount() << std::endl;
|
||||
m_WorldVao = std::make_unique<GL::VertexArray>(std::move(WorldLoader::LoadWorldModel(m_World)));
|
||||
m_MobVao = std::make_unique<GL::VertexArray>(std::move(WorldLoader::LoadMobModel()));
|
||||
m_SelectTileVao = std::make_unique<GL::VertexArray>(std::move(WorldLoader::LoadTileSelectModel()));
|
||||
std::cout << "Vertex Count : " << m_WorldVao->GetVertexCount() << std::endl;
|
||||
}
|
||||
|
||||
WorldRenderer::WorldRenderer(game::World* world, client::ClientGame* client) : m_Client(client), m_Renderer(m_Client->getRenderer()), m_World(world), m_Zoom(0.1) {
|
||||
m_Renderer->setZoom(m_Zoom);
|
||||
m_Renderer->setCamMovement({});
|
||||
m_TowerPlacePopup = std::make_unique<gui::TowerPlacePopup>(m_Client->getClient());
|
||||
m_MobTooltip = std::make_unique<gui::MobTooltip>(m_Client->getClient());
|
||||
m_CastleTooltip = std::make_unique<gui::CastleTooltip>(m_Client->getClient());
|
||||
m_Client->getWorldClient().getWorldNotifier().bindListener(this);
|
||||
WorldRenderer::WorldRenderer(game::World* world, client::ClientGame* client) : m_Client(client), m_Renderer(m_Client->GetRenderer()), m_World(world), m_Zoom(0.1) {
|
||||
m_Renderer->SetZoom(m_Zoom);
|
||||
m_Renderer->SetCamMovement({});
|
||||
m_TowerPlacePopup = std::make_unique<gui::TowerPlacePopup>(m_Client->GetClient());
|
||||
m_MobTooltip = std::make_unique<gui::MobTooltip>(m_Client->GetClient());
|
||||
m_CastleTooltip = std::make_unique<gui::CastleTooltip>(m_Client->GetClient());
|
||||
m_Client->GetWorldClient().GetWorldNotifier().BindListener(this);
|
||||
}
|
||||
|
||||
void WorldRenderer::updateCursorPos() {
|
||||
m_CursorPos = getCursorWorldPos();
|
||||
void WorldRenderer::UpdateCursorPos() {
|
||||
m_CursorPos = GetCursorWorldPos();
|
||||
}
|
||||
|
||||
void WorldRenderer::update() {
|
||||
void WorldRenderer::Update() {
|
||||
if (m_WorldVao == nullptr)
|
||||
return;
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
if (io.MouseDown[0] && !ImGui::IsAnyItemActive()) {
|
||||
ImVec2 mouseDelta = ImGui::GetIO().MouseDelta;
|
||||
const float relativeX = mouseDelta.x / (float)Display::getWindowWidth() * 2;
|
||||
const float relativeY = mouseDelta.y / (float)Display::getWindowHeight() * 2;
|
||||
moveCam(relativeX, relativeY, Display::getAspectRatio());
|
||||
const float relativeX = mouseDelta.x / (float)Display::GetWindowWidth() * 2;
|
||||
const float relativeY = mouseDelta.y / (float)Display::GetWindowHeight() * 2;
|
||||
MoveCam(relativeX, relativeY, Display::GetAspectRatio());
|
||||
}
|
||||
if (io.MouseWheel != 0) {
|
||||
changeZoom(io.MouseWheel);
|
||||
ChangeZoom(io.MouseWheel);
|
||||
}
|
||||
updateCursorPos();
|
||||
UpdateCursorPos();
|
||||
if (ImGui::IsMouseClicked(0)) {
|
||||
if (!m_PopupOpened) {
|
||||
m_HoldCursorPos = { io.MousePos.x, io.MousePos.y };
|
||||
@@ -67,84 +67,84 @@ void WorldRenderer::update() {
|
||||
}
|
||||
}
|
||||
|
||||
if (ImGui::IsMouseDoubleClicked(1)) removeTower();
|
||||
if (ImGui::IsMouseDoubleClicked(1)) RemoveTower();
|
||||
}
|
||||
|
||||
void WorldRenderer::removeTower() {
|
||||
glm::vec2 cursorPos = getCursorWorldPos();
|
||||
void WorldRenderer::RemoveTower() {
|
||||
glm::vec2 cursorPos = GetCursorWorldPos();
|
||||
|
||||
game::TowerPtr clickedTower = m_World->getTower(cursorPos);
|
||||
game::TowerPtr clickedTower = m_World->GetTower(cursorPos);
|
||||
|
||||
if (clickedTower != nullptr) {
|
||||
m_Client->getClient()->removeTower(clickedTower->getID());
|
||||
m_Client->GetClient()->RemoveTower(clickedTower->GetID());
|
||||
}
|
||||
}
|
||||
|
||||
void WorldRenderer::renderWorld() const {
|
||||
m_Renderer->renderVAO(*m_WorldVao);
|
||||
void WorldRenderer::RenderWorld() const {
|
||||
m_Renderer->RenderVAO(*m_WorldVao);
|
||||
}
|
||||
|
||||
void WorldRenderer::renderMobs() const {
|
||||
for (game::MobPtr mob : m_World->getMobList()) {
|
||||
void WorldRenderer::RenderMobs() const {
|
||||
for (game::MobPtr mob : m_World->GetMobList()) {
|
||||
Renderer::Model model;
|
||||
model.vao = m_MobVao.get();
|
||||
model.positon = { mob->getCenterX(), mob->getCenterY() };
|
||||
m_Renderer->renderModel(model);
|
||||
model.positon = { mob->GetCenterX(), mob->GetCenterY() };
|
||||
m_Renderer->RenderModel(model);
|
||||
}
|
||||
}
|
||||
|
||||
void WorldRenderer::renderTowers() const {
|
||||
if (!m_TowersCache.isEmpty())
|
||||
m_Renderer->renderVAO(m_TowersCache.getVertexArray());
|
||||
void WorldRenderer::RenderTowers() const {
|
||||
if (!m_TowersCache.IsEmpty())
|
||||
m_Renderer->RenderVAO(m_TowersCache.GetVertexArray());
|
||||
}
|
||||
|
||||
void WorldRenderer::renderTileSelect() const {
|
||||
void WorldRenderer::RenderTileSelect() const {
|
||||
if (ImGui::IsAnyItemHovered()) return;
|
||||
|
||||
if(m_MobTooltip->isShown() || m_CastleTooltip->isShown()) return;
|
||||
if (m_MobTooltip->IsShown() || m_CastleTooltip->IsShown()) return;
|
||||
|
||||
Renderer::Model tileSelectModel;
|
||||
tileSelectModel.vao = m_SelectTileVao.get();
|
||||
tileSelectModel.positon = { (int)m_CursorPos.x, (int)m_CursorPos.y };
|
||||
|
||||
m_Renderer->renderModel(tileSelectModel);
|
||||
m_Renderer->RenderModel(tileSelectModel);
|
||||
}
|
||||
|
||||
void WorldRenderer::renderPopups() {
|
||||
m_TowerPlacePopup->render();
|
||||
renderTowerUpgradePopup();
|
||||
void WorldRenderer::RenderPopups() {
|
||||
m_TowerPlacePopup->Render();
|
||||
RenderTowerUpgradePopup();
|
||||
}
|
||||
|
||||
void WorldRenderer::render() {
|
||||
void WorldRenderer::Render() {
|
||||
if (m_WorldVao == nullptr)
|
||||
return;
|
||||
renderWorld();
|
||||
renderMobs();
|
||||
renderTowers();
|
||||
renderTileSelect();
|
||||
renderTooltips();
|
||||
renderPopups();
|
||||
detectClick();
|
||||
RenderWorld();
|
||||
RenderMobs();
|
||||
RenderTowers();
|
||||
RenderTileSelect();
|
||||
RenderTooltips();
|
||||
RenderPopups();
|
||||
DetectClick();
|
||||
}
|
||||
|
||||
WorldRenderer::~WorldRenderer() {
|
||||
|
||||
}
|
||||
|
||||
void WorldRenderer::renderTooltips() const {
|
||||
renderMobTooltip();
|
||||
renderCastleTooltip();
|
||||
void WorldRenderer::RenderTooltips() const {
|
||||
RenderMobTooltip();
|
||||
RenderCastleTooltip();
|
||||
}
|
||||
|
||||
void WorldRenderer::moveCam(float relativeX, float relativeY, float aspectRatio) {
|
||||
void WorldRenderer::MoveCam(float relativeX, float relativeY, float aspectRatio) {
|
||||
if (m_WorldVao == nullptr)
|
||||
return;
|
||||
float movementX = -relativeX / m_Zoom * aspectRatio;
|
||||
float movementY = relativeY / m_Zoom;
|
||||
m_Renderer->setCamMovement({ movementX, movementY });
|
||||
m_Renderer->SetCamMovement({ movementX, movementY });
|
||||
}
|
||||
|
||||
void WorldRenderer::changeZoom(float zoomStep) {
|
||||
void WorldRenderer::ChangeZoom(float zoomStep) {
|
||||
if (m_WorldVao == nullptr)
|
||||
return;
|
||||
static float sensibility = 1.5f;
|
||||
@@ -153,34 +153,34 @@ void WorldRenderer::changeZoom(float zoomStep) {
|
||||
} else {
|
||||
m_Zoom *= zoomStep * sensibility;
|
||||
}
|
||||
m_Renderer->setZoom(m_Zoom);
|
||||
m_Renderer->setCamMovement({});
|
||||
m_Renderer->SetZoom(m_Zoom);
|
||||
m_Renderer->SetCamMovement({});
|
||||
}
|
||||
|
||||
void WorldRenderer::click() {
|
||||
const game::TowerPtr tower = m_Client->getWorld().getTower(getClickWorldPos());
|
||||
m_TowerPlacePopup->setClickPos(getClickWorldPos());
|
||||
void WorldRenderer::Click() {
|
||||
const game::TowerPtr tower = m_Client->GetWorld().GetTower(GetClickWorldPos());
|
||||
m_TowerPlacePopup->SetClickPos(GetClickWorldPos());
|
||||
if (tower != nullptr) { // there is a tower here
|
||||
ImGui::OpenPopup("TowerUpgrade");
|
||||
} else if (m_Client->getWorld().CanPlaceLittleTower(getClickWorldPos(), m_Client->getPlayer()->getID())) {
|
||||
} else if (m_Client->GetWorld().CanPlaceLittleTower(GetClickWorldPos(), m_Client->GetPlayer()->GetID())) {
|
||||
ImGui::OpenPopup("TowerPlace");
|
||||
}
|
||||
}
|
||||
|
||||
void WorldRenderer::setCamPos(float camX, float camY) {
|
||||
void WorldRenderer::SetCamPos(float camX, float camY) {
|
||||
m_CamPos = { camX, camY };
|
||||
m_Renderer->setCamPos(m_CamPos);
|
||||
m_Renderer->SetCamPos(m_CamPos);
|
||||
}
|
||||
|
||||
void WorldRenderer::renderTowerUpgradePopup() {
|
||||
void WorldRenderer::RenderTowerUpgradePopup() {
|
||||
if (ImGui::BeginPopup("TowerUpgrade")) {
|
||||
m_PopupOpened = true;
|
||||
game::TowerPtr tower = m_Client->getWorld().getTower(getClickWorldPos());
|
||||
game::TowerPtr tower = m_Client->GetWorld().GetTower(GetClickWorldPos());
|
||||
if (tower == nullptr) {
|
||||
ImGui::EndPopup();
|
||||
return;
|
||||
}
|
||||
ImGui::Text("Tower : %s", game::TowerFactory::getTowerName(tower->getType()).c_str());
|
||||
ImGui::Text("Tower : %s", game::TowerFactory::GetTowerName(tower->GetType()).c_str());
|
||||
|
||||
for (int y = 0; y < 3; y++) { // path: 0 -> top 1 -> middle 2 -> bottom
|
||||
for (int x = 0; x < 4; x++) { // level: 1, 2, 3, 4
|
||||
@@ -191,12 +191,12 @@ void WorldRenderer::renderTowerUpgradePopup() {
|
||||
std::uint8_t currentLevel = x + 1;
|
||||
game::TowerPath currentPath = game::TowerPath(y);
|
||||
|
||||
const game::TowerStats* towerStats = game::getTowerStats(tower->getType(), { currentLevel, currentPath });
|
||||
game::TowerPath towerPath = tower->getLevel().getPath();
|
||||
const game::TowerStats* towerStats = game::GetTowerStats(tower->GetType(), { currentLevel, currentPath });
|
||||
game::TowerPath towerPath = tower->GetLevel().GetPath();
|
||||
|
||||
bool disabled = towerStats == nullptr;
|
||||
|
||||
int towerLevel = tower->getLevel().getLevel();
|
||||
int towerLevel = tower->GetLevel().GetLevel();
|
||||
|
||||
bool alreadyUpgraded = currentLevel <= towerLevel;
|
||||
bool canUpgrade = (towerLevel + 1) == currentLevel;
|
||||
@@ -220,7 +220,7 @@ void WorldRenderer::renderTowerUpgradePopup() {
|
||||
ImGui::EndDisabled();
|
||||
} else if (canUpgrade) {
|
||||
if (ImGui::Button("Upgrade", ImVec2(100, 100))) {
|
||||
m_Client->getClient()->upgradeTower(tower->getID(), { currentLevel, currentPath });
|
||||
m_Client->GetClient()->UpgradeTower(tower->GetID(), { currentLevel, currentPath });
|
||||
}
|
||||
} else {
|
||||
ImGui::BeginDisabled();
|
||||
@@ -235,71 +235,71 @@ void WorldRenderer::renderTowerUpgradePopup() {
|
||||
}
|
||||
}
|
||||
|
||||
void WorldRenderer::detectClick() {
|
||||
void WorldRenderer::DetectClick() {
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
if (ImGui::IsMouseReleased(0) && !ImGui::IsAnyItemHovered() && !ImGui::IsAnyItemFocused()) {
|
||||
glm::vec2 cursorPos = { io.MousePos.x, io.MousePos.y };
|
||||
if (cursorPos == m_HoldCursorPos) {
|
||||
m_LastClicked = m_HoldCursorPos;
|
||||
click();
|
||||
Click();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void WorldRenderer::renderMobTooltip() const {
|
||||
void WorldRenderer::RenderMobTooltip() const {
|
||||
if (ImGui::IsAnyItemHovered()) return;
|
||||
|
||||
detectMobHovering();
|
||||
m_MobTooltip->render();
|
||||
DetectMobHovering();
|
||||
m_MobTooltip->Render();
|
||||
}
|
||||
|
||||
void WorldRenderer::renderCastleTooltip() const {
|
||||
void WorldRenderer::RenderCastleTooltip() const {
|
||||
if (ImGui::IsAnyItemHovered()) return;
|
||||
|
||||
detectCastleHovering();
|
||||
m_CastleTooltip->render();
|
||||
DetectCastleHovering();
|
||||
m_CastleTooltip->Render();
|
||||
}
|
||||
|
||||
void WorldRenderer::detectMobHovering() const {
|
||||
glm::vec2 cursorWorldPos = getCursorWorldPos();
|
||||
for (game::MobPtr mob : m_World->getMobList()) {
|
||||
if (mob->collidesWith({ cursorWorldPos.x, cursorWorldPos.y })) {
|
||||
m_MobTooltip->setMob(mob.get());
|
||||
void WorldRenderer::DetectMobHovering() const {
|
||||
glm::vec2 cursorWorldPos = GetCursorWorldPos();
|
||||
for (game::MobPtr mob : m_World->GetMobList()) {
|
||||
if (mob->CollidesWith({ cursorWorldPos.x, cursorWorldPos.y })) {
|
||||
m_MobTooltip->SetMob(mob.get());
|
||||
return;
|
||||
}
|
||||
}
|
||||
m_MobTooltip->setMob(nullptr);
|
||||
m_MobTooltip->SetMob(nullptr);
|
||||
}
|
||||
|
||||
void WorldRenderer::detectCastleHovering() const {
|
||||
glm::vec2 cursorWorldPos = getCursorWorldPos();
|
||||
for (const game::Team& team : m_World->getTeams()) {
|
||||
if (team.getCastle().collidesWith({ cursorWorldPos.x, cursorWorldPos.y })) {
|
||||
m_CastleTooltip->setCastle(&team.getCastle());
|
||||
void WorldRenderer::DetectCastleHovering() const {
|
||||
glm::vec2 cursorWorldPos = GetCursorWorldPos();
|
||||
for (const game::Team& team : m_World->GetTeams()) {
|
||||
if (team.GetCastle().CollidesWith({ cursorWorldPos.x, cursorWorldPos.y })) {
|
||||
m_CastleTooltip->SetCastle(&team.GetCastle());
|
||||
return;
|
||||
}
|
||||
}
|
||||
m_CastleTooltip->setCastle(nullptr);
|
||||
m_CastleTooltip->SetCastle(nullptr);
|
||||
}
|
||||
|
||||
void WorldRenderer::OnTowerAdd(game::TowerPtr tower) {
|
||||
WorldLoader::RenderData renderData = WorldLoader::loadTowerModel(tower);
|
||||
m_TowersCache.addData(tower->getID(), renderData.positions, renderData.colors);
|
||||
m_TowersCache.updateVertexArray();
|
||||
WorldLoader::RenderData RenderData = WorldLoader::LoadTowerModel(tower);
|
||||
m_TowersCache.AddData(tower->GetID(), RenderData.positions, RenderData.colors);
|
||||
m_TowersCache.UpdateVertexArray();
|
||||
}
|
||||
|
||||
void WorldRenderer::OnTowerRemove(game::TowerPtr tower) {
|
||||
m_TowersCache.removeData(tower->getID());
|
||||
m_TowersCache.updateVertexArray();
|
||||
m_TowersCache.RemoveData(tower->GetID());
|
||||
m_TowersCache.UpdateVertexArray();
|
||||
}
|
||||
|
||||
glm::vec2 WorldRenderer::getCursorWorldPos() const {
|
||||
glm::vec2 WorldRenderer::GetCursorWorldPos() const {
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
return m_Renderer->getCursorWorldPos({ io.MousePos.x, io.MousePos.y }, Display::getAspectRatio(), m_Zoom, Display::getWindowWidth(), Display::getWindowHeight());
|
||||
return m_Renderer->GetCursorWorldPos({ io.MousePos.x, io.MousePos.y }, Display::GetAspectRatio(), m_Zoom, Display::GetWindowWidth(), Display::GetWindowHeight());
|
||||
}
|
||||
|
||||
glm::vec2 WorldRenderer::getClickWorldPos() const {
|
||||
return m_Renderer->getCursorWorldPos(m_LastClicked, Display::getAspectRatio(), m_Zoom, Display::getWindowWidth(), Display::getWindowHeight());
|
||||
glm::vec2 WorldRenderer::GetClickWorldPos() const {
|
||||
return m_Renderer->GetCursorWorldPos(m_LastClicked, Display::GetAspectRatio(), m_Zoom, Display::GetWindowWidth(), Display::GetWindowHeight());
|
||||
}
|
||||
|
||||
} // namespace render
|
||||
|
||||
Reference in New Issue
Block a user