feat: implement basic tower placement
This commit is contained in:
@@ -3,13 +3,15 @@
|
||||
#include "render/Renderer.h"
|
||||
#include "../render/gui/imgui/imgui.h"
|
||||
#include "window/Display.h"
|
||||
#include "game/client/TowersInfo.h"
|
||||
#include "game/client/ClientGame.h"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
namespace td {
|
||||
namespace render {
|
||||
|
||||
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()));
|
||||
@@ -17,103 +19,147 @@ void WorldRenderer::loadModels(){
|
||||
std::cout << "Vertex Count : " << m_WorldVao->getVertexCount() << std::endl;
|
||||
}
|
||||
|
||||
WorldRenderer::WorldRenderer(game::World* world, Renderer* renderer) : m_Renderer(renderer), m_World(world) {
|
||||
WorldRenderer::WorldRenderer(game::World* world, client::ClientGame* client) : m_Client(client), m_Renderer(m_Client->getRenderer()), m_World(world) {
|
||||
}
|
||||
|
||||
void WorldRenderer::updateCursorPos(){
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
|
||||
float mouseX = io.MousePos.x;
|
||||
float mouseY = io.MousePos.y;
|
||||
|
||||
m_CursorPos = m_Renderer->getCursorWorldPos({mouseX, mouseY}, Display::getAspectRatio(), m_Zoom, Display::getWindowWidth(), Display::getWindowHeight());
|
||||
void WorldRenderer::updateCursorPos() {
|
||||
m_CursorPos = getCursorWorldPos();
|
||||
}
|
||||
|
||||
void WorldRenderer::update(){
|
||||
if(m_WorldVao == nullptr)
|
||||
void WorldRenderer::update() {
|
||||
if (m_WorldVao == nullptr)
|
||||
return;
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
if(io.MouseDown[0] && !ImGui::IsAnyItemActive()){
|
||||
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;
|
||||
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){
|
||||
if (io.MouseWheel != 0) {
|
||||
changeZoom(io.MouseWheel);
|
||||
}
|
||||
updateCursorPos();
|
||||
if (ImGui::IsMouseClicked(0)) {
|
||||
if (!m_TowerPlacePopupOpened) {
|
||||
m_HoldCursorPos = { io.MousePos.x, io.MousePos.y };
|
||||
} else {
|
||||
m_TowerPlacePopupOpened = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void WorldRenderer::renderWorld() const{
|
||||
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->getX(), mob->getY()};
|
||||
model.positon = { mob->getX(), mob->getY() };
|
||||
m_Renderer->renderModel(model);
|
||||
}
|
||||
}
|
||||
|
||||
void WorldRenderer::renderTowers() const{
|
||||
void WorldRenderer::renderTowers() const {
|
||||
Renderer::Model tileSelectModel;
|
||||
tileSelectModel.vao = m_SelectTileVao.get();
|
||||
tileSelectModel.positon = {(int) m_CursorPos.x, (int) m_CursorPos.y};
|
||||
|
||||
tileSelectModel.positon = { (int)m_CursorPos.x, (int)m_CursorPos.y };
|
||||
|
||||
m_Renderer->renderModel(tileSelectModel);
|
||||
}
|
||||
|
||||
void WorldRenderer::renderTileSelect() const{
|
||||
void WorldRenderer::renderTileSelect() const {
|
||||
|
||||
}
|
||||
|
||||
void WorldRenderer::render() const{
|
||||
if(m_WorldVao == nullptr)
|
||||
void WorldRenderer::render() {
|
||||
if (m_WorldVao == nullptr)
|
||||
return;
|
||||
renderWorld();
|
||||
renderMobs();
|
||||
renderTowers();
|
||||
renderTileSelect();
|
||||
detectClick();
|
||||
renderPopups();
|
||||
}
|
||||
|
||||
WorldRenderer::~WorldRenderer(){
|
||||
|
||||
WorldRenderer::~WorldRenderer() {
|
||||
|
||||
}
|
||||
|
||||
void WorldRenderer::moveCam(float relativeX, float relativeY, float aspectRatio){
|
||||
if(m_WorldVao == nullptr)
|
||||
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){
|
||||
if(m_WorldVao == nullptr)
|
||||
void WorldRenderer::changeZoom(float zoomStep) {
|
||||
if (m_WorldVao == nullptr)
|
||||
return;
|
||||
static float sensibility = 1.5f;
|
||||
if (zoomStep < 0){
|
||||
if (zoomStep < 0) {
|
||||
m_Zoom /= -zoomStep * sensibility;
|
||||
}
|
||||
else{
|
||||
} else {
|
||||
m_Zoom *= zoomStep * sensibility;
|
||||
}
|
||||
m_Renderer->setZoom(m_Zoom);
|
||||
m_Renderer->setCamMovement({});
|
||||
}
|
||||
|
||||
void WorldRenderer::click(int mouseX, int mouseY){
|
||||
if(m_WorldVao == nullptr)
|
||||
return;
|
||||
void WorldRenderer::click() {
|
||||
if (m_Client->CanPlaceLittleTower(getClickWorldPos())) {
|
||||
ImGui::OpenPopup("TowerPlace");
|
||||
m_TowerPlacePopupOpened = true;
|
||||
}
|
||||
}
|
||||
|
||||
void WorldRenderer::setCamPos(float camX, float camY){
|
||||
m_CamPos = {camX, camY};
|
||||
void WorldRenderer::setCamPos(float camX, float camY) {
|
||||
m_CamPos = { camX, camY };
|
||||
m_Renderer->setCamPos(m_CamPos);
|
||||
}
|
||||
|
||||
void WorldRenderer::renderPopups() const {
|
||||
if (ImGui::BeginPopup("TowerPlace")) {
|
||||
for (int i = 0; i < (int)game::TowerType::TowerCount; i++) {
|
||||
game::TowerType towerType = game::TowerType(i);
|
||||
const game::TowerInfo& towerInfo = game::getTowerInfo(towerType);
|
||||
if (!towerInfo.isBigTower() || (towerInfo.isBigTower() && m_Client->CanPlaceBigTower(getClickWorldPos()))) {
|
||||
if (ImGui::Button(game::getTowerInfo(towerType).getName().c_str())) {
|
||||
m_Client->PlaceTower(towerType, getClickWorldPos());
|
||||
ImGui::CloseCurrentPopup();
|
||||
break;
|
||||
}
|
||||
if (ImGui::IsItemHovered()) {
|
||||
ImGui::SetTooltip(game::getTowerInfo(towerType).getDescription().c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
ImGui::EndPopup();
|
||||
}
|
||||
}
|
||||
|
||||
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) {
|
||||
click();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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());
|
||||
}
|
||||
|
||||
glm::vec2 WorldRenderer::getClickWorldPos() const{
|
||||
return m_Renderer->getCursorWorldPos(m_HoldCursorPos, Display::getAspectRatio(), m_Zoom, Display::getWindowWidth(), Display::getWindowHeight());
|
||||
}
|
||||
|
||||
} // namespace render
|
||||
} // namespace td
|
||||
|
||||
Reference in New Issue
Block a user