eliminate RD_Entity code entirely

This commit is contained in:
Ryan Fleury
2025-02-05 13:11:06 -08:00
parent 92d4f3ebb1
commit edbce2713f
3 changed files with 24 additions and 962 deletions
+18 -788
View File
@@ -93,164 +93,6 @@ rd_cmd_list_push_new(Arena *arena, RD_CmdList *cmds, String8 name, RD_Regs *regs
cmds->count += 1;
}
////////////////////////////////
//~ rjf: Entity Functions
//- rjf: nil
internal B32
rd_entity_is_nil(RD_Entity *entity)
{
return (entity == 0 || entity == &rd_nil_entity);
}
//- rjf: handle <-> entity conversions
internal U64
rd_index_from_entity(RD_Entity *entity)
{
return (U64)(entity - rd_state->entities_base);
}
internal RD_Handle
rd_handle_from_entity(RD_Entity *entity)
{
RD_Handle handle = rd_handle_zero();
if(!rd_entity_is_nil(entity))
{
handle.u64[0] = rd_index_from_entity(entity);
handle.u64[1] = entity->gen;
}
return handle;
}
internal RD_Entity *
rd_entity_from_handle(RD_Handle handle)
{
RD_Entity *result = rd_state->entities_base + handle.u64[0];
if(handle.u64[0] >= rd_state->entities_count || result->gen != handle.u64[1])
{
result = &rd_nil_entity;
}
return result;
}
//- rjf: entity recursion iterators
internal RD_EntityRec
rd_entity_rec_depth_first(RD_Entity *entity, RD_Entity *subtree_root, U64 sib_off, U64 child_off)
{
RD_EntityRec result = {0};
if(!rd_entity_is_nil(*MemberFromOffset(RD_Entity **, entity, child_off)))
{
result.next = *MemberFromOffset(RD_Entity **, entity, child_off);
result.push_count = 1;
}
else for(RD_Entity *parent = entity; parent != subtree_root && !rd_entity_is_nil(parent); parent = parent->parent)
{
if(parent != subtree_root && !rd_entity_is_nil(*MemberFromOffset(RD_Entity **, parent, sib_off)))
{
result.next = *MemberFromOffset(RD_Entity **, parent, sib_off);
break;
}
result.pop_count += 1;
}
return result;
}
//- rjf: ancestor/child introspection
internal RD_Entity *
rd_entity_child_from_kind(RD_Entity *entity, RD_EntityKind kind)
{
RD_Entity *result = &rd_nil_entity;
for(RD_Entity *child = entity->first; !rd_entity_is_nil(child); child = child->next)
{
if(!(child->flags & RD_EntityFlag_MarkedForDeletion) && child->kind == kind)
{
result = child;
break;
}
}
return result;
}
//- rjf: entity list building
internal void
rd_entity_list_push(Arena *arena, RD_EntityList *list, RD_Entity *entity)
{
RD_EntityNode *n = push_array(arena, RD_EntityNode, 1);
n->entity = entity;
SLLQueuePush(list->first, list->last, n);
list->count += 1;
}
internal RD_EntityArray
rd_entity_array_from_list(Arena *arena, RD_EntityList *list)
{
RD_EntityArray result = {0};
result.count = list->count;
result.v = push_array(arena, RD_Entity *, result.count);
U64 idx = 0;
for(RD_EntityNode *n = list->first; n != 0; n = n->next, idx += 1)
{
result.v[idx] = n->entity;
}
return result;
}
//- rjf: entity -> color operations
internal Vec4F32
rd_hsva_from_entity(RD_Entity *entity)
{
Vec4F32 result = {0};
if(entity->flags & RD_EntityFlag_HasColor)
{
result = entity->color_hsva;
}
return result;
}
internal Vec4F32
rd_rgba_from_entity(RD_Entity *entity)
{
Vec4F32 result = {0};
if(entity->flags & RD_EntityFlag_HasColor)
{
Vec3F32 hsv = v3f32(entity->color_hsva.x, entity->color_hsva.y, entity->color_hsva.z);
Vec3F32 rgb = rgb_from_hsv(hsv);
result = v4f32(rgb.x, rgb.y, rgb.z, entity->color_hsva.w);
}
else switch(entity->kind)
{
default:{}break;
case RD_EntityKind_Breakpoint:
{
result = rd_rgba_from_theme_color(RD_ThemeColor_Breakpoint);
}break;
}
return result;
}
//- rjf: entity -> expansion tree keys
internal EV_Key
rd_ev_key_from_entity(RD_Entity *entity)
{
EV_Key parent_key = rd_parent_ev_key_from_entity(entity);
EV_Key key = ev_key_make(ev_hash_from_key(parent_key), (U64)entity);
return key;
}
internal EV_Key
rd_parent_ev_key_from_entity(RD_Entity *entity)
{
EV_Key parent_key = ev_key_make(5381, (U64)entity);
return parent_key;
}
////////////////////////////////
//~ rjf: View Spec Type Functions
@@ -1510,258 +1352,6 @@ rd_immediate_cfg_from_keyf(char *fmt, ...)
return result;
}
////////////////////////////////
//~ rjf: Entity State Functions
//- rjf: entity allocation + tree forming
internal RD_Entity *
rd_entity_alloc(RD_Entity *parent, RD_EntityKind kind)
{
B32 user_defined_lifetime = !!(rd_entity_kind_flags_table[kind] & RD_EntityKindFlag_UserDefinedLifetime);
U64 free_list_idx = !!user_defined_lifetime;
if(rd_entity_is_nil(parent)) { parent = rd_state->entities_root; }
// rjf: empty free list -> push new
if(!rd_state->entities_free[free_list_idx])
{
RD_Entity *entity = push_array(rd_state->entities_arena, RD_Entity, 1);
rd_state->entities_count += 1;
rd_state->entities_free_count += 1;
SLLStackPush(rd_state->entities_free[free_list_idx], entity);
}
// rjf: pop new entity off free-list
RD_Entity *entity = rd_state->entities_free[free_list_idx];
SLLStackPop(rd_state->entities_free[free_list_idx]);
rd_state->entities_free_count -= 1;
rd_state->entities_active_count += 1;
// rjf: zero entity
{
U64 gen = entity->gen;
MemoryZeroStruct(entity);
entity->gen = gen;
}
// rjf: set up alloc'd entity links
entity->first = entity->last = entity->next = entity->prev = entity->parent = &rd_nil_entity;
entity->parent = parent;
// rjf: stitch up parent links
if(rd_entity_is_nil(parent))
{
rd_state->entities_root = entity;
}
else
{
DLLPushBack_NPZ(&rd_nil_entity, parent->first, parent->last, entity, next, prev);
}
// rjf: fill out metadata
entity->kind = kind;
rd_state->entities_id_gen += 1;
entity->id = rd_state->entities_id_gen;
entity->gen += 1;
entity->alloc_time_us = os_now_microseconds();
// rjf: initialize to deleted, record history, then "undelete" if this allocation can be undone
if(user_defined_lifetime)
{
// TODO(rjf)
}
// rjf: dirtify caches
rd_state->kind_alloc_gens[kind] += 1;
// rjf: log
LogInfoNamedBlockF("new_entity")
{
log_infof("kind: \"%S\"\n", d_entity_kind_display_string_table[kind]);
log_infof("id: $0x%I64x\n", entity->id);
}
return entity;
}
internal void
rd_entity_mark_for_deletion(RD_Entity *entity)
{
if(!rd_entity_is_nil(entity))
{
entity->flags |= RD_EntityFlag_MarkedForDeletion;
rd_state->kind_alloc_gens[entity->kind] += 1;
}
}
internal void
rd_entity_release(RD_Entity *entity)
{
Temp scratch = scratch_begin(0, 0);
// rjf: unpack
U64 free_list_idx = !!(rd_entity_kind_flags_table[entity->kind] & RD_EntityKindFlag_UserDefinedLifetime);
// rjf: release whole tree
typedef struct Task Task;
struct Task
{
Task *next;
RD_Entity *e;
};
Task start_task = {0, entity};
Task *first_task = &start_task;
Task *last_task = &start_task;
for(Task *task = first_task; task != 0; task = task->next)
{
for(RD_Entity *child = task->e->first; !rd_entity_is_nil(child); child = child->next)
{
Task *t = push_array(scratch.arena, Task, 1);
t->e = child;
SLLQueuePush(first_task, last_task, t);
}
LogInfoNamedBlockF("end_entity")
{
log_infof("kind: \"%S\"\n", d_entity_kind_display_string_table[task->e->kind]);
log_infof("id: $0x%I64x\n", task->e->id);
}
SLLStackPush(rd_state->entities_free[free_list_idx], task->e);
rd_state->entities_free_count += 1;
rd_state->entities_active_count -= 1;
task->e->gen += 1;
if(task->e->string.size != 0)
{
rd_name_release(task->e->string);
}
rd_state->kind_alloc_gens[task->e->kind] += 1;
}
scratch_end(scratch);
}
internal void
rd_entity_change_parent(RD_Entity *entity, RD_Entity *old_parent, RD_Entity *new_parent, RD_Entity *prev_child)
{
Assert(entity->parent == old_parent);
Assert(prev_child->parent == old_parent || rd_entity_is_nil(prev_child));
if(prev_child != entity)
{
// rjf: fix up links
if(!rd_entity_is_nil(old_parent))
{
DLLRemove_NPZ(&rd_nil_entity, old_parent->first, old_parent->last, entity, next, prev);
}
if(!rd_entity_is_nil(new_parent))
{
DLLInsert_NPZ(&rd_nil_entity, new_parent->first, new_parent->last, prev_child, entity, next, prev);
}
entity->parent = new_parent;
// rjf: notify
rd_state->kind_alloc_gens[entity->kind] += 1;
}
}
internal RD_Entity *
rd_entity_child_from_kind_or_alloc(RD_Entity *entity, RD_EntityKind kind)
{
RD_Entity *child = rd_entity_child_from_kind(entity, kind);
if(rd_entity_is_nil(child))
{
child = rd_entity_alloc(entity, kind);
}
return child;
}
//- rjf: entity simple equipment
internal void
rd_entity_equip_txt_pt(RD_Entity *entity, TxtPt point)
{
rd_require_entity_nonnil(entity, return);
entity->text_point = point;
entity->flags |= RD_EntityFlag_HasTextPoint;
}
internal void
rd_entity_equip_disabled(RD_Entity *entity, B32 value)
{
rd_require_entity_nonnil(entity, return);
entity->disabled = value;
}
internal void
rd_entity_equip_u64(RD_Entity *entity, U64 u64)
{
rd_require_entity_nonnil(entity, return);
entity->u64 = u64;
entity->flags |= RD_EntityFlag_HasU64;
}
internal void
rd_entity_equip_color_rgba(RD_Entity *entity, Vec4F32 rgba)
{
rd_require_entity_nonnil(entity, return);
Vec3F32 rgb = v3f32(rgba.x, rgba.y, rgba.z);
Vec3F32 hsv = hsv_from_rgb(rgb);
Vec4F32 hsva = v4f32(hsv.x, hsv.y, hsv.z, rgba.w);
rd_entity_equip_color_hsva(entity, hsva);
}
internal void
rd_entity_equip_color_hsva(RD_Entity *entity, Vec4F32 hsva)
{
rd_require_entity_nonnil(entity, return);
entity->color_hsva = hsva;
entity->flags |= RD_EntityFlag_HasColor;
}
internal void
rd_entity_equip_cfg_src(RD_Entity *entity, RD_CfgSrc cfg_src)
{
rd_require_entity_nonnil(entity, return);
entity->cfg_src = cfg_src;
}
internal void
rd_entity_equip_timestamp(RD_Entity *entity, U64 timestamp)
{
rd_require_entity_nonnil(entity, return);
entity->timestamp = timestamp;
}
//- rjf: control layer correllation equipment
internal void
rd_entity_equip_vaddr(RD_Entity *entity, U64 vaddr)
{
rd_require_entity_nonnil(entity, return);
entity->vaddr = vaddr;
entity->flags |= RD_EntityFlag_HasVAddr;
}
//- rjf: name equipment
internal void
rd_entity_equip_name(RD_Entity *entity, String8 name)
{
rd_require_entity_nonnil(entity, return);
if(entity->string.size != 0)
{
rd_name_release(entity->string);
}
if(name.size != 0)
{
entity->string = rd_name_alloc(name);
}
else
{
entity->string = str8_zero();
}
}
//- rjf: file path map override lookups
internal String8
rd_mapped_from_file_path(Arena *arena, String8 file_path)
{
@@ -1895,251 +1485,6 @@ rd_possible_overrides_from_file_path(Arena *arena, String8 file_path)
return result;
}
//- rjf: top-level state queries
internal RD_Entity *
rd_entity_root(void)
{
return rd_state->entities_root;
}
internal RD_EntityList
rd_push_entity_list_with_kind(Arena *arena, RD_EntityKind kind)
{
ProfBeginFunction();
RD_EntityList result = {0};
for(RD_Entity *entity = rd_state->entities_root;
!rd_entity_is_nil(entity);
entity = rd_entity_rec_depth_first_pre(entity, &rd_nil_entity).next)
{
if(entity->kind == kind && !(entity->flags & RD_EntityFlag_MarkedForDeletion))
{
rd_entity_list_push(arena, &result, entity);
}
}
ProfEnd();
return result;
}
internal RD_Entity *
rd_entity_from_id(RD_EntityID id)
{
RD_Entity *result = &rd_nil_entity;
for(RD_Entity *e = rd_entity_root();
!rd_entity_is_nil(e);
e = rd_entity_rec_depth_first_pre(e, &rd_nil_entity).next)
{
if(e->id == id)
{
result = e;
break;
}
}
return result;
}
internal RD_Entity *
rd_entity_from_name_and_kind(String8 string, RD_EntityKind kind)
{
RD_Entity *result = &rd_nil_entity;
RD_EntityList all_of_this_kind = rd_query_cached_entity_list_with_kind(kind);
for(RD_EntityNode *n = all_of_this_kind.first; n != 0; n = n->next)
{
if(str8_match(n->entity->string, string, 0))
{
result = n->entity;
break;
}
}
return result;
}
////////////////////////////////
//~ rjf: Frontend Entity Info Extraction
internal DR_FancyStringList
rd_title_fstrs_from_entity(Arena *arena, RD_Entity *entity, Vec4F32 secondary_color, F32 size)
{
DR_FancyStringList result = {0};
RD_Entity *exe = rd_entity_child_from_kind(entity, RD_EntityKind_Executable);
RD_Entity *args = rd_entity_child_from_kind(entity, RD_EntityKind_Arguments);
RD_Entity *loc = rd_entity_child_from_kind(entity, RD_EntityKind_Location);
RD_Entity *cnd = rd_entity_child_from_kind(entity, RD_EntityKind_Condition);
RD_Entity *src = rd_entity_child_from_kind(entity, RD_EntityKind_Source);
RD_Entity *dst = rd_entity_child_from_kind(entity, RD_EntityKind_Dest);
RD_IconKind icon_kind = rd_entity_kind_icon_kind_table[entity->kind];
Vec4F32 color = rd_rgba_from_theme_color(RD_ThemeColor_Text);
if(icon_kind != RD_IconKind_Null)
{
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Icons), size, secondary_color, rd_icon_kind_text_table[icon_kind]);
}
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, secondary_color, str8_lit(" "));
if(entity->kind == RD_EntityKind_Target && entity->cfg_src == RD_CfgSrc_CommandLine)
{
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Icons), size, rd_rgba_from_theme_color(RD_ThemeColor_TextNegative), rd_icon_kind_text_table[RD_IconKind_Info]);
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, secondary_color, str8_lit(" "));
}
String8 name = entity->string;
B32 name_is_code = 1;
if(rd_entity_kind_flags_table[entity->kind] & RD_EntityKindFlag_NameIsPath)
{
name_is_code = 0;
}
String8 location = {0};
B32 location_is_code = 0;
String8 exe_name = str8_skip_last_slash(exe->string);
String8 args_string = args->string;
String8 cnd_string = cnd->string;
if(!rd_entity_is_nil(loc))
{
if(loc->string.size != 0 && loc->flags & RD_EntityFlag_HasTextPoint)
{
location = push_str8f(arena, "%S:%I64d:%I64d", loc->string, loc->text_point.line, loc->text_point.column);
location_is_code = 0;
}
else if(loc->string.size != 0)
{
location = loc->string;
location_is_code = 1;
}
else if(loc->flags & RD_EntityFlag_HasVAddr)
{
location = push_str8f(arena, "0x%I64x", loc->vaddr);
location_is_code = 1;
}
}
B32 extra = 0;
F32 size_extrafied = size;
Vec4F32 color_extrafied = color;
if(name.size != 0)
{
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(name_is_code ? RD_FontSlot_Code : RD_FontSlot_Main), size, color, name);
extra = 1;
size_extrafied = size*0.95f;
color_extrafied = secondary_color;
}
if(location.size != 0)
{
if(extra)
{
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" "));
}
if(location_is_code)
{
DR_FancyStringList loc_fstrs = {0};
RD_Font(RD_FontSlot_Code)
loc_fstrs = rd_fancy_string_list_from_code_string(arena, 1.f, 0, color_extrafied, location);
dr_fancy_string_list_concat_in_place(&result, &loc_fstrs);
}
else
{
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), size_extrafied, color_extrafied, location);
}
extra = 1;
size_extrafied = size*0.95f;
color_extrafied = secondary_color;
}
if(exe_name.size != 0)
{
if(extra)
{
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" "));
}
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), size_extrafied, color_extrafied, exe_name);
extra = 1;
size_extrafied = size*0.95f;
color_extrafied = secondary_color;
}
if(args_string.size != 0)
{
if(extra)
{
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" "));
}
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), size_extrafied, color_extrafied, args_string);
extra = 1;
size_extrafied = size*0.95f;
color_extrafied = secondary_color;
}
if(cnd_string.size != 0)
{
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, color_extrafied, str8_lit(" if "));
RD_Font(RD_FontSlot_Code) UI_FontSize(size_extrafied)
{
DR_FancyStringList cnd_fstrs = rd_fancy_string_list_from_code_string(arena, 1.f, 0.f, color_extrafied, cnd_string);
dr_fancy_string_list_concat_in_place(&result, &cnd_fstrs);
}
}
if(entity->kind == RD_EntityKind_FilePathMap)
{
String8 src_string = src->string;
Vec4F32 src_color = color;
String8 dst_string = dst->string;
Vec4F32 dst_color = color;
if(src_string.size == 0)
{
src_string = str8_lit("(source path)");
src_color = secondary_color;
}
if(dst_string.size == 0)
{
dst_string = str8_lit("(destination path)");
dst_color = secondary_color;
}
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), size, src_color, src_string);
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" "));
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Icons), size, secondary_color, rd_icon_kind_text_table[RD_IconKind_RightArrow]);
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" "));
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), size, dst_color, dst_string);
}
if(entity->kind == RD_EntityKind_AutoViewRule)
{
String8 src_string = src->string;
Vec4F32 src_color = color;
String8 dst_string = dst->string;
Vec4F32 dst_color = color;
DR_FancyStringList src_fstrs = {0};
DR_FancyStringList dst_fstrs = {0};
if(src_string.size == 0)
{
src_string = str8_lit("(type)");
src_color = secondary_color;
dr_fancy_string_list_push_new(arena, &src_fstrs, rd_font_from_slot(RD_FontSlot_Main), size, src_color, src_string);
}
else RD_Font(RD_FontSlot_Code)
{
src_fstrs = rd_fancy_string_list_from_code_string(arena, 1.f, 0, src_color, src_string);
}
if(dst_string.size == 0)
{
dst_string = str8_lit("(view rule)");
dst_color = secondary_color;
dr_fancy_string_list_push_new(arena, &dst_fstrs, rd_font_from_slot(RD_FontSlot_Main), size, dst_color, dst_string);
}
else RD_Font(RD_FontSlot_Code)
{
dst_fstrs = rd_fancy_string_list_from_code_string(arena, 1.f, 0, dst_color, dst_string);
}
dr_fancy_string_list_concat_in_place(&result, &src_fstrs);
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" "));
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Icons), size, secondary_color, rd_icon_kind_text_table[RD_IconKind_RightArrow]);
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" "));
dr_fancy_string_list_concat_in_place(&result, &dst_fstrs);
}
if((entity->kind == RD_EntityKind_Target || entity->kind == RD_EntityKind_Breakpoint) && entity->disabled)
{
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" "));
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), size*0.95f, secondary_color, str8_lit("(Disabled)"));
}
if(entity->kind == RD_EntityKind_Breakpoint)
{
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" "));
String8 string = push_str8f(arena, "(%I64u hit%s)", entity->u64, entity->u64 == 1 ? "" : "s");
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), size_extrafied, secondary_color, string);
}
return result;
}
////////////////////////////////
//~ rjf: Control Entity Info Extraction
@@ -2543,73 +1888,6 @@ rd_eval_blob_from_entity__cached(CTRL_Entity *entity)
//- rjf: entity -> meta eval
internal CTRL_MetaEval *
rd_ctrl_meta_eval_from_entity(Arena *arena, RD_Entity *entity)
{
ProfBeginFunction();
CTRL_MetaEval *meval = push_array(arena, CTRL_MetaEval, 1);
RD_Entity *exe = rd_entity_child_from_kind(entity, RD_EntityKind_Executable);
RD_Entity *args= rd_entity_child_from_kind(entity, RD_EntityKind_Arguments);
RD_Entity *wdir= rd_entity_child_from_kind(entity, RD_EntityKind_WorkingDirectory);
RD_Entity *entr= rd_entity_child_from_kind(entity, RD_EntityKind_EntryPoint);
RD_Entity *stdo= rd_entity_child_from_kind(entity, RD_EntityKind_StdoutPath);
RD_Entity *stde= rd_entity_child_from_kind(entity, RD_EntityKind_StderrPath);
RD_Entity *stdi= rd_entity_child_from_kind(entity, RD_EntityKind_StdinPath);
RD_Entity *loc = rd_entity_child_from_kind(entity, RD_EntityKind_Location);
RD_Entity *cnd = rd_entity_child_from_kind(entity, RD_EntityKind_Condition);
RD_Entity *src = rd_entity_child_from_kind(entity, RD_EntityKind_Source);
RD_Entity *dst = rd_entity_child_from_kind(entity, RD_EntityKind_Dest);
String8 label_string = push_str8_copy(arena, entity->string);
String8 src_loc_string = {0};
String8 vaddr_loc_string = {0};
String8 function_loc_string = {0};
if(loc->flags & RD_EntityFlag_HasTextPoint)
{
src_loc_string = push_str8f(arena, "%S:%I64u:%I64u", loc->string, loc->text_point.line, loc->text_point.column);
}
else if(loc->flags & RD_EntityFlag_HasVAddr)
{
vaddr_loc_string = push_str8f(arena, "0x%I64x", loc->vaddr);
}
else if(loc->string.size != 0)
{
function_loc_string = push_str8_copy(arena, loc->string);
}
String8 cnd_string = push_str8_copy(arena, cnd->string);
meval->enabled = !entity->disabled;
meval->hit_count = entity->u64;
meval->color = u32_from_rgba(rd_rgba_from_entity(entity));
meval->label = label_string;
meval->exe = exe->string;
meval->args = args->string;
meval->working_directory = wdir->string;
meval->entry_point = entr->string;
meval->stdout_path = stdo->string;
meval->stderr_path = stde->string;
meval->stdin_path = stdi->string;
meval->source_location = src_loc_string;
meval->address_location = vaddr_loc_string;
meval->function_location = function_loc_string;
meval->condition = cnd_string;
meval->debug_subprocesses.b32 = entity->debug_subprocesses;
switch(entity->kind)
{
default:{}break;
case RD_EntityKind_FilePathMap:
{
meval->source_path = src->string;
meval->destination_path = dst->string;
}break;
case RD_EntityKind_AutoViewRule:
{
meval->type = src->string;
meval->view_rule = dst->string;
}break;
}
ProfEnd();
return meval;
}
internal CTRL_MetaEval *
rd_ctrl_meta_eval_from_ctrl_entity(Arena *arena, CTRL_Entity *entity)
{
@@ -11627,32 +10905,6 @@ rd_frame_arena(void)
return rd_state->frame_arenas[rd_state->frame_index%ArrayCount(rd_state->frame_arenas)];
}
//- rjf: entity cache queries
internal RD_EntityList
rd_query_cached_entity_list_with_kind(RD_EntityKind kind)
{
ProfBeginFunction();
RD_EntityListCache *cache = &rd_state->kind_caches[kind];
// rjf: build cached list if we're out-of-date
if(cache->alloc_gen != rd_state->kind_alloc_gens[kind])
{
cache->alloc_gen = rd_state->kind_alloc_gens[kind];
if(cache->arena == 0)
{
cache->arena = arena_alloc();
}
arena_clear(cache->arena);
cache->list = rd_push_entity_list_with_kind(cache->arena, kind);
}
// rjf: grab & return cached list
RD_EntityList result = cache->list;
ProfEnd();
return result;
}
////////////////////////////////
//~ rjf: Registers
@@ -11884,11 +11136,6 @@ rd_init(CmdLine *cmdln)
{
rd_state->cmds_arenas[idx] = arena_alloc();
}
rd_state->entities_arena = arena_alloc(.reserve_size = GB(64), .commit_size = KB(64));
rd_state->entities_root = &rd_nil_entity;
rd_state->entities_base = push_array(rd_state->entities_arena, RD_Entity, 0);
rd_state->entities_count = 0;
rd_state->entities_root = rd_entity_alloc(&rd_nil_entity, RD_EntityKind_Root);
rd_state->popup_arena = arena_alloc();
rd_state->ctx_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("top_level_ctx_menu"));
rd_state->drop_completion_key = ui_key_from_string(ui_key_zero(), str8_lit("drop_completion_ctx_menu"));
@@ -15508,17 +14755,28 @@ Z(getting_started)
case RD_CmdKind_ToggleWatchExpression:
if(rd_regs()->string.size != 0)
{
RD_Entity *existing_watch = rd_entity_from_name_and_kind(rd_regs()->string, RD_EntityKind_Watch);
if(rd_entity_is_nil(existing_watch))
RD_CfgList all_existing_watches = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("watch"));
RD_Cfg *existing_watch = &rd_nil_cfg;
for(RD_CfgNode *n = all_existing_watches.first; n != 0; n = n->next)
{
RD_Entity *watch = &rd_nil_entity;
watch = rd_entity_alloc(rd_entity_root(), RD_EntityKind_Watch);
rd_entity_equip_cfg_src(watch, RD_CfgSrc_Project);
rd_entity_equip_name(watch, rd_regs()->string);
RD_Cfg *watch = n->v;
String8 expr = rd_expr_from_cfg(watch);
if(str8_match(expr, rd_regs()->string, 0))
{
existing_watch = watch;
break;
}
}
if(existing_watch == &rd_nil_cfg)
{
RD_Cfg *project = rd_cfg_child_from_string(rd_state->root_cfg, str8_lit("project"));
RD_Cfg *watch = rd_cfg_new(project, str8_lit("watch"));
RD_Cfg *expr = rd_cfg_new(watch, str8_lit("expression"));
rd_cfg_new(expr, rd_regs()->string);
}
else
{
rd_entity_mark_for_deletion(existing_watch);
rd_cfg_release(existing_watch);
}
}break;
@@ -16803,34 +16061,6 @@ Z(getting_started)
}
}
//////////////////////////////
//- rjf: eliminate entities that are marked for deletion
//
ProfScope("eliminate deleted entities")
{
for(RD_Entity *entity = rd_entity_root(), *next = 0; !rd_entity_is_nil(entity); entity = next)
{
next = rd_entity_rec_depth_first_pre(entity, &rd_nil_entity).next;
if(entity->flags & RD_EntityFlag_MarkedForDeletion)
{
B32 undoable = (rd_entity_kind_flags_table[entity->kind] & RD_EntityKindFlag_UserDefinedLifetime);
// rjf: fixup next entity to iterate to
next = rd_entity_rec_depth_first(entity, &rd_nil_entity, OffsetOf(RD_Entity, next), OffsetOf(RD_Entity, next)).next;
// rjf: eliminate root entity if we're freeing it
if(entity == rd_state->entities_root)
{
rd_state->entities_root = &rd_nil_entity;
}
// rjf: unhook & release this entity tree
rd_entity_change_parent(entity, entity->parent, &rd_nil_entity, &rd_nil_entity);
rd_entity_release(entity);
}
}
}
//////////////////////////////
//- rjf: determine frame time, record into history
//
-171
View File
@@ -386,72 +386,6 @@ struct RD_PanelNodeRec
S32 pop_count;
};
////////////////////////////////
//~ rjf: Entity Types
typedef U64 RD_EntityID;
typedef struct RD_Entity RD_Entity;
struct RD_Entity
{
// rjf: tree links
RD_Entity *first;
RD_Entity *last;
RD_Entity *next;
RD_Entity *prev;
RD_Entity *parent;
// rjf: metadata
RD_EntityKind kind;
RD_EntityFlags flags;
RD_EntityID id;
U64 gen;
U64 alloc_time_us;
// rjf: basic equipment
TxtPt text_point;
B32 disabled;
B32 debug_subprocesses;
U64 u64;
U64 vaddr;
Vec4F32 color_hsva;
RD_CfgSrc cfg_src;
U64 timestamp;
// rjf: string equipment
String8 string;
};
typedef struct RD_EntityNode RD_EntityNode;
struct RD_EntityNode
{
RD_EntityNode *next;
RD_Entity *entity;
};
typedef struct RD_EntityList RD_EntityList;
struct RD_EntityList
{
RD_EntityNode *first;
RD_EntityNode *last;
U64 count;
};
typedef struct RD_EntityArray RD_EntityArray;
struct RD_EntityArray
{
RD_Entity **v;
U64 count;
};
typedef struct RD_EntityRec RD_EntityRec;
struct RD_EntityRec
{
RD_Entity *next;
S32 push_count;
S32 pop_count;
};
////////////////////////////////
//~ rjf: Command Types
@@ -767,14 +701,6 @@ struct RD_NameChunkNode
U64 size;
};
typedef struct RD_EntityListCache RD_EntityListCache;
struct RD_EntityListCache
{
Arena *arena;
U64 alloc_gen;
RD_EntityList list;
};
typedef struct RD_AmbiguousPathNode RD_AmbiguousPathNode;
struct RD_AmbiguousPathNode
{
@@ -913,20 +839,6 @@ struct RD_State
// TODO(rjf): TO BE ELIMINATED OR REPLACED VVVVVVVVVVVVVVVV
//-
// rjf: entity state
Arena *entities_arena;
RD_Entity *entities_base;
U64 entities_count;
U64 entities_id_gen;
RD_Entity *entities_root;
RD_Entity *entities_free[2]; // [0] -> normal lifetime, not user defined; [1] -> user defined lifetime (& thus undoable)
U64 entities_free_count;
U64 entities_active_count;
// rjf: entity query caches
U64 kind_alloc_gens[RD_EntityKind_COUNT];
RD_EntityListCache kind_caches[RD_EntityKind_COUNT];
// rjf: bind change
Arena *bind_change_arena;
B32 bind_change_active;
@@ -964,15 +876,6 @@ read_only global RD_PanelNode rd_nil_panel_node =
.selected_tab = &rd_nil_cfg,
};
read_only global RD_Entity rd_nil_entity =
{
&rd_nil_entity,
&rd_nil_entity,
&rd_nil_entity,
&rd_nil_entity,
&rd_nil_entity,
};
read_only global RD_CmdKindInfo rd_nil_cmd_kind_info = {0};
read_only global RD_ViewRuleInfo rd_nil_view_rule_info =
@@ -1025,39 +928,6 @@ internal RD_Regs *rd_regs_copy(Arena *arena, RD_Regs *src);
internal void rd_cmd_list_push_new(Arena *arena, RD_CmdList *cmds, String8 name, RD_Regs *regs);
////////////////////////////////
//~ rjf: Entity Type Pure Functions
//- rjf: nil
internal B32 rd_entity_is_nil(RD_Entity *entity);
#define rd_require_entity_nonnil(entity, if_nil_stmts) do{if(rd_entity_is_nil(entity)){if_nil_stmts;}}while(0)
//- rjf: handle <-> entity conversions
internal U64 rd_index_from_entity(RD_Entity *entity);
internal RD_Handle rd_handle_from_entity(RD_Entity *entity);
internal RD_Entity *rd_entity_from_handle(RD_Handle handle);
//- rjf: entity recursion iterators
internal RD_EntityRec rd_entity_rec_depth_first(RD_Entity *entity, RD_Entity *subtree_root, U64 sib_off, U64 child_off);
#define rd_entity_rec_depth_first_pre(entity, subtree_root) rd_entity_rec_depth_first((entity), (subtree_root), OffsetOf(RD_Entity, next), OffsetOf(RD_Entity, first))
#define rd_entity_rec_depth_first_post(entity, subtree_root) rd_entity_rec_depth_first((entity), (subtree_root), OffsetOf(RD_Entity, prev), OffsetOf(RD_Entity, last))
//- rjf: ancestor/child introspection
internal RD_Entity *rd_entity_child_from_kind(RD_Entity *entity, RD_EntityKind kind);
//- rjf: entity list building
internal void rd_entity_list_push(Arena *arena, RD_EntityList *list, RD_Entity *entity);
internal RD_EntityArray rd_entity_array_from_list(Arena *arena, RD_EntityList *list);
#define rd_first_entity_from_list(list) ((list)->first != 0 ? (list)->first->entity : &rd_nil_entity)
//- rjf: entity -> color operations
internal Vec4F32 rd_hsva_from_entity(RD_Entity *entity);
internal Vec4F32 rd_rgba_from_entity(RD_Entity *entity);
//- rjf: entity -> expansion tree keys
internal EV_Key rd_ev_key_from_entity(RD_Entity *entity);
internal EV_Key rd_parent_ev_key_from_entity(RD_Entity *entity);
////////////////////////////////
//~ rjf: View Spec Type Functions
@@ -1143,46 +1013,9 @@ internal String8 rd_setting_from_name(String8 name);
internal RD_Cfg *rd_immediate_cfg_from_key(String8 string);
internal RD_Cfg *rd_immediate_cfg_from_keyf(char *fmt, ...);
////////////////////////////////
//~ rjf: Entity Stateful Functions
//- rjf: entity allocation + tree forming
internal RD_Entity *rd_entity_alloc(RD_Entity *parent, RD_EntityKind kind);
internal void rd_entity_mark_for_deletion(RD_Entity *entity);
internal void rd_entity_release(RD_Entity *entity);
internal void rd_entity_change_parent(RD_Entity *entity, RD_Entity *old_parent, RD_Entity *new_parent, RD_Entity *prev_child);
internal RD_Entity *rd_entity_child_from_kind_or_alloc(RD_Entity *entity, RD_EntityKind kind);
//- rjf: entity simple equipment
internal void rd_entity_equip_txt_pt(RD_Entity *entity, TxtPt point);
internal void rd_entity_equip_disabled(RD_Entity *entity, B32 b32);
internal void rd_entity_equip_u64(RD_Entity *entity, U64 u64);
internal void rd_entity_equip_color_rgba(RD_Entity *entity, Vec4F32 rgba);
internal void rd_entity_equip_color_hsva(RD_Entity *entity, Vec4F32 hsva);
internal void rd_entity_equip_cfg_src(RD_Entity *entity, RD_CfgSrc cfg_src);
internal void rd_entity_equip_timestamp(RD_Entity *entity, U64 timestamp);
//- rjf: control layer correllation equipment
internal void rd_entity_equip_vaddr(RD_Entity *entity, U64 vaddr);
//- rjf: name equipment
internal void rd_entity_equip_name(RD_Entity *entity, String8 name);
//- rjf: file path map override lookups
internal String8 rd_mapped_from_file_path(Arena *arena, String8 file_path);
internal String8List rd_possible_overrides_from_file_path(Arena *arena, String8 file_path);
//- rjf: top-level state queries
internal RD_Entity *rd_entity_root(void);
internal RD_EntityList rd_push_entity_list_with_kind(Arena *arena, RD_EntityKind kind);
internal RD_Entity *rd_entity_from_id(RD_EntityID id);
internal RD_Entity *rd_entity_from_name_and_kind(String8 string, RD_EntityKind kind);
////////////////////////////////
//~ rjf: Frontend Entity Info Extraction
internal DR_FancyStringList rd_title_fstrs_from_entity(Arena *arena, RD_Entity *entity, Vec4F32 secondary_color, F32 size);
////////////////////////////////
//~ rjf: Control Entity Info Extraction
@@ -1210,7 +1043,6 @@ internal String8 rd_eval_blob_from_entity(Arena *arena, CTRL_Entity *entity);
internal String8 rd_eval_blob_from_entity__cached(CTRL_Entity *entity);
//- rjf: entity -> meta eval
internal CTRL_MetaEval *rd_ctrl_meta_eval_from_entity(Arena *arena, RD_Entity *entity);
internal CTRL_MetaEval *rd_ctrl_meta_eval_from_ctrl_entity(Arena *arena, CTRL_Entity *entity);
//- rjf: eval space reads/writes
@@ -1368,9 +1200,6 @@ internal void rd_request_frame(void);
//- rjf: per-frame arena
internal Arena *rd_frame_arena(void);
//- rjf: entity cache queries
internal RD_EntityList rd_query_cached_entity_list_with_kind(RD_EntityKind kind);
////////////////////////////////
//~ rjf: Registers
+6 -3
View File
@@ -968,6 +968,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
if(info.group_cfg_name.size != 0)
{
RD_CfgList cfgs = rd_cfg_top_level_list_from_string(scratch.arena, info.group_cfg_name);
// TODO(rjf): this is not correct - assumes row's evaluation is in the block's space...
// info.group_cfg = rd_cfg_from_eval_space(info.eval.space);
}
@@ -2080,7 +2081,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, Rng2F32 rect)
taken = 1;
state_dirty = 1;
snap_to_cursor = 1;
RD_EntityList entities_to_remove = {0};
RD_CfgList cfgs_to_remove = {0};
RD_WatchPt next_cursor_pt = {0};
B32 next_cursor_set = 0;
EV_WindowedRowList rows = ev_rows_from_num_range(scratch.arena, eval_view, filter, &block_ranges, r1u64(selection_tbl.min.y, selection_tbl.max.y+1));
@@ -2143,9 +2144,9 @@ rd_watch_view_build(RD_WatchViewState *ewv, Rng2F32 rect)
#endif
}
}
for(RD_EntityNode *n = entities_to_remove.first; n != 0; n = n->next)
for(RD_CfgNode *n = cfgs_to_remove.first; n != 0; n = n->next)
{
rd_entity_mark_for_deletion(n->entity);
rd_cfg_release(n->v);
}
if(next_cursor_set)
{
@@ -2318,6 +2319,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, Rng2F32 rect)
#endif
// rjf: map selection endpoints to entities
#if 0 // TODO(rjf): @cfg
RD_Entity *first_entity = &rd_nil_entity;
RD_Entity *last_entity = &rd_nil_entity;
if(collection_entity_kind != RD_EntityKind_Nil)
@@ -2360,6 +2362,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, Rng2F32 rect)
rd_entity_change_parent(last_entity_next, last_entity_next->parent, last_entity_next->parent, first_entity_prev);
}
}
#endif
}
}