add player names display
This commit is contained in:
@@ -50,7 +50,7 @@ LevelScreen::LevelScreen(Engine* engine, std::unique_ptr<Level> levelPtr)
|
|||||||
hud = std::make_unique<Hud>(engine, *frontend, controller->getPlayer());
|
hud = std::make_unique<Hud>(engine, *frontend, controller->getPlayer());
|
||||||
|
|
||||||
decorator = std::make_unique<Decorator>(
|
decorator = std::make_unique<Decorator>(
|
||||||
*controller, *worldRenderer->particles, assets
|
*controller, *worldRenderer, assets
|
||||||
);
|
);
|
||||||
|
|
||||||
keepAlive(settings.graphics.backlight.observe([=](bool) {
|
keepAlive(settings.graphics.backlight.observe([=](bool) {
|
||||||
|
|||||||
@@ -1,13 +1,19 @@
|
|||||||
#include "Decorator.hpp"
|
#include "Decorator.hpp"
|
||||||
|
|
||||||
#include "ParticlesRenderer.hpp"
|
#include "ParticlesRenderer.hpp"
|
||||||
|
#include "WorldRenderer.hpp"
|
||||||
|
#include "TextsRenderer.hpp"
|
||||||
|
#include "TextNote.hpp"
|
||||||
#include "assets/assets_util.hpp"
|
#include "assets/assets_util.hpp"
|
||||||
#include "content/Content.hpp"
|
#include "content/Content.hpp"
|
||||||
#include "voxels/Chunks.hpp"
|
#include "voxels/Chunks.hpp"
|
||||||
#include "voxels/Block.hpp"
|
#include "voxels/Block.hpp"
|
||||||
#include "world/Level.hpp"
|
#include "world/Level.hpp"
|
||||||
#include "window/Camera.hpp"
|
#include "window/Camera.hpp"
|
||||||
|
#include "objects/Players.hpp"
|
||||||
#include "logic/LevelController.hpp"
|
#include "logic/LevelController.hpp"
|
||||||
|
#include "util/stringutil.hpp"
|
||||||
|
#include "presets/NotePreset.hpp"
|
||||||
|
|
||||||
/// @brief Not greather than 64 for this BIG_PRIME value
|
/// @brief Not greather than 64 for this BIG_PRIME value
|
||||||
inline constexpr int UPDATE_AREA_DIAMETER = 32;
|
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
|
/// @brief Big prime number used for pseudo-random 3d array iteration
|
||||||
inline constexpr int BIG_PRIME = 666667;
|
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(
|
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(
|
controller.getBlocksController()->listenBlockInteraction(
|
||||||
[this](auto player, const auto& pos, const auto& def, BlockInteraction type) {
|
[this](auto player, const auto& pos, const auto& def, BlockInteraction type) {
|
||||||
if (type == BlockInteraction::placing && def.particles) {
|
if (type == BlockInteraction::placing && def.particles) {
|
||||||
addParticles(def, pos);
|
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) {
|
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(
|
auto treg = util::get_texture_region(
|
||||||
assets, def.particles->texture, ""
|
assets, def.particles->texture, ""
|
||||||
);
|
);
|
||||||
blockEmitters[pos] = particles.add(std::make_unique<Emitter>(
|
blockEmitters[pos] = renderer.particles->add(std::make_unique<Emitter>(
|
||||||
level,
|
level,
|
||||||
glm::vec3{pos.x + 0.5, pos.y + 0.5, pos.z + 0.5},
|
glm::vec3{pos.x + 0.5, pos.y + 0.5, pos.z + 0.5},
|
||||||
*def.particles,
|
*def.particles,
|
||||||
@@ -81,7 +108,7 @@ void Decorator::update(float delta, const Camera& camera) {
|
|||||||
const auto& indices = *level.content->getIndices();
|
const auto& indices = *level.content->getIndices();
|
||||||
auto iter = blockEmitters.begin();
|
auto iter = blockEmitters.begin();
|
||||||
while (iter != blockEmitters.end()) {
|
while (iter != blockEmitters.end()) {
|
||||||
auto emitter = particles.getEmitter(iter->second);
|
auto emitter = renderer.particles->getEmitter(iter->second);
|
||||||
if (emitter == nullptr) {
|
if (emitter == nullptr) {
|
||||||
iter = blockEmitters.erase(iter);
|
iter = blockEmitters.erase(iter);
|
||||||
continue;
|
continue;
|
||||||
@@ -108,4 +135,24 @@ void Decorator::update(float delta, const Camera& camera) {
|
|||||||
}
|
}
|
||||||
iter++;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,19 +6,24 @@
|
|||||||
|
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
||||||
|
#include "typedefs.hpp"
|
||||||
|
|
||||||
class Level;
|
class Level;
|
||||||
class Chunks;
|
class Chunks;
|
||||||
class Camera;
|
class Camera;
|
||||||
class Assets;
|
class Assets;
|
||||||
|
class Player;
|
||||||
struct Block;
|
struct Block;
|
||||||
class LevelController;
|
class LevelController;
|
||||||
class ParticlesRenderer;
|
class WorldRenderer;
|
||||||
|
|
||||||
class Decorator {
|
class Decorator {
|
||||||
const Level& level;
|
const Level& level;
|
||||||
const Assets& assets;
|
const Assets& assets;
|
||||||
ParticlesRenderer& particles;
|
Player& player;
|
||||||
|
WorldRenderer& renderer;
|
||||||
std::unordered_map<glm::ivec3, uint64_t> blockEmitters;
|
std::unordered_map<glm::ivec3, uint64_t> blockEmitters;
|
||||||
|
std::unordered_map<int64_t, u64id_t> playerTexts;
|
||||||
int currentIndex = 0;
|
int currentIndex = 0;
|
||||||
|
|
||||||
void update(
|
void update(
|
||||||
@@ -27,7 +32,7 @@ class Decorator {
|
|||||||
void addParticles(const Block& def, const glm::ivec3& pos);
|
void addParticles(const Block& def, const glm::ivec3& pos);
|
||||||
public:
|
public:
|
||||||
Decorator(
|
Decorator(
|
||||||
LevelController& level, ParticlesRenderer& particles, const Assets& assets
|
LevelController& level, WorldRenderer& renderer, const Assets& assets
|
||||||
);
|
);
|
||||||
|
|
||||||
void update(float delta, const Camera& camera);
|
void update(float delta, const Camera& camera);
|
||||||
|
|||||||
@@ -61,6 +61,10 @@ void TextsRenderer::renderNote(
|
|||||||
if (preset.displayMode == NoteDisplayMode::XY_FREE_BILLBOARD) {
|
if (preset.displayMode == NoteDisplayMode::XY_FREE_BILLBOARD) {
|
||||||
yvec = camera.up;
|
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 (preset.displayMode != NoteDisplayMode::PROJECTED) {
|
||||||
if (!frustum.isBoxVisible(pos - xvec * (width * 0.5f),
|
if (!frustum.isBoxVisible(pos - xvec * (width * 0.5f),
|
||||||
|
|||||||
@@ -194,7 +194,7 @@ PlayerController::PlayerController(
|
|||||||
BlocksController* blocksController
|
BlocksController* blocksController
|
||||||
)
|
)
|
||||||
: settings(settings), level(level),
|
: settings(settings), level(level),
|
||||||
player(level->players->getPlayer(0)),
|
player(level->players->get(0)),
|
||||||
camControl(player, settings.camera),
|
camControl(player, settings.camera),
|
||||||
blocksController(blocksController),
|
blocksController(blocksController),
|
||||||
playerTickClock(20, 3) {
|
playerTickClock(20, 3) {
|
||||||
|
|||||||
@@ -351,7 +351,7 @@ static int l_place(lua::State* L) {
|
|||||||
"there is no block with index " + std::to_string(id)
|
"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(
|
controller->getBlocksController()->placeBlock(
|
||||||
player, *def, int2blockstate(state), x, y, z
|
player, *def, int2blockstate(state), x, y, z
|
||||||
);
|
);
|
||||||
@@ -368,7 +368,7 @@ static int l_destruct(lua::State* L) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
auto& def = level->content->getIndices()->blocks.require(voxel->id);
|
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);
|
controller->getBlocksController()->breakBlock(player, def, x, y, z);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
using namespace scripting;
|
using namespace scripting;
|
||||||
|
|
||||||
inline Player* get_player(lua::State* L, int idx) {
|
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) {
|
static int l_get_pos(lua::State* L) {
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ void Players::addPlayer(std::unique_ptr<Player> player) {
|
|||||||
players[player->getId()] = std::move(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);
|
const auto& found = players.find(id);
|
||||||
if (found == players.end()) {
|
if (found == players.end()) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|||||||
@@ -21,11 +21,19 @@ class Players : public Serializable {
|
|||||||
public:
|
public:
|
||||||
Players(Level* level);
|
Players(Level* level);
|
||||||
|
|
||||||
Player* getPlayer(int64_t id) const;
|
Player* get(int64_t id) const;
|
||||||
|
|
||||||
Player* create();
|
Player* create();
|
||||||
|
|
||||||
dv::value serialize() const override;
|
dv::value serialize() const override;
|
||||||
|
|
||||||
void deserialize(const dv::value& src) override;
|
void deserialize(const dv::value& src) override;
|
||||||
|
|
||||||
|
auto begin() const {
|
||||||
|
return players.begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto end() const {
|
||||||
|
return players.end();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -62,9 +62,9 @@ bool Events::jclicked(int button) {
|
|||||||
void Events::toggleCursor() {
|
void Events::toggleCursor() {
|
||||||
cursor_drag = false;
|
cursor_drag = false;
|
||||||
_cursor_locked = !_cursor_locked;
|
_cursor_locked = !_cursor_locked;
|
||||||
/*Window::setCursorMode(
|
Window::setCursorMode(
|
||||||
_cursor_locked ? GLFW_CURSOR_DISABLED : GLFW_CURSOR_NORMAL
|
_cursor_locked ? GLFW_CURSOR_DISABLED : GLFW_CURSOR_NORMAL
|
||||||
);*/
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Events::pollEvents() {
|
void Events::pollEvents() {
|
||||||
|
|||||||
Reference in New Issue
Block a user