1 #ifndef PLAYER_COMMON_C
2 #define PLAYER_COMMON_C
6 VG_STATIC
void player_vector_angles( v3f angles
, v3f v
, float C
, float k
)
8 float yaw
= atan2f( v
[0], -v
[2] ),
22 VG_STATIC
void player_camera_portal_correction( player_instance
*player
)
24 if( player
->gate_waiting
)
26 /* construct plane equation for reciever gate */
28 v3_copy( player
->gate_waiting
->recv_to_world
[2], plane
);
29 plane
[3] = v3_dot( plane
, player
->gate_waiting
->recv_to_world
[3] );
31 /* check camera polarity */
32 if( v3_dot( player
->cam
.pos
, plane
) < plane
[3] )
34 vg_success( "Plane cleared\n" );
35 player_apply_transport_to_cam( player
->gate_waiting
->transport
);
36 player
->gate_waiting
= NULL
;
40 /* de-transform camera and player back */
42 m4x3_invert_affine( player
->gate_waiting
->transport
, inverse
);
43 m4x3_mulv( inverse
, player
->cam
.pos
, player
->cam
.pos
);
45 /* TODO: Find robust method for this */
46 v3f fwd_dir
= { cosf(player
->cam
.angles
[0]),
48 sinf(player
->cam
.angles
[0])};
49 m3x3_mulv( inverse
, fwd_dir
, fwd_dir
);
50 player
->cam
.angles
[0] = atan2f( fwd_dir
[2], fwd_dir
[0] );
52 struct skeleton
*sk
= &player
->playeravatar
->sk
;
53 skeleton_apply_transform( sk
, inverse
);
58 VG_STATIC
void player__cam_iterate( player_instance
*player
)
60 struct player_avatar
*av
= player
->playeravatar
;
62 v3_lerp( player
->follow_pos
, player
->follow_pos_target
,
63 vg
.frame_delta
* 15.0f
, player
->follow_pos
);
64 camera_lerp_angles( player
->follow_angles
, player
->follow_angles_target
,
65 vg
.frame_delta
* 18.0f
, player
->follow_angles
);
68 player
->camera_type_blend
=
69 vg_lerpf( player
->camera_type_blend
,
70 (player
->camera_mode
== k_cam_firstperson
)? 1.0f
: 0.0f
,
71 5.0f
* vg
.frame_delta
);
72 float t
= player
->camera_type_blend
;
75 v3_lerp( player
->follow_pos
, player
->override_pos
,
76 player
->cam_position_override_strength
, p1
);
77 camera_lerp_angles( player
->follow_angles
, player
->override_angles
,
78 player
->cam_angles_override_strength
, a1
);
80 v3_copy( player
->fpv_pos
, p0
);
81 v3_copy( player
->fpv_angles
, a0
);
83 v3_lerp( p0
, p1
, player
->camera_type_blend
, player
->cam
.pos
);
84 camera_lerp_angles( a0
, a1
, player
->camera_type_blend
, player
->cam
.angles
);
87 player
->cam
.fov
= vg_lerpf( 118.0f
, 90.0f
, player
->camera_type_blend
);
89 /* portal transitions */
90 player_camera_portal_correction( player
);
93 VG_STATIC
void player_set_follower_subject( player_instance
*player
,
97 v3_sub( subj
, player
->follow_pos
, dir
);
99 if( v3_length2( dir
) < 0.1f
*0.1f
)
100 v3_copy( (v3f
){ 0.0f
, 0.0f
, 1.0f
}, dir
); /* FIXME */
106 v3_muladds( subj
, dir
, -2.0f
, player
->follow_pos_target
);
107 player_vector_angles( player
->follow_angles_target
, dir
, 1.0f
, 0.2f
);
110 VG_STATIC
void player_look( player_instance
*player
, v3f angles
)
113 v2_muladds( angles
, vg
.mouse_delta
, 0.0025f
, angles
);
115 if( vg_input
.controller_should_use_trackpad_look
)
117 static v2f last_input
;
119 static v2f vel_smooth
;
121 v2f input
= { player
->input_js2h
->axis
.value
,
122 player
->input_js2v
->axis
.value
};
124 if( (v2_length2(last_input
) > 0.001f
) && (v2_length2(input
) > 0.001f
) )
126 v2_sub( input
, last_input
, vel
);
127 v2_muls( vel
, 1.0f
/vg
.time_delta
, vel
);
134 v2_lerp( vel_smooth
, vel
, vg
.time_delta
*8.0f
, vel_smooth
);
136 v2_muladds( angles
, vel_smooth
, vg
.time_delta
, angles
);
137 v2_copy( input
, last_input
);
141 angles
[0] += player
->input_js2h
->axis
.value
* vg
.time_delta
* 4.0f
;
142 angles
[1] += player
->input_js2v
->axis
.value
* vg
.time_delta
* 4.0f
;
145 angles
[1] = vg_clampf( angles
[1], -VG_PIf
*0.5f
, VG_PIf
*0.5f
);
148 #endif /* PLAYER_COMMON_C */