aboutsummaryrefslogtreecommitdiff
path: root/src/client
diff options
context:
space:
mode:
authorElias Fleckenstein <eliasfleckenstein@web.de>2022-05-22 12:05:27 +0200
committerElias Fleckenstein <eliasfleckenstein@web.de>2022-05-22 12:05:27 +0200
commit3ff3103e98b350712543f926c429ab339700e252 (patch)
tree61827d6b7dcb51c38f17f068c8b498c16a0db1c3 /src/client
parent350b6d175c406fbbc002237f37db4cf88d6d3d19 (diff)
parent9f338f5a56e5adee3d11d59827f7e2b8a714e6c2 (diff)
downloaddragonfireclient-3ff3103e98b350712543f926c429ab339700e252.tar.xz
Merge branch 'master' of https://github.com/minetest/minetest
Diffstat (limited to 'src/client')
-rw-r--r--src/client/camera.cpp10
-rw-r--r--src/client/camera.h3
-rw-r--r--src/client/client.cpp8
-rw-r--r--src/client/clientenvironment.cpp1
-rw-r--r--src/client/clientmap.cpp41
-rw-r--r--src/client/clientmap.h3
-rw-r--r--src/client/content_cao.cpp8
-rw-r--r--src/client/mapblock_mesh.cpp21
-rw-r--r--src/client/mapblock_mesh.h17
-rw-r--r--src/client/shader.cpp2
-rw-r--r--src/client/shadows/dynamicshadowsrender.cpp1
11 files changed, 70 insertions, 45 deletions
diff --git a/src/client/camera.cpp b/src/client/camera.cpp
index 0c387262e..164db8761 100644
--- a/src/client/camera.cpp
+++ b/src/client/camera.cpp
@@ -48,7 +48,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
Camera::Camera(MapDrawControl &draw_control, Client *client, RenderingEngine *rendering_engine):
m_draw_control(draw_control),
- m_client(client)
+ m_client(client),
+ m_player_light_color(0xFFFFFFFF)
{
auto smgr = rendering_engine->get_scene_manager();
// note: making the camera node a child of the player node
@@ -154,8 +155,10 @@ void Camera::step(f32 dtime)
bool was_under_zero = m_wield_change_timer < 0;
m_wield_change_timer = MYMIN(m_wield_change_timer + dtime, 0.125);
- if (m_wield_change_timer >= 0 && was_under_zero)
+ if (m_wield_change_timer >= 0 && was_under_zero) {
m_wieldnode->setItem(m_wield_item_next, m_client);
+ m_wieldnode->setNodeLightColor(m_player_light_color);
+ }
if (m_view_bobbing_state != 0)
{
@@ -556,7 +559,8 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 tool_reload_ratio)
m_wieldnode->setPosition(wield_position);
m_wieldnode->setRotation(wield_rotation);
- m_wieldnode->setNodeLightColor(player->light_color);
+ m_player_light_color = player->light_color;
+ m_wieldnode->setNodeLightColor(m_player_light_color);
// Set render distance
updateViewingRange();
diff --git a/src/client/camera.h b/src/client/camera.h
index ecd71f1e7..6a8cf650d 100644
--- a/src/client/camera.h
+++ b/src/client/camera.h
@@ -291,4 +291,7 @@ private:
std::list<Nametag *> m_nametags;
bool m_show_nametag_backgrounds;
+
+ // Last known light color of the player
+ video::SColor m_player_light_color;
};
diff --git a/src/client/client.cpp b/src/client/client.cpp
index 4e4bb8a97..2d9d226e4 100644
--- a/src/client/client.cpp
+++ b/src/client/client.cpp
@@ -789,16 +789,18 @@ void Client::peerAdded(con::Peer *peer)
infostream << "Client::peerAdded(): peer->id="
<< peer->id << std::endl;
}
+
void Client::deletingPeer(con::Peer *peer, bool timeout)
{
infostream << "Client::deletingPeer(): "
"Server Peer is getting deleted "
<< "(timeout=" << timeout << ")" << std::endl;
- if (timeout) {
- m_access_denied = true;
+ m_access_denied = true;
+ if (timeout)
m_access_denied_reason = gettext("Connection timed out.");
- }
+ else
+ m_access_denied_reason = gettext("Connection aborted (protocol error?).");
}
/*
diff --git a/src/client/clientenvironment.cpp b/src/client/clientenvironment.cpp
index 01aaa0408..e847161f9 100644
--- a/src/client/clientenvironment.cpp
+++ b/src/client/clientenvironment.cpp
@@ -304,6 +304,7 @@ void ClientEnvironment::step(float dtime)
node_at_lplayer = m_map->getNode(p);
u16 light = getInteriorLight(node_at_lplayer, 0, m_client->ndef());
+ lplayer->light_color = encode_light(light, 0); // this transfers light.alpha
final_color_blend(&lplayer->light_color, light, day_night_ratio);
}
diff --git a/src/client/clientmap.cpp b/src/client/clientmap.cpp
index 51f0f6896..85b765709 100644
--- a/src/client/clientmap.cpp
+++ b/src/client/clientmap.cpp
@@ -449,15 +449,7 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
drawcall_count += draw_order.size();
for (auto &descriptor : draw_order) {
- scene::IMeshBuffer *buf;
-
- if (descriptor.m_use_partial_buffer) {
- descriptor.m_partial_buffer->beforeDraw();
- buf = descriptor.m_partial_buffer->getBuffer();
- }
- else {
- buf = descriptor.m_buffer;
- }
+ scene::IMeshBuffer *buf = descriptor.getBuffer();
// Check and abort if the machine is swapping a lot
if (draw.getTimerTime() > 2000) {
@@ -489,6 +481,8 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
// Do not enable filter on shadow texture to avoid visual artifacts
// with colored shadows.
// Filtering is done in shader code anyway
+ layer.BilinearFilter = false;
+ layer.AnisotropicFilter = false;
layer.TrilinearFilter = false;
}
driver->setMaterial(material);
@@ -499,7 +493,7 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
m.setTranslation(block_wpos - offset);
driver->setTransform(video::ETS_WORLD, m);
- driver->drawMeshBuffer(buf);
+ descriptor.draw(driver);
vertex_count += buf->getIndexCount();
}
@@ -810,15 +804,7 @@ void ClientMap::renderMapShadows(video::IVideoDriver *driver,
drawcall_count += draw_order.size();
for (auto &descriptor : draw_order) {
- scene::IMeshBuffer *buf;
-
- if (descriptor.m_use_partial_buffer) {
- descriptor.m_partial_buffer->beforeDraw();
- buf = descriptor.m_partial_buffer->getBuffer();
- }
- else {
- buf = descriptor.m_buffer;
- }
+ scene::IMeshBuffer *buf = descriptor.getBuffer();
// Check and abort if the machine is swapping a lot
if (draw.getTimerTime() > 1000) {
@@ -843,7 +829,7 @@ void ClientMap::renderMapShadows(video::IVideoDriver *driver,
m.setTranslation(block_wpos - offset);
driver->setTransform(video::ETS_WORLD, m);
- driver->drawMeshBuffer(buf);
+ descriptor.draw(driver);
vertex_count += buf->getIndexCount();
}
@@ -964,3 +950,18 @@ void ClientMap::updateTransparentMeshBuffers()
m_needs_update_transparent_meshes = false;
}
+scene::IMeshBuffer* ClientMap::DrawDescriptor::getBuffer()
+{
+ return m_use_partial_buffer ? m_partial_buffer->getBuffer() : m_buffer;
+}
+
+void ClientMap::DrawDescriptor::draw(video::IVideoDriver* driver)
+{
+ if (m_use_partial_buffer) {
+ m_partial_buffer->beforeDraw();
+ driver->drawMeshBuffer(m_partial_buffer->getBuffer());
+ m_partial_buffer->afterDraw();
+ } else {
+ driver->drawMeshBuffer(m_buffer);
+ }
+}
diff --git a/src/client/clientmap.h b/src/client/clientmap.h
index 6d57f1911..823870c68 100644
--- a/src/client/clientmap.h
+++ b/src/client/clientmap.h
@@ -174,6 +174,9 @@ private:
DrawDescriptor(v3s16 pos, const PartialMeshBuffer *buffer) :
m_pos(pos), m_partial_buffer(buffer), m_reuse_material(false), m_use_partial_buffer(true)
{}
+
+ scene::IMeshBuffer* getBuffer();
+ void draw(video::IVideoDriver* driver);
};
Client *m_client;
diff --git a/src/client/content_cao.cpp b/src/client/content_cao.cpp
index ec1fd1c2a..eeeb19ac5 100644
--- a/src/client/content_cao.cpp
+++ b/src/client/content_cao.cpp
@@ -920,12 +920,8 @@ void GenericCAO::setNodeLight(const video::SColor &light_color)
if (m_prop.visual == "upright_sprite") {
if (!m_meshnode)
return;
-
- scene::IMesh *mesh = m_meshnode->getMesh();
- for (u32 i = 0; i < mesh->getMeshBufferCount(); ++i) {
- scene::IMeshBuffer *buf = mesh->getMeshBuffer(i);
- buf->getMaterial().EmissiveColor = light_color;
- }
+ for (u32 i = 0; i < m_meshnode->getMaterialCount(); ++i)
+ m_meshnode->getMaterial(i).EmissiveColor = light_color;
} else {
scene::ISceneNode *node = getSceneNode();
if (!node)
diff --git a/src/client/mapblock_mesh.cpp b/src/client/mapblock_mesh.cpp
index f0d43ec7e..9e82fc3e4 100644
--- a/src/client/mapblock_mesh.cpp
+++ b/src/client/mapblock_mesh.cpp
@@ -1204,15 +1204,16 @@ void MapBlockBspTree::traverse(s32 node, v3f viewpoint, std::vector<s32> &output
void PartialMeshBuffer::beforeDraw() const
{
// Patch the indexes in the mesh buffer before draw
-
- m_buffer->Indices.clear();
- if (!m_vertex_indexes.empty()) {
- for (auto index : m_vertex_indexes)
- m_buffer->Indices.push_back(index);
- }
+ m_buffer->Indices = std::move(m_vertex_indexes);
m_buffer->setDirty(scene::EBT_INDEX);
}
+void PartialMeshBuffer::afterDraw() const
+{
+ // Take the data back
+ m_vertex_indexes = std::move(m_buffer->Indices.steal());
+}
+
/*
MapBlockMesh
*/
@@ -1582,7 +1583,7 @@ void MapBlockMesh::updateTransparentBuffers(v3f camera_pos, v3s16 block_pos)
const auto &t = m_transparent_triangles[i];
if (current_buffer != t.buffer) {
if (current_buffer) {
- m_transparent_buffers.emplace_back(current_buffer, current_strain);
+ m_transparent_buffers.emplace_back(current_buffer, std::move(current_strain));
current_strain.clear();
}
current_buffer = t.buffer;
@@ -1593,7 +1594,7 @@ void MapBlockMesh::updateTransparentBuffers(v3f camera_pos, v3s16 block_pos)
}
if (!current_strain.empty())
- m_transparent_buffers.emplace_back(current_buffer, current_strain);
+ m_transparent_buffers.emplace_back(current_buffer, std::move(current_strain));
}
void MapBlockMesh::consolidateTransparentBuffers()
@@ -1607,7 +1608,7 @@ void MapBlockMesh::consolidateTransparentBuffers()
for (const auto &t : m_transparent_triangles) {
if (current_buffer != t.buffer) {
if (current_buffer != nullptr) {
- this->m_transparent_buffers.emplace_back(current_buffer, current_strain);
+ this->m_transparent_buffers.emplace_back(current_buffer, std::move(current_strain));
current_strain.clear();
}
current_buffer = t.buffer;
@@ -1618,7 +1619,7 @@ void MapBlockMesh::consolidateTransparentBuffers()
}
if (!current_strain.empty()) {
- this->m_transparent_buffers.emplace_back(current_buffer, current_strain);
+ this->m_transparent_buffers.emplace_back(current_buffer, std::move(current_strain));
}
}
diff --git a/src/client/mapblock_mesh.h b/src/client/mapblock_mesh.h
index 5e2d70b75..8133627b1 100644
--- a/src/client/mapblock_mesh.h
+++ b/src/client/mapblock_mesh.h
@@ -140,20 +140,31 @@ private:
s32 root = -1; // index of the root node
};
+/*
+ * PartialMeshBuffer
+ *
+ * Attach alternate `Indices` to an existing mesh buffer, to make it possible to use different
+ * indices with the same vertex buffer.
+ *
+ * Irrlicht does not currently support this: `CMeshBuffer` ties together a single vertex buffer
+ * and a single index buffer. There's no way to share these between mesh buffers.
+ *
+ */
class PartialMeshBuffer
{
public:
- PartialMeshBuffer(scene::SMeshBuffer *buffer, const std::vector<u16> &vertex_indexes) :
- m_buffer(buffer), m_vertex_indexes(vertex_indexes)
+ PartialMeshBuffer(scene::SMeshBuffer *buffer, std::vector<u16> &&vertex_indexes) :
+ m_buffer(buffer), m_vertex_indexes(std::move(vertex_indexes))
{}
scene::IMeshBuffer *getBuffer() const { return m_buffer; }
const std::vector<u16> &getVertexIndexes() const { return m_vertex_indexes; }
void beforeDraw() const;
+ void afterDraw() const;
private:
scene::SMeshBuffer *m_buffer;
- std::vector<u16> m_vertex_indexes;
+ mutable std::vector<u16> m_vertex_indexes;
};
/*
diff --git a/src/client/shader.cpp b/src/client/shader.cpp
index bbb872761..009a4b3d7 100644
--- a/src/client/shader.cpp
+++ b/src/client/shader.cpp
@@ -771,6 +771,8 @@ ShaderInfo ShaderSource::generateShader(const std::string &name,
shaders_header << "#define SOFTSHADOWRADIUS " << shadow_soft_radius << "\n";
}
+ shaders_header << "#line 0\n"; // reset the line counter for meaningful diagnostics
+
std::string common_header = shaders_header.str();
std::string vertex_shader = m_sourcecache.getOrLoad(name, "opengl_vertex.glsl");
diff --git a/src/client/shadows/dynamicshadowsrender.cpp b/src/client/shadows/dynamicshadowsrender.cpp
index 07dc6daf2..c13cfe252 100644
--- a/src/client/shadows/dynamicshadowsrender.cpp
+++ b/src/client/shadows/dynamicshadowsrender.cpp
@@ -670,6 +670,7 @@ std::string ShadowRenderer::readShaderFile(const std::string &path)
std::string prefix;
if (m_shadow_map_colored)
prefix.append("#define COLORED_SHADOWS 1\n");
+ prefix.append("#line 0\n");
std::string content;
fs::ReadFile(path, content);