From 2fb0eb0eb14ab6ffbccfd124d581e6887d459255 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 25 Sep 2024 16:53:54 -0700 Subject: [PATCH] sketch out basic coordinate space conversions for new block tree / block range list structures; num -> key; key -> row; num -> containing block range; etc. --- .../eval_visualization_core.c | 69 +++++++++++++++++-- .../eval_visualization_core.h | 7 ++ 2 files changed, 72 insertions(+), 4 deletions(-) diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index 085c0158..723a3845 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -683,6 +683,9 @@ ev2_depth_from_block(EV2_Block *block) return depth; } +//////////////////////////////// +//~ rjf: Block Coordinate Spaces (v2) + internal EV2_BlockRangeList ev2_block_range_list_from_tree(Arena *arena, EV2_BlockTree *block_tree) { @@ -697,6 +700,7 @@ ev2_block_range_list_from_tree(Arena *arena, EV2_BlockTree *block_tree) EV2_Block *next_child; Rng1U64 block_relative_range; }; + U64 base_num = 1; BlockTask start_task = {0, block_tree->root, block_tree->root->first, r1u64(0, block_tree->root->visual_row_count)}; for(BlockTask *t = &start_task; t != 0; t = t->next) { @@ -712,8 +716,8 @@ ev2_block_range_list_from_tree(Arena *arena, EV2_BlockTree *block_tree) if(block_num_visual_rows != 0) { EV2_BlockRangeNode *n = push_array(arena, EV2_BlockRangeNode, 1); - n->v.block = t->block; - n->v.range = block_relative_range; + n->v.block = t->block; + n->v.range = block_relative_range; SLLQueuePush(list.first, list.last, n); list.count += 1; } @@ -747,6 +751,65 @@ ev2_block_range_list_from_tree(Arena *arena, EV2_BlockTree *block_tree) return list; } +internal EV2_BlockRange +ev2_block_range_from_num(EV2_BlockRangeList *block_ranges, U64 num) +{ + EV2_BlockRange result = {&ev2_nil_block}; + U64 base_num = 1; + for(EV2_BlockRangeNode *n = block_ranges->first; n != 0; n = n->next) + { + Rng1U64 global_range = r1u64(base_num, base_num + dim_1u64(n->v.range)); + if(contains_1u64(global_range, num)) + { + result = n->v; + break; + } + } + return result; +} + +internal EV_Key +ev2_key_from_num(EV2_BlockRangeList *block_ranges, U64 num) +{ + EV_Key key = {0}; + U64 base_num = 1; + for(EV2_BlockRangeNode *n = block_ranges->first; n != 0; n = n->next) + { + U64 range_size = dim_1u64(n->v.range); + Rng1U64 global_range = r1u64(base_num, base_num + range_size); + if(contains_1u64(global_range, num)) + { + U64 relative_num = (num - base_num) + 1; + U64 child_id = n->v.block->expand_view_rule_info->expr_expand_id_from_num(relative_num, n->v.block->expand_view_rule_info_user_data); + EV_Key block_key = n->v.block->key; + key = ev_key_make(ev_hash_from_key(block_key), child_id); + break; + } + base_num += range_size; + } + return key; +} + +internal U64 +ev2_num_from_key(EV2_BlockRangeList *block_ranges, EV_Key key) +{ + U64 result = 0; + U64 base_num = 1; + for(EV2_BlockRangeNode *n = block_ranges->first; n != 0; n = n->next) + { + U64 range_size = dim_1u64(n->v.range); + U64 hash = ev_hash_from_key(n->v.block->key); + if(hash == key.parent_hash) + { + U64 relative_num = n->v.block->expand_view_rule_info->expr_expand_num_from_id(relative_num, n->v.block->expand_view_rule_info_user_data); + result = (base_num - 1) + relative_num; + break; + } + base_num += range_size; + } + return result; +} + //////////////////////////////// //~ rjf: Row Building (v2) @@ -755,7 +818,6 @@ ev2_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 { EV2_WindowedRowList rows = {0}; { - Temp scratch = scratch_begin(&arena, 1); U64 visual_idx_off = 0; for(EV2_BlockRangeNode *n = block_ranges->first; n != 0; n = n->next) { @@ -834,7 +896,6 @@ ev2_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 } } } - scratch_end(scratch); } return rows; } diff --git a/src/eval_visualization/eval_visualization_core.h b/src/eval_visualization/eval_visualization_core.h index 320acb40..e8b94238 100644 --- a/src/eval_visualization/eval_visualization_core.h +++ b/src/eval_visualization/eval_visualization_core.h @@ -512,7 +512,14 @@ internal E_Expr *ev_expr_from_expr_view_rules(Arena *arena, E_Expr *expr, EV_Vie internal EV2_BlockTree ev2_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 string, E_Expr *expr, EV_ViewRuleList *view_rules); internal EV2_BlockTree ev2_block_tree_from_string(Arena *arena, EV_View *view, String8 filter, String8 string, EV_ViewRuleList *view_rules); internal U64 ev2_depth_from_block(EV2_Block *block); + +//////////////////////////////// +//~ rjf: Block Coordinate Spaces (v2) + internal EV2_BlockRangeList ev2_block_range_list_from_tree(Arena *arena, EV2_BlockTree *block_tree); +internal EV2_BlockRange ev2_block_range_from_num(EV2_BlockRangeList *block_ranges, U64 num); +internal EV_Key ev2_key_from_num(EV2_BlockRangeList *block_ranges, U64 num); +internal U64 ev2_num_from_key(EV2_BlockRangeList *block_ranges, EV_Key key); //////////////////////////////// //~ rjf: Row Building (v2)