Skip to content

Commit d65a90a

Browse files
rubenwardynerzhul
authored andcommitted
Add camera smoothing and cinematic mode (F8)
1 parent b4acac7 commit d65a90a

File tree

4 files changed

+62
-23
lines changed

4 files changed

+62
-23
lines changed

minetest.conf.example

+8
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
#keymap_rangeselect = KEY_KEY_R
4949
#keymap_freemove = KEY_KEY_K
5050
#keymap_fastmove = KEY_KEY_J
51+
#keymap_cinematic = KEY_F8
5152
#keymap_screenshot = KEY_F12
5253
# If true, keymap_special1 instead of keymap_sneak is used for climbing down and descending
5354
#aux1_descends = false
@@ -127,6 +128,13 @@
127128
#free_move = false
128129
# Continuous forward movement (for testing)
129130
#continuous_forward = false
131+
# Enable cinematic mode
132+
#cinematic = false
133+
# Camera smoothing - smooths rotation of camera. 0 is no smoothing.
134+
# Must be equal to or greater than 0, and less than 1.
135+
#camera_smoothing = 0.0
136+
# Camera smoothing when in cinematic mode
137+
#cinematic_camera_smoothing = 0.7
130138
# Fast movement (keymap_special1)
131139
#fast_move = false
132140
# Invert mouse

src/defaultsettings.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ void set_default_settings(Settings *settings)
4848
settings->setDefault("keymap_freemove", "KEY_KEY_K");
4949
settings->setDefault("keymap_fastmove", "KEY_KEY_J");
5050
settings->setDefault("keymap_noclip", "KEY_KEY_H");
51+
settings->setDefault("keymap_cinematic", "KEY_F8");
5152
settings->setDefault("keymap_screenshot", "KEY_F12");
5253
settings->setDefault("keymap_toggle_hud", "KEY_F1");
5354
settings->setDefault("keymap_toggle_chat", "KEY_F2");
@@ -115,6 +116,9 @@ void set_default_settings(Settings *settings)
115116
settings->setDefault("free_move", "false");
116117
settings->setDefault("noclip", "false");
117118
settings->setDefault("continuous_forward", "false");
119+
settings->setDefault("cinematic", "false");
120+
settings->setDefault("camera_smoothing", "0");
121+
settings->setDefault("cinematic_camera_smoothing", "0.7");
118122
settings->setDefault("fast_move", "false");
119123
settings->setDefault("invert_mouse", "false");
120124
settings->setDefault("enable_clouds", "true");

src/game.cpp

+28-3
Original file line numberDiff line numberDiff line change
@@ -1137,7 +1137,7 @@ static void show_pause_menu(GUIFormSpecMenu **cur_formspec,
11371137
os << "button_exit[4," << (ypos++) << ";3,0.5;btn_change_password;"
11381138
<< wide_to_narrow(wstrgettext("Change Password")) << "]";
11391139
}
1140-
1140+
11411141
#ifndef __ANDROID__
11421142
os << "button_exit[4," << (ypos++) << ";3,0.5;btn_sound;"
11431143
<< wide_to_narrow(wstrgettext("Sound Volume")) << "]";
@@ -1253,6 +1253,7 @@ struct KeyCache {
12531253
KEYMAP_ID_FREEMOVE,
12541254
KEYMAP_ID_FASTMOVE,
12551255
KEYMAP_ID_NOCLIP,
1256+
KEYMAP_ID_CINEMATIC,
12561257
KEYMAP_ID_SCREENSHOT,
12571258
KEYMAP_ID_TOGGLE_HUD,
12581259
KEYMAP_ID_TOGGLE_CHAT,
@@ -1301,6 +1302,7 @@ void KeyCache::populate()
13011302
key[KEYMAP_ID_FREEMOVE] = getKeySetting("keymap_freemove");
13021303
key[KEYMAP_ID_FASTMOVE] = getKeySetting("keymap_fastmove");
13031304
key[KEYMAP_ID_NOCLIP] = getKeySetting("keymap_noclip");
1305+
key[KEYMAP_ID_CINEMATIC] = getKeySetting("keymap_cinematic");
13041306
key[KEYMAP_ID_SCREENSHOT] = getKeySetting("keymap_screenshot");
13051307
key[KEYMAP_ID_TOGGLE_HUD] = getKeySetting("keymap_toggle_hud");
13061308
key[KEYMAP_ID_TOGGLE_CHAT] = getKeySetting("keymap_toggle_chat");
@@ -1497,6 +1499,7 @@ class Game
14971499
void toggleFreeMoveAlt(float *statustext_time, float *jump_timer);
14981500
void toggleFast(float *statustext_time);
14991501
void toggleNoClip(float *statustext_time);
1502+
void toggleCinematic(float *statustext_time);
15001503

15011504
void toggleChat(float *statustext_time, bool *flag);
15021505
void toggleHud(float *statustext_time, bool *flag);
@@ -1737,6 +1740,7 @@ void Game::run()
17371740
{
17381741
ProfilerGraph graph;
17391742
RunStats stats = { 0 };
1743+
CameraOrientation cam_view_target = { 0 };
17401744
CameraOrientation cam_view = { 0 };
17411745
GameRunData runData = { 0 };
17421746
FpsControl draw_times = { 0 };
@@ -1792,7 +1796,17 @@ void Game::run()
17921796
updateProfilers(runData, stats, draw_times, dtime);
17931797
processUserInput(&flags, &runData, dtime);
17941798
// Update camera before player movement to avoid camera lag of one frame
1795-
updateCameraDirection(&cam_view, &flags);
1799+
updateCameraDirection(&cam_view_target, &flags);
1800+
float cam_smoothing = 0;
1801+
if (g_settings->getBool("cinematic"))
1802+
cam_smoothing = 1 - g_settings->getFloat("cinematic_camera_smoothing");
1803+
else
1804+
cam_smoothing = 1 - g_settings->getFloat("camera_smoothing");
1805+
cam_smoothing = rangelim(cam_smoothing, 0.01f, 1.0f);
1806+
cam_view.camera_yaw += (cam_view_target.camera_yaw -
1807+
cam_view.camera_yaw) * cam_smoothing;
1808+
cam_view.camera_pitch += (cam_view_target.camera_pitch -
1809+
cam_view.camera_pitch) * cam_smoothing;
17961810
updatePlayerControl(cam_view);
17971811
step(&dtime);
17981812
processClientEvents(&cam_view, &runData.damage_flash);
@@ -2568,6 +2582,8 @@ void Game::processKeyboardInput(VolatileRunFlags *flags,
25682582
toggleFast(statustext_time);
25692583
} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_NOCLIP])) {
25702584
toggleNoClip(statustext_time);
2585+
} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_CINEMATIC])) {
2586+
toggleCinematic(statustext_time);
25712587
} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_SCREENSHOT])) {
25722588
client->makeScreenshot(device);
25732589
} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_TOGGLE_HUD])) {
@@ -2754,6 +2770,16 @@ void Game::toggleNoClip(float *statustext_time)
27542770
statustext += L" (note: no 'noclip' privilege)";
27552771
}
27562772

2773+
void Game::toggleCinematic(float *statustext_time)
2774+
{
2775+
static const wchar_t *msg[] = { L"cinematic disabled", L"cinematic enabled" };
2776+
bool cinematic = !g_settings->getBool("cinematic");
2777+
g_settings->set("cinematic", bool_to_cstr(cinematic));
2778+
2779+
*statustext_time = 0;
2780+
statustext = msg[cinematic];
2781+
}
2782+
27572783

27582784
void Game::toggleChat(float *statustext_time, bool *flag)
27592785
{
@@ -4237,4 +4263,3 @@ void the_game(bool *kill,
42374263
error_message = narrow_to_wide(e.what()) + wstrgettext("\nCheck debug.txt for details.");
42384264
}
42394265
}
4240-

src/guiKeyChangeMenu.cpp

+22-20
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ enum
5151
GUI_ID_KEY_FAST_BUTTON,
5252
GUI_ID_KEY_JUMP_BUTTON,
5353
GUI_ID_KEY_NOCLIP_BUTTON,
54+
GUI_ID_KEY_CINEMATIC_BUTTON,
5455
GUI_ID_KEY_CHAT_BUTTON,
5556
GUI_ID_KEY_CMD_BUTTON,
5657
GUI_ID_KEY_CONSOLE_BUTTON,
@@ -137,20 +138,20 @@ void GUIKeyChangeMenu::regenerateGui(v2u32 screensize)
137138
{
138139
key_setting *k = key_settings.at(i);
139140
{
140-
core::rect < s32 > rect(0, 0, 100, 20);
141+
core::rect < s32 > rect(0, 0, 110, 20);
141142
rect += topleft + v2s32(offset.X, offset.Y);
142143
Environment->addStaticText(k->button_name, rect, false, true, this, -1);
143144
}
144145

145146
{
146147
core::rect < s32 > rect(0, 0, 100, 30);
147-
rect += topleft + v2s32(offset.X + 105, offset.Y - 5);
148+
rect += topleft + v2s32(offset.X + 115, offset.Y - 5);
148149
const wchar_t *text = wgettext(k->key.name());
149150
k->button = Environment->addButton(rect, this, k->id, text);
150151
delete[] text;
151152
}
152153
if(i + 1 == KMaxButtonPerColumns)
153-
offset = v2s32(250, 60);
154+
offset = v2s32(260, 60);
154155
else
155156
offset += v2s32(0, 25);
156157
}
@@ -394,22 +395,23 @@ void GUIKeyChangeMenu::add_key(int id, const wchar_t *button_name, const std::st
394395

395396
void GUIKeyChangeMenu::init_keys()
396397
{
397-
this->add_key(GUI_ID_KEY_FORWARD_BUTTON, wgettext("Forward"), "keymap_forward");
398-
this->add_key(GUI_ID_KEY_BACKWARD_BUTTON, wgettext("Backward"), "keymap_backward");
399-
this->add_key(GUI_ID_KEY_LEFT_BUTTON, wgettext("Left"), "keymap_left");
400-
this->add_key(GUI_ID_KEY_RIGHT_BUTTON, wgettext("Right"), "keymap_right");
401-
this->add_key(GUI_ID_KEY_USE_BUTTON, wgettext("Use"), "keymap_special1");
402-
this->add_key(GUI_ID_KEY_JUMP_BUTTON, wgettext("Jump"), "keymap_jump");
403-
this->add_key(GUI_ID_KEY_SNEAK_BUTTON, wgettext("Sneak"), "keymap_sneak");
404-
this->add_key(GUI_ID_KEY_DROP_BUTTON, wgettext("Drop"), "keymap_drop");
405-
this->add_key(GUI_ID_KEY_INVENTORY_BUTTON, wgettext("Inventory"), "keymap_inventory");
406-
this->add_key(GUI_ID_KEY_CHAT_BUTTON, wgettext("Chat"), "keymap_chat");
407-
this->add_key(GUI_ID_KEY_CMD_BUTTON, wgettext("Command"), "keymap_cmd");
408-
this->add_key(GUI_ID_KEY_CONSOLE_BUTTON, wgettext("Console"), "keymap_console");
409-
this->add_key(GUI_ID_KEY_FLY_BUTTON, wgettext("Toggle fly"), "keymap_freemove");
410-
this->add_key(GUI_ID_KEY_FAST_BUTTON, wgettext("Toggle fast"), "keymap_fastmove");
411-
this->add_key(GUI_ID_KEY_NOCLIP_BUTTON, wgettext("Toggle noclip"), "keymap_noclip");
412-
this->add_key(GUI_ID_KEY_RANGE_BUTTON, wgettext("Range select"), "keymap_rangeselect");
413-
this->add_key(GUI_ID_KEY_DUMP_BUTTON, wgettext("Print stacks"), "keymap_print_debug_stacks");
398+
this->add_key(GUI_ID_KEY_FORWARD_BUTTON, wgettext("Forward"), "keymap_forward");
399+
this->add_key(GUI_ID_KEY_BACKWARD_BUTTON, wgettext("Backward"), "keymap_backward");
400+
this->add_key(GUI_ID_KEY_LEFT_BUTTON, wgettext("Left"), "keymap_left");
401+
this->add_key(GUI_ID_KEY_RIGHT_BUTTON, wgettext("Right"), "keymap_right");
402+
this->add_key(GUI_ID_KEY_USE_BUTTON, wgettext("Use"), "keymap_special1");
403+
this->add_key(GUI_ID_KEY_JUMP_BUTTON, wgettext("Jump"), "keymap_jump");
404+
this->add_key(GUI_ID_KEY_SNEAK_BUTTON, wgettext("Sneak"), "keymap_sneak");
405+
this->add_key(GUI_ID_KEY_DROP_BUTTON, wgettext("Drop"), "keymap_drop");
406+
this->add_key(GUI_ID_KEY_INVENTORY_BUTTON, wgettext("Inventory"), "keymap_inventory");
407+
this->add_key(GUI_ID_KEY_CHAT_BUTTON, wgettext("Chat"), "keymap_chat");
408+
this->add_key(GUI_ID_KEY_CMD_BUTTON, wgettext("Command"), "keymap_cmd");
409+
this->add_key(GUI_ID_KEY_CONSOLE_BUTTON, wgettext("Console"), "keymap_console");
410+
this->add_key(GUI_ID_KEY_FLY_BUTTON, wgettext("Toggle fly"), "keymap_freemove");
411+
this->add_key(GUI_ID_KEY_FAST_BUTTON, wgettext("Toggle fast"), "keymap_fastmove");
412+
this->add_key(GUI_ID_KEY_CINEMATIC_BUTTON, wgettext("Toggle Cinematic"), "keymap_cinematic");
413+
this->add_key(GUI_ID_KEY_NOCLIP_BUTTON, wgettext("Toggle noclip"), "keymap_noclip");
414+
this->add_key(GUI_ID_KEY_RANGE_BUTTON, wgettext("Range select"), "keymap_rangeselect");
415+
this->add_key(GUI_ID_KEY_DUMP_BUTTON, wgettext("Print stacks"), "keymap_print_debug_stacks");
414416
}
415417

0 commit comments

Comments
 (0)