X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fclient%2Fgame.cpp;h=122e25d8c2042ca121ee6bdbc0ab6e522e2863d9;hb=84787962269bb170b3e9f76d2706cbfd2232586a;hp=360ce4f8cecd1eb601f471c07d9a9315071f6c92;hpb=7bf64fc61a6094733f9a9a9401d6f03a8f10edeb;p=minetest.git diff --git a/src/client/game.cpp b/src/client/game.cpp index 360ce4f8c..122e25d8c 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -414,6 +414,8 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter CachedPixelShaderSetting m_fog_distance; CachedVertexShaderSetting m_animation_timer_vertex; CachedPixelShaderSetting m_animation_timer_pixel; + CachedVertexShaderSetting m_animation_timer_delta_vertex; + CachedPixelShaderSetting m_animation_timer_delta_pixel; CachedPixelShaderSetting m_day_light; CachedPixelShaderSetting m_star_color; CachedPixelShaderSetting m_eye_position_pixel; @@ -427,8 +429,8 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter CachedPixelShaderSetting m_texture3; CachedPixelShaderSetting m_texel_size0; std::array m_texel_size0_values; - CachedPixelShaderSetting m_exposure_factor_pixel; - float m_user_exposure_factor; + CachedStructPixelShaderSetting m_exposure_params_pixel; + float m_user_exposure_compensation; bool m_bloom_enabled; CachedPixelShaderSetting m_bloom_intensity_pixel; float m_bloom_intensity; @@ -436,7 +438,6 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter float m_bloom_strength; CachedPixelShaderSetting m_bloom_radius_pixel; float m_bloom_radius; - float m_saturation; CachedPixelShaderSetting m_saturation_pixel; public: @@ -444,16 +445,14 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter { if (name == "enable_fog") m_fog_enabled = g_settings->getBool("enable_fog"); - if (name == "exposure_factor") - m_user_exposure_factor = g_settings->getFloat("exposure_factor", 0.1f, 10.0f); + if (name == "exposure_compensation") + m_user_exposure_compensation = g_settings->getFloat("exposure_compensation", -1.0f, 1.0f); if (name == "bloom_intensity") m_bloom_intensity = g_settings->getFloat("bloom_intensity", 0.01f, 1.0f); if (name == "bloom_strength_factor") m_bloom_strength = RenderingEngine::BASE_BLOOM_STRENGTH * g_settings->getFloat("bloom_strength_factor", 0.1f, 10.0f); if (name == "bloom_radius") m_bloom_radius = g_settings->getFloat("bloom_radius", 0.1f, 8.0f); - if (name == "saturation") - m_saturation = g_settings->getFloat("saturation", 0.0f, 5.0f); } static void settingsCallback(const std::string &name, void *userdata) @@ -473,6 +472,8 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter m_fog_distance("fogDistance"), m_animation_timer_vertex("animationTimer"), m_animation_timer_pixel("animationTimer"), + m_animation_timer_delta_vertex("animationTimerDelta"), + m_animation_timer_delta_pixel("animationTimerDelta"), m_day_light("dayLight"), m_star_color("starColor"), m_eye_position_pixel("eyePosition"), @@ -485,25 +486,28 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter m_texture2("texture2"), m_texture3("texture3"), m_texel_size0("texelSize0"), - m_exposure_factor_pixel("exposureFactor"), + m_exposure_params_pixel("exposureParams", + std::array { + "luminanceMin", "luminanceMax", "exposureCorrection", + "speedDarkBright", "speedBrightDark", "centerWeightPower", "compensationFactor" + }), m_bloom_intensity_pixel("bloomIntensity"), m_bloom_strength_pixel("bloomStrength"), m_bloom_radius_pixel("bloomRadius"), m_saturation_pixel("saturation") { g_settings->registerChangedCallback("enable_fog", settingsCallback, this); - g_settings->registerChangedCallback("exposure_factor", settingsCallback, this); + g_settings->registerChangedCallback("exposure_compensation", settingsCallback, this); g_settings->registerChangedCallback("bloom_intensity", settingsCallback, this); g_settings->registerChangedCallback("bloom_strength_factor", settingsCallback, this); g_settings->registerChangedCallback("bloom_radius", settingsCallback, this); g_settings->registerChangedCallback("saturation", settingsCallback, this); m_fog_enabled = g_settings->getBool("enable_fog"); - m_user_exposure_factor = g_settings->getFloat("exposure_factor", 0.1f, 10.0f); + m_user_exposure_compensation = g_settings->getFloat("exposure_compensation", -1.0f, 1.0f); m_bloom_enabled = g_settings->getBool("enable_bloom"); m_bloom_intensity = g_settings->getFloat("bloom_intensity", 0.01f, 1.0f); m_bloom_strength = RenderingEngine::BASE_BLOOM_STRENGTH * g_settings->getFloat("bloom_strength_factor", 0.1f, 10.0f); m_bloom_radius = g_settings->getFloat("bloom_radius", 0.1f, 8.0f); - m_saturation = g_settings->getFloat("saturation", 0.0f, 5.0f); } ~GameGlobalShaderConstantSetter() @@ -550,6 +554,10 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter m_animation_timer_vertex.set(&animation_timer_f, services); m_animation_timer_pixel.set(&animation_timer_f, services); + float animation_timer_delta_f = (float)m_client->getEnv().getFrameTimeDelta() / 100000.f; + m_animation_timer_delta_vertex.set(&animation_timer_delta_f, services); + m_animation_timer_delta_pixel.set(&animation_timer_delta_f, services); + float eye_position_array[3]; v3f epos = m_client->getEnv().getLocalPlayer()->getEyePosition(); epos.getAs3Values(eye_position_array); @@ -581,17 +589,25 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter m_texel_size0.set(m_texel_size0_values.data(), services); - float exposure_factor = m_user_exposure_factor; - if (std::isnan(exposure_factor)) - exposure_factor = 1.0f; - m_exposure_factor_pixel.set(&exposure_factor, services); + const AutoExposure &exposure_params = m_client->getEnv().getLocalPlayer()->getLighting().exposure; + std::array exposure_buffer = { + std::pow(2.0f, exposure_params.luminance_min), + std::pow(2.0f, exposure_params.luminance_max), + exposure_params.exposure_correction, + exposure_params.speed_dark_bright, + exposure_params.speed_bright_dark, + exposure_params.center_weight_power, + powf(2.f, m_user_exposure_compensation) + }; + m_exposure_params_pixel.set(exposure_buffer.data(), services); if (m_bloom_enabled) { m_bloom_intensity_pixel.set(&m_bloom_intensity, services); m_bloom_radius_pixel.set(&m_bloom_radius, services); m_bloom_strength_pixel.set(&m_bloom_strength, services); } - m_saturation_pixel.set(&m_saturation, services); + float saturation = m_client->getEnv().getLocalPlayer()->getLighting().saturation; + m_saturation_pixel.set(&saturation, services); } void onSetMaterial(const video::SMaterial &material) @@ -699,6 +715,7 @@ struct GameRunData { float damage_flash; float update_draw_list_timer; + float touch_blocks_timer; f32 fog_range; @@ -1258,11 +1275,7 @@ void Game::run() void Game::shutdown() { m_rendering_engine->finalize(); -#if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR <= 8 - if (g_settings->get("3d_mode") == "pageflip") { - driver->setRenderTarget(irr::video::ERT_STEREO_BOTH_BUFFERS); - } -#endif + auto formspec = m_game_ui->getFormspecGUI(); if (formspec) formspec->quitMenu(); @@ -1421,7 +1434,6 @@ bool Game::createClient(const GameStartData &start_data) if (g_touchscreengui) { g_touchscreengui->init(texture_src); g_touchscreengui->hide(); - g_touchscreengui->setUseCrosshair(!isNoCrosshairAllowed()); } #endif if (!connectToServer(start_data, &could_connect, &connect_aborted)) @@ -1458,6 +1470,11 @@ bool Game::createClient(const GameStartData &start_data) if (client->modsLoaded()) client->getScript()->on_camera_ready(camera); client->setCamera(camera); +#ifdef HAVE_TOUCHSCREENGUI + if (g_touchscreengui) { + g_touchscreengui->setUseCrosshair(!isNoCrosshairAllowed()); + } +#endif /* Clouds */ @@ -2116,7 +2133,6 @@ void Game::processItemSelection(u16 *new_playeritem) /* Item selection using mouse wheel */ *new_playeritem = player->getWieldIndex(); - s32 wheel = input->getMouseWheel(); u16 max_item = MYMIN(PLAYER_INVENTORY_SIZE - 1, player->hud_hotbar_itemcount - 1); @@ -2143,6 +2159,9 @@ void Game::processItemSelection(u16 *new_playeritem) break; } } + + // Clamp selection again in case it wasn't changed but max_item was + *new_playeritem = MYMIN(*new_playeritem, max_item); } @@ -2516,6 +2535,13 @@ void Game::checkZoomEnabled() void Game::updateCameraDirection(CameraOrientation *cam, float dtime) { +#if !defined(__ANDROID__) && IRRLICHT_VERSION_MT_REVISION >= 9 + if (isMenuActive()) + device->getCursorControl()->setRelativeMode(false); + else + device->getCursorControl()->setRelativeMode(true); +#endif + if ((device->isWindowActive() && device->isWindowFocused() && !isMenuActive()) || input->isRandom()) { @@ -3552,24 +3578,23 @@ bool Game::nodePlacement(const ItemDefinition &selected_def, const ContentFeatures &predicted_f = nodedef->get(id); - // Predict param2 for facedir and wallmounted nodes - // Compare core.item_place_node() for what the server does - u8 param2 = 0; + // Compare core.item_place_node() for what the server does with param2 + MapNode predicted_node(id, 0, 0); const u8 place_param2 = selected_def.place_param2; if (place_param2) { - param2 = place_param2; + predicted_node.setParam2(place_param2); } else if (predicted_f.param_type_2 == CPT2_WALLMOUNTED || predicted_f.param_type_2 == CPT2_COLORED_WALLMOUNTED) { v3s16 dir = nodepos - neighborpos; if (abs(dir.Y) > MYMAX(abs(dir.X), abs(dir.Z))) { - param2 = dir.Y < 0 ? 1 : 0; + predicted_node.setParam2(dir.Y < 0 ? 1 : 0); } else if (abs(dir.X) > abs(dir.Z)) { - param2 = dir.X < 0 ? 3 : 2; + predicted_node.setParam2(dir.X < 0 ? 3 : 2); } else { - param2 = dir.Z < 0 ? 5 : 4; + predicted_node.setParam2(dir.Z < 0 ? 5 : 4); } } else if (predicted_f.param_type_2 == CPT2_FACEDIR || predicted_f.param_type_2 == CPT2_COLORED_FACEDIR || @@ -3578,29 +3603,36 @@ bool Game::nodePlacement(const ItemDefinition &selected_def, v3s16 dir = nodepos - floatToInt(client->getEnv().getLocalPlayer()->getPosition(), BS); if (abs(dir.X) > abs(dir.Z)) { - param2 = dir.X < 0 ? 3 : 1; + predicted_node.setParam2(dir.X < 0 ? 3 : 1); } else { - param2 = dir.Z < 0 ? 2 : 0; + predicted_node.setParam2(dir.Z < 0 ? 2 : 0); } } // Check attachment if node is in group attached_node - if (itemgroup_get(predicted_f.groups, "attached_node") != 0) { - const static v3s16 wallmounted_dirs[8] = { - v3s16(0, 1, 0), - v3s16(0, -1, 0), - v3s16(1, 0, 0), - v3s16(-1, 0, 0), - v3s16(0, 0, 1), - v3s16(0, 0, -1), - }; + int an = itemgroup_get(predicted_f.groups, "attached_node"); + if (an != 0) { v3s16 pp; - if (predicted_f.param_type_2 == CPT2_WALLMOUNTED || - predicted_f.param_type_2 == CPT2_COLORED_WALLMOUNTED) - pp = p + wallmounted_dirs[param2]; - else + if (an == 3) { pp = p + v3s16(0, -1, 0); + } else if (an == 4) { + pp = p + v3s16(0, 1, 0); + } else if (an == 2) { + if (predicted_f.param_type_2 == CPT2_FACEDIR || + predicted_f.param_type_2 == CPT2_COLORED_FACEDIR || + predicted_f.param_type_2 == CPT2_4DIR || + predicted_f.param_type_2 == CPT2_COLORED_4DIR) { + pp = p + facedir_dirs[predicted_node.getFaceDir(nodedef)]; + } else { + pp = p; + } + } else if (predicted_f.param_type_2 == CPT2_WALLMOUNTED || + predicted_f.param_type_2 == CPT2_COLORED_WALLMOUNTED) { + pp = p + predicted_node.getWallMountedDir(nodedef); + } else { + pp = p + v3s16(0, -1, 0); + } if (!nodedef->get(map.getNode(pp)).walkable) { soundmaker->m_player_rightpunch_sound = selected_def.sound_place_failed; @@ -3620,36 +3652,34 @@ bool Game::nodePlacement(const ItemDefinition &selected_def, if (!indexstr.empty()) { s32 index = mystoi(indexstr); if (predicted_f.param_type_2 == CPT2_COLOR) { - param2 = index; + predicted_node.setParam2(index); } else if (predicted_f.param_type_2 == CPT2_COLORED_WALLMOUNTED) { // param2 = pure palette index + other - param2 = (index & 0xf8) | (param2 & 0x07); + predicted_node.setParam2((index & 0xf8) | (predicted_node.getParam2() & 0x07)); } else if (predicted_f.param_type_2 == CPT2_COLORED_FACEDIR) { // param2 = pure palette index + other - param2 = (index & 0xe0) | (param2 & 0x1f); + predicted_node.setParam2((index & 0xe0) | (predicted_node.getParam2() & 0x1f)); } else if (predicted_f.param_type_2 == CPT2_COLORED_4DIR) { // param2 = pure palette index + other - param2 = (index & 0xfc) | (param2 & 0x03); + predicted_node.setParam2((index & 0xfc) | (predicted_node.getParam2() & 0x03)); } } } // Add node to client map - MapNode n(id, 0, param2); - try { LocalPlayer *player = client->getEnv().getLocalPlayer(); // Don't place node when player would be inside new node // NOTE: This is to be eventually implemented by a mod as client-side Lua - if (!nodedef->get(n).walkable || + if (!predicted_f.walkable || g_settings->getBool("enable_build_where_you_stand") || (client->checkPrivilege("noclip") && g_settings->getBool("noclip")) || - (nodedef->get(n).walkable && + (predicted_f.walkable && neighborpos != player->getStandingNodePos() + v3s16(0, 1, 0) && neighborpos != player->getStandingNodePos() + v3s16(0, 2, 0))) { // This triggers the required mesh update too - client->addNode(p, n); + client->addNode(p, predicted_node); // Report to server client->interact(INTERACT_PLACE, pointed); // A node is predicted, also play a sound @@ -4023,6 +4053,9 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, changed much */ runData.update_draw_list_timer += dtime; + runData.touch_blocks_timer += dtime; + + bool draw_list_updated = false; float update_draw_list_delta = 0.2f; @@ -4034,6 +4067,12 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, runData.update_draw_list_timer = 0; client->getEnv().getClientMap().updateDrawList(); runData.update_draw_list_last_cam_dir = camera_direction; + draw_list_updated = true; + } + + if (runData.touch_blocks_timer > update_draw_list_delta && !draw_list_updated) { + client->getEnv().getClientMap().touchMapBlocks(); + runData.touch_blocks_timer = 0; } if (RenderingEngine::get_shadow_renderer()) { @@ -4252,7 +4291,7 @@ void Game::readSettings() m_cache_enable_fog = g_settings->getBool("enable_fog"); m_cache_mouse_sensitivity = g_settings->getFloat("mouse_sensitivity", 0.001f, 10.0f); m_cache_joystick_frustum_sensitivity = std::max(g_settings->getFloat("joystick_frustum_sensitivity"), 0.001f); - m_repeat_place_time = g_settings->getFloat("repeat_place_time", 0.25f, 2.0); + m_repeat_place_time = g_settings->getFloat("repeat_place_time", 0.16f, 2.0); m_cache_enable_noclip = g_settings->getBool("noclip"); m_cache_enable_free_move = g_settings->getBool("free_move");