add player names display

This commit is contained in:
MihailRis 2024-11-23 07:41:44 +03:00
parent acc4d2540d
commit 65e5063326
10 changed files with 80 additions and 16 deletions

View File

@ -50,7 +50,7 @@ LevelScreen::LevelScreen(Engine* engine, std::unique_ptr<Level> levelPtr)
hud = std::make_unique<Hud>(engine, *frontend, controller->getPlayer());
decorator = std::make_unique<Decorator>(
*controller, *worldRenderer->particles, assets
*controller, *worldRenderer, assets
);
keepAlive(settings.graphics.backlight.observe([=](bool) {

View File

@ -1,13 +1,19 @@
#include "Decorator.hpp"
#include "ParticlesRenderer.hpp"
#include "WorldRenderer.hpp"
#include "TextsRenderer.hpp"
#include "TextNote.hpp"
#include "assets/assets_util.hpp"
#include "content/Content.hpp"
#include "voxels/Chunks.hpp"
#include "voxels/Block.hpp"
#include "world/Level.hpp"
#include "window/Camera.hpp"
#include "objects/Players.hpp"
#include "logic/LevelController.hpp"
#include "util/stringutil.hpp"
#include "presets/NotePreset.hpp"
/// @brief Not greather than 64 for this BIG_PRIME value
inline constexpr int UPDATE_AREA_DIAMETER = 32;
@ -19,16 +25,37 @@ inline constexpr int ITERATIONS = 512;
/// @brief Big prime number used for pseudo-random 3d array iteration
inline constexpr int BIG_PRIME = 666667;
static u64id_t create_player_name_note(
const WorldRenderer& renderer, const Player& player
) {
NotePreset preset {};
preset.displayMode = NoteDisplayMode::PROJECTED;
preset.xrayOpacity = 0.3f;
preset.renderDistance = 128.0f;
return renderer.texts->add(std::make_unique<TextNote>(
util::str2wstr_utf8(player.getName()), preset, player.getPosition()
));
}
Decorator::Decorator(
LevelController& controller, ParticlesRenderer& particles, const Assets& assets
LevelController& controller, WorldRenderer& renderer, const Assets& assets
)
: level(*controller.getLevel()), particles(particles), assets(assets) {
: level(*controller.getLevel()),
renderer(renderer),
assets(assets),
player(*controller.getPlayer()) {
controller.getBlocksController()->listenBlockInteraction(
[this](auto player, const auto& pos, const auto& def, BlockInteraction type) {
if (type == BlockInteraction::placing && def.particles) {
addParticles(def, pos);
}
});
for (const auto& [id, player] : *level.players) {
if (id == controller.getPlayer()->getId()) {
continue;
}
playerTexts[id] = create_player_name_note(renderer, *player);
}
}
void Decorator::addParticles(const Block& def, const glm::ivec3& pos) {
@ -37,7 +64,7 @@ void Decorator::addParticles(const Block& def, const glm::ivec3& pos) {
auto treg = util::get_texture_region(
assets, def.particles->texture, ""
);
blockEmitters[pos] = particles.add(std::make_unique<Emitter>(
blockEmitters[pos] = renderer.particles->add(std::make_unique<Emitter>(
level,
glm::vec3{pos.x + 0.5, pos.y + 0.5, pos.z + 0.5},
*def.particles,
@ -81,7 +108,7 @@ void Decorator::update(float delta, const Camera& camera) {
const auto& indices = *level.content->getIndices();
auto iter = blockEmitters.begin();
while (iter != blockEmitters.end()) {
auto emitter = particles.getEmitter(iter->second);
auto emitter = renderer.particles->getEmitter(iter->second);
if (emitter == nullptr) {
iter = blockEmitters.erase(iter);
continue;
@ -108,4 +135,24 @@ void Decorator::update(float delta, const Camera& camera) {
}
iter++;
}
for (const auto& [id, player] : *level.players) {
if (id == this->player.getId() ||
playerTexts.find(id) != playerTexts.end()) {
continue;
}
playerTexts[id] = create_player_name_note(renderer, *player);
}
auto textsIter = playerTexts.begin();
while (textsIter != playerTexts.end()) {
auto note = renderer.texts->get(textsIter->second);
auto player = level.players->get(textsIter->first);
if (player == nullptr) {
textsIter = playerTexts.erase(textsIter);
} else {
note->setPosition(player->getPosition() + glm::vec3(0, 1, 0));
++textsIter;
}
}
}

View File

@ -6,19 +6,24 @@
#include <unordered_map>
#include "typedefs.hpp"
class Level;
class Chunks;
class Camera;
class Assets;
class Player;
struct Block;
class LevelController;
class ParticlesRenderer;
class WorldRenderer;
class Decorator {
const Level& level;
const Assets& assets;
ParticlesRenderer& particles;
Player& player;
WorldRenderer& renderer;
std::unordered_map<glm::ivec3, uint64_t> blockEmitters;
std::unordered_map<int64_t, u64id_t> playerTexts;
int currentIndex = 0;
void update(
@ -27,7 +32,7 @@ class Decorator {
void addParticles(const Block& def, const glm::ivec3& pos);
public:
Decorator(
LevelController& level, ParticlesRenderer& particles, const Assets& assets
LevelController& level, WorldRenderer& renderer, const Assets& assets
);
void update(float delta, const Camera& camera);

View File

@ -61,6 +61,10 @@ void TextsRenderer::renderNote(
if (preset.displayMode == NoteDisplayMode::XY_FREE_BILLBOARD) {
yvec = camera.up;
}
float scale =
(1.0f - preset.perspective) * glm::pow(glm::distance(camera.position, pos), 1.0f-preset.perspective);
xvec *= 1.0f + scale;
yvec *= 1.0f + scale;
}
if (preset.displayMode != NoteDisplayMode::PROJECTED) {
if (!frustum.isBoxVisible(pos - xvec * (width * 0.5f),

View File

@ -194,7 +194,7 @@ PlayerController::PlayerController(
BlocksController* blocksController
)
: settings(settings), level(level),
player(level->players->getPlayer(0)),
player(level->players->get(0)),
camControl(player, settings.camera),
blocksController(blocksController),
playerTickClock(20, 3) {

View File

@ -351,7 +351,7 @@ static int l_place(lua::State* L) {
"there is no block with index " + std::to_string(id)
);
}
auto player = level->players->getPlayer(playerid);
auto player = level->players->get(playerid);
controller->getBlocksController()->placeBlock(
player, *def, int2blockstate(state), x, y, z
);
@ -368,7 +368,7 @@ static int l_destruct(lua::State* L) {
return 0;
}
auto& def = level->content->getIndices()->blocks.require(voxel->id);
auto player = level->players->getPlayer(playerid);
auto player = level->players->get(playerid);
controller->getBlocksController()->breakBlock(player, def, x, y, z);
return 0;
}

View File

@ -13,7 +13,7 @@
using namespace scripting;
inline Player* get_player(lua::State* L, int idx) {
return level->players->getPlayer(lua::tointeger(L, idx));
return level->players->get(lua::tointeger(L, idx));
}
static int l_get_pos(lua::State* L) {

View File

@ -11,7 +11,7 @@ void Players::addPlayer(std::unique_ptr<Player> player) {
players[player->getId()] = std::move(player);
}
Player* Players::getPlayer(int64_t id) const {
Player* Players::get(int64_t id) const {
const auto& found = players.find(id);
if (found == players.end()) {
return nullptr;

View File

@ -21,11 +21,19 @@ class Players : public Serializable {
public:
Players(Level* level);
Player* getPlayer(int64_t id) const;
Player* get(int64_t id) const;
Player* create();
dv::value serialize() const override;
void deserialize(const dv::value& src) override;
auto begin() const {
return players.begin();
}
auto end() const {
return players.end();
}
};

View File

@ -62,9 +62,9 @@ bool Events::jclicked(int button) {
void Events::toggleCursor() {
cursor_drag = false;
_cursor_locked = !_cursor_locked;
/*Window::setCursorMode(
Window::setCursorMode(
_cursor_locked ? GLFW_CURSOR_DISABLED : GLFW_CURSOR_NORMAL
);*/
);
}
void Events::pollEvents() {