From 653eb08d439bac3dc7b5c430f902a9cbb4a338de Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 25 Jun 2024 17:21:59 -0700 Subject: [PATCH] set up interaction register stack --- src/df/core/df_core.c | 46 ++++++++++++++++++++++++++++++++++++++++++- src/df/core/df_core.h | 5 ++++- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 0a0b4569..208c2e48 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -5870,7 +5870,7 @@ df_eval_viz_row_list_push_new(Arena *arena, EVAL_ParseCtx *parse_ctx, DF_EvalViz //////////////////////////////// //~ rjf: Main State Accessors/Mutators -//- rjf: frame metadata +//- rjf: frame data internal F32 df_dt(void) @@ -5884,12 +5884,49 @@ df_frame_index(void) return df_state->frame_index; } +internal Arena * +df_frame_arena(void) +{ + return df_state->frame_arenas[df_state->frame_index%ArrayCount(df_state->frame_arenas)]; +} + internal F64 df_time_in_seconds(void) { return df_state->time_in_seconds; } +//- rjf: interaction registers + +internal DF_InteractRegs * +df_interact_regs(void) +{ + DF_InteractRegs *regs = &df_state->top_interact_regs->v; + return regs; +} + +internal DF_InteractRegs * +df_push_interact_regs(void) +{ + DF_InteractRegs *top = df_interact_regs(); + DF_InteractRegsNode *n = push_array(df_frame_arena(), DF_InteractRegsNode, 1); + MemoryCopyStruct(&n->v, top); + SLLStackPush(df_state->top_interact_regs, n); + return &n->v; +} + +internal DF_InteractRegs * +df_pop_interact_regs(void) +{ + DF_InteractRegs *regs = &df_state->top_interact_regs->v; + SLLStackPop(df_state->top_interact_regs); + if(df_state->top_interact_regs == 0) + { + df_state->top_interact_regs = &df_state->base_interact_regs; + } + return regs; +} + //- rjf: undo/redo history internal DF_StateDeltaHistory * @@ -6776,6 +6813,10 @@ df_core_init(CmdLine *cmdln, DF_StateDeltaHistory *hist) Arena *arena = arena_alloc(); df_state = push_array(arena, DF_State, 1); df_state->arena = arena; + for(U64 idx = 0; idx < ArrayCount(df_state->frame_arenas); idx += 1) + { + df_state->frame_arenas[idx] = arena_alloc(); + } df_state->root_cmd_arena = arena_alloc(); df_state->output_log_key = hs_hash_from_data(str8_lit("df_output_log_key")); df_state->entities_arena = arena_alloc__sized(GB(64), KB(64)); @@ -6936,8 +6977,11 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) { ProfBeginFunction(); df_state->frame_index += 1; + arena_clear(df_frame_arena()); df_state->dt = dt; df_state->time_in_seconds += dt; + df_state->top_interact_regs = &df_state->base_interact_regs; + MemoryZeroStruct(df_state->top_interact_regs); //- rjf: sync with ctrl thread ProfScope("sync with ctrl thread") diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h index 8f594ed2..5d4df49e 100644 --- a/src/df/core/df_core.h +++ b/src/df/core/df_core.h @@ -1762,13 +1762,16 @@ internal DF_EvalVizRow *df_eval_viz_row_list_push_new(Arena *arena, EVAL_ParseCt //////////////////////////////// //~ rjf: Main State Accessors/Mutators -//- rjf: frame metadata +//- rjf: frame data internal F32 df_dt(void); internal U64 df_frame_index(void); +internal Arena *df_frame_arena(void); internal F64 df_time_in_seconds(void); //- rjf: interaction registers internal DF_InteractRegs *df_interact_regs(void); +internal DF_InteractRegs *df_push_interact_regs(void); +internal DF_InteractRegs *df_pop_interact_regs(void); //- rjf: undo/redo history internal DF_StateDeltaHistory *df_state_delta_history(void);