change WorldRenderer to class
This commit is contained in:
@@ -10,7 +10,8 @@ namespace game {
|
|||||||
enum class GameState : std::uint8_t{
|
enum class GameState : std::uint8_t{
|
||||||
Lobby,
|
Lobby,
|
||||||
Game,
|
Game,
|
||||||
EndGame
|
EndGame,
|
||||||
|
Disconnected,
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::map<std::uint8_t, Player> PlayerList;
|
typedef std::map<std::uint8_t, Player> PlayerList;
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ public:
|
|||||||
|
|
||||||
void tick(std::uint64_t delta);
|
void tick(std::uint64_t delta);
|
||||||
|
|
||||||
|
void render();
|
||||||
|
|
||||||
void connect(const std::string& address, std::uint16_t port);
|
void connect(const std::string& address, std::uint16_t port);
|
||||||
void closeConnection();
|
void closeConnection();
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#include "game/BaseGame.h"
|
#include "game/BaseGame.h"
|
||||||
#include "protocol/PacketHandler.h"
|
#include "protocol/PacketHandler.h"
|
||||||
#include "WorldClient.h"
|
#include "WorldClient.h"
|
||||||
|
#include "render/WorldRenderer.h"
|
||||||
|
|
||||||
namespace td {
|
namespace td {
|
||||||
namespace client {
|
namespace client {
|
||||||
@@ -13,12 +14,15 @@ private:
|
|||||||
std::uint32_t m_LobbyTime = 0;
|
std::uint32_t m_LobbyTime = 0;
|
||||||
game::Player* m_Player = nullptr;
|
game::Player* m_Player = nullptr;
|
||||||
client::WorldClient m_WorldClient{this};
|
client::WorldClient m_WorldClient{this};
|
||||||
|
render::WorldRenderer m_WorldRenderer{&m_WorldClient};
|
||||||
public:
|
public:
|
||||||
ClientGame(protocol::PacketDispatcher* dispatcher);
|
ClientGame(protocol::PacketDispatcher* dispatcher);
|
||||||
virtual ~ClientGame();
|
virtual ~ClientGame();
|
||||||
|
|
||||||
virtual void tick(std::uint64_t delta);
|
virtual void tick(std::uint64_t delta);
|
||||||
|
|
||||||
|
void renderWorld();
|
||||||
|
|
||||||
std::uint32_t getLobbyTime() const{return m_LobbyTime;}
|
std::uint32_t getLobbyTime() const{return m_LobbyTime;}
|
||||||
const game::Player* getPlayer() const{return m_Player;}
|
const game::Player* getPlayer() const{return m_Player;}
|
||||||
|
|
||||||
@@ -30,6 +34,8 @@ public:
|
|||||||
virtual void HandlePacket(protocol::UpdateGameStatePacket* packet);
|
virtual void HandlePacket(protocol::UpdateGameStatePacket* packet);
|
||||||
virtual void HandlePacket(protocol::UpdateLobbyTimePacket* packet);
|
virtual void HandlePacket(protocol::UpdateLobbyTimePacket* packet);
|
||||||
virtual void HandlePacket(protocol::UpdateMoneyPacket* packet);
|
virtual void HandlePacket(protocol::UpdateMoneyPacket* packet);
|
||||||
|
virtual void HandlePacket(protocol::DisconnectPacket* packet);
|
||||||
|
virtual void HandlePacket(protocol::WorldDataPacket* packet);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace client
|
} // namespace client
|
||||||
|
|||||||
@@ -1,23 +1,39 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "game/World.h"
|
#include "game/World.h"
|
||||||
|
#include "render/loader/GLLoader.h"
|
||||||
|
|
||||||
|
#include <glm/glm.hpp>
|
||||||
|
|
||||||
namespace td {
|
namespace td {
|
||||||
namespace render {
|
namespace render {
|
||||||
|
|
||||||
namespace WorldRenderer{
|
class WorldRenderer{
|
||||||
|
private:
|
||||||
|
game::World* m_World;
|
||||||
|
std::unique_ptr<GL::VAO> m_WorldVao, m_MobVao;
|
||||||
|
glm::vec2 m_CamPos;
|
||||||
|
float m_Zoom = 1;
|
||||||
|
float m_CamSensibility = 1;
|
||||||
|
public:
|
||||||
|
WorldRenderer(game::World* world);
|
||||||
|
~WorldRenderer();
|
||||||
|
|
||||||
void init(const game::World* world);
|
void loadModels();
|
||||||
void update();
|
|
||||||
void render();
|
|
||||||
void destroy();
|
|
||||||
|
|
||||||
void moveCam(float relativeX, float relativeY, float aspectRatio);
|
void update();
|
||||||
void changeZoom(float zoom);
|
void render() const;
|
||||||
void click(int mouseX, int mouseY);
|
|
||||||
|
|
||||||
} // namespace WorldRenderer
|
|
||||||
|
|
||||||
|
void setCamPos(float camX, float camY);
|
||||||
|
|
||||||
|
void moveCam(float relativeX, float relativeY, float aspectRatio);
|
||||||
|
void changeZoom(float zoom);
|
||||||
|
void click(int mouseX, int mouseY);
|
||||||
|
private:
|
||||||
|
void renderWorld() const;
|
||||||
|
void renderTowers() const;
|
||||||
|
void renderMobs() const;
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace render
|
} // namespace render
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
|||||||
@@ -42,6 +42,9 @@ void Client::tick(std::uint64_t delta){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Client::render(){
|
||||||
|
m_Game.renderWorld();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace client
|
} // namespace client
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
|||||||
@@ -42,7 +42,6 @@ bool ClientConnexion::updateSocket(){
|
|||||||
void ClientConnexion::HandlePacket(protocol::DisconnectPacket* packet){
|
void ClientConnexion::HandlePacket(protocol::DisconnectPacket* packet){
|
||||||
m_DisconnectReason = packet->getReason();
|
m_DisconnectReason = packet->getReason();
|
||||||
closeConnection();
|
closeConnection();
|
||||||
render::WorldRenderer::destroy();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace client
|
} // namespace client
|
||||||
|
|||||||
@@ -16,6 +16,8 @@ ClientGame::ClientGame(protocol::PacketDispatcher* dispatcher): protocol::Packet
|
|||||||
GetDispatcher()->RegisterHandler(protocol::PacketType::UpdateLobbyTime, this);
|
GetDispatcher()->RegisterHandler(protocol::PacketType::UpdateLobbyTime, this);
|
||||||
GetDispatcher()->RegisterHandler(protocol::PacketType::UpdateGameState, this);
|
GetDispatcher()->RegisterHandler(protocol::PacketType::UpdateGameState, this);
|
||||||
GetDispatcher()->RegisterHandler(protocol::PacketType::UpdateMoney, this);
|
GetDispatcher()->RegisterHandler(protocol::PacketType::UpdateMoney, this);
|
||||||
|
GetDispatcher()->RegisterHandler(protocol::PacketType::Disconnect, this);
|
||||||
|
GetDispatcher()->RegisterHandler(protocol::PacketType::WorldData, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
ClientGame::~ClientGame(){
|
ClientGame::~ClientGame(){
|
||||||
@@ -24,6 +26,7 @@ ClientGame::~ClientGame(){
|
|||||||
|
|
||||||
void ClientGame::tick(std::uint64_t delta){
|
void ClientGame::tick(std::uint64_t delta){
|
||||||
game::Game::tick(delta);
|
game::Game::tick(delta);
|
||||||
|
m_WorldRenderer.update();
|
||||||
if (m_GameState == game::GameState::Lobby && m_Players.size() >= 2){
|
if (m_GameState == game::GameState::Lobby && m_Players.size() >= 2){
|
||||||
m_LobbyTime -= delta;
|
m_LobbyTime -= delta;
|
||||||
}
|
}
|
||||||
@@ -90,5 +93,22 @@ void ClientGame::HandlePacket(protocol::UpdateMoneyPacket* packet){
|
|||||||
m_Player->setGold(packet->getGold());
|
m_Player->setGold(packet->getGold());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ClientGame::HandlePacket(protocol::DisconnectPacket* packet){
|
||||||
|
m_GameState = game::GameState::Disconnected;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientGame::HandlePacket(protocol::WorldDataPacket* packet){
|
||||||
|
m_WorldRenderer.loadModels();
|
||||||
|
// set cam pos to player spawn
|
||||||
|
const game::Spawn& spawn = m_World->getTeam(m_Player->getTeamColor()).getSpawn();
|
||||||
|
m_WorldRenderer.setCamPos(spawn.x, spawn.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientGame::renderWorld(){
|
||||||
|
if(m_GameState == game::GameState::Game || m_GameState == game::GameState::EndGame){
|
||||||
|
m_WorldRenderer.render();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace client
|
} // namespace client
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ void WorldClient::HandlePacket(protocol::WorldBeginDataPacket* packet){
|
|||||||
|
|
||||||
void WorldClient::HandlePacket(protocol::WorldDataPacket* packet){
|
void WorldClient::HandlePacket(protocol::WorldDataPacket* packet){
|
||||||
loadMap(packet);
|
loadMap(packet);
|
||||||
render::WorldRenderer::init(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldClient::HandlePacket(protocol::SpawnMobPacket* packet){
|
void WorldClient::HandlePacket(protocol::SpawnMobPacket* packet){
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ void ServerGame::tick(std::uint64_t delta){
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ServerGame::startGame(){
|
void ServerGame::startGame(){
|
||||||
|
balanceTeams();
|
||||||
|
|
||||||
protocol::WorldBeginDataPacket headerMapData(m_World);
|
protocol::WorldBeginDataPacket headerMapData(m_World);
|
||||||
m_Server->broadcastPacket(&headerMapData);
|
m_Server->broadcastPacket(&headerMapData);
|
||||||
|
|
||||||
@@ -22,8 +24,6 @@ void ServerGame::startGame(){
|
|||||||
|
|
||||||
m_GameState = game::GameState::Game;
|
m_GameState = game::GameState::Game;
|
||||||
|
|
||||||
balanceTeams();
|
|
||||||
|
|
||||||
m_ServerWorld.spawnMobs(game::MobType::Zombie, 1, 0, 12);
|
m_ServerWorld.spawnMobs(game::MobType::Zombie, 1, 0, 12);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,29 +9,18 @@
|
|||||||
namespace td {
|
namespace td {
|
||||||
namespace render {
|
namespace render {
|
||||||
|
|
||||||
namespace WorldRenderer{
|
void WorldRenderer::loadModels(){
|
||||||
|
|
||||||
static std::unique_ptr<GL::VAO> worldVAO;
|
|
||||||
static const game::World* worldPtr = nullptr;
|
|
||||||
|
|
||||||
static glm::vec2 camPos{13.5, 13.5};//{60, -10};
|
|
||||||
static float zoom = 1;
|
|
||||||
|
|
||||||
static const float camSensibility = 1;
|
|
||||||
|
|
||||||
static std::unique_ptr<GL::VAO> mobVAO;
|
|
||||||
|
|
||||||
void init(const game::World* world){
|
|
||||||
std::cout << "World Created !\n";
|
std::cout << "World Created !\n";
|
||||||
worldVAO = std::make_unique<GL::VAO>(std::move(WorldLoader::loadWorldModel(world)));
|
m_WorldVao = std::make_unique<GL::VAO>(std::move(WorldLoader::loadWorldModel(m_World)));
|
||||||
mobVAO = std::make_unique<GL::VAO>(std::move(WorldLoader::loadMobModel()));
|
m_MobVao = std::make_unique<GL::VAO>(std::move(WorldLoader::loadMobModel()));
|
||||||
std::cout << "Vertex Count : " << worldVAO->getVertexCount() << std::endl;
|
std::cout << "Vertex Count : " << m_WorldVao->getVertexCount() << std::endl;
|
||||||
Renderer::setCamPos(camPos);
|
|
||||||
worldPtr = world;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void update(){
|
WorldRenderer::WorldRenderer(game::World* world) : m_World(world){
|
||||||
if(worldVAO == nullptr)
|
}
|
||||||
|
|
||||||
|
void WorldRenderer::update(){
|
||||||
|
if(m_WorldVao == nullptr)
|
||||||
return;
|
return;
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
if(io.MouseDown[0] && !ImGui::IsAnyItemActive()){
|
if(io.MouseDown[0] && !ImGui::IsAnyItemActive()){
|
||||||
@@ -45,68 +34,66 @@ void update(){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void renderWorld(){
|
void WorldRenderer::renderWorld() const{
|
||||||
Renderer::renderVAO(*worldVAO);
|
Renderer::renderVAO(*m_WorldVao);
|
||||||
}
|
}
|
||||||
|
|
||||||
void renderMobs(){
|
void WorldRenderer::renderMobs() const{
|
||||||
for(game::MobPtr mob : worldPtr->getMobList()){
|
for(game::MobPtr mob : m_World->getMobList()){
|
||||||
Renderer::Model model;
|
Renderer::Model model;
|
||||||
model.vao = mobVAO.get();
|
model.vao = m_MobVao.get();
|
||||||
model.positon = {mob->getX(), mob->getY()};
|
model.positon = {mob->getX(), mob->getY()};
|
||||||
Renderer::renderModel(model);
|
Renderer::renderModel(model);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void renderTowers(){
|
void WorldRenderer::renderTowers() const{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void render(){
|
void WorldRenderer::render() const{
|
||||||
if(worldVAO == nullptr)
|
if(m_WorldVao == nullptr)
|
||||||
return;
|
return;
|
||||||
renderWorld();
|
renderWorld();
|
||||||
renderMobs();
|
renderMobs();
|
||||||
renderTowers();
|
renderTowers();
|
||||||
}
|
}
|
||||||
|
|
||||||
void destroy(){
|
WorldRenderer::~WorldRenderer(){
|
||||||
if(worldVAO == nullptr)
|
|
||||||
return;
|
|
||||||
worldVAO.reset();
|
|
||||||
worldPtr = nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void moveCam(float relativeX, float relativeY, float aspectRatio){
|
void WorldRenderer::moveCam(float relativeX, float relativeY, float aspectRatio){
|
||||||
if(worldVAO == nullptr)
|
if(m_WorldVao == nullptr)
|
||||||
return;
|
return;
|
||||||
float movementX = -relativeX / zoom * aspectRatio;
|
float movementX = -relativeX / m_Zoom * aspectRatio;
|
||||||
float movementY = relativeY / zoom;
|
float movementY = relativeY / m_Zoom;
|
||||||
Renderer::setCamMovement({movementX, movementY});
|
Renderer::setCamMovement({movementX, movementY});
|
||||||
}
|
}
|
||||||
|
|
||||||
void changeZoom(float zoomStep){
|
void WorldRenderer::changeZoom(float zoomStep){
|
||||||
if(worldVAO == nullptr)
|
if(m_WorldVao == nullptr)
|
||||||
return;
|
return;
|
||||||
static float sensibility = 1.5f;
|
static float sensibility = 1.5f;
|
||||||
if (zoomStep < 0){
|
if (zoomStep < 0){
|
||||||
zoom /= -zoomStep * sensibility;
|
m_Zoom /= -zoomStep * sensibility;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
zoom *= zoomStep * sensibility;
|
m_Zoom *= zoomStep * sensibility;
|
||||||
}
|
}
|
||||||
Renderer::setZoom(zoom);
|
Renderer::setZoom(m_Zoom);
|
||||||
Renderer::setCamMovement({});
|
Renderer::setCamMovement({});
|
||||||
}
|
}
|
||||||
|
|
||||||
void click(int mouseX, int mouseY){
|
void WorldRenderer::click(int mouseX, int mouseY){
|
||||||
if(worldVAO == nullptr)
|
if(m_WorldVao == nullptr)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
} // namespace WorldRenderer
|
|
||||||
|
|
||||||
|
void WorldRenderer::setCamPos(float camX, float camY){
|
||||||
|
m_CamPos = {camX, camY};
|
||||||
|
Renderer::setCamPos(m_CamPos);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace render
|
} // namespace render
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
|||||||
@@ -301,6 +301,7 @@ void tick(){
|
|||||||
|
|
||||||
void render(){
|
void render(){
|
||||||
tick();
|
tick();
|
||||||
|
client.render();
|
||||||
beginFrame();
|
beginFrame();
|
||||||
if (client.isConnected())
|
if (client.isConnected())
|
||||||
renderGame();
|
renderGame();
|
||||||
|
|||||||
@@ -37,11 +37,6 @@ void keyboard_event(GLFWwindow* window, int key, int scancode, int actions, int
|
|||||||
void mouseCursorEvent(GLFWwindow* window, double xPos, double yPos){
|
void mouseCursorEvent(GLFWwindow* window, double xPos, double yPos){
|
||||||
static double lastX = xPos;
|
static double lastX = xPos;
|
||||||
static double lastY = yPos;
|
static double lastY = yPos;
|
||||||
if(isMouseDown(0)){
|
|
||||||
const float relativeX = (float) (xPos - lastX) / (float) lastWidth * 2;
|
|
||||||
const float relativeY = (float) (yPos - lastY) / (float) lastHeight * 2;
|
|
||||||
td::render::WorldRenderer::moveCam(relativeX, relativeY, aspectRatio);
|
|
||||||
}
|
|
||||||
lastX = xPos;
|
lastX = xPos;
|
||||||
lastY = yPos;
|
lastY = yPos;
|
||||||
}
|
}
|
||||||
@@ -54,7 +49,7 @@ void windowResizeEvent(GLFWwindow* window, int width, int height){
|
|||||||
}
|
}
|
||||||
|
|
||||||
void mouseScroll(GLFWwindow* window, double x, double y){
|
void mouseScroll(GLFWwindow* window, double x, double y){
|
||||||
td::render::WorldRenderer::changeZoom(y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void registerCallbacks(){
|
void registerCallbacks(){
|
||||||
@@ -84,7 +79,6 @@ void create() {
|
|||||||
|
|
||||||
void render() {
|
void render() {
|
||||||
td::render::Renderer::prepare();
|
td::render::Renderer::prepare();
|
||||||
td::render::WorldRenderer::render();
|
|
||||||
TowerGui::render();
|
TowerGui::render();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -99,7 +93,6 @@ void update() {
|
|||||||
|
|
||||||
void destroy() {
|
void destroy() {
|
||||||
td::render::Renderer::destroy();
|
td::render::Renderer::destroy();
|
||||||
td::render::WorldRenderer::destroy();
|
|
||||||
TowerGui::destroy();
|
TowerGui::destroy();
|
||||||
glfwDestroyWindow(window);
|
glfwDestroyWindow(window);
|
||||||
window = NULL;
|
window = NULL;
|
||||||
@@ -108,7 +101,6 @@ void destroy() {
|
|||||||
|
|
||||||
void pollEvents() {
|
void pollEvents() {
|
||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
td::render::WorldRenderer::update();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isCloseRequested() {
|
bool isCloseRequested() {
|
||||||
|
|||||||
Reference in New Issue
Block a user