376 lines
16 KiB
Plaintext
376 lines
16 KiB
Plaintext
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;
|
|
}
|
|
|
|
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"; |