diff --git a/src/df/core/df_core.mdesk b/src/df/core/df_core.mdesk index dc557cf0..32a74e72 100644 --- a/src/df/core/df_core.mdesk +++ b/src/df/core/df_core.mdesk @@ -520,27 +520,27 @@ DF_CoreCmdTable:// | | | | @table(coverage_check name name_lower string ih ex xp vb display_name docs schema description) DF_CoreViewRuleTable: { - {x Default default "default" - - - x "Default" - "" "" } - {x Array array "array" - - x - "Array" x "x:{expr}" "Specifies that a pointer points to N elements, rather than only 1." } - {x Slice slice "slice" - - x - "Slice" x "" "Specifies that a pointer within a struct, also containing an integer, points to the number of elements encoded by the integer." } - {- List list "list" - - - x "List" x "x:{member}" "Specifies that some struct, union, or class forms the top of a linked list, and the member which points at the following element in the list." } - {x ByteSwap bswap "bswap" x - x - "Byte Swap" x "" "Specifies that all integral evaluations should be byte-swapped, such that their endianness is reversed." } - {x Cast cast "cast" - - x - "Cast" x "x:{type}" "Specifies that the expression to which the view rule is applied should be casted to the provided type." } - {- BaseDec base_dec "dec" x - - - "Decimal Base (Base 10)" x "" "Specifies that all integral evaluations should appear in base-10 form." } - {- BaseBin base_bin "bin" x - - - "Binary Base (Base 2)" x "" "Specifies that all integral evaluations should appear in base-2 form." } - {- BaseOct base_oct "oct" x - - - "Octal Base (Base 8)" x "" "Specifies that all integral evaluations should appear in base-8 form." } - {- BaseHex base_hex "hex" x - - - "Hexadecimal Base (Base 16)" x "" "Specifies that all integral evaluations should appear in base-16 form." } - {- Only only "only" x - - x "Only Specified Members" x "x:{member}" "Specifies that only the specified members should appear in struct, union, or class evaluations." } - {- Omit omit "omit" x - - x "Omit Specified Members" x "x:{member}" "Omits a list of member names from appearing in struct, union, or class evaluations." } - {- NoAddr no_addr "no_addr" x - - - "Disable Address Values" x "" "Displays only what pointers point to, if possible, without the pointer's address value." } - {x Checkbox checkbox "checkbox" - - - - "Checkbox" x "" "Displays simple integer values as checkboxes, encoding zero or nonzero values." } - {- RGBA rgba "rgba" - x - x "Color (RGBA)" x "" "Displays as a color, interpreting the data as encoding R, G, B, and A values." } - {x Text text "text" - x - x "Text" x "x:{'lang':lang, 'size':expr}" "Displays as text." } - {x Disasm disasm "disasm" - x - x "Disassembly" x "x:{'arch':arch, 'size':expr}" "Displays as disassembled instructions, interpreting the data as raw machine code." } - {x Memory memory "memory" - x - x "Memory" x "x:{'size':expr}" "Displays as a raw memory grid." } - {- Graph graph "graph" - x - x "Graph" x "" "Displays as a pointer graph, visualizing nodes and edges formed by pointers directly." } - {x Bitmap bitmap "bitmap" - x - x "Bitmap" x "x:{'w':expr, 'h':expr, 'fmt':tex2dformat}" "Displays as a bitmap, interpreting the data as raw pixel data." } - {- Geo geo "geo" - x - x "Geometry" x "x:{'count':expr, 'vertices_base':expr, 'vertices_size':expr}" "Displays as geometry, interpreting the data as vertex data." } + {x Default default "default" - - - x "Default" - "" "" } + {x Array array "array" - - x - "Array" x "x:{expr}" "Specifies that a pointer points to N elements, rather than only 1." } + {x Slice slice "slice" - - x - "Slice" x "" "Specifies that a pointer within a struct, also containing an integer, points to the number of elements encoded by the integer." } + {- List list "list" - - - x "List" x "x:{member}" "Specifies that some struct, union, or class forms the top of a linked list, and the member which points at the following element in the list." } + {x ByteSwap bswap "bswap" x - x - "Byte Swap" x "" "Specifies that all integral evaluations should be byte-swapped, such that their endianness is reversed." } + {x Cast cast "cast" - - x - "Cast" x "x:{type}" "Specifies that the expression to which the view rule is applied should be casted to the provided type." } + {- BaseDec base_dec "dec" x - - - "Decimal Base (Base 10)" x "" "Specifies that all integral evaluations should appear in base-10 form." } + {- BaseBin base_bin "bin" x - - - "Binary Base (Base 2)" x "" "Specifies that all integral evaluations should appear in base-2 form." } + {- BaseOct base_oct "oct" x - - - "Octal Base (Base 8)" x "" "Specifies that all integral evaluations should appear in base-8 form." } + {- BaseHex base_hex "hex" x - - - "Hexadecimal Base (Base 16)" x "" "Specifies that all integral evaluations should appear in base-16 form." } + {- Only only "only" x - - x "Only Specified Members" x "x:{member}" "Specifies that only the specified members should appear in struct, union, or class evaluations." } + {- Omit omit "omit" x - - x "Omit Specified Members" x "x:{member}" "Omits a list of member names from appearing in struct, union, or class evaluations." } + {- NoAddr no_addr "no_addr" x - - - "Disable Address Values" x "" "Displays only what pointers point to, if possible, without the pointer's address value." } + {x Checkbox checkbox "checkbox" - - - - "Checkbox" x "" "Displays simple integer values as checkboxes, encoding zero or nonzero values." } + {- RGBA rgba "rgba" - x - x "Color (RGBA)" x "" "Displays as a color, interpreting the data as encoding R, G, B, and A values." } + {x Text text "text" - x - x "Text" x "x:{'lang':lang, 'size':expr}" "Displays as text." } + {x Disasm disasm "disasm" - x - x "Disassembly" x "x:{'arch':arch, 'size':expr}" "Displays as disassembled instructions, interpreting the data as raw machine code." } + {x Memory memory "memory" - x - x "Memory" x "x:{'size':expr}" "Displays as a raw memory grid." } + {- Graph graph "graph" - x - x "Graph" x "" "Displays as a pointer graph, visualizing nodes and edges formed by pointers directly." } + {x Bitmap bitmap "bitmap" - x - x "Bitmap" x "x:{'w':expr, 'h':expr, 'fmt':tex2dformat}" "Displays as a bitmap, interpreting the data as raw pixel data." } + {- Geo3D geo3d "geo3d" - x - x "Geometry (3D)" x "x:{'count':expr, 'vtx':expr, 'vtx_size':expr}" "Displays as geometry, interpreting the data as index or vertex data." } } //////////////////////////////// diff --git a/src/df/core/generated/df_core.meta.c b/src/df/core/generated/df_core.meta.c index 5c08dc9e..1b3f2a2c 100644 --- a/src/df/core/generated/df_core.meta.c +++ b/src/df/core/generated/df_core.meta.c @@ -503,7 +503,7 @@ DF_CoreViewRuleSpecInfo df_g_core_view_rule_spec_info_table[21] = {str8_lit_comp("memory"), str8_lit_comp("Memory"), str8_lit_comp("x:{'size':expr}"), str8_lit_comp("Displays as a raw memory grid."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*1)|(DF_CoreViewRuleSpecInfoFlag_ExprResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(memory) , }, {str8_lit_comp("graph"), str8_lit_comp("Graph"), str8_lit_comp(""), str8_lit_comp("Displays as a pointer graph, visualizing nodes and edges formed by pointers directly."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*1)|(DF_CoreViewRuleSpecInfoFlag_ExprResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(graph) , }, {str8_lit_comp("bitmap"), str8_lit_comp("Bitmap"), str8_lit_comp("x:{'w':expr, 'h':expr, 'fmt':tex2dformat}"), str8_lit_comp("Displays as a bitmap, interpreting the data as raw pixel data."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*1)|(DF_CoreViewRuleSpecInfoFlag_ExprResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(bitmap) , }, -{str8_lit_comp("geo"), str8_lit_comp("Geometry"), str8_lit_comp("x:{'count':expr, 'vertices_base':expr, 'vertices_size':expr}"), str8_lit_comp("Displays as geometry, interpreting the data as vertex data."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*1)|(DF_CoreViewRuleSpecInfoFlag_ExprResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(geo) , }, +{str8_lit_comp("geo3d"), str8_lit_comp("Geometry (3D)"), str8_lit_comp("x:{'count':expr, 'vtx':expr, 'vtx_size':expr}"), str8_lit_comp("Displays as geometry, interpreting the data as index or vertex data."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*1)|(DF_CoreViewRuleSpecInfoFlag_ExprResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(geo3d) , }, }; String8 df_g_icon_kind_text_table[69] = diff --git a/src/df/core/generated/df_core.meta.h b/src/df/core/generated/df_core.meta.h index e57627c3..b45fd064 100644 --- a/src/df/core/generated/df_core.meta.h +++ b/src/df/core/generated/df_core.meta.h @@ -370,7 +370,7 @@ DF_CoreViewRuleKind_Disasm, DF_CoreViewRuleKind_Memory, DF_CoreViewRuleKind_Graph, DF_CoreViewRuleKind_Bitmap, -DF_CoreViewRuleKind_Geo, +DF_CoreViewRuleKind_Geo3D, DF_CoreViewRuleKind_COUNT, } DF_CoreViewRuleKind; @@ -446,7 +446,7 @@ DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(disasm); DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(memory); DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(graph); DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(bitmap); -DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(geo); +DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(geo3d); global B32 DEV_telemetry_capture = 0; global B32 DEV_simulate_lag = 0; global B32 DEV_draw_ui_text_pos = 0; diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 142a61d3..a0d929ac 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -846,48 +846,52 @@ df_view_equip_spec(DF_Window *window, DF_View *view, DF_ViewSpec *spec, String8 arena_clear(view->params_arenas[idx]); } view->params_roots[0] = md_tree_copy(view->params_arenas[0], params); + view->params_write_gen = view->params_read_gen = 0; // rjf: fill query buffer + df_view_equip_query(view, query); + + // rjf: initialize state for new view spec + DF_ViewSetupFunctionType *view_setup = spec->info.setup_hook; + { + for(DF_ArenaExt *ext = view->first_arena_ext; ext != 0; ext = ext->next) + { + arena_release(ext->arena); + } + for(DF_View *tchild = view->first_transient, *next = 0; !df_view_is_nil(tchild); tchild = next) + { + next = tchild->order_next; + df_view_release(tchild); + } + view->first_transient = view->last_transient = &df_g_nil_view; + view->first_arena_ext = view->last_arena_ext = 0; + view->transient_view_slots_count = 0; + view->transient_view_slots = 0; + arena_clear(view->arena); + view->user_data = 0; + } + MemoryZeroStruct(&view->scroll_pos); + view->spec = spec; + if(spec->info.flags & DF_ViewSpecFlag_ProjectSpecific) + { + arena_clear(view->project_path_arena); + view->project_path = push_str8_copy(view->project_path_arena, df_cfg_path_from_src(DF_CfgSrc_Project)); + } + else + { + MemoryZeroStruct(&view->project_path); + } + view->is_filtering = 0; + view->is_filtering_t = 0; + view_setup(window, view, view->params_roots[view->params_read_gen%ArrayCount(view->params_roots)], str8(view->query_buffer, view->query_string_size)); +} + +internal void +df_view_equip_query(DF_View *view, String8 query) +{ view->query_string_size = Min(sizeof(view->query_buffer), query.size); MemoryCopy(view->query_buffer, query.str, view->query_string_size); view->query_cursor = view->query_mark = txt_pt(1, query.size+1); - - // rjf: initialize state for new view spec, if needed - if(view->spec != spec || spec == &df_g_nil_view_spec) - { - DF_ViewSetupFunctionType *view_setup = spec->info.setup_hook; - { - for(DF_ArenaExt *ext = view->first_arena_ext; ext != 0; ext = ext->next) - { - arena_release(ext->arena); - } - for(DF_View *tchild = view->first_transient, *next = 0; !df_view_is_nil(tchild); tchild = next) - { - next = tchild->order_next; - df_view_release(tchild); - } - view->first_transient = view->last_transient = &df_g_nil_view; - view->first_arena_ext = view->last_arena_ext = 0; - view->transient_view_slots_count = 0; - view->transient_view_slots = 0; - arena_clear(view->arena); - view->user_data = 0; - } - MemoryZeroStruct(&view->scroll_pos); - view->spec = spec; - if(spec->info.flags & DF_ViewSpecFlag_ProjectSpecific) - { - arena_clear(view->project_path_arena); - view->project_path = push_str8_copy(view->project_path_arena, df_cfg_path_from_src(DF_CfgSrc_Project)); - } - else - { - MemoryZeroStruct(&view->project_path); - } - view->is_filtering = 0; - view->is_filtering_t = 0; - view_setup(window, view, view->params_roots[view->params_read_gen%ArrayCount(view->params_roots)], str8(view->query_buffer, view->query_string_size)); - } } internal void @@ -976,43 +980,43 @@ df_view_store_paramf(DF_View *view, String8 key, char *fmt, ...) //////////////////////////////// //~ rjf: Expand-Keyed Transient View Functions -internal DF_View * -df_transient_view_from_expand_key(DF_View *owner_view, DF_ExpandKey key) +internal DF_TransientViewNode * +df_transient_view_node_from_expand_key(DF_View *owner_view, DF_ExpandKey key) { if(owner_view->transient_view_slots_count == 0) { owner_view->transient_view_slots_count = 256; owner_view->transient_view_slots = push_array(owner_view->arena, DF_TransientViewSlot, owner_view->transient_view_slots_count); } - DF_View *view = &df_g_nil_view; U64 hash = df_hash_from_expand_key(key); U64 slot_idx = hash%owner_view->transient_view_slots_count; DF_TransientViewSlot *slot = &owner_view->transient_view_slots[slot_idx]; + DF_TransientViewNode *node = 0; for(DF_TransientViewNode *n = slot->first; n != 0; n = n->next) { if(df_expand_key_match(n->key, key)) { - view = n->view; + node = n; n->last_frame_index_touched = df_frame_index(); break; } } - if(df_view_is_nil(view)) + if(node == 0) { if(!owner_view->free_transient_view_node) { owner_view->free_transient_view_node = push_array(df_gfx_state->arena, DF_TransientViewNode, 1); } - DF_TransientViewNode *node = owner_view->free_transient_view_node; + node = owner_view->free_transient_view_node; SLLStackPop(owner_view->free_transient_view_node); DLLPushBack(slot->first, slot->last, node); node->key = key; node->view = df_view_alloc(); + node->initial_params_arena = arena_alloc(); node->first_frame_index_touched = node->last_frame_index_touched = df_frame_index(); - view = node->view; - DLLPushBack_NPZ(&df_g_nil_view, owner_view->first_transient, owner_view->last_transient, view, order_next, order_prev); + DLLPushBack_NPZ(&df_g_nil_view, owner_view->first_transient, owner_view->last_transient, node->view, order_next, order_prev); } - return view; + return node; } //////////////////////////////// diff --git a/src/df/gfx/df_gfx.h b/src/df/gfx/df_gfx.h index 90a75581..d73bf31e 100644 --- a/src/df/gfx/df_gfx.h +++ b/src/df/gfx/df_gfx.h @@ -171,6 +171,8 @@ struct DF_TransientViewNode DF_TransientViewNode *prev; DF_ExpandKey key; DF_View *view; + Arena *initial_params_arena; + MD_Node *initial_params; U64 first_frame_index_touched; U64 last_frame_index_touched; }; @@ -347,7 +349,7 @@ enum #define DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(name) df_gfx_view_rule_line_stringize__##name #define DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(name) internal DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_SIG(DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(name)) -#define DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_SIG(name) void name(struct DF_Window *ws, DF_ExpandKey key, E_Eval eval, MD_Node *params) +#define DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_SIG(name) void name(struct DF_Window *ws, DF_ExpandKey key, MD_Node *params, String8 string) #define DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME(name) df_gfx_view_rule_row_ui__##name #define DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(name) DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_SIG(DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME(name)) @@ -962,6 +964,7 @@ internal void df_view_release(DF_View *view); //- rjf: equipment internal void df_view_equip_spec(DF_Window *window, DF_View *view, DF_ViewSpec *spec, String8 query, MD_Node *params); +internal void df_view_equip_query(DF_View *view, String8 query); internal void df_view_equip_loading_info(DF_View *view, B32 is_loading, U64 progress_v, U64 progress_target); //- rjf: user state extensions @@ -979,7 +982,7 @@ internal void df_view_store_paramf(DF_View *view, String8 key, char *fmt, ...); //////////////////////////////// //~ rjf: Expand-Keyed Transient View Functions -internal DF_View *df_transient_view_from_expand_key(DF_View *owner_view, DF_ExpandKey key); +internal DF_TransientViewNode *df_transient_view_node_from_expand_key(DF_View *owner_view, DF_ExpandKey key); //////////////////////////////// //~ rjf: View Rule Instance State Functions diff --git a/src/df/gfx/df_gfx.mdesk b/src/df/gfx/df_gfx.mdesk index 4f18d353..eecfbd1a 100644 --- a/src/df/gfx/df_gfx.mdesk +++ b/src/df/gfx/df_gfx.mdesk @@ -257,6 +257,7 @@ DF_GfxViewTable: { Memory "memory" "Memory" Grid 0 0 1 0 1 0 1 "A hex-editor-like grid interface for viewing memory." } { Bitmap "bitmap" "Bitmap" Binoculars 0 0 1 0 1 0 1 "Visualizes memory as a bitmap." } { ColorRGBA "color_rgba" "Color (RGBA)" Palette 0 0 1 0 1 0 1 "Visualizes memory as an RGBA color." } + { Geometry3D "geometry_3d" "Geometry (3D)" Binoculars 0 0 1 0 1 0 1 "Visualizes memory as 3D geometry." } //- rjf: meta (settings) { ExceptionFilters "exception_filters" "Exception Filters" Gear 0 0 1 1 0 1 1 "An interface which controls whether or not the debugger will halt attached processes upon encountering specific exception codes for the first time." } @@ -334,7 +335,7 @@ DF_GfxViewRuleTable: {"disasm" - - - x "disassembly" } {"memory" - - - x "memory" } {"bitmap" - - - x "bitmap" } - {"geo" - - x x "geometry" } + {"geo3d" - - - x "geometry_3d" } } @gen diff --git a/src/df/gfx/df_view_rules.c b/src/df/gfx/df_view_rules.c index 5ab501a7..c2af54dd 100644 --- a/src/df/gfx/df_view_rules.c +++ b/src/df/gfx/df_view_rules.c @@ -335,11 +335,14 @@ DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(no_addr){} DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(checkbox) { + Temp scratch = scratch_begin(0, 0); + E_Eval eval = e_eval_from_string(scratch.arena, string); E_Eval value_eval = e_value_eval_from_eval(eval); if(ui_clicked(df_icon_buttonf(ws, value_eval.value.u64 == 0 ? DF_IconKind_CheckHollow : DF_IconKind_CheckFilled, 0, "###check"))) { df_commit_eval_value_string(eval, value_eval.value.u64 == 0 ? str8_lit("1") : str8_lit("0")); } + scratch_end(scratch); } //////////////////////////////// @@ -359,12 +362,8 @@ DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(rgba) DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(rgba) { Temp scratch = scratch_begin(0, 0); - DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - - //- rjf: grab hsva - E_Eval value_eval = e_value_eval_from_eval(eval); - Vec4F32 rgba = df_rgba_from_eval_params(value_eval, params); + E_Eval eval = e_eval_from_string(scratch.arena, string); + Vec4F32 rgba = df_rgba_from_eval_params(eval, params); Vec4F32 hsva = hsva_from_rgba(rgba); //- rjf: build text box @@ -490,90 +489,9 @@ DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(bitmap) } //////////////////////////////// -//~ rjf: "geo" +//~ rjf: "geo3d" -#if 0 -internal DF_GeoTopologyInfo -df_vr_geo_topology_info_from_cfg(DF_CfgNode *cfg) -{ - Temp scratch = scratch_begin(0, 0); - DF_GeoTopologyInfo result = {0}; - { - StringJoin join = {0}; - join.sep = str8_lit(" "); - DF_CfgNode *count_cfg = df_cfg_node_child_from_string(cfg, str8_lit("count"), 0); - DF_CfgNode *vertices_base_cfg = df_cfg_node_child_from_string(cfg, str8_lit("vertices_base"), 0); - DF_CfgNode *vertices_size_cfg = df_cfg_node_child_from_string(cfg, str8_lit("vertices_size"), 0); - String8List count_expr_strs = {0}; - String8List vertices_base_expr_strs = {0}; - String8List vertices_size_expr_strs = {0}; - for(DF_CfgNode *child = count_cfg->first; child != &df_g_nil_cfg_node; child = child->next) - { - str8_list_push(scratch.arena, &count_expr_strs, child->string); - } - for(DF_CfgNode *child = vertices_base_cfg->first; child != &df_g_nil_cfg_node; child = child->next) - { - str8_list_push(scratch.arena, &vertices_base_expr_strs, child->string); - } - for(DF_CfgNode *child = vertices_size_cfg->first; child != &df_g_nil_cfg_node; child = child->next) - { - str8_list_push(scratch.arena, &vertices_size_expr_strs, child->string); - } - String8 count_expr = str8_list_join(scratch.arena, &count_expr_strs, &join); - String8 vertices_base_expr = str8_list_join(scratch.arena, &vertices_base_expr_strs, &join); - String8 vertices_size_expr = str8_list_join(scratch.arena, &vertices_size_expr_strs, &join); - E_Eval count_eval = e_eval_from_string(scratch.arena, count_expr); - E_Eval vertices_base_eval = e_eval_from_string(scratch.arena, vertices_base_expr); - E_Eval vertices_size_eval = e_eval_from_string(scratch.arena, vertices_size_expr); - E_Eval count_val_eval = e_value_eval_from_eval(count_eval); - E_Eval vertices_base_val_eval = e_value_eval_from_eval(vertices_base_eval); - E_Eval vertices_size_val_eval = e_value_eval_from_eval(vertices_size_eval); - U64 vertices_base_vaddr = vertices_base_val_eval.value.u64; - result.index_count = count_val_eval.value.u64; - result.vertices_vaddr_range = r1u64(vertices_base_vaddr, vertices_base_vaddr+vertices_size_val_eval.value.u64); - } - scratch_end(scratch); - return result; -} -#endif - -internal UI_BOX_CUSTOM_DRAW(df_vr_geo_box_draw) -{ - DF_VR_GeoBoxDrawData *draw_data = (DF_VR_GeoBoxDrawData *)user_data; - DF_VR_GeoState *state = df_view_rule_block_user_state(draw_data->key, DF_VR_GeoState); - - // rjf: get clip - Rng2F32 clip = box->rect; - for(UI_Box *b = box->parent; !ui_box_is_nil(b); b = b->parent) - { - if(b->flags & UI_BoxFlag_Clip) - { - clip = intersect_2f32(b->rect, clip); - } - } - - // rjf: calculate eye/target - Vec3F32 target = {0}; - Vec3F32 eye = v3f32(state->zoom*cos_f32(state->yaw)*sin_f32(state->pitch), - state->zoom*sin_f32(state->yaw)*sin_f32(state->pitch), - state->zoom*cos_f32(state->pitch)); - - // rjf: mesh - Vec2F32 box_dim = dim_2f32(box->rect); - R_PassParams_Geo3D *pass = d_geo3d_begin(box->rect, - make_look_at_4x4f32(eye, target, v3f32(0, 0, 1)), - make_perspective_4x4f32(0.25f, box_dim.x/box_dim.y, 0.1f, 500.f)); - pass->clip = clip; - d_mesh(draw_data->vertex_buffer, draw_data->index_buffer, R_GeoTopologyKind_Triangles, R_GeoVertexFlag_TexCoord|R_GeoVertexFlag_Normals|R_GeoVertexFlag_RGB, r_handle_zero(), mat_4x4f32(1.f)); - - // rjf: blur - if(draw_data->loaded_t < 0.98f) - { - d_blur(intersect_2f32(clip, box->rect), 10.f-9.f*draw_data->loaded_t, 0); - } -} - -DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(geo) +DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(geo3d) { DF_EvalVizBlock *vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Canvas, key, df_expand_key_make(df_hash_from_expand_key(key), 1), depth); vb->string = string; @@ -583,110 +501,3 @@ DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(geo) vb->cfg_table = cfg_table; df_eval_viz_block_end(out, vb); } - -DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(geo) -{ - E_Eval value_eval = e_value_eval_from_eval(eval); - U64 base_vaddr = value_eval.value.u64; - DF_Font(ws, DF_FontSlot_Code) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - ui_labelf("0x%I64x -> Geometry", base_vaddr); -} - -#if 0 -DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(geo) -{ - Temp scratch = scratch_begin(0, 0); - GEO_Scope *geo_scope = geo_scope_open(); - DF_VR_GeoState *state = df_view_rule_block_user_state(key, DF_VR_GeoState); - if(!state->initialized) - { - state->initialized = 1; - state->zoom_target = 3.5f; - state->yaw = state->yaw_target = -0.125f; - state->pitch = state->pitch_target = -0.125f; - } - if(state->last_open_frame_idx+1 < df_frame_index()) - { - state->loaded_t = 0; - } - state->last_open_frame_idx = df_frame_index(); - - //- rjf: resolve to address value - E_Eval value_eval = e_value_eval_from_eval(eval); - U64 base_vaddr = value_eval.value.u64; - - //- rjf: extract extra geo topology info from view rule - DF_GeoTopologyInfo top = df_vr_geo_topology_info_from_cfg(cfg); - Rng1U64 index_buffer_vaddr_range = r1u64(base_vaddr, base_vaddr+top.index_count*sizeof(U32)); - Rng1U64 vertex_buffer_vaddr_range = top.vertices_vaddr_range; - - //- rjf: unpack thread/process of eval - DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - - //- rjf: obtain keys for index buffer & vertex buffer memory - U128 index_buffer_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, index_buffer_vaddr_range, 0); - U128 vertex_buffer_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, vertex_buffer_vaddr_range, 0); - - //- rjf: get gpu buffers - R_Handle index_buffer = geo_buffer_from_key(geo_scope, index_buffer_key); - R_Handle vertex_buffer = geo_buffer_from_key(geo_scope, vertex_buffer_key); - - //- rjf: build preview - F32 rate = 1 - pow_f32(2, (-15.f * df_dt())); - if(top.index_count != 0) - { - UI_Padding(ui_pct(1.f, 0.f)) - UI_PrefWidth(ui_px(dim.y, 1.f)) - UI_Column UI_Padding(ui_pct(1.f, 0.f)) - UI_PrefHeight(ui_px(dim.y, 1.f)) - { - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_Clickable, "geo_box"); - UI_Signal sig = ui_signal_from_box(box); - if(ui_dragging(sig)) - { - if(ui_pressed(sig)) - { - Vec2F32 data = v2f32(state->yaw_target, state->pitch_target); - ui_store_drag_struct(&data); - } - Vec2F32 drag_delta = ui_drag_delta(); - Vec2F32 drag_start_data = *ui_get_drag_struct(Vec2F32); - state->yaw_target = drag_start_data.x + drag_delta.x/dim_2f32(box->rect).x; - state->pitch_target = drag_start_data.y + drag_delta.y/dim_2f32(box->rect).y; - } - state->zoom += (state->zoom_target - state->zoom) * rate; - state->yaw += (state->yaw_target - state->yaw) * rate; - state->pitch += (state->pitch_target - state->pitch) * rate; - if(abs_f32(state->zoom-state->zoom_target) > 0.001f || - abs_f32(state->yaw-state->yaw_target) > 0.001f || - abs_f32(state->pitch-state->pitch_target) > 0.001f) - { - df_gfx_request_frame(); - } - DF_VR_GeoBoxDrawData *draw_data = push_array(ui_build_arena(), DF_VR_GeoBoxDrawData, 1); - draw_data->key = key; - draw_data->vertex_buffer = vertex_buffer; - draw_data->index_buffer = index_buffer; - draw_data->loaded_t = state->loaded_t; - ui_box_equip_custom_draw(box, df_vr_geo_box_draw, draw_data); - if(r_handle_match(r_handle_zero(), vertex_buffer)) - { - df_gfx_request_frame(); - state->loaded_t = 0; - } - else - { - state->loaded_t += (1.f - state->loaded_t) * rate; - if(state->loaded_t < 0.99f) - { - df_gfx_request_frame(); - } - } - } - } - - geo_scope_close(geo_scope); - scratch_end(scratch); -} -#endif diff --git a/src/df/gfx/df_view_rules.h b/src/df/gfx/df_view_rules.h index 2ef86e0c..07e91344 100644 --- a/src/df/gfx/df_view_rules.h +++ b/src/df/gfx/df_view_rules.h @@ -4,74 +4,4 @@ #ifndef DF_VIEW_RULES_H #define DF_VIEW_RULES_H -//////////////////////////////// -//~ rjf: "rgba" - -typedef struct DF_VR_RGBAState DF_VR_RGBAState; -struct DF_VR_RGBAState -{ - Vec4F32 hsva; - U64 memgen_idx; -}; - -internal void df_vr_eval_commit_rgba(E_Eval eval, Vec4F32 rgba); - -//////////////////////////////// -//~ rjf: "disasm" - -typedef struct DF_DisasmTopologyInfo DF_DisasmTopologyInfo; -struct DF_DisasmTopologyInfo -{ - Architecture arch; - U64 size_cap; -}; - -typedef struct DF_VR_DisasmState DF_VR_DisasmState; -struct DF_VR_DisasmState -{ - B32 initialized; - TxtPt cursor; - TxtPt mark; - S64 preferred_column; - U64 last_open_frame_idx; - F32 loaded_t; -}; - -//////////////////////////////// -//~ rjf: "geo" - -typedef struct DF_GeoTopologyInfo DF_GeoTopologyInfo; -struct DF_GeoTopologyInfo -{ - U64 index_count; - Rng1U64 vertices_vaddr_range; -}; - -typedef struct DF_VR_GeoState DF_VR_GeoState; -struct DF_VR_GeoState -{ - B32 initialized; - U64 last_open_frame_idx; - F32 loaded_t; - F32 pitch; - F32 pitch_target; - F32 yaw; - F32 yaw_target; - F32 zoom; - F32 zoom_target; -}; - -typedef struct DF_VR_GeoBoxDrawData DF_VR_GeoBoxDrawData; -struct DF_VR_GeoBoxDrawData -{ - DF_ExpandKey key; - R_Handle vertex_buffer; - R_Handle index_buffer; - F32 loaded_t; -}; - -#if 0 -internal DF_GeoTopologyInfo df_vr_geo_topology_info_from_cfg(DF_CfgNode *cfg); -#endif - #endif // DF_VIEW_RULES_H diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index 1cf29a1f..2142c181 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -2709,33 +2709,15 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS //- rjf: unpack DF_WatchViewPoint pt = {0, row->parent_key, row->key}; DF_ViewSpec *canvas_view_spec = df_view_spec_from_string(row->expand_ui_rule_spec->info.view_spec_name); - DF_View *canvas_view = df_transient_view_from_expand_key(view, row->key); + DF_TransientViewNode *canvas_view_node = df_transient_view_node_from_expand_key(view, row->key); + DF_View *canvas_view = canvas_view_node->view; String8 canvas_view_expr = e_string_from_expr(scratch.arena, row->expr); - B32 need_new_spec = 0; - if(!need_new_spec && !str8_match(str8(canvas_view->query_buffer, canvas_view->query_string_size), canvas_view_expr, 0)) - { - need_new_spec = 1; - } - if(!need_new_spec) - { - for(MD_EachNode(child, row->expand_ui_rule_params->first)) - { - MD_Node *current_param = md_child_from_string(canvas_view->params_roots[canvas_view->params_write_gen%ArrayCount(canvas_view->params_roots)], - child->string, 0); - if(md_node_is_nil(current_param)) - { - need_new_spec = 1; - break; - } - else if(!md_node_deep_match(child, current_param, 0)) - { - need_new_spec = 1; - break; - } - } - } + B32 need_new_spec = (!str8_match(str8(canvas_view->query_buffer, canvas_view->query_string_size), canvas_view_expr, 0) || + !md_tree_match(canvas_view_node->initial_params, row->expand_ui_rule_params, 0)); if(need_new_spec) { + arena_clear(canvas_view_node->initial_params_arena); + canvas_view_node->initial_params = md_tree_copy(canvas_view_node->initial_params_arena, row->expand_ui_rule_params); df_view_equip_spec(ws, canvas_view, canvas_view_spec, canvas_view_expr, row->expand_ui_rule_params); } Vec2F32 canvas_dim = v2f32(scroll_list_params.dim_px.x - ui_top_font_size()*1.5f, @@ -3019,7 +3001,8 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clip|UI_BoxFlag_Clickable, "###val_%I64x", row_hash); UI_Parent(box) { - cell_ui_hook(ws, row->key, cell_eval, cell_ui_params); + String8 row_expr = e_string_from_expr(scratch.arena, row->expr); + cell_ui_hook(ws, row->key, cell_ui_params, row_expr); } sig = ui_signal_from_box(box); } @@ -3896,7 +3879,7 @@ DF_VIEW_UI_FUNCTION_DEF(FileSystem) if(query_normalized_with_opt_slash_props.flags & FilePropertyFlag_IsFolder) { String8 new_path = push_str8f(scratch.arena, "%S%S/", path_query.path, path_query.search); - df_view_equip_spec(ws, view, view->spec, new_path, &md_nil_node); + df_view_equip_query(view, new_path); } // rjf: is a file -> complete view @@ -3926,7 +3909,7 @@ DF_VIEW_UI_FUNCTION_DEF(FileSystem) { String8 existing_path = str8_chop_last_slash(path_query.path); String8 new_path = push_str8f(scratch.arena, "%S/%S/", existing_path, files[0].filename); - df_view_equip_spec(ws, view, view->spec, new_path, &md_nil_node); + df_view_equip_query(view, new_path); } else { @@ -4056,7 +4039,7 @@ DF_VIEW_UI_FUNCTION_DEF(FileSystem) String8 new_path = str8_chop_last_slash(str8_chop_last_slash(path_query.path)); new_path = path_normalized_from_string(scratch.arena, new_path); String8 new_cmd = push_str8f(scratch.arena, "%S%s", new_path, new_path.size != 0 ? "/" : ""); - df_view_equip_spec(ws, view, view->spec, new_cmd, &md_nil_node); + df_view_equip_query(view, new_cmd); } } @@ -4138,7 +4121,7 @@ DF_VIEW_UI_FUNCTION_DEF(FileSystem) if(file->props.flags & FilePropertyFlag_IsFolder) { String8 new_cmd = push_str8f(scratch.arena, "%S%s", new_path, new_path.size != 0 ? "/" : ""); - df_view_equip_spec(ws, view, view->spec, new_cmd, &md_nil_node); + df_view_equip_query(view, new_cmd); } else { @@ -8396,7 +8379,7 @@ DF_VIEW_UI_FUNCTION_DEF(Bitmap) } //////////////////////////////// -//~ rjf: Color @view_hook_impl +//~ rjf: ColorRGBA @view_hook_impl DF_VIEW_SETUP_FUNCTION_DEF(ColorRGBA) {} DF_VIEW_CMD_FUNCTION_DEF(ColorRGBA) {} @@ -8445,6 +8428,158 @@ DF_VIEW_UI_FUNCTION_DEF(ColorRGBA) scratch_end(scratch); } +//////////////////////////////// +//~ rjf: Geometry3D @view_hook_impl + +internal UI_BOX_CUSTOM_DRAW(df_geometry3d_box_draw) +{ + DF_Geometry3DBoxDrawData *draw_data = (DF_Geometry3DBoxDrawData *)user_data; + + // rjf: get clip + Rng2F32 clip = box->rect; + for(UI_Box *b = box->parent; !ui_box_is_nil(b); b = b->parent) + { + if(b->flags & UI_BoxFlag_Clip) + { + clip = intersect_2f32(b->rect, clip); + } + } + + // rjf: calculate eye/target + Vec3F32 target = {0}; + Vec3F32 eye = v3f32(draw_data->zoom*cos_f32(draw_data->yaw)*sin_f32(draw_data->pitch), + draw_data->zoom*sin_f32(draw_data->yaw)*sin_f32(draw_data->pitch), + draw_data->zoom*cos_f32(draw_data->pitch)); + + // rjf: mesh + Vec2F32 box_dim = dim_2f32(box->rect); + R_PassParams_Geo3D *pass = d_geo3d_begin(box->rect, + make_look_at_4x4f32(eye, target, v3f32(0, 0, 1)), + make_perspective_4x4f32(0.25f, box_dim.x/box_dim.y, 0.1f, 500.f)); + pass->clip = clip; + d_mesh(draw_data->vertex_buffer, draw_data->index_buffer, R_GeoTopologyKind_Triangles, R_GeoVertexFlag_TexCoord|R_GeoVertexFlag_Normals|R_GeoVertexFlag_RGB, r_handle_zero(), mat_4x4f32(1.f)); +} + +DF_VIEW_SETUP_FUNCTION_DEF(Geometry3D) +{ + df_view_equip_loading_info(view, 1, 0, 0); + view->loading_t = view->loading_t_target = 1.f; +} +DF_VIEW_CMD_FUNCTION_DEF(Geometry3D) {} +DF_VIEW_UI_FUNCTION_DEF(Geometry3D) +{ + Temp scratch = scratch_begin(0, 0); + GEO_Scope *geo_scope = geo_scope_open(); + DF_Geometry3DViewState *state = df_view_user_state(view, DF_Geometry3DViewState); + + ////////////////////////////// + //- rjf: unpack parameters + // + U64 count = df_value_from_params_key(params, str8_lit("count")).u64; + U64 vtx_base_off = df_value_from_params_key(params, str8_lit("vtx")).u64; + U64 vtx_size = df_value_from_params_key(params, str8_lit("vtx_size")).u64; + F32 yaw_target = df_value_from_params_key(params, str8_lit("yaw")).f32; + F32 pitch_target = df_value_from_params_key(params, str8_lit("pitch")).f32; + F32 zoom_target = df_value_from_params_key(params, str8_lit("zoom")).f32; + + ////////////////////////////// + //- rjf: evaluate & unpack expression + // + E_Eval eval = e_eval_from_string(scratch.arena, string); + U64 base_offset = df_base_offset_from_eval(eval); + Rng1U64 idxs_range = r1u64(base_offset, base_offset+count*sizeof(U32)); + Rng1U64 vtxs_range = r1u64(vtx_base_off, vtx_base_off+vtx_size); + U128 idxs_key = df_key_from_eval_space_range(eval.space, idxs_range, 0); + U128 vtxs_key = df_key_from_eval_space_range(eval.space, vtxs_range, 0); + R_Handle idxs_buffer = geo_buffer_from_key(geo_scope, idxs_key); + R_Handle vtxs_buffer = geo_buffer_from_key(geo_scope, vtxs_key); + + ////////////////////////////// + //- rjf: equip loading info + // + if(eval.msgs.max_kind == E_MsgKind_Null && + (r_handle_match(idxs_buffer, r_handle_zero()) || + r_handle_match(vtxs_buffer, r_handle_zero()))) + { + df_view_equip_loading_info(view, 1, 0, 0); + } + + ////////////////////////////// + //- rjf: do first-time camera initialization, if needed + // + if(zoom_target == 0) + { + yaw_target = -0.125f; + pitch_target = -0.125f; + zoom_target = 3.5f; + } + + ////////////////////////////// + //- rjf: animate camera + // + { + F32 fast_rate = 1 - pow_f32(2, (-60.f * df_dt())); + F32 slow_rate = 1 - pow_f32(2, (-30.f * df_dt())); + state->zoom += (zoom_target - state->zoom) * slow_rate; + state->yaw += (yaw_target - state->yaw) * fast_rate; + state->pitch += (pitch_target - state->pitch) * fast_rate; + if(abs_f32(state->zoom - zoom_target) > 0.001f || + abs_f32(state->yaw - yaw_target) > 0.001f || + abs_f32(state->pitch - pitch_target) > 0.001f) + { + df_gfx_request_frame(); + } + } + + ////////////////////////////// + //- rjf: build + // + if(count != 0 && !r_handle_match(idxs_buffer, r_handle_zero()) && !r_handle_match(vtxs_buffer, r_handle_zero())) + { + Vec2F32 dim = dim_2f32(rect); + UI_Box *box = &ui_g_nil_box; + UI_FixedSize(dim) + { + box = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_Clickable|UI_BoxFlag_Scroll, "geo_box"); + } + UI_Signal sig = ui_signal_from_box(box); + if(ui_dragging(sig)) + { + if(ui_pressed(sig)) + { + DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); + df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); + Vec2F32 data = v2f32(yaw_target, pitch_target); + ui_store_drag_struct(&data); + } + Vec2F32 drag_delta = ui_drag_delta(); + Vec2F32 drag_start_data = *ui_get_drag_struct(Vec2F32); + yaw_target = drag_start_data.x + drag_delta.x/dim.x; + pitch_target = drag_start_data.y + drag_delta.y/dim.y; + } + zoom_target += sig.scroll.y; + zoom_target = Clamp(0.1f, zoom_target, 100.f); + pitch_target = Clamp(-0.49f, pitch_target, -0.01f); + DF_Geometry3DBoxDrawData *draw_data = push_array(ui_build_arena(), DF_Geometry3DBoxDrawData, 1); + draw_data->yaw = state->yaw; + draw_data->pitch = state->pitch; + draw_data->zoom = state->zoom; + draw_data->vertex_buffer = vtxs_buffer; + draw_data->index_buffer = idxs_buffer; + ui_box_equip_custom_draw(box, df_geometry3d_box_draw, draw_data); + } + + ////////////////////////////// + //- rjf: commit parameters + // + df_view_store_param_f32(view, str8_lit("yaw"), yaw_target); + df_view_store_param_f32(view, str8_lit("pitch"), pitch_target); + df_view_store_param_f32(view, str8_lit("zoom"), zoom_target); + + geo_scope_close(geo_scope); + scratch_end(scratch); +} + //////////////////////////////// //~ rjf: ExceptionFilters @view_hook_impl diff --git a/src/df/gfx/df_views.h b/src/df/gfx/df_views.h index 2a892aa9..a4a717be 100644 --- a/src/df/gfx/df_views.h +++ b/src/df/gfx/df_views.h @@ -457,6 +457,27 @@ struct DF_BitmapCanvasBoxDrawData F32 zoom; }; +//////////////////////////////// +//~ rjf: Geometry3D @view_types + +typedef struct DF_Geometry3DViewState DF_Geometry3DViewState; +struct DF_Geometry3DViewState +{ + F32 yaw; + F32 pitch; + F32 zoom; +}; + +typedef struct DF_Geometry3DBoxDrawData DF_Geometry3DBoxDrawData; +struct DF_Geometry3DBoxDrawData +{ + F32 yaw; + F32 pitch; + F32 zoom; + R_Handle vertex_buffer; + R_Handle index_buffer; +}; + //////////////////////////////// //~ rjf: Settings @view_types diff --git a/src/df/gfx/generated/df_gfx.meta.c b/src/df/gfx/generated/df_gfx.meta.c index 337070b5..e300f92b 100644 --- a/src/df/gfx/generated/df_gfx.meta.c +++ b/src/df/gfx/generated/df_gfx.meta.c @@ -140,7 +140,7 @@ str8_lit_comp("add_address_breakpoint"), str8_lit_comp("add_function_breakpoint"), }; -DF_ViewSpecInfo df_g_gfx_view_kind_spec_info_table[33] = +DF_ViewSpecInfo df_g_gfx_view_kind_spec_info_table[34] = { {(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("null"), str8_lit_comp(""), DF_IconKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(Null), DF_VIEW_CMD_FUNCTION_NAME(Null), DF_VIEW_UI_FUNCTION_NAME(Null)}, {(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("empty"), str8_lit_comp(""), DF_IconKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(Empty), DF_VIEW_CMD_FUNCTION_NAME(Empty), DF_VIEW_UI_FUNCTION_NAME(Empty)}, @@ -173,6 +173,7 @@ DF_ViewSpecInfo df_g_gfx_view_kind_spec_info_table[33] = {(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("memory"), str8_lit_comp("Memory"), DF_IconKind_Grid, DF_VIEW_SETUP_FUNCTION_NAME(Memory), DF_VIEW_CMD_FUNCTION_NAME(Memory), DF_VIEW_UI_FUNCTION_NAME(Memory)}, {(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("bitmap"), str8_lit_comp("Bitmap"), DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(Bitmap), DF_VIEW_CMD_FUNCTION_NAME(Bitmap), DF_VIEW_UI_FUNCTION_NAME(Bitmap)}, {(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("color_rgba"), str8_lit_comp("Color (RGBA)"), DF_IconKind_Palette, DF_VIEW_SETUP_FUNCTION_NAME(ColorRGBA), DF_VIEW_CMD_FUNCTION_NAME(ColorRGBA), DF_VIEW_UI_FUNCTION_NAME(ColorRGBA)}, +{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("geometry_3d"), str8_lit_comp("Geometry (3D)"), DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(Geometry3D), DF_VIEW_CMD_FUNCTION_NAME(Geometry3D), DF_VIEW_UI_FUNCTION_NAME(Geometry3D)}, {(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|1*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("exception_filters"), str8_lit_comp("Exception Filters"), DF_IconKind_Gear, DF_VIEW_SETUP_FUNCTION_NAME(ExceptionFilters), DF_VIEW_CMD_FUNCTION_NAME(ExceptionFilters), DF_VIEW_UI_FUNCTION_NAME(ExceptionFilters)}, {(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|1*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("settings"), str8_lit_comp("Settings"), DF_IconKind_Gear, DF_VIEW_SETUP_FUNCTION_NAME(Settings), DF_VIEW_CMD_FUNCTION_NAME(Settings), DF_VIEW_UI_FUNCTION_NAME(Settings)}, }; @@ -227,7 +228,7 @@ DF_GfxViewRuleSpecInfo df_g_gfx_view_rule_spec_info_table[16] = { str8_lit_comp("disasm"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_ViewUI*1), 0, 0, 0, str8_lit_comp("disassembly") }, { str8_lit_comp("memory"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_ViewUI*1), 0, 0, 0, str8_lit_comp("memory") }, { str8_lit_comp("bitmap"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_ViewUI*1), 0, 0, 0, str8_lit_comp("bitmap") }, -{ str8_lit_comp("geo"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*1)|(DF_GfxViewRuleSpecInfoFlag_ViewUI*1), 0, 0, DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME(geo) , str8_lit_comp("geometry") }, +{ str8_lit_comp("geo3d"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_ViewUI*1), 0, 0, 0, str8_lit_comp("geometry_3d") }, }; String8 df_g_theme_preset_display_string_table[9] = diff --git a/src/df/gfx/generated/df_gfx.meta.h b/src/df/gfx/generated/df_gfx.meta.h index 0f208938..dd5009d3 100644 --- a/src/df/gfx/generated/df_gfx.meta.h +++ b/src/df/gfx/generated/df_gfx.meta.h @@ -39,6 +39,7 @@ DF_GfxViewKind_Output, DF_GfxViewKind_Memory, DF_GfxViewKind_Bitmap, DF_GfxViewKind_ColorRGBA, +DF_GfxViewKind_Geometry3D, DF_GfxViewKind_ExceptionFilters, DF_GfxViewKind_Settings, DF_GfxViewKind_COUNT, @@ -193,6 +194,7 @@ DF_VIEW_SETUP_FUNCTION_DEF(Output); DF_VIEW_SETUP_FUNCTION_DEF(Memory); DF_VIEW_SETUP_FUNCTION_DEF(Bitmap); DF_VIEW_SETUP_FUNCTION_DEF(ColorRGBA); +DF_VIEW_SETUP_FUNCTION_DEF(Geometry3D); DF_VIEW_SETUP_FUNCTION_DEF(ExceptionFilters); DF_VIEW_SETUP_FUNCTION_DEF(Settings); DF_VIEW_CMD_FUNCTION_DEF(Null); @@ -226,6 +228,7 @@ DF_VIEW_CMD_FUNCTION_DEF(Output); DF_VIEW_CMD_FUNCTION_DEF(Memory); DF_VIEW_CMD_FUNCTION_DEF(Bitmap); DF_VIEW_CMD_FUNCTION_DEF(ColorRGBA); +DF_VIEW_CMD_FUNCTION_DEF(Geometry3D); DF_VIEW_CMD_FUNCTION_DEF(ExceptionFilters); DF_VIEW_CMD_FUNCTION_DEF(Settings); DF_VIEW_UI_FUNCTION_DEF(Null); @@ -259,6 +262,7 @@ DF_VIEW_UI_FUNCTION_DEF(Output); DF_VIEW_UI_FUNCTION_DEF(Memory); DF_VIEW_UI_FUNCTION_DEF(Bitmap); DF_VIEW_UI_FUNCTION_DEF(ColorRGBA); +DF_VIEW_UI_FUNCTION_DEF(Geometry3D); DF_VIEW_UI_FUNCTION_DEF(ExceptionFilters); DF_VIEW_UI_FUNCTION_DEF(Settings); @@ -274,12 +278,11 @@ DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(omit); DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(no_addr); DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(checkbox); DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(rgba); -DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(geo); C_LINKAGE_BEGIN extern DF_StringBindingPair df_g_default_binding_table[110]; extern String8 df_g_binding_version_remap_old_name_table[7]; extern String8 df_g_binding_version_remap_new_name_table[7]; -extern DF_ViewSpecInfo df_g_gfx_view_kind_spec_info_table[33]; +extern DF_ViewSpecInfo df_g_gfx_view_kind_spec_info_table[34]; extern DF_CmdParamSlot df_g_cmd_param_slot_2_view_spec_src_map[7]; extern String8 df_g_cmd_param_slot_2_view_spec_dst_map[7]; extern String8 df_g_cmd_param_slot_2_view_spec_cmd_map[7]; diff --git a/src/mdesk/mdesk.c b/src/mdesk/mdesk.c index 195ddc38..6f550a65 100644 --- a/src/mdesk/mdesk.c +++ b/src/mdesk/mdesk.c @@ -361,6 +361,10 @@ md_string_from_children(Arena *arena, MD_Node *root) String8List strs = {0}; for(MD_EachNode(child, root->first)) { + if(child->flags == child->prev->flags) + { + str8_list_push(scratch.arena, &strs, str8_lit(" ")); + } str8_list_push(scratch.arena, &strs, child->string); } String8 result = str8_list_join(arena, &strs, 0); @@ -393,7 +397,7 @@ md_node_match(MD_Node *a, MD_Node *b, StringMatchFlags flags) !md_node_is_nil(a_tag_arg) || !md_node_is_nil(b_tag_arg); a_tag_arg = a_tag_arg->next, b_tag_arg = b_tag_arg->next) { - if(!md_node_deep_match(a_tag_arg, b_tag_arg, flags)) + if(!md_tree_match(a_tag_arg, b_tag_arg, flags)) { result = 0; goto end; @@ -413,7 +417,7 @@ md_node_match(MD_Node *a, MD_Node *b, StringMatchFlags flags) } internal B32 -md_node_deep_match(MD_Node *a, MD_Node *b, StringMatchFlags flags) +md_tree_match(MD_Node *a, MD_Node *b, StringMatchFlags flags) { B32 result = md_node_match(a, b, flags); if(result) @@ -422,7 +426,7 @@ md_node_deep_match(MD_Node *a, MD_Node *b, StringMatchFlags flags) !md_node_is_nil(a_child) || !md_node_is_nil(b_child); a_child = a_child->next, b_child = b_child->next) { - if(!md_node_deep_match(a_child, b_child, flags)) + if(!md_tree_match(a_child, b_child, flags)) { result = 0; goto end; diff --git a/src/mdesk/mdesk.h b/src/mdesk/mdesk.h index 08c86d67..612c0df4 100644 --- a/src/mdesk/mdesk.h +++ b/src/mdesk/mdesk.h @@ -282,7 +282,7 @@ internal U64 md_tag_count_from_node(MD_Node *node); internal String8 md_string_from_children(Arena *arena, MD_Node *root); //- rjf: tree comparison -internal B32 md_node_deep_match(MD_Node *a, MD_Node *b, StringMatchFlags flags); +internal B32 md_tree_match(MD_Node *a, MD_Node *b, StringMatchFlags flags); internal B32 md_node_match(MD_Node *a, MD_Node *b, StringMatchFlags flags); //- rjf: tree duplication diff --git a/src/mule/mule_main.cpp b/src/mule/mule_main.cpp index f5fa3a45..2b44ada4 100644 --- a/src/mule/mule_main.cpp +++ b/src/mule/mule_main.cpp @@ -1857,7 +1857,7 @@ fancy_viz_eval_tests(void) 136, 137, 138, 138, 139, 136, 140, 141, 142, 142, 143, 140, 144, 145, 146, 146, 147, 144, 148, 149, 150, 150, 151, 148, 152, 153, 154, 154, 155, 152, 156, 157, 158, 158, 159, 156, 160, 161, 162, 162, 163, 160, 164, 165, 166, 166, 167, 164, }; - raddbg_pin(index_data, "geo: { count:(sizeof index_data / 4), vertices_base:(vertex_data), vertices_size:(sizeof vertex_data) }"); + raddbg_pin(index_data, "geo3d: { count:(sizeof index_data/4), vtx:(vertex_data), vtx_size:(sizeof vertex_data) }"); int x3 = 0; } diff --git a/src/ui/ui_core.h b/src/ui/ui_core.h index a3a23d91..5632391c 100644 --- a/src/ui/ui_core.h +++ b/src/ui/ui_core.h @@ -1047,6 +1047,8 @@ internal void ui_pop_corner_radius(void); #define UI_TextAlignment(v) DeferLoop(ui_push_text_alignment(v), ui_pop_text_alignment()) //- rjf: stacks (compositions) +#define UI_FixedPos(v) DeferLoop((ui_push_fixed_x((v).x), ui_push_fixed_y((v).y)), (ui_pop_fixed_x(), ui_pop_fixed_y())) +#define UI_FixedSize(v) DeferLoop((ui_push_fixed_width((v).x), ui_push_fixed_height((v).y)), (ui_pop_fixed_width(), ui_pop_fixed_height())) #define UI_WidthFill UI_PrefWidth(ui_pct(1.f, 0.f)) #define UI_HeightFill UI_PrefHeight(ui_pct(1.f, 0.f)) #define UI_Rect(r) DeferLoop(ui_push_rect(r), ui_pop_rect())