Skip to content

Commit 1d1d922

Browse files
kilbithnerzhul
authored andcommittedJun 26, 2017
Add Arm Inertia (#6050)
1 parent 936d67d commit 1d1d922

File tree

5 files changed

+99
-3
lines changed

5 files changed

+99
-3
lines changed
 

Diff for: ‎builtin/settingtypes.txt

+4
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,10 @@ enable_waving_plants (Waving plants) bool false
469469

470470
[***Advanced]
471471

472+
# Arm inertia, gives a more realistic movement of
473+
# the arm when the camera moves.
474+
arm_inertia (Arm inertia) bool true
475+
472476
# If FPS would go higher than this, limit it by sleeping
473477
# to not waste CPU power for no benefit.
474478
fps_max (Maximum FPS) int 60

Diff for: ‎minetest.conf.example

+5
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,11 @@
534534

535535
#### Advanced
536536

537+
# Arm inertia, gives a more realistic movement of
538+
# the arm when the camera moves.
539+
# type: bool
540+
# arm_inertia = true
541+
537542
# If FPS would go higher than this, limit it by sleeping
538543
# to not waste CPU power for no benefit.
539544
# type: int

Diff for: ‎src/camera.cpp

+80-3
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ Camera::Camera(scene::ISceneManager* smgr, MapDrawControl& draw_control,
7575
m_cache_view_bobbing_amount = g_settings->getFloat("view_bobbing_amount");
7676
m_cache_fov = g_settings->getFloat("fov");
7777
m_cache_zoom_fov = g_settings->getFloat("zoom_fov");
78+
m_arm_inertia = g_settings->getBool("arm_inertia");
7879
m_nametags.clear();
7980
}
8081

@@ -193,6 +194,82 @@ void Camera::step(f32 dtime)
193194
}
194195
}
195196

197+
void Camera::add_arm_inertia(f32 player_yaw, f32 frametime)
198+
{
199+
m_cam_vel.X = std::fabs((m_last_cam_pos.X - player_yaw) / m_timer.X) * 0.01f;
200+
m_cam_vel.Y = std::fabs((m_last_cam_pos.Y - m_camera_direction.Y) / m_timer.Y);
201+
202+
if (m_cam_vel.X > 1.0f || m_cam_vel.Y > 1.0f) {
203+
/*
204+
the arm moves when the camera moves fast enough.
205+
*/
206+
207+
if (m_cam_vel.X > 1.0f) {
208+
m_timer.X = 0.0f;
209+
m_timer.X += frametime;
210+
211+
if (m_cam_vel.X > m_cam_vel_old.X)
212+
m_cam_vel_old.X = m_cam_vel.X;
213+
214+
if (m_last_cam_pos.X > player_yaw)
215+
// right
216+
m_wieldmesh_offset.X -= (0.1f + frametime) * m_cam_vel.X;
217+
else
218+
// left
219+
m_wieldmesh_offset.X += (0.1f + frametime) * m_cam_vel.X;
220+
221+
if (m_last_cam_pos.X != player_yaw)
222+
m_last_cam_pos.X = player_yaw;
223+
224+
m_wieldmesh_offset.X = rangelim(m_wieldmesh_offset.X, 48.0f, 62.0f);
225+
}
226+
227+
if (m_cam_vel.Y > 1.0f) {
228+
m_timer.Y = 0.0f;
229+
m_timer.Y += frametime;
230+
231+
if (m_cam_vel.Y > m_cam_vel_old.Y)
232+
m_cam_vel_old.Y = m_cam_vel.Y;
233+
234+
if (m_last_cam_pos.Y > m_camera_direction.Y)
235+
// down
236+
m_wieldmesh_offset.Y += (0.1f + frametime) * m_cam_vel.Y;
237+
else
238+
// up
239+
m_wieldmesh_offset.Y -= (0.1f + frametime) * m_cam_vel.Y;
240+
241+
if (m_last_cam_pos.Y != m_camera_direction.Y)
242+
m_last_cam_pos.Y = m_camera_direction.Y;
243+
244+
m_wieldmesh_offset.Y = rangelim(m_wieldmesh_offset.Y, -45.0f, -30.0f);
245+
}
246+
} else {
247+
/*
248+
the arm now gets back to its default position when the camera stops.
249+
*/
250+
251+
if (floor(m_wieldmesh_offset.X) == 55.0f) {
252+
m_cam_vel_old.X = 0.0f;
253+
m_wieldmesh_offset.X = 55.0f;
254+
}
255+
256+
if (m_wieldmesh_offset.X > 55.0f)
257+
m_wieldmesh_offset.X -= (0.05f + frametime) * m_cam_vel_old.X;
258+
if (m_wieldmesh_offset.X < 55.0f)
259+
m_wieldmesh_offset.X += (0.05f + frametime) * m_cam_vel_old.X;
260+
261+
if (floor(m_wieldmesh_offset.Y) == -35.0f) {
262+
m_cam_vel_old.Y = 0.0f;
263+
m_wieldmesh_offset.Y = -35.0f;
264+
}
265+
266+
if (m_wieldmesh_offset.Y > -35.0f)
267+
m_wieldmesh_offset.Y -= (0.05f + frametime) * m_cam_vel_old.Y;
268+
if (m_wieldmesh_offset.Y < -35.0f)
269+
m_wieldmesh_offset.Y += (0.05f + frametime) * m_cam_vel_old.Y;
270+
}
271+
}
272+
196273
void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime,
197274
f32 tool_reload_ratio, ClientEnvironment &c_env)
198275
{
@@ -380,12 +457,12 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime,
380457
m_cameranode->setAspectRatio(m_aspect);
381458
m_cameranode->setFOV(m_fov_y);
382459

383-
float wieldmesh_offset_Y = -35 + player->getPitch() * 0.05;
384-
wieldmesh_offset_Y = rangelim(wieldmesh_offset_Y, -52, -32);
460+
if (m_arm_inertia)
461+
add_arm_inertia(player->getYaw(), frametime);
385462

386463
// Position the wielded item
387464
//v3f wield_position = v3f(45, -35, 65);
388-
v3f wield_position = v3f(55, wieldmesh_offset_Y, 65);
465+
v3f wield_position = v3f(m_wieldmesh_offset.X, m_wieldmesh_offset.Y, 65);
389466
//v3f wield_rotation = v3f(-100, 120, -100);
390467
v3f wield_rotation = v3f(-100, 120, -100);
391468
wield_position.Y += fabs(m_wield_change_timer)*320 - 40;

Diff for: ‎src/camera.h

+9
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,8 @@ class Camera
166166

167167
void drawNametags();
168168

169+
inline void add_arm_inertia(f32 player_yaw, f32 frametime);
170+
169171
private:
170172
// Nodes
171173
scene::ISceneNode *m_playernode = nullptr;
@@ -188,6 +190,12 @@ class Camera
188190
// Camera offset
189191
v3s16 m_camera_offset;
190192

193+
v2f m_wieldmesh_offset = v2f(55.0f, -35.0f);
194+
v2f m_timer;
195+
v2f m_cam_vel;
196+
v2f m_cam_vel_old;
197+
v2f m_last_cam_pos;
198+
191199
// Field of view and aspect ratio stuff
192200
f32 m_aspect = 1.0f;
193201
f32 m_fov_x = 1.0f;
@@ -221,6 +229,7 @@ class Camera
221229
f32 m_cache_view_bobbing_amount;
222230
f32 m_cache_fov;
223231
f32 m_cache_zoom_fov;
232+
bool m_arm_inertia;
224233

225234
std::list<Nametag *> m_nametags;
226235
};

Diff for: ‎src/defaultsettings.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ void set_default_settings(Settings *settings)
171171
settings->setDefault("ambient_occlusion_gamma", "2.2");
172172
settings->setDefault("enable_shaders", "true");
173173
settings->setDefault("enable_particles", "true");
174+
settings->setDefault("arm_inertia", "true");
174175

175176
settings->setDefault("enable_minimap", "true");
176177
settings->setDefault("minimap_shape_round", "true");

0 commit comments

Comments
 (0)
Please sign in to comment.