Textfield time
This commit is contained in:
@@ -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.
|
||||
//
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 :: () {
|
||||
|
||||
@@ -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";
|
||||
|
||||
|
||||
154
ui/widgets.jai
154
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, <<text, ui_state.fonts.button);
|
||||
|
||||
ui_set_next_size_y(.PIXELS, text_size.y); // TODO
|
||||
ui_set_next_padding(5);
|
||||
|
||||
//ui_set_next_text_alignment(.CENTER_VERTICALLY);
|
||||
outer := ui_box_make(.ANIMATE_ON_HOVER | .CLICKABLE | .DRAW_BORDER, get_hash(loc, identifier));
|
||||
|
||||
if outer.interaction.editing {
|
||||
outer.style.border_color = .{0.3,0.3,1.0,1.0};
|
||||
}
|
||||
|
||||
ui_push_parent(outer, alignment=.LEFT, axis=.HORIZONTAL);
|
||||
{
|
||||
if text.count > 0 {
|
||||
ui_set_next_text(<<text);
|
||||
ui_set_next_text_color(.{1,1,1,1});
|
||||
ui_set_next_text_alignment(.CENTER_VERTICALLY);
|
||||
ui_set_next_text_color(.{1,1,1,1});
|
||||
ui_set_next_size_x(.TEXT_DIM);
|
||||
ui_set_next_size_y(.TEXT_DIM);
|
||||
text_widget := ui_box_make(.DRAW_TEXT, get_hash(loc, identifier));
|
||||
}
|
||||
|
||||
if outer.interaction.clicked {
|
||||
outer.interaction.editing = true;
|
||||
}
|
||||
|
||||
if outer.interaction.editing {
|
||||
if key_down(.BACKSPACE) {
|
||||
if text.count > 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(<<text);
|
||||
<<text = new_str;
|
||||
}
|
||||
|
||||
// Cursor
|
||||
ui_set_next_background_color(.{0.0,0.5,0.5,1.0});
|
||||
ui_set_next_size_x(.PIXELS, 3);
|
||||
ui_set_next_size_y(.PCT, 1);
|
||||
cursor := ui_box_make(.DRAW_BACKGROUND, get_hash(loc, identifier));
|
||||
}
|
||||
}
|
||||
ui_pop_parent();
|
||||
}
|
||||
ui_pop_parent();
|
||||
}
|
||||
|
||||
ui_float_field :: (value: *float, identifier: s64 = 0, loc := #caller_location) {
|
||||
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(.CHILDREN_SUM, 1);
|
||||
|
||||
text_size := get_text_size(engine.renderer, "0.00", ui_state.fonts.button);
|
||||
|
||||
ui_set_next_size_y(.PIXELS, text_size.y); // TODO
|
||||
ui_set_next_padding(5);
|
||||
|
||||
//ui_set_next_text_alignment(.CENTER_VERTICALLY);
|
||||
outer := ui_box_make(.ANIMATE_ON_HOVER | .CLICKABLE | .DRAW_BORDER, get_hash(loc, identifier));
|
||||
|
||||
if outer.interaction.editing {
|
||||
outer.style.border_color = .{0.3,0.3,1.0,1.0};
|
||||
}
|
||||
|
||||
ui_push_parent(outer, alignment=.LEFT, axis=.HORIZONTAL);
|
||||
{
|
||||
//text.count > 0 {
|
||||
ui_set_next_text(tprint("%", <<value));
|
||||
ui_set_next_text_color(.{1,1,1,1});
|
||||
ui_set_next_text_alignment(.CENTER_VERTICALLY);
|
||||
ui_set_next_text_color(.{1,1,1,1});
|
||||
ui_set_next_size_x(.TEXT_DIM);
|
||||
ui_set_next_size_y(.TEXT_DIM);
|
||||
text_widget := ui_box_make(.DRAW_TEXT, get_hash(loc, identifier));
|
||||
//}
|
||||
|
||||
if outer.interaction.clicked {
|
||||
outer.interaction.editing = true;
|
||||
}
|
||||
|
||||
//if outer.interaction.editing {
|
||||
// if key_down(.BACKSPACE) {
|
||||
// if text.count > 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(<<text);
|
||||
// <<text = new_str;
|
||||
// }
|
||||
|
||||
// // Cursor
|
||||
// ui_set_next_background_color(.{0.0,0.5,0.5,1.0});
|
||||
// ui_set_next_size_x(.PIXELS, 3);
|
||||
// ui_set_next_size_y(.PCT, 1);
|
||||
// cursor := ui_box_make(.DRAW_BACKGROUND, get_hash(loc, identifier));
|
||||
//
|
||||
}
|
||||
ui_pop_parent();
|
||||
}
|
||||
|
||||
ui_vector_field :: (label: string, value: *Vector3, identifier: s64 = 0, loc := #caller_location) {
|
||||
ui_container_layout(identifier=identifier, loc=loc);
|
||||
ui_push_parent(ui_state.last_box, .LEFT, .HORIZONTAL);
|
||||
{
|
||||
ui_label(label);
|
||||
ui_label("X");
|
||||
ui_float_field(*value.x);
|
||||
ui_label("Y");
|
||||
ui_float_field(*value.y);
|
||||
ui_label("Z");
|
||||
ui_float_field(*value.z);
|
||||
}
|
||||
ui_pop_parent();
|
||||
}
|
||||
|
||||
ui_clickable_label :: (text: string, selected: bool = false, identifier: s64 = 0, loc := #caller_location) -> clicked: bool, Interaction_State {
|
||||
ui_set_next_text(text);
|
||||
if selected {
|
||||
|
||||
Reference in New Issue
Block a user