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_entities: [..] *Entity; mouse_viewport_state: Interaction_State; last_right_mouse_click_time: float; menu_position: Vector2; } init_editor :: () { aspect_ratio := cast(float)engine.renderer.render_target_width / cast(float)engine.renderer.render_target_height; engine.editor.camera = create_perspective_camera(.{0, 10, -10}, yaw=0, pitch=-40, roll=0.0, fov=40, aspect=aspect_ratio); } 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.engine.input.mouse.x; // mouse_position.y = xx engine.engine.input.mouse.y; // // screen_size : Vector2; // screen_size.x = cast(float)engine.engine.window.width; // screen_size.y = cast(float)engine.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";