using Cirno.Scripts.Misc; using Godot; namespace Cirno.Scripts.Components.Actors; public partial class MouseAimProvider3D : Node3D, IMouseAimProvider { private Viewport _viewport; public override void _Ready() { _viewport = GetViewport(); } public Vector2 GetMouseAimInput() { var mouseWorldPos = GetMouseWorldPosition(this.GlobalPosition.Y); var direction = (mouseWorldPos - this.GlobalPosition).Normalized(); return new Vector2(direction.X, direction.Z); } public Vector3 GetMouseWorldPosition(float planeHeight = 0) { var mousePos = _viewport.GetMousePosition(); var rayOrigin = CameraController3D.Instance.ProjectRayOrigin(mousePos); var rayDirection = CameraController3D.Instance.ProjectRayNormal(mousePos); var plane = new Plane(Vector3.Up, planeHeight); var intersection = plane.IntersectsRay(rayOrigin, rayDirection); return intersection ?? Vector3.Zero; } }