Skip to content

Commit bb4fb83

Browse files
authored
Fix local camera snapping to position when exiting possession (#4410)
Plus some code refactor
1 parent 22a6c5c commit bb4fb83

File tree

5 files changed

+39
-55
lines changed

5 files changed

+39
-55
lines changed

src/engine_redraw.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -526,7 +526,7 @@ void set_engine_view(struct PlayerInfo *player, long val)
526526
// fall through
527527
case PVM_CreatureView:
528528
player->acamera = &player->cameras[CamIV_FirstPerson];
529-
sync_local_camera(player->acamera);
529+
sync_local_camera(player);
530530
if (!is_my_player(player))
531531
break;
532532
lens_mode = 2;
@@ -539,7 +539,7 @@ void set_engine_view(struct PlayerInfo *player, long val)
539539
case PVM_IsoStraightView:
540540
player->acamera = &player->cameras[CamIV_Isometric];
541541
player->acamera->view_mode = val;
542-
sync_local_camera(player->acamera);
542+
sync_local_camera(player);
543543
if (!is_my_player(player))
544544
break;
545545
lens_mode = 0;
@@ -550,7 +550,7 @@ void set_engine_view(struct PlayerInfo *player, long val)
550550
break;
551551
case PVM_ParchmentView:
552552
player->acamera = &player->cameras[CamIV_Parchment];
553-
sync_local_camera(player->acamera);
553+
sync_local_camera(player);
554554
if (!is_my_player(player))
555555
break;
556556
S3DSetLineOfSightFunction(dummy_sound_line_of_sight);
@@ -562,7 +562,7 @@ void set_engine_view(struct PlayerInfo *player, long val)
562562
break;
563563
case PVM_FrontView:
564564
player->acamera = &player->cameras[CamIV_FrontView];
565-
sync_local_camera(player->acamera);
565+
sync_local_camera(player);
566566
if (!is_my_player(player))
567567
break;
568568
lens_mode = 0;

src/local_camera.c

Lines changed: 22 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ extern "C" {
4141
/******************************************************************************/
4242
struct Camera local_cameras[4];
4343
struct Camera previous_local_cameras[4];
44-
struct Camera desired_local_cameras[4];
44+
struct Camera destination_local_cameras[4];
4545
float interpolated_cam_mappos_x[4];
4646
float interpolated_cam_mappos_y[4];
4747
float interpolated_cam_mappos_z[4];
@@ -55,7 +55,7 @@ TbBool local_camera_ready;
5555
void sync_camera_state(int cam_idx, struct Camera *cam)
5656
{
5757
local_cameras[cam_idx] = *cam;
58-
desired_local_cameras[cam_idx] = *cam;
58+
destination_local_cameras[cam_idx] = *cam;
5959
previous_local_cameras[cam_idx] = *cam;
6060
interpolated_cam_mappos_x[cam_idx] = cam->mappos.x.val;
6161
interpolated_cam_mappos_y[cam_idx] = cam->mappos.y.val;
@@ -100,21 +100,21 @@ void process_local_minimap_click(struct Packet* packet) {
100100
long pos_y = subtile_coord_center(packet->actn_par2);
101101
for (int i = CamIV_Isometric; i <= CamIV_FrontView; i++) {
102102
if (i != CamIV_FirstPerson) {
103-
desired_local_cameras[i].mappos.x.val = pos_x;
104-
desired_local_cameras[i].mappos.y.val = pos_y;
103+
destination_local_cameras[i].mappos.x.val = pos_x;
104+
destination_local_cameras[i].mappos.y.val = pos_y;
105105
}
106106
}
107107
}
108108
}
109109

110110
void update_local_first_person_camera(struct Thing *ctrltng)
111111
{
112-
struct Camera* cam = &desired_local_cameras[CamIV_FirstPerson];
112+
struct Camera* cam = &destination_local_cameras[CamIV_FirstPerson];
113113
int eye_height = get_creature_eye_height(ctrltng);
114114
update_first_person_position(cam, ctrltng, eye_height);
115115

116-
long current_horizontal = desired_local_cameras[CamIV_FirstPerson].rotation_angle_x;
117-
long current_vertical = desired_local_cameras[CamIV_FirstPerson].rotation_angle_y;
116+
long current_horizontal = destination_local_cameras[CamIV_FirstPerson].rotation_angle_x;
117+
long current_vertical = destination_local_cameras[CamIV_FirstPerson].rotation_angle_y;
118118
struct Packet* latest_packet = get_local_input_lag_packet_for_turn(CURRENT_TURN_FOR_CAMERA);
119119
if (latest_packet != NULL) {
120120
long new_horizontal, new_vertical, new_roll;
@@ -135,7 +135,7 @@ void update_local_cameras(void)
135135
return;
136136
}
137137
for (int i = 0; i < 4; i++) {
138-
previous_local_cameras[i] = desired_local_cameras[i];
138+
previous_local_cameras[i] = destination_local_cameras[i];
139139
}
140140
struct PlayerInfo* my_player = get_my_player();
141141
struct Thing *ctrltng = thing_get(my_player->controlled_thing_idx);
@@ -152,8 +152,8 @@ void update_local_cameras(void)
152152
if (cam_idx == CamIV_FirstPerson || cam_idx == CamIV_Parchment) {
153153
continue;
154154
}
155-
process_camera_controls(&desired_local_cameras[cam_idx], local_packet, my_player);
156-
view_process_camera_inertia(&desired_local_cameras[cam_idx]);
155+
process_camera_controls(&destination_local_cameras[cam_idx], local_packet, my_player);
156+
view_process_camera_inertia(&destination_local_cameras[cam_idx]);
157157
}
158158
}
159159
}
@@ -165,7 +165,7 @@ void interpolate_local_cameras(void)
165165
}
166166
for (int i = 0; i < 4; i++) {
167167
struct Camera* prev = &previous_local_cameras[i];
168-
struct Camera* desired = &desired_local_cameras[i];
168+
struct Camera* desired = &destination_local_cameras[i];
169169
struct Camera* out = &local_cameras[i];
170170
interpolated_cam_mappos_x[i] = interpolate(interpolated_cam_mappos_x[i], prev->mappos.x.val, desired->mappos.x.val);
171171
interpolated_cam_mappos_y[i] = interpolate(interpolated_cam_mappos_y[i], prev->mappos.y.val, desired->mappos.y.val);
@@ -184,40 +184,30 @@ void interpolate_local_cameras(void)
184184
}
185185
}
186186

187-
void sync_local_camera(struct Camera *cam)
187+
void sync_local_camera(struct PlayerInfo *player)
188188
{
189-
if (!local_camera_ready) {
189+
if (!is_my_player(player) || !local_camera_ready) {
190190
return;
191191
}
192-
struct PlayerInfo *player = get_my_player();
193-
if (cam == &player->cameras[CamIV_FirstPerson]) {
194-
sync_first_person_camera(cam, player);
192+
if (player->acamera == &player->cameras[CamIV_FirstPerson]) {
193+
sync_first_person_camera(player->acamera, player);
195194
return;
196195
}
197196
for (int cam_idx = CamIV_Isometric; cam_idx <= CamIV_FrontView; cam_idx++) {
198-
if (cam == &player->cameras[cam_idx]) {
199-
sync_camera_state(cam_idx, cam);
200-
if (cam_idx != CamIV_Parchment) {
201-
if (player->view_mode == PVM_ParchmentView) {
202-
reset_all_minimap_interpolation = true;
203-
}
204-
}
205-
return;
206-
}
197+
sync_camera_state(cam_idx, &player->cameras[cam_idx]);
198+
}
199+
if (player->view_mode == PVM_ParchmentView) {
200+
reset_all_minimap_interpolation = true;
207201
}
208202
}
209203

210-
void set_local_desired_camera(struct Camera *cam)
204+
void set_local_camera_destination(struct PlayerInfo *player)
211205
{
212-
if (!local_camera_ready) {
206+
if (!is_my_player(player) || !local_camera_ready) {
213207
return;
214208
}
215-
struct PlayerInfo *player = get_my_player();
216209
for (int cam_idx = CamIV_Isometric; cam_idx <= CamIV_FrontView; cam_idx++) {
217-
if (cam == &player->cameras[cam_idx]) {
218-
desired_local_cameras[cam_idx] = *cam;
219-
break;
220-
}
210+
destination_local_cameras[cam_idx] = player->cameras[cam_idx];
221211
}
222212
}
223213

@@ -227,9 +217,6 @@ struct Camera* get_local_camera(struct Camera* cam)
227217
return cam;
228218
}
229219
struct PlayerInfo *player = get_my_player();
230-
if ((player->allocflags & PlaF_CompCtrl) != 0) {
231-
return cam;
232-
}
233220
for (int cam_idx = CamIV_Isometric; cam_idx <= CamIV_FrontView; cam_idx++) {
234221
if (cam == &player->cameras[cam_idx]) {
235222
return &local_cameras[cam_idx];

src/local_camera.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ struct PlayerInfo;
3535
/******************************************************************************/
3636
extern struct Camera local_cameras[4];
3737
extern struct Camera previous_local_cameras[4];
38-
extern struct Camera desired_local_cameras[4];
38+
extern struct Camera destination_local_cameras[4];
3939
extern float interpolated_cam_mappos_x[4];
4040
extern float interpolated_cam_mappos_y[4];
4141
extern float interpolated_cam_mappos_z[4];
@@ -48,8 +48,8 @@ extern TbBool local_camera_ready;
4848
void init_local_cameras(struct PlayerInfo *player);
4949
void update_local_cameras(void);
5050
void interpolate_local_cameras(void);
51-
void sync_local_camera(struct Camera *cam);
52-
void set_local_desired_camera(struct Camera *cam);
51+
void sync_local_camera(struct PlayerInfo *player);
52+
void set_local_camera_destination(struct PlayerInfo *player);
5353
struct Camera* get_local_camera(struct Camera* cam);
5454

5555
/******************************************************************************/

src/packets.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -815,11 +815,7 @@ TbBool process_players_global_packet_action(PlayerNumber plyr_idx)
815815
player->cameras[CamIV_Parchment].rotation_angle_x = pckt->actn_par1;
816816
player->cameras[CamIV_FrontView].rotation_angle_x = pckt->actn_par1;
817817
player->cameras[CamIV_Isometric].rotation_angle_x = pckt->actn_par1;
818-
if (is_my_player(player)) {
819-
set_local_desired_camera(&player->cameras[CamIV_Parchment]);
820-
set_local_desired_camera(&player->cameras[CamIV_FrontView]);
821-
set_local_desired_camera(&player->cameras[CamIV_Isometric]);
822-
}
818+
set_local_camera_destination(player);
823819
return 0;
824820
case PckA_SetPlyrState:
825821
set_player_state(player, pckt->actn_par1, pckt->actn_par2);

src/player_instances.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ long pinstfm_control_creature(struct PlayerInfo *player, int32_t *n)
410410
{
411411
cam->rotation_angle_x -= DEGREES_360;
412412
}
413-
set_local_desired_camera(cam);
413+
set_local_camera_destination(player);
414414
}
415415
return 0;
416416
}
@@ -512,7 +512,7 @@ long pinstfm_leave_creature(struct PlayerInfo *player, int32_t *n)
512512
if (get_camera_zoom(player->acamera) < player->dungeon_camera_zoom) {
513513
set_camera_zoom(player->acamera, player->dungeon_camera_zoom);
514514
}
515-
set_local_desired_camera(player->acamera);
515+
set_local_camera_destination(player);
516516
}
517517
return 0;
518518
}
@@ -551,8 +551,6 @@ long pinstfe_leave_creature(struct PlayerInfo *player, int32_t *n)
551551
set_camera_zoom(player->acamera, player->dungeon_camera_zoom);
552552
if (is_my_player(player)) {
553553
PaletteSetPlayerPalette(player, engine_palette);
554-
sync_local_camera(&player->cameras[CamIV_Isometric]);
555-
sync_local_camera(&player->cameras[CamIV_FrontView]);
556554
}
557555
player->allocflags &= ~PlaF_KeyboardInputDisabled;
558556
player->allocflags &= ~PlaF_MouseInputDisabled;
@@ -693,8 +691,7 @@ long pinstfm_zoom_out_of_heart(struct PlayerInfo *player, int32_t *n)
693691
dstcam = &player->cameras[CamIV_FrontView];
694692
dstcam->mappos.x.val = thing->mappos.x.val + deltax;
695693
dstcam->mappos.y.val = thing->mappos.y.val + deltay;
696-
set_local_desired_camera(&player->cameras[CamIV_Isometric]);
697-
set_local_desired_camera(&player->cameras[CamIV_FrontView]);
694+
set_local_camera_destination(player);
698695
}
699696
if (is_my_player_number(player->id_number) && (player->instance_remain_turns >= 8))
700697
LbPaletteFade(engine_palette, 8, Lb_PALETTE_FADE_OPEN);
@@ -711,7 +708,7 @@ long pinstfe_zoom_out_of_heart(struct PlayerInfo *player, int32_t *n)
711708
{
712709
cam->zoom = player->isometric_view_zoom_level;
713710
cam->rotation_angle_x = DEGREES_45;
714-
sync_local_camera(cam);
711+
set_local_camera_destination(player);
715712
}
716713
light_turn_light_on(player->cursor_light_idx);
717714
player->allocflags &= ~PlaF_KeyboardInputDisabled;
@@ -884,7 +881,7 @@ long pinstfm_zoom_to_position(struct PlayerInfo *player, int32_t *n)
884881
player->instance_remain_turns = 0;
885882
cam->mappos.x.val = x;
886883
cam->mappos.y.val = y;
887-
set_local_desired_camera(cam);
884+
set_local_camera_destination(player);
888885
return 0;
889886
}
890887

@@ -969,6 +966,7 @@ void leave_creature_as_controller(struct PlayerInfo *player, struct Thing *thing
969966
player->cameras[CamIV_Isometric].mappos.y.val = subtile_coord_center(game.map_subtiles_y/2);
970967
player->cameras[CamIV_FrontView].mappos.x.val = subtile_coord_center(game.map_subtiles_x/2);
971968
player->cameras[CamIV_FrontView].mappos.y.val = subtile_coord_center(game.map_subtiles_y/2);
969+
sync_local_camera(player);
972970
clear_selected_thing(player);
973971
return;
974972
}
@@ -986,6 +984,7 @@ void leave_creature_as_controller(struct PlayerInfo *player, struct Thing *thing
986984
player->cameras[CamIV_Isometric].mappos.y.val = thing->mappos.y.val + distance_with_angle_to_coord_y(k,i);
987985
player->cameras[CamIV_FrontView].mappos.x.val = thing->mappos.x.val + distance_with_angle_to_coord_x(k,i);
988986
player->cameras[CamIV_FrontView].mappos.y.val = thing->mappos.y.val + distance_with_angle_to_coord_y(k,i);
987+
sync_local_camera(player);
989988
if (thing->class_id == TCls_Creature)
990989
{
991990
set_start_state(thing);
@@ -1017,6 +1016,7 @@ void leave_creature_as_passenger(struct PlayerInfo *player, struct Thing *thing)
10171016
player->cameras[CamIV_Isometric].mappos.y.val = subtile_coord_center(game.map_subtiles_y/2);
10181017
player->cameras[CamIV_FrontView].mappos.x.val = subtile_coord_center(game.map_subtiles_x/2);
10191018
player->cameras[CamIV_FrontView].mappos.y.val = subtile_coord_center(game.map_subtiles_y/2);
1019+
sync_local_camera(player);
10201020
clear_selected_thing(player);
10211021
return;
10221022
}
@@ -1030,6 +1030,7 @@ void leave_creature_as_passenger(struct PlayerInfo *player, struct Thing *thing)
10301030
player->cameras[CamIV_Isometric].mappos.y.val = thing->mappos.y.val + distance_with_angle_to_coord_y(k,i);
10311031
player->cameras[CamIV_FrontView].mappos.x.val = thing->mappos.x.val + distance_with_angle_to_coord_x(k,i);
10321032
player->cameras[CamIV_FrontView].mappos.y.val = thing->mappos.y.val + distance_with_angle_to_coord_y(k,i);
1033+
sync_local_camera(player);
10331034
clear_selected_thing(player);
10341035
}
10351036

0 commit comments

Comments
 (0)