1
0
game/client/entity/player/PlayerRenderer.cpp

97 lines
3.4 KiB
C++

#include "PlayerRenderer.hpp"
#include "../../net/NetworkManager.hpp"
PlayerRenderer::PlayerRenderer() {
init();
}
PlayerRenderer::~PlayerRenderer() {
// Unload textures
for (auto& [color, texture] : playerTextures) {
UnloadTexture(texture);
}
// Unload models
UnloadModel(localPlayerModel);
for (auto& [id, model] : remotePlayerModels) {
UnloadModel(model);
}
}
void PlayerRenderer::init() {
// Load all player color textures
playerTextures["red"] = LoadTexture("../assets/textures/red.png");
playerTextures["green"] = LoadTexture("../assets/textures/green.png");
playerTextures["orange"] = LoadTexture("../assets/textures/orange.png");
playerTextures["purple"] = LoadTexture("../assets/textures/purple.png");
playerTextures["white"] = LoadTexture("../assets/textures/white.png");
// Create local player model
auto cubeMesh = GenMeshCube(1.0f, 2.0f, 1.0f);
localPlayerModel = LoadModelFromMesh(cubeMesh);
}
void PlayerRenderer::renderLocalPlayer(RenderContext& ctx, const Vector3& position, const std::string& color) {
// Set texture based on player color
if (playerTextures.count(color) > 0) {
localPlayerModel.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = playerTextures[color];
}
// Submit to render context
ctx.submitModel(localPlayerModel, position, 1.0f, WHITE, RenderContext::RenderLayer::ENTITIES);
}
void PlayerRenderer::renderRemotePlayers(RenderContext& ctx,
const std::unordered_map<uint32_t, RemotePlayer>& players) {
for (const auto& [id, player] : players) {
// Ensure model exists for this player
ensurePlayerModel(id);
// Update texture based on player color
if (remotePlayerModels.count(id) > 0 && playerTextures.count(player.color) > 0) {
remotePlayerModels[id].materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = playerTextures[player.color];
// Submit to render context
ctx.submitModel(remotePlayerModels[id], player.position, 1.0f, WHITE,
RenderContext::RenderLayer::ENTITIES);
}
}
}
void PlayerRenderer::ensurePlayerModel(uint32_t playerId) {
if (remotePlayerModels.find(playerId) == remotePlayerModels.end()) {
// Create new model for this player
auto cubeMesh = GenMeshCube(1.0f, 2.0f, 1.0f);
remotePlayerModels[playerId] = LoadModelFromMesh(cubeMesh);
}
}
void PlayerRenderer::removePlayerModel(uint32_t playerId) {
auto it = remotePlayerModels.find(playerId);
if (it != remotePlayerModels.end()) {
UnloadModel(it->second);
remotePlayerModels.erase(it);
}
}
void PlayerRenderer::cleanupDisconnectedPlayers(const std::unordered_map<uint32_t, RemotePlayer>& currentPlayers) {
// Remove models for players who are no longer connected
for (auto it = remotePlayerModels.begin(); it != remotePlayerModels.end();) {
if (currentPlayers.find(it->first) == currentPlayers.end()) {
UnloadModel(it->second);
it = remotePlayerModels.erase(it);
} else {
++it;
}
}
}
Texture2D PlayerRenderer::getPlayerTexture(const std::string& color) const {
auto it = playerTextures.find(color);
if (it != playerTextures.end()) {
return it->second;
}
// Return a default texture or handle error
return Texture2D{};
}