basic npc
[carveJwlIkooP6JGAAIwe30JlM.git] / player_replay.h
1 #pragma once
2 #include "player_render.h"
3 #include "vg/vg_rigidbody.h"
4
5 typedef struct replay_buffer replay_buffer;
6 typedef struct replay_frame replay_frame;
7 typedef struct replay_gamestate replay_gamestate;
8 typedef struct replay_sfx replay_sfx;
9
10 struct replay_buffer {
11 void *data;
12 u32 size; /* bytes */
13
14 replay_frame *head, *tail, *cursor_frame,
15 *statehead;
16 f64 cursor;
17 };
18
19 enum replay_framedata{
20 k_replay_framedata_animator,
21 k_replay_framedata_gamestate,
22 k_replay_framedata_internal_gamestate,
23 k_replay_framedata_sfx,
24 k_replay_framedata_glider,
25 k_replay_framedata_rows
26 };
27
28 struct replay_frame {
29 v3f cam_pos, cam_angles;
30 f32 cam_fov;
31
32 f64 time;
33 replay_frame *l, *r;
34
35 enum player_subsystem system;
36 u16 total_size;
37 u16 data_table[k_replay_framedata_rows][2];
38 };
39
40 struct replay_gamestate {
41 rigidbody rb, glider_rb; /* TODO: these don't need to be saved with their
42 full matrices */
43 v3f angles;
44 struct player_cam_controller cam_control;
45 u32 current_run_version;
46 };
47
48 /* we save this per-anim-frame. if there glider is existing in any state */
49 struct replay_glider_data {
50 bool have_glider, glider_orphan;
51 f32 t;
52 v3f co;
53 v4f q;
54 };
55
56 struct replay_sfx {
57 u32 none;
58 };
59
60 struct replay_globals
61 {
62 replay_buffer local;
63 replay_frame *resume_target;
64 f64 resume_begin;
65 f32 resume_transition;
66
67 enum replay_control {
68 k_replay_control_scrub,
69 k_replay_control_play,
70 k_replay_control_resume
71 }
72 replay_control;
73 f32 track_velocity;
74 struct gui_helper *helper_resume, *helper_freecam;
75
76 vg_camera replay_freecam;
77 i32 freecam;
78 v3f freecam_v, freecam_w;
79 }
80 extern player_replay;
81
82 int replay_seek( replay_buffer *replay, f64 t );
83
84 replay_frame *replay_find_recent_stateframe( replay_buffer *replay );
85 void replay_get_camera( replay_buffer *replay, vg_camera *cam );
86 void replay_get_frame_camera( replay_frame *frame, vg_camera *cam );
87 f32 replay_subframe_time( replay_buffer *replay );
88 void replay_clear( replay_buffer *replay );
89 void *
90 replay_frame_data( replay_frame *frame, enum replay_framedata type );
91
92 void skaterift_replay_pre_update(void);
93 void skaterift_replay_imgui(void);
94 void skaterift_replay_debug_info(void);
95 void skaterift_record_frame( replay_buffer *replay,
96 int force_gamestate );
97 void skaterift_replay_post_render(void);