@@ -195,39 +195,51 @@ void Camera::step(f32 dtime)
195
195
}
196
196
}
197
197
198
- void Camera::addArmInertia (f32 player_yaw, f32 frametime )
198
+ static inline v2f dir ( const v2f &pos_dist )
199
199
{
200
- if (m_timer.X == 0 .0f ) {
201
- // In the limit case where timer is 0 set a static velocity (generic case divide by zero)
202
- m_cam_vel.X = 1 .0001f ;
200
+ f32 x = pos_dist.X - 55 .0f ;
201
+ f32 y = pos_dist.Y + 35 .0f ;
202
+
203
+ f32 x_abs = std::fabs (x);
204
+ f32 y_abs = std::fabs (y);
205
+
206
+ if (x_abs >= y_abs) {
207
+ y *= (1 .0f / x_abs);
208
+ x /= x_abs;
203
209
}
204
- else
205
- m_cam_vel.X = std::fabs ((m_last_cam_pos.X - player_yaw) / m_timer.X ) * 0 .01f ;
206
210
207
- if (m_timer. Y == 0 . 0f ) {
208
- // In the limit case where timer is 0 set a static velocity (generic case divide by zero)
209
- m_cam_vel. Y = 1 . 0001f ;
211
+ if (y_abs >= x_abs ) {
212
+ x *= ( 1 . 0f / y_abs);
213
+ y /= y_abs ;
210
214
}
211
- else
212
- m_cam_vel.Y = std::fabs ((m_last_cam_pos.Y - m_camera_direction.Y ) / m_timer.Y );
215
+
216
+ return v2f (std::fabs (x), std::fabs (y));
217
+ }
218
+
219
+ void Camera::addArmInertia (f32 player_yaw, f32 frametime)
220
+ {
221
+ m_cam_vel.X = std::fabs ((m_last_cam_pos.X - player_yaw) / frametime) * 0 .01f ;
222
+ m_cam_vel.Y = std::fabs ((m_last_cam_pos.Y - m_camera_direction.Y ) / frametime);
213
223
214
224
if (m_cam_vel.X > 1 .0f || m_cam_vel.Y > 1 .0f ) {
215
225
/*
216
- the arm moves when the camera moves fast enough.
226
+ The arm moves relative to the camera speed,
227
+ with an acceleration factor.
217
228
*/
218
229
219
230
if (m_cam_vel.X > 1 .0f ) {
220
- m_timer.X = frametime;
221
-
222
231
if (m_cam_vel.X > m_cam_vel_old.X )
223
232
m_cam_vel_old.X = m_cam_vel.X ;
224
233
225
- if (m_last_cam_pos.X > player_yaw)
234
+ if (m_last_cam_pos.X > player_yaw) {
226
235
// right
236
+ m_cam_vel.X -= std::fabs (55 .0f - m_wieldmesh_offset.X ) * 0 .1f ;
227
237
m_wieldmesh_offset.X -= (0 .1f + frametime) * m_cam_vel.X ;
228
- else
238
+ } else {
229
239
// left
240
+ m_cam_vel.X += std::fabs (55 .0f - m_wieldmesh_offset.X ) * 0 .1f ;
230
241
m_wieldmesh_offset.X += (0 .1f + frametime) * m_cam_vel.X ;
242
+ }
231
243
232
244
if (m_last_cam_pos.X != player_yaw)
233
245
m_last_cam_pos.X = player_yaw;
@@ -236,47 +248,54 @@ void Camera::addArmInertia(f32 player_yaw, f32 frametime)
236
248
}
237
249
238
250
if (m_cam_vel.Y > 1 .0f ) {
239
- m_timer.Y = frametime;
240
-
241
251
if (m_cam_vel.Y > m_cam_vel_old.Y )
242
252
m_cam_vel_old.Y = m_cam_vel.Y ;
243
253
244
- if (m_last_cam_pos.Y > m_camera_direction.Y )
254
+ if (m_last_cam_pos.Y > m_camera_direction.Y ) {
245
255
// down
256
+ m_cam_vel.Y -= std::fabs (-35 .0f - m_wieldmesh_offset.Y ) * 0 .1f ;
246
257
m_wieldmesh_offset.Y += (0 .1f + frametime) * m_cam_vel.Y ;
247
- else
258
+ } else {
248
259
// up
260
+ m_cam_vel.Y += std::fabs (-35 .0f - m_wieldmesh_offset.Y ) * 0 .1f ;
249
261
m_wieldmesh_offset.Y -= (0 .1f + frametime) * m_cam_vel.Y ;
262
+ }
250
263
251
264
if (m_last_cam_pos.Y != m_camera_direction.Y )
252
265
m_last_cam_pos.Y = m_camera_direction.Y ;
253
266
254
267
m_wieldmesh_offset.Y = rangelim (m_wieldmesh_offset.Y , -45 .0f , -30 .0f );
255
268
}
269
+
270
+ m_arm_dir = dir (m_wieldmesh_offset);
256
271
} else {
257
272
/*
258
- the arm now gets back to its default position when the camera stops.
273
+ Now the arm gets back to its default position when the camera stops,
274
+ following a vector, with a smooth deceleration factor.
259
275
*/
260
276
261
- if (floor (m_wieldmesh_offset.X ) == 55 .0f ) {
277
+ f32 acc_X = (m_cam_vel_old.X * (1 .0f + (1 .0f - m_arm_dir.X ))) /
278
+ (20 .0f / std::fabs (55 .0f - m_wieldmesh_offset.X ));
279
+ f32 acc_Y = (m_cam_vel_old.Y * (1 .0f + (1 .0f - m_arm_dir.Y ))) /
280
+ (15 .0f / std::fabs (-35 .0f - m_wieldmesh_offset.Y ));
281
+
282
+ if (std::fabs (55 .0f - m_wieldmesh_offset.X ) < 0 .1f )
262
283
m_cam_vel_old.X = 0 .0f ;
263
- m_wieldmesh_offset.X = 55 .0f ;
264
- }
265
284
266
285
if (m_wieldmesh_offset.X > 55 .0f )
267
- m_wieldmesh_offset.X -= (0 .05f + frametime) * m_cam_vel_old.X ;
286
+ m_wieldmesh_offset.X -= (0 .2f + frametime) * acc_X;
287
+
268
288
if (m_wieldmesh_offset.X < 55 .0f )
269
- m_wieldmesh_offset.X += (0 .05f + frametime) * m_cam_vel_old. X ;
289
+ m_wieldmesh_offset.X += (0 .2f + frametime) * acc_X ;
270
290
271
- if (floor ( m_wieldmesh_offset.Y ) == - 35 . 0f ) {
291
+ if (std::fabs (- 35 . 0f - m_wieldmesh_offset.Y ) < 0 . 1f )
272
292
m_cam_vel_old.Y = 0 .0f ;
273
- m_wieldmesh_offset.Y = -35 .0f ;
274
- }
275
293
276
294
if (m_wieldmesh_offset.Y > -35 .0f )
277
- m_wieldmesh_offset.Y -= (0 .05f + frametime) * m_cam_vel_old.Y ;
295
+ m_wieldmesh_offset.Y -= (0 .1f + frametime) * acc_Y;
296
+
278
297
if (m_wieldmesh_offset.Y < -35 .0f )
279
- m_wieldmesh_offset.Y += (0 .05f + frametime) * m_cam_vel_old. Y ;
298
+ m_wieldmesh_offset.Y += (0 .1f + frametime) * acc_Y ;
280
299
}
281
300
}
282
301
@@ -468,7 +487,7 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime,
468
487
m_cameranode->setAspectRatio (m_aspect);
469
488
m_cameranode->setFOV (m_fov_y);
470
489
471
- if (m_arm_inertia)
490
+ if (m_arm_inertia && frametime > 0 . 0f )
472
491
addArmInertia (player->getYaw (), frametime);
473
492
474
493
// Position the wielded item
0 commit comments