Initial commit

This commit is contained in:
2024-10-11 22:21:32 +02:00
commit 1bdd01e9b2
38 changed files with 11363 additions and 0 deletions

378
editor/editor.jai Normal file
View File

@@ -0,0 +1,378 @@
Gizmo_Space :: enum {
LOCAL;
WORLD;
}
Transform_Axis :: enum {
NONE;
UP;
FORWARD;
RIGHT;
CENTER;
}
Transform_Type :: enum {
TRANSLATION;
ROTATION;
SCALE;
}
Buffer_Info :: struct {
buffer: Buffer_Handle;
vertex_count: u32;
}
Transform_Gizmo :: struct {
active: bool = false;
transform_type: Transform_Type = .TRANSLATION;
space: Gizmo_Space;
selected_axis: Transform_Axis;
first_hit_position: Vector3;
actual_entity_position: Vector3; // The actual position of the selected entity. Used for snapping
actual_entity_scale: Vector3; // The actual position of the selected entity. Used for snapping
last_circle_dir: Vector3;
clicked: bool;
transform: Transform;
can_use: bool = true;
center_model_buffer: Buffer_Handle;
up_model_buffer: Buffer_Handle;
forward_model_buffer: Buffer_Handle;
right_model_buffer: Buffer_Handle;
color_center: Color;
color_up: Color;
color_forward: Color;
color_right: Color;
color_center_buffer: Buffer_Handle;
color_up_buffer: Buffer_Handle;
color_forward_buffer: Buffer_Handle;
color_right_buffer: Buffer_Handle;
uniform_gizmo_scale: float;
}
Editor :: struct {
show_menu: bool;
should_check_entities: bool;
camera: Camera;
transform_gizmo: Transform_Gizmo;
selected_entity: *Entity;
mouse_viewport_state: Interaction_State;
last_right_mouse_click_time: float;
menu_position: Vector2;
}
editor : Editor;
update_transform_gizmo :: (ray: Ray, mouse_position: Vector2) -> bool {
return false;
// selected_entity := engine.editor.selected_entity;
//
// if key_down(.TAB) {
// if engine.editor.transform_gizmo.space == {
// case .WORLD;
// engine.editor.transform_gizmo.space = .LOCAL;
// case .LOCAL;
// engine.editor.transform_gizmo.space = .WORLD;
// }
// }
//
// if engine.editor.transform_gizmo.space == {
// case .WORLD;
// set_rotation(*engine.editor.transform_gizmo.transform, .{0,0,0,1});
// case .LOCAL;
// set_rotation(*engine.editor.transform_gizmo.transform, selected_entity.transform.orientation);
// }
//
// if engine.editor.transform_gizmo.transform_type == {
// case .TRANSLATION;
// if !key_pressed(.MOUSE_LEFT) {
// selected_axis, t := intersect_translation_gizmo(ray);
// engine.editor.transform_gizmo.selected_axis = selected_axis;
// } else if engine.editor.transform_gizmo.can_use && engine.editor.transform_gizmo.selected_axis != .NONE {
// first_update := key_down(.MOUSE_LEFT);
//
// if first_update {
// engine.editor.transform_gizmo.actual_entity_position = selected_entity.transform.position;
// }
//
// // Move the currently selected entity along the selected axis
// axis_vec : Vector3;
//
// if engine.editor.transform_gizmo.selected_axis == {
// case .UP;
// axis_vec.y = 1;
// case .FORWARD;
// axis_vec.z = 1;
// case .RIGHT;
// axis_vec.x = 1;
// }
//
// r1 : Ray;
// r1.origin = selected_entity.transform.position;
// r1.direction = rotate(axis_vec, engine.editor.transform_gizmo.transform.orientation);
//
// r2 := normalized_screen_to_ray_v2(*engine.editor.camera, mouse_position);
//
// d, t1, t2 := closest_distance_between_rays(r1, r2);
//
// new_position := r1.origin + r1.direction * t1;
//
// if first_update {
// engine.editor.transform_gizmo.first_hit_position = new_position;
// }
//
// position_change := new_position - engine.editor.transform_gizmo.first_hit_position;
//
// entity_position := engine.editor.transform_gizmo.actual_entity_position + position_change;
//
// if selected_entity.flags & Entity_Flags.SNAP_TO_GRID {
// entity_position.x -= fmod_cycling(entity_position.x - selected_entity.snap_offset.x, selected_entity.snap_intervals.x);// + selected_entity.snap_offset.x;
// entity_position.y -= fmod_cycling(entity_position.y - selected_entity.snap_offset.y, selected_entity.snap_intervals.y);// + selected_entity.snap_offset.y;
// entity_position.z -= fmod_cycling(entity_position.z - selected_entity.snap_offset.z, selected_entity.snap_intervals.z);// + selected_entity.snap_offset.z;
// }
//
// selected_entity.transform.position = entity_position;
// set_position(*engine.editor.transform_gizmo.transform, entity_position);
// }
//
// color_up := engine.editor.transform_gizmo.color_up;
// color_forward := engine.editor.transform_gizmo.color_forward;
// color_right := engine.editor.transform_gizmo.color_right;
//
// if engine.editor.transform_gizmo.selected_axis == {
// case .NONE;
// case .UP;
// color_up = Color.{1,1,0,1};
// case .FORWARD;
// color_forward = Color.{1,1,0,1};
// case .RIGHT;
// color_right = Color.{1,1,0,1};
// }
//
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_up_buffer, *color_up, size_of(Color));
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_forward_buffer, *color_forward, size_of(Color));
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_right_buffer, *color_right, size_of(Color));
// case .ROTATION;
// selected_entity := engine.editor.selected_entity;
//
// if !engine.editor.transform_gizmo.clicked {
// selected_axis, point := intersect_rotation_gizmo(ray);
// engine.editor.transform_gizmo.selected_axis = selected_axis;
//
// if engine.editor.transform_gizmo.selected_axis != .NONE && key_down(.MOUSE_LEFT) {
// engine.editor.transform_gizmo.clicked = true;
// engine.editor.transform_gizmo.last_circle_dir = normalize(point - selected_entity.transform.position);
// }
// } else if !key_pressed(.MOUSE_LEFT) {
// engine.editor.transform_gizmo.clicked = false;
// } else {
// direction : Vector3;
// if engine.editor.transform_gizmo.selected_axis == {
// case .UP;
// direction = .{0,1,0};
// case .FORWARD;
// direction = .{0,0,1};
// case .RIGHT;
// direction = .{1,0,0};
// }
// direction = rotate(direction, engine.editor.transform_gizmo.transform.orientation);
//
// // Find the rotation
// circle : Circle;
// circle.radius = engine.editor.transform_gizmo.uniform_gizmo_scale;
// circle.center = selected_entity.transform.position;
// circle.orientation = direction;
//
// distance, point := closest_distance_ray_circle(ray, circle);
// new_dir := normalize(point - selected_entity.transform.position);
//
// dotp := dot(engine.editor.transform_gizmo.last_circle_dir, new_dir);
// angle := acos(clamp(dotp, -1.0, 1.0));
// cp := cross(engine.editor.transform_gizmo.last_circle_dir, new_dir);
//
// if dot(direction, cp) < 0 {
// angle *= -1.0;
// }
//
// q : Quaternion;
// set_from_axis_and_angle(*q, direction, angle);
//
// selected_entity.transform.orientation = q * selected_entity.transform.orientation;
// update_matrix(*selected_entity.transform);
//
// set_rotation(*engine.editor.transform_gizmo.transform, selected_entity.transform.orientation);
//
// engine.editor.transform_gizmo.last_circle_dir = new_dir;
// }
//
// color_up := engine.editor.transform_gizmo.color_up;
// color_forward := engine.editor.transform_gizmo.color_forward;
// color_right := engine.editor.transform_gizmo.color_right;
//
// if engine.editor.transform_gizmo.selected_axis == {
// case .NONE;
// case .UP;
// color_up = Color.{1,1,0,1};
// case .FORWARD;
// color_forward = Color.{1,1,0,1};
// case .RIGHT;
// color_right = Color.{1,1,0,1};
// }
//
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_up_buffer, *color_up, size_of(Color));
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_forward_buffer, *color_forward, size_of(Color));
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_right_buffer, *color_right, size_of(Color));
// case .SCALE;
// if !key_pressed(.MOUSE_LEFT) {
// selected_axis, t := intersect_scale_gizmo(ray);
// engine.editor.transform_gizmo.selected_axis = selected_axis;
// } else if engine.editor.transform_gizmo.selected_axis != .NONE {
// selected_entity := engine.editor.selected_entity;
// first_update := key_down(.MOUSE_LEFT);
//
// if first_update {
// engine.editor.transform_gizmo.actual_entity_position = selected_entity.transform.position;
// engine.editor.transform_gizmo.actual_entity_scale = selected_entity.transform.scale;
// }
//
// // Move the currently selected entity along the selected axis
// axis_vec : Vector3;
//
// if engine.editor.transform_gizmo.selected_axis == {
// case .UP;
// axis_vec.y = 1;
// case .FORWARD;
// axis_vec.z = -1;
// case .RIGHT;
// axis_vec.x = 1;
// case .CENTER; axis_vec = .{1,1,1};
// }
//
// r1 : Ray;
// r1.origin = selected_entity.transform.position;
// r1.direction = rotate(axis_vec, engine.editor.transform_gizmo.transform.orientation);
// // Shoot a ray from screen to world
// mouse_position : Vector2;
// mouse_position.x = xx engine.input.mouse.x;
// mouse_position.y = xx engine.input.mouse.y;
//
// screen_size : Vector2;
// screen_size.x = cast(float)engine.window.width;
// screen_size.y = cast(float)engine.window.height;
//
// r2 := screen_to_ray_v2(*engine.editor.camera, mouse_position, screen_size);
//
// d, t1, t2 := closest_distance_between_rays(r1, r2);
// new_position := r1.origin + r1.direction * t1;
//
// if first_update {
// engine.editor.transform_gizmo.first_hit_position = new_position;
// }
//
// position_change := new_position - engine.editor.transform_gizmo.first_hit_position;
// scale_speed := ifx key_pressed(.SHIFT) then 4.0 else 1.0;
//
// if selected_entity.uses_uniform_scale {
// current_scale := selected_entity.transform.scale;
//
// if engine.editor.transform_gizmo.selected_axis == {
// case .UP; {
// current_scale.y = engine.editor.transform_gizmo.actual_entity_scale.y + position_change.y * scale_speed;
// position_change.x = 0;
// position_change.z = 0;
// }
// case .FORWARD; {
// current_scale.z = engine.editor.transform_gizmo.actual_entity_scale.z + position_change.z * scale_speed;
// position_change.x = 0;
// position_change.y = 0;
// }
// case .RIGHT; {
// current_scale.x = engine.editor.transform_gizmo.actual_entity_scale.x + position_change.x * scale_speed;
// position_change.y = 0;
// position_change.z = 0;
// }
// case .CENTER; {
// current_scale.x = engine.editor.transform_gizmo.actual_entity_scale.x + position_change.x * scale_speed;
// current_scale.y = current_scale.x; // @Incomplete: This is most definitely wrong!
// current_scale.z = current_scale.x;
//
// position_change.y = 0;
// position_change.z = 0;
// }
// }
//
// set_scale(*selected_entity.transform, current_scale);
//
// } else {
// if engine.editor.transform_gizmo.selected_axis == {
// case .UP;
// position_change.x = 0;
// position_change.z = 0;
// case .FORWARD;
// position_change.x = 0;
// position_change.y = 0;
// case .RIGHT;
// position_change.y = 0;
// position_change.z = 0;
// }
//
// entity_scale := engine.editor.transform_gizmo.actual_entity_scale + position_change * scale_speed;
// set_scale(*selected_entity.transform, entity_scale);
// }
// }
//
// color_up := engine.editor.transform_gizmo.color_up;
// color_forward := engine.editor.transform_gizmo.color_forward;
// color_right := engine.editor.transform_gizmo.color_right;
// color_center := Color.{1,1,1,1};
//
// if engine.editor.transform_gizmo.selected_axis == {
// case .NONE;
// case .UP;
// color_up = Color.{1,1,0,1};
// case .FORWARD;
// color_forward = Color.{1,1,0,1};
// case .RIGHT;
// color_right = Color.{1,1,0,1};
// case .CENTER;
// color_center = Color.{1,1,0,1};
// }
//
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_center_buffer, *color_center, size_of(Color));
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_up_buffer, *color_up, size_of(Color));
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_forward_buffer, *color_forward, size_of(Color));
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_right_buffer, *color_right, size_of(Color));
// }
//
// return engine.editor.transform_gizmo.selected_axis != .NONE;
}
update_gizmo_buffers :: () {
// update_matrix(*engine.editor.transform_gizmo.transform);
//
// up_rotation := rotation_matrix(Matrix3, euler_to_quaternion(degrees_to_radians(90), degrees_to_radians(90), degrees_to_radians(0)));
// right_rotation := rotation_matrix(Matrix3, euler_to_quaternion(degrees_to_radians(90), degrees_to_radians(0), degrees_to_radians(90)));
// up_model := engine.editor.transform_gizmo.transform.model_matrix * up_rotation;
// right_model := engine.editor.transform_gizmo.transform.model_matrix * right_rotation;
// center_scale := make_scale_matrix4(.{0.15, 0.15, 0.15});
// center_model := engine.editor.transform_gizmo.transform.model_matrix * center_scale;
//
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.center_model_buffer, *center_model, size_of(Matrix4));
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.up_model_buffer, *up_model, size_of(Matrix4));
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.forward_model_buffer, *engine.editor.transform_gizmo.transform.model_matrix, size_of(Matrix4));
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.right_model_buffer, *right_model, size_of(Matrix4));
}
#load "editor_ui.jai";

310
editor/editor_ui.jai Normal file
View File

@@ -0,0 +1,310 @@
#load "../ui/widgets.jai";
pick_scene_view_at :: (coordinates: Vector2) {
ray := normalized_screen_to_ray_v2(*editor.camera, coordinates);
if editor.should_check_entities {
hit_entity : *Entity;
closest : float = 100000000;
for game_state.current_scene.entities {
if !(it.flags & .RENDERABLE) continue;
//if it.flags & Entity_Flags.DELETED || !it.selectable || 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 cast(*Entity)hit_entity != editor.selected_entity {
editor.selected_entity = hit_entity;
}
} else if editor.selected_entity != null {
editor.selected_entity = null;
}
}
}
editor_ui :: () {
ui_full_size_background();
ui_push_parent(ui_state.last_box, alignment=.LEFT, axis=.VERTICAL);
{
ui_set_next_padding(1);
ui_toolbar();
ui_push_parent(ui_state.last_box, alignment=.LEFT, axis=.HORIZONTAL);
{
if ui_toolbar_button("File") {
}
//ui_space(15, 10);
if ui_toolbar_button("Edit") {
}
//ui_space(15, 10);
if ui_toolbar_button("View") {
}
ui_space(20, 0);
//if mode == {
// case .PLAYING; {
// ui_set_next_background_color(.{0,0.6,0,1});
// if ui_button_with_texture(editor.icons.stop) {
// edit_current_scene();
// }
// ui_label(tprint("Playing '%'", current_scene.name), .{0,0.7,0,1});
// }
// case .EDITING; {
ui_set_next_background_color(.{0.6,0,0,1});
//if ui_button_with_texture(editor.icons.play) {
// play_current_editor_scene();
//}
ui_label(tprint("Editing '%'", game_state.current_scene.name), .{1,1,1,1});
//}
//}
}
ui_pop_parent();
ui_set_next_size_x(.PCT, 1.0);
ui_set_next_size_y(.PCT, 0.965);
ui_set_next_background_color(.{0,0,0,1});
background := ui_box(.NONE);
ui_push_parent(ui_state.last_box, alignment=.LEFT, axis=.HORIZONTAL);
{
ui_set_next_size_x(.PCT, 0.1);
ui_set_next_size_y(.PCT, 1.0);
ui_set_next_padding(1);
first_panel := ui_box(.NONE);
ui_push_parent(first_panel, alignment=.LEFT, axis=.VERTICAL);
{
ui_set_next_size_x(.PCT, 1.0);
ui_set_next_size_y(.PCT, 1.0);
ui_set_next_background_color(.{0.04, 0.04, 0.04, 1.0});
background := ui_box(.DRAW_BACKGROUND|.DRAW_BORDER);
ui_push_parent(background, alignment=.LEFT, axis=.VERTICAL);
{
ui_set_next_size_x(.PCT, 1.0);
ui_tab_title_bar("ENTITIES");
for game_state.current_scene.entities {
ui_set_next_padding(20);
clicked := false;
if it.name.count == 0 {
clicked = ui_clickable_label(tprint("%", it.type), it == editor.selected_entity, it_index);
} else {
clicked = ui_clickable_label(it.name, it == editor.selected_entity, it_index);
}
if clicked {
editor.selected_entity = it;
}
//ui_space(0, 5);
}
}
ui_pop_parent();
}
ui_pop_parent();
// Scene
ui_set_next_size_x(.PCT, 0.7);
ui_set_next_size_y(.PCT, 1.0);
ui_set_next_padding(1);
viewport_layer := ui_box(.NONE);
ui_push_parent(viewport_layer, alignment=.LEFT, axis=.VERTICAL);
{
ui_set_next_size_x(.PCT, 1.0);
ui_tab_title_bar("SCENE");
ui_set_next_size_x(.PCT, 1.0);
ui_set_next_size_y(.PCT, 0.9);
state := ui_interactable_texture(get_texture_from_pass("FXAA"));
if state.left_mouse_down {
//pick_scene_view_at(.{state.normalized_local_mouse_coordinates.x, 1.0 - state.normalized_local_mouse_coordinates.y});
}
editor.mouse_viewport_state = state;
ui_set_next_size_x(.PCT, 1.0);
ui_set_next_size_y(.PCT, 0.1);
ui_tab_title_bar("SCENES");
}
ui_pop_parent();
// Properties
ui_set_next_size_x(.PCT, 0.2);
ui_set_next_size_y(.PCT, 1.0);
ui_set_next_background_color(.{0.04, 0.04, 0.04, 1.0});
ui_set_next_padding(1);
inspector := ui_box(.DRAW_BACKGROUND | .DRAW_BORDER);
ui_push_parent(inspector, alignment=.LEFT, axis=.VERTICAL);
{
ui_set_next_size_x(.PCT, 1.0);
ui_tab_title_bar("PROPERTIES");
if editor.selected_entity != null {
ui_slider(*slider_value, 0.0, 1.0);
ui_label(tprint("Name: %", editor.selected_entity.name));
ui_label(tprint("Id: %", editor.selected_entity.id));
ui_label(tprint("Position: % % %", editor.selected_entity.transform.position.x, editor.selected_entity.transform.position.y, editor.selected_entity.transform.position.z));
ui_label(tprint("Rotation: % % % %", editor.selected_entity.transform.orientation.x, editor.selected_entity.transform.orientation.y, editor.selected_entity.transform.orientation.z, editor.selected_entity.transform.orientation.w));
ui_label(tprint("Scale: % % %", editor.selected_entity.transform.scale.x, editor.selected_entity.transform.scale.y, editor.selected_entity.transform.scale.z));
}
}
ui_pop_parent();
}
ui_pop_parent();
}
ui_pop_parent();
}
slider_value : float = 0.0;
base_editor_update :: () {
if editor.show_menu && (key_down(.MOUSE_LEFT) || key_down(.ESCAPE)) {
editor.show_menu = false;
eat_key(.MOUSE_LEFT);
}
// Check if we hit the gizmo
// @Incomplete: MOVE THIS
editor.should_check_entities = true;
if editor.selected_entity != null {
gizmo_scale := distance(editor.selected_entity.transform.position, editor.camera.position) * 0.1 * 0.5;
editor.transform_gizmo.uniform_gizmo_scale = gizmo_scale;
set_scale(*editor.transform_gizmo.transform, .{gizmo_scale, gizmo_scale, gizmo_scale});
coordinates := Vector2.{editor.mouse_viewport_state.normalized_local_mouse_coordinates.x, 1.0 - editor.mouse_viewport_state.normalized_local_mouse_coordinates.y};
ray := normalized_screen_to_ray_v2(*editor.camera, coordinates);
if update_transform_gizmo(ray, coordinates) {
editor.should_check_entities = false;
}
}
editor_ui();
//if editor.show_menu {
// placed_entity := imgui_show_place_entity();
// if placed_entity != null {
// // @Incomplete: At some point we want this to place entities at either a set distance or a distance depending on a raycast in the camera's forward direction so that we don't place things behind other entities
// set_position(*placed_entity.transform, editor.camera.position + editor.camera.forward * 30);
// editor.show_menu = false;
// editor.selected_entity = placed_entity;
// }
//}
camera := *editor.camera;
if key_pressed(.CTRL) && key_down(.S) {
save_scene(game_state.current_scene, "../assets/scenes/");
//show_message("Saved scene");
}
if editor.selected_entity != null {
// @Incomplete:@Incomplete: Duplicate
//if key_pressed(.CTRL) && key_down(.D) {
// make_directory_if_it_does_not_exist("../temp");
// save_entity(editor.selected_entity, "../temp/", "temp");
// duplicated := load_entity(editor_scene, "../temp/temp.ent");
// editor.selected_entity = duplicated;
//}
// DELETE
// DELETE
//if key_down(.DELETE) || key_down(.BACKSPACE) {
// delete_entity(editor.selected_entity);
// editor.selected_entity = null;
// editor.transform_gizmo.selected_axis = .NONE;
//}
}
//if key_pressed(.CTRL) && key_down(.Z) {
// editor_undo();
//}
if game_state.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 -= input.mouse.delta_x * MOUSE_SENSITIVITY;
camera.rotation.pitch += -input.mouse.delta_y * MOUSE_SENSITIVITY;
if key_down(.MOUSE_RIGHT) {
editor.last_right_mouse_click_time = time;
}
} else {
set_show_cursor(true);
if time - editor.last_right_mouse_click_time < 0.2 {
mouse_position : Vector2;
mouse_position.x = xx input.mouse.x;
mouse_position.y = xx input.mouse.y;
editor.show_menu = true;
editor.menu_position.x = mouse_position.x;
editor.menu_position.y = cast(float)renderer.render_target_height - mouse_position.y;
}
if key_down(.W) {
editor.transform_gizmo.transform_type = .TRANSLATION;
}
if key_down(.E) {
editor.transform_gizmo.transform_type = .ROTATION;
}
if key_down(.R) {
editor.transform_gizmo.transform_type = .SCALE;
}
}
update_view_matrix(camera);
}
if editor.selected_entity != null {
e := editor.selected_entity;
set_position(*editor.transform_gizmo.transform, e.transform.position);
update_gizmo_buffers();
}
//edit_scene_settings(*game_state.current_scene.settings);
}