From f953d9230e587566774110be048b7344e46a0b17 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Sun, 30 Jan 2022 21:17:09 -0600 Subject: [PATCH] added rendering all structure members to the editor --- src/entity/editor.onyx | 29 ++++++++++++++++++++++++++--- src/entity/manager.onyx | 9 ++++++--- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/entity/editor.onyx b/src/entity/editor.onyx index ad08f55..f9a7a4f 100644 --- a/src/entity/editor.onyx +++ b/src/entity/editor.onyx @@ -133,7 +133,7 @@ editor_draw :: () { } { // Draw sidebar, if necessary - sidebar_width = editor_openness * 300.0f; + sidebar_width = editor_openness * 400.0f; w := sidebar_width; x := ~~ window_width - w; y := 40.0f; @@ -163,9 +163,13 @@ editor_draw :: () { font_print(editor_font, x + 2, y + 20, info.name); - i := 0; + render_struct_fields(any.{~~entity, entity.type}, 0, x, y, w, h); +} + +#local render_struct_fields :: (v: any, i: i32, x, y, w, h: f32) -> (new_y: f32, new_i: i32) { + info := cast(^type_info.Type_Info_Struct) type_info.get_type_info(v.type); for info.members { - defer i += 1; + i += 1; y += 20; if i % 2 == 0 { @@ -174,7 +178,26 @@ editor_draw :: () { } font_print(editor_font, x + 22, y + 20, it.name); + + member_any := any.{cast(^u8) v.data + it.offset, it.type}; + + if type_info.get_type_info(it.type).kind == .Struct { + y, i = render_struct_fields(member_any, i, x + 20, y, w - 20, h); + + } elseif it.type == Entity_ID { + value_buf: [1024] u8; + entity_type := (entity_manager->get(*cast(^Entity_ID) member_any.data)).type; // Dereferencing null here + value_str := conv.format_va(value_buf, "{} ({})", .[member_any, .{^entity_type, type_expr}]); + font_print(editor_font, x + w - font_get_width(editor_font, value_str) - 2, y + 20, value_str); + + } else { + value_buf: [1024] u8; + value_str := conv.format_va(value_buf, "{}", .[member_any]); + font_print(editor_font, x + w - font_get_width(editor_font, value_str) - 2, y + 20, value_str); + } } + + return y, i; } #local { diff --git a/src/entity/manager.onyx b/src/entity/manager.onyx index 34e9c15..30aa7e9 100644 --- a/src/entity/manager.onyx +++ b/src/entity/manager.onyx @@ -2,8 +2,11 @@ use package core use package glfw3 -Entity_ID :: u32 Entity_Nothing :: cast(Entity_ID) 0 +Entity_ID :: #distinct u32 +#match hash.to_u32 macro (e: Entity_ID) => (package core.hash).to_u32(cast(u32) e); +#operator == (a, b: Entity_ID) => cast(u32) a == cast(u32) b; +#operator != (a, b: Entity_ID) => cast(u32) a != cast(u32) b; Entity :: struct { id: Entity_ID; @@ -106,12 +109,12 @@ entity_manager_register :: (use this: ^Entity_Manager, $entity_type: type_expr) } } -entity_manager_add :: (use this: ^Entity_Manager, entity: ^$T) -> u32 where IsEntity(^T) { +entity_manager_add :: (use this: ^Entity_Manager, entity: ^$T) -> Entity_ID where IsEntity(^T) { this->register(T); entity.type = T; entity.id = next_entity_id; - next_entity_id += 1; + next_entity_id = ~~(cast(u32) next_entity_id + 1); entities << entity; entity_map[entity.id] = entity; -- 2.25.1