Files
coven/editor/editor_ui.jai

313 lines
10 KiB
Plaintext

#load "../ui/widgets.jai";
pick_scene_view_at :: (camera: Camera, coordinates: Vector2) {
ray := normalized_screen_to_ray(camera, coordinates);
if engine.editor.should_check_entities {
hit_entity : *Entity;
closest : float = 100000000;
for engine.current_scene.entities {
if !(it.flags & .RENDERABLE) continue;
if it.flags & Entity_Flags.DELETED || it.parent != null continue;
success, dist := ray_entity_intersect(ray, it);
if success && dist < closest {
closest = dist;
hit_entity = it;
}
}
if hit_entity != null {
if !array_find(engine.editor.selected_entities, hit_entity) {
if !key_pressed(.CTRL) {
engine.editor.selected_entities.count = 0;
}
array_add(*engine.editor.selected_entities, hit_entity);
} else {
array_unordered_remove_by_value(*engine.editor.selected_entities, hit_entity);
}
} else {
engine.editor.selected_entities.count = 0;
}
}
}
editor_ui :: () {
// Scene picking
blocking_input := ImGui.GetIO().WantCaptureMouse || ImGui.GetIO().WantCaptureKeyboard;
if !blocking_input {
if key_down(.MOUSE_LEFT) {
if engine.current_scene != null {
coords := engine.input.normalized_viewport_mouse_position;
pick_scene_view_at(engine.editor.camera, .{coords.x, 1.0-coords.y});
}
}
}
{
ImGui.Begin("Create", flags=ImGui.WindowFlags.NoResize);
new_entity := editor_ui_entity_creation();
if new_entity != null {
set_position(*new_entity.transform, engine.editor.camera.position + engine.editor.camera.forward * 20.0);
engine.editor.selected_entities.count = 0;
array_add(*engine.editor.selected_entities, new_entity);
}
ImGui.End();
ImGui.Begin("Create Mesh Entity", flags=ImGui.WindowFlags.NoResize);
for mesh_entity_files {
ImGui.PushID(to_temp_c_string(it.full_path)) ;
defer ImGui.PopID();
if ImGui.Button(to_temp_c_string(it.full_path)) {
mesh_entity := new_mesh_entity(init=false);
mesh_entity.model_path = it.full_path;
init_entity(mesh_entity);
new_entity = mesh_entity;
break;
}
}
//set_position(*new_entity.transform, engine.editor.camera.position + engine.editor.camera.forward * 20.0);
//engine.editor.selected_entities.count = 0;
//array_add(*engine.editor.selected_entities, new_entity);
ImGui.End();
if new_entity != null {
set_position(*new_entity.transform, engine.editor.camera.position + engine.editor.camera.forward * 20.0);
engine.editor.selected_entities.count = 0;
array_add(*engine.editor.selected_entities, new_entity);
}
}
ImGui.Begin("Entities");
if engine.current_scene != null {
for engine.current_scene.entities {
if it.flags & .DELETED continue;
clicked := false;
selected := array_find(engine.editor.selected_entities, it);
label : *u8;
if it.name.count == 0 {
label = tprint_c("%", it.type);
} else {
label = to_temp_c_string(it.name);
//clicked = ui_clickable_label(it.name, selected, it.id);
}
ImGui.PushID(tprint("%", it_index));
clicked = ImGui.Selectable(label, selected);
ImGui.PopID();
if clicked {
if !key_pressed(.CTRL) {
engine.editor.selected_entities.count = 0;
array_add(*engine.editor.selected_entities, it);
} else {
if selected {
array_unordered_remove_by_value(*engine.editor.selected_entities, it);
} else {
array_add(*engine.editor.selected_entities, it);
}
}
}
}
}
ImGui.End();
ImGui.Begin("Settings");
{
if engine.editor.transform_gizmo.snap_to_grid {
if ImGui.Button("Snap to grid enabled") {
engine.editor.transform_gizmo.snap_to_grid = false;
}
} else {
if ImGui.Button("Snap to grid disabled") {
engine.editor.transform_gizmo.snap_to_grid = true;
}
}
if engine.editor.transform_gizmo.space == .LOCAL {
if ImGui.Button("LOCAL") {
engine.editor.transform_gizmo.space = .WORLD;
}
} else {
if ImGui.Button("WORLD") {
engine.editor.transform_gizmo.space = .LOCAL;
}
}
}
ImGui.End();
// Properties
{
if engine.editor.selected_entities.count == 1 {
ImGui.Begin("Properties");
if engine.editor.selected_entities.count == 1 {
entity := engine.editor.selected_entities[0];
entity_ui(entity);
}
ImGui.End();
}
}
}
text_fun : string;
slider_value : float = 0.0;
base_editor_update :: () {
if !engine.editor.hide_ui || engine.mode == .EDITING {
editor_ui();
}
camera := *engine.editor.camera;
capture_mouse := ImGui.GetIO().WantCaptureMouse;
capture_keyboard := ImGui.GetIO().WantCaptureKeyboard;
if engine.editor.focused_widget == null && engine.mode == .EDITING {
engine.editor.should_check_entities = true;
if engine.editor.selected_entities.count > 0 {
entity := engine.editor.selected_entities[0];
gizmo_scale := distance(entity.transform.position, engine.editor.camera.position) * 0.1 * 0.5;
engine.editor.transform_gizmo.uniform_gizmo_scale = gizmo_scale;
set_scale(*engine.editor.transform_gizmo.transform, .{gizmo_scale, gizmo_scale, gizmo_scale});
coordinates := engine.input.normalized_viewport_mouse_position;
coordinates.y = 1.0 - coordinates.y;
//coordinates := Vector2.{engine.editor.mouse_viewport_state.normalized_local_mouse_coordinates.x, 1.0 - engine.editor.mouse_viewport_state.normalized_local_mouse_coordinates.y};
ray := normalized_screen_to_ray(engine.editor.camera, coordinates);
if !capture_mouse {
if update_transform_gizmo(ray, coordinates) {
engine.editor.should_check_entities = false;
}
}
}
if !capture_keyboard {
if key_pressed(.CTRL) && key_down(.Z) {
undo();
}
if key_pressed(.CTRL) && key_down(.S) {
save_scene(engine.current_scene, "../assets/scenes/");
//show_message("Saved scene");
}
if key_down(.DELETE) || key_down(.BACKSPACE) {
for engine.editor.selected_entities {
mark_entity_deleted(it);
}
engine.editor.transform_gizmo.selected_axis = .NONE;
engine.editor.selected_entities.count = 0;
}
if key_pressed(.CTRL) && key_down(.D) {
duplicated_entities: [..] *Entity;
duplicated_entities.allocator = temp;
for e: engine.editor.selected_entities {
array_add(*duplicated_entities, duplicate_entity(e));
}
engine.editor.selected_entities.count = 0;
for e: duplicated_entities {
array_add(*engine.editor.selected_entities, e);
}
}
}
}
if engine.mode == .EDITING {
if key_pressed(.MOUSE_RIGHT) {
set_show_cursor(false);
// Update camera
mouse_speed :: 54.0;
dir : Vector3;
if key_pressed(.W) {
dir += camera.forward;
} else if key_pressed(.S) {
dir += -camera.forward;
}
if key_pressed(.A) {
dir += -camera.right;
} else if key_pressed(.D) {
dir += camera.right;
}
if key_pressed(.Q) {
dir += -camera.up;
} else if key_pressed(.E) {
dir += camera.up;
}
dir = normalize(dir);
if length(dir) > 0.05 {
multiplier := ifx key_pressed(.SHIFT) then 10.0 else 1.0;
camera.position += dir * 20.0 * multiplier * dt;
//print("Camera position %\n", camera.position);
}
MOUSE_SENSITIVITY :: 0.06;
camera.rotation.yaw -= engine.input.mouse.delta_x * MOUSE_SENSITIVITY;
camera.rotation.pitch += -engine.input.mouse.delta_y * MOUSE_SENSITIVITY;
if key_down(.MOUSE_RIGHT) {
engine.editor.last_right_mouse_click_time = time;
}
} else {
set_show_cursor(true);
if time - engine.editor.last_right_mouse_click_time < 0.2 {
mouse_position : Vector2;
mouse_position.x = xx engine.input.mouse.x;
mouse_position.y = xx engine.input.mouse.y;
engine.editor.show_menu = true;
engine.editor.menu_position.x = mouse_position.x;
engine.editor.menu_position.y = cast(float)engine.renderer.render_target_height - mouse_position.y;
}
if !engine.editor.focused_widget && !key_pressed(.CTRL) {
if key_down(.W) {
engine.editor.transform_gizmo.transform_type = .TRANSLATION;
}
if key_down(.E) {
engine.editor.transform_gizmo.transform_type = .ROTATION;
}
if key_down(.R) {
engine.editor.transform_gizmo.transform_type = .SCALE;
}
}
}
update_view_matrix(camera);
}
if key_pressed(.CTRL) && key_down(.U) {
engine.editor.hide_ui = !engine.editor.hide_ui;
}
if key_pressed(.CTRL) && key_down(.E) {
new_mode := ifx engine.mode == .EDITING then Engine_Mode.PLAYING else .EDITING;
switch_engine_mode(new_mode);
}
}