@@ -75,6 +75,7 @@ Camera::Camera(scene::ISceneManager* smgr, MapDrawControl& draw_control,
75
75
m_cache_view_bobbing_amount = g_settings->getFloat (" view_bobbing_amount" );
76
76
m_cache_fov = g_settings->getFloat (" fov" );
77
77
m_cache_zoom_fov = g_settings->getFloat (" zoom_fov" );
78
+ m_arm_inertia = g_settings->getBool (" arm_inertia" );
78
79
m_nametags.clear ();
79
80
}
80
81
@@ -193,6 +194,82 @@ void Camera::step(f32 dtime)
193
194
}
194
195
}
195
196
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
+
196
273
void Camera::update (LocalPlayer* player, f32 frametime, f32 busytime,
197
274
f32 tool_reload_ratio, ClientEnvironment &c_env)
198
275
{
@@ -380,12 +457,12 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime,
380
457
m_cameranode->setAspectRatio (m_aspect);
381
458
m_cameranode->setFOV (m_fov_y);
382
459
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 );
385
462
386
463
// Position the wielded item
387
464
// 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 );
389
466
// v3f wield_rotation = v3f(-100, 120, -100);
390
467
v3f wield_rotation = v3f (-100 , 120 , -100 );
391
468
wield_position.Y += fabs (m_wield_change_timer)*320 - 40 ;
0 commit comments