From 89c95c0656f726de8d2eb023abc17b953c6031c3 Mon Sep 17 00:00:00 2001 From: Daniel Bross Date: Sun, 20 Oct 2024 00:46:44 +0200 Subject: [PATCH] Textfield time --- .build/.added_strings_w3.jai | 144 ++++++++++++++++---------------- core/transform.jai | 4 + editor/editor.jai | 5 ++ editor/editor_ui.jai | 18 ++-- ui/ui.jai | 5 ++ ui/widgets.jai | 154 +++++++++++++++++++++++++++++++++++ 6 files changed, 253 insertions(+), 77 deletions(-) diff --git a/.build/.added_strings_w3.jai b/.build/.added_strings_w3.jai index 36753e1..12240de 100644 --- a/.build/.added_strings_w3.jai +++ b/.build/.added_strings_w3.jai @@ -171,6 +171,78 @@ deserialize_entity :: (scene: *Scene, lines: [] string, e: *Block) { } } +// +// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:307. +// +serialize_entity :: (e: *Item, builder: *String_Builder) { + print_to_builder(builder, "type: Item\n"); + print_to_builder(builder, "entity.enabled: %\n", e.entity.enabled); + print_to_builder(builder, "entity.flags: %\n", e.entity.flags); + print_to_builder(builder, "entity.transform.position.x: %\n", e.entity.transform.position.x); + print_to_builder(builder, "entity.transform.position.y: %\n", e.entity.transform.position.y); + print_to_builder(builder, "entity.transform.position.z: %\n", e.entity.transform.position.z); + print_to_builder(builder, "entity.transform.orientation.x: %\n", e.entity.transform.orientation.x); + print_to_builder(builder, "entity.transform.orientation.y: %\n", e.entity.transform.orientation.y); + print_to_builder(builder, "entity.transform.orientation.z: %\n", e.entity.transform.orientation.z); + print_to_builder(builder, "entity.transform.orientation.w: %\n", e.entity.transform.orientation.w); + print_to_builder(builder, "entity.transform.scale.x: %\n", e.entity.transform.scale.x); + print_to_builder(builder, "entity.transform.scale.y: %\n", e.entity.transform.scale.y); + print_to_builder(builder, "entity.transform.scale.z: %\n", e.entity.transform.scale.z); + print_to_builder(builder, "entity.snap_offset.x: %\n", e.entity.snap_offset.x); + print_to_builder(builder, "entity.snap_offset.y: %\n", e.entity.snap_offset.y); + print_to_builder(builder, "entity.snap_offset.z: %\n", e.entity.snap_offset.z); + print_to_builder(builder, "entity.snap_intervals.x: %\n", e.entity.snap_intervals.x); + print_to_builder(builder, "entity.snap_intervals.y: %\n", e.entity.snap_intervals.y); + print_to_builder(builder, "entity.snap_intervals.z: %\n", e.entity.snap_intervals.z); +} + +// +// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:307. +// +deserialize_entity :: (scene: *Scene, lines: [] string, e: *Item) { + for line: lines { + values := split(line, ":"); + if values.count == 2 { + if trim(values[0], " ") == { + case "entity.enabled"; + scan2(values[1], "%", *e.entity.enabled); + case "entity.transform.position.x"; + scan2(values[1], "%", *e.entity.transform.position.x); + case "entity.transform.position.y"; + scan2(values[1], "%", *e.entity.transform.position.y); + case "entity.transform.position.z"; + scan2(values[1], "%", *e.entity.transform.position.z); + case "entity.transform.orientation.x"; + scan2(values[1], "%", *e.entity.transform.orientation.x); + case "entity.transform.orientation.y"; + scan2(values[1], "%", *e.entity.transform.orientation.y); + case "entity.transform.orientation.z"; + scan2(values[1], "%", *e.entity.transform.orientation.z); + case "entity.transform.orientation.w"; + scan2(values[1], "%", *e.entity.transform.orientation.w); + case "entity.transform.scale.x"; + scan2(values[1], "%", *e.entity.transform.scale.x); + case "entity.transform.scale.y"; + scan2(values[1], "%", *e.entity.transform.scale.y); + case "entity.transform.scale.z"; + scan2(values[1], "%", *e.entity.transform.scale.z); + case "entity.snap_offset.x"; + scan2(values[1], "%", *e.entity.snap_offset.x); + case "entity.snap_offset.y"; + scan2(values[1], "%", *e.entity.snap_offset.y); + case "entity.snap_offset.z"; + scan2(values[1], "%", *e.entity.snap_offset.z); + case "entity.snap_intervals.x"; + scan2(values[1], "%", *e.entity.snap_intervals.x); + case "entity.snap_intervals.y"; + scan2(values[1], "%", *e.entity.snap_intervals.y); + case "entity.snap_intervals.z"; + scan2(values[1], "%", *e.entity.snap_intervals.z); + } + } + } +} + // // String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:307. // @@ -285,78 +357,6 @@ deserialize_entity :: (scene: *Scene, lines: [] string, e: *Character) { } } -// -// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:307. -// -serialize_entity :: (e: *Item, builder: *String_Builder) { - print_to_builder(builder, "type: Item\n"); - print_to_builder(builder, "entity.enabled: %\n", e.entity.enabled); - print_to_builder(builder, "entity.flags: %\n", e.entity.flags); - print_to_builder(builder, "entity.transform.position.x: %\n", e.entity.transform.position.x); - print_to_builder(builder, "entity.transform.position.y: %\n", e.entity.transform.position.y); - print_to_builder(builder, "entity.transform.position.z: %\n", e.entity.transform.position.z); - print_to_builder(builder, "entity.transform.orientation.x: %\n", e.entity.transform.orientation.x); - print_to_builder(builder, "entity.transform.orientation.y: %\n", e.entity.transform.orientation.y); - print_to_builder(builder, "entity.transform.orientation.z: %\n", e.entity.transform.orientation.z); - print_to_builder(builder, "entity.transform.orientation.w: %\n", e.entity.transform.orientation.w); - print_to_builder(builder, "entity.transform.scale.x: %\n", e.entity.transform.scale.x); - print_to_builder(builder, "entity.transform.scale.y: %\n", e.entity.transform.scale.y); - print_to_builder(builder, "entity.transform.scale.z: %\n", e.entity.transform.scale.z); - print_to_builder(builder, "entity.snap_offset.x: %\n", e.entity.snap_offset.x); - print_to_builder(builder, "entity.snap_offset.y: %\n", e.entity.snap_offset.y); - print_to_builder(builder, "entity.snap_offset.z: %\n", e.entity.snap_offset.z); - print_to_builder(builder, "entity.snap_intervals.x: %\n", e.entity.snap_intervals.x); - print_to_builder(builder, "entity.snap_intervals.y: %\n", e.entity.snap_intervals.y); - print_to_builder(builder, "entity.snap_intervals.z: %\n", e.entity.snap_intervals.z); -} - -// -// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:307. -// -deserialize_entity :: (scene: *Scene, lines: [] string, e: *Item) { - for line: lines { - values := split(line, ":"); - if values.count == 2 { - if trim(values[0], " ") == { - case "entity.enabled"; - scan2(values[1], "%", *e.entity.enabled); - case "entity.transform.position.x"; - scan2(values[1], "%", *e.entity.transform.position.x); - case "entity.transform.position.y"; - scan2(values[1], "%", *e.entity.transform.position.y); - case "entity.transform.position.z"; - scan2(values[1], "%", *e.entity.transform.position.z); - case "entity.transform.orientation.x"; - scan2(values[1], "%", *e.entity.transform.orientation.x); - case "entity.transform.orientation.y"; - scan2(values[1], "%", *e.entity.transform.orientation.y); - case "entity.transform.orientation.z"; - scan2(values[1], "%", *e.entity.transform.orientation.z); - case "entity.transform.orientation.w"; - scan2(values[1], "%", *e.entity.transform.orientation.w); - case "entity.transform.scale.x"; - scan2(values[1], "%", *e.entity.transform.scale.x); - case "entity.transform.scale.y"; - scan2(values[1], "%", *e.entity.transform.scale.y); - case "entity.transform.scale.z"; - scan2(values[1], "%", *e.entity.transform.scale.z); - case "entity.snap_offset.x"; - scan2(values[1], "%", *e.entity.snap_offset.x); - case "entity.snap_offset.y"; - scan2(values[1], "%", *e.entity.snap_offset.y); - case "entity.snap_offset.z"; - scan2(values[1], "%", *e.entity.snap_offset.z); - case "entity.snap_intervals.x"; - scan2(values[1], "%", *e.entity.snap_intervals.x); - case "entity.snap_intervals.y"; - scan2(values[1], "%", *e.entity.snap_intervals.y); - case "entity.snap_intervals.z"; - scan2(values[1], "%", *e.entity.snap_intervals.z); - } - } - } -} - // // String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:315. // diff --git a/core/transform.jai b/core/transform.jai index b9146e4..7555c8a 100644 --- a/core/transform.jai +++ b/core/transform.jai @@ -67,6 +67,10 @@ translate :: (transform: *Transform, translation: Vector3, calculate_matrix: boo if calculate_matrix update_matrix(transform); } +euler_to_quaternion :: (value: Vector3) -> Quaternion { + return euler_to_quaternion(value.x, value.y, value.z); +} + euler_to_quaternion :: (yaw: float, pitch: float, roll: float) -> Quaternion { cy := cos(yaw * 0.5); sy := sin(yaw * 0.5); diff --git a/editor/editor.jai b/editor/editor.jai index f889fb2..13ede85 100644 --- a/editor/editor.jai +++ b/editor/editor.jai @@ -328,6 +328,11 @@ update_transform_gizmo :: (ray: Ray, mouse_position: Vector2) -> bool { } position_change := new_position - engine.editor.transform_gizmo.first_hit_position; + + // @Robustness: Why though? + position_change.z *= -1.0; + position_change.y *= -1.0; + scale_speed := ifx key_pressed(.SHIFT) then 4.0 else 1.0; if selected_entity.flags & .UNIFORM_SCALE { diff --git a/editor/editor_ui.jai b/editor/editor_ui.jai index a10cf54..ea386a5 100644 --- a/editor/editor_ui.jai +++ b/editor/editor_ui.jai @@ -173,12 +173,19 @@ editor_ui :: () { if engine.editor.selected_entities.count == 1 { entity := engine.editor.selected_entities[0]; - ui_slider(*slider_value, 0.0, 1.0); - ui_label(tprint("Name: %", entity.name)); + //ui_slider(*slider_value, 0.0, 1.0); + + ui_textfield("Name", *entity.name); + ui_label(tprint("Id: %", entity.id)); - ui_label(tprint("Position: % % %", entity.transform.position.x, entity.transform.position.y, entity.transform.position.z)); - ui_label(tprint("Rotation: % % % %", entity.transform.orientation.x, entity.transform.orientation.y, entity.transform.orientation.z, entity.transform.orientation.w)); - ui_label(tprint("Scale: % % %", entity.transform.scale.x, entity.transform.scale.y, entity.transform.scale.z)); + + ui_vector_field("Position", *entity.transform.position); + euler_rotation := quaternion_to_euler_v3(entity.transform.orientation); + euler_rotation *= RADIANS_TO_DEGREES; + ui_vector_field("Rotation", *euler_rotation); + euler_rotation *= DEGREES_TO_RADIANS; + entity.transform.orientation = euler_to_quaternion(euler_rotation); + ui_vector_field("Scale", *entity.transform.scale); } } @@ -189,6 +196,7 @@ editor_ui :: () { ui_pop_parent(); } +text_fun : string; slider_value : float = 0.0; base_editor_update :: () { diff --git a/ui/ui.jai b/ui/ui.jai index 9b732c9..5622768 100644 --- a/ui/ui.jai +++ b/ui/ui.jai @@ -36,6 +36,8 @@ Interaction_State :: struct { left_mouse_pressed: bool; right_mouse_pressed: bool; + editing: bool; + normalized_local_mouse_coordinates: Vector2; // Coordinates inside the rect in the range [0,1] } @@ -71,6 +73,8 @@ UI_Box :: struct { interaction : Interaction_State; + _number_text: Static_Array(u8, 8); + style : struct { texture: Texture_Handle; background_color: Color; @@ -971,4 +975,5 @@ padding_top : float; padding_bottom : float; #load "../core/stack.jai"; +#load "../core/static_array.jai"; diff --git a/ui/widgets.jai b/ui/widgets.jai index a6dd45b..3b90328 100644 --- a/ui/widgets.jai +++ b/ui/widgets.jai @@ -7,6 +7,15 @@ ui_full_size_background :: (color: Color = .{0,0,0,1}, identifier: s64 = 0, loc background := ui_box_make(.DRAW_BACKGROUND, hash=get_hash(loc, identifier)); } +ui_container_layout :: (color: Color = .{0,0,0,0}, identifier: s64 = 0, loc := #caller_location) { + ui_set_next_size_x(.CHILDREN_SUM); + ui_set_next_size_y(.CHILDREN_SUM); + + ui_set_next_background_color(color); + + container := ui_box_make(.DRAW_BACKGROUND, hash=get_hash(loc, identifier)); +} + ui_button :: (text: string, identifier: s64 = 0, loc := #caller_location) -> clicked: bool, Interaction_State { ui_set_next_text(text); ui_set_next_background_color(.{0.2,0.2,0.2,1}); @@ -99,6 +108,151 @@ ui_label_fill_parent_x :: (text: string, identifier: s64 = 0, loc := #caller_loc box := ui_box_make(.DRAW_TEXT | .ANIMATE_ON_HOVER, get_hash(loc, identifier)); } +ui_textfield :: (label: string, text: *string, identifier: s64 = 0, loc := #caller_location) { + ui_container_layout(); + ui_push_parent(ui_state.last_box, .LEFT, .HORIZONTAL); + { + ui_label(label); + ui_set_next_background_color(.{0.0,1.0,1.0,0.0}); + ui_set_next_border_color(.{0.3,0.3,0.3,1.0}); + ui_set_next_size_x(.PCT, 1); + + text_size := get_text_size(engine.renderer, < 0 { + ui_set_next_text(< 0 { + text.count -= 1; + } + } + + if key_down(.RETURN) { + outer.interaction.editing = false; + } + + if engine.input.has_char { + new_str := alloc_string(text.count + 1); + memcpy(new_str.data, text.data, text.count); + new_str[new_str.count-1] = xx engine.input.current_char; + free(< 0 { + ui_set_next_text(tprint("%", < 0 { + // text.count -= 1; + // } + // } + + // if key_down(.RETURN) { + // outer.interaction.editing = false; + // } + + // if engine.input.has_char { + // new_str := alloc_string(text.count + 1); + // memcpy(new_str.data, text.data, text.count); + // new_str[new_str.count-1] = xx engine.input.current_char; + // free(< clicked: bool, Interaction_State { ui_set_next_text(text); if selected {