Properly keep noclip state in Game and ClientMap

This commit is contained in:
sfan5 2022-05-21 20:29:44 +02:00
parent 5f3af7d18b
commit 575caa8015
3 changed files with 23 additions and 17 deletions

@ -219,13 +219,11 @@ void ClientMap::updateDrawList()
// Number of blocks occlusion culled // Number of blocks occlusion culled
u32 blocks_occlusion_culled = 0; u32 blocks_occlusion_culled = 0;
// No occlusion culling when free_move is on and camera is // No occlusion culling when free_move is on and camera is inside ground
// inside ground
bool occlusion_culling_enabled = true; bool occlusion_culling_enabled = true;
if (g_settings->getBool("free_move") && g_settings->getBool("noclip")) { if (m_control.allow_noclip) {
MapNode n = getNode(cam_pos_nodes); MapNode n = getNode(cam_pos_nodes);
if (n.getContent() == CONTENT_IGNORE || if (n.getContent() == CONTENT_IGNORE || m_nodedef->get(n).solidness == 2)
m_nodedef->get(n).solidness == 2)
occlusion_culling_enabled = false; occlusion_culling_enabled = false;
} }
@ -678,19 +676,17 @@ void ClientMap::renderPostFx(CameraMode cam_mode)
MapNode n = getNode(floatToInt(m_camera_position, BS)); MapNode n = getNode(floatToInt(m_camera_position, BS));
// - If the player is in a solid node, make everything black.
// - If the player is in liquid, draw a semi-transparent overlay.
// - Do not if player is in third person mode
const ContentFeatures& features = m_nodedef->get(n); const ContentFeatures& features = m_nodedef->get(n);
video::SColor post_effect_color = features.post_effect_color; video::SColor post_effect_color = features.post_effect_color;
if(features.solidness == 2 && !(g_settings->getBool("noclip") &&
m_client->checkLocalPrivilege("noclip")) && // If the camera is in a solid node, make everything black.
cam_mode == CAMERA_MODE_FIRST) // (first person mode only)
{ if (features.solidness == 2 && cam_mode == CAMERA_MODE_FIRST &&
!m_control.allow_noclip) {
post_effect_color = video::SColor(255, 0, 0, 0); post_effect_color = video::SColor(255, 0, 0, 0);
} }
if (post_effect_color.getAlpha() != 0)
{ if (post_effect_color.getAlpha() != 0) {
// Draw a full-screen rectangle // Draw a full-screen rectangle
video::IVideoDriver* driver = SceneManager->getVideoDriver(); video::IVideoDriver* driver = SceneManager->getVideoDriver();
v2u32 ss = driver->getScreenSize(); v2u32 ss = driver->getScreenSize();

@ -27,10 +27,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
struct MapDrawControl struct MapDrawControl
{ {
// Overrides limits by drawing everything
bool range_all = false;
// Wanted drawing range // Wanted drawing range
float wanted_range = 0.0f; float wanted_range = 0.0f;
// Overrides limits by drawing everything
bool range_all = false;
// Allow rendering out of bounds
bool allow_noclip = false;
// show a wire frame for debugging // show a wire frame for debugging
bool show_wireframe = false; bool show_wireframe = false;
}; };

@ -1743,6 +1743,8 @@ void Game::processQueues()
void Game::updateDebugState() void Game::updateDebugState()
{ {
LocalPlayer *player = client->getEnv().getLocalPlayer(); LocalPlayer *player = client->getEnv().getLocalPlayer();
// debug UI and wireframe
bool has_debug = client->checkPrivilege("debug"); bool has_debug = client->checkPrivilege("debug");
bool has_basic_debug = has_debug || (player->hud_flags & HUD_FLAG_BASIC_DEBUG); bool has_basic_debug = has_debug || (player->hud_flags & HUD_FLAG_BASIC_DEBUG);
@ -1757,6 +1759,9 @@ void Game::updateDebugState()
hud->disableBlockBounds(); hud->disableBlockBounds();
if (!has_debug) if (!has_debug)
draw_control->show_wireframe = false; draw_control->show_wireframe = false;
// noclip
draw_control->allow_noclip = m_cache_enable_noclip && client->checkPrivilege("noclip");
} }
void Game::updateProfilers(const RunStats &stats, const FpsControl &draw_times, void Game::updateProfilers(const RunStats &stats, const FpsControl &draw_times,
@ -3762,7 +3767,10 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
float direct_brightness; float direct_brightness;
bool sunlight_seen; bool sunlight_seen;
if (m_cache_enable_noclip && m_cache_enable_free_move) { // When in noclip mode force same sky brightness as above ground so you
// can see properly
if (draw_control->allow_noclip && m_cache_enable_free_move &&
client->checkPrivilege("fly")) {
direct_brightness = time_brightness; direct_brightness = time_brightness;
sunlight_seen = true; sunlight_seen = true;
} else { } else {