e27f5522e2
Don't know why this is here. It just seems to set the filter to an identity. Which then quickly returns to where its supposed to be anyways.
65 lines
No EOL
1.7 KiB
C#
65 lines
No EOL
1.7 KiB
C#
using Ryujinx.Input.Motion;
|
|
using System;
|
|
using System.Numerics;
|
|
|
|
namespace Ryujinx.Input
|
|
{
|
|
public class MotionInput
|
|
{
|
|
public ulong TimeStamp { get; set; }
|
|
public Vector3 Accelerometer { get; set; }
|
|
public Vector3 Gyroscrope { get; set; }
|
|
public Vector3 Rotation { get; set; }
|
|
|
|
private readonly MotionSensorFilter _filter;
|
|
|
|
public MotionInput()
|
|
{
|
|
TimeStamp = 0;
|
|
Accelerometer = new Vector3();
|
|
Gyroscrope = new Vector3();
|
|
Rotation = new Vector3();
|
|
|
|
// TODO: RE the correct filter.
|
|
_filter = new MotionSensorFilter(0f);
|
|
}
|
|
|
|
public void Update(Vector3 accel, Vector3 gyro, ulong timestamp, int sensitivity, float deadzone)
|
|
{
|
|
if (TimeStamp != 0)
|
|
{
|
|
Accelerometer = -accel;
|
|
|
|
if (gyro.Length() < deadzone)
|
|
{
|
|
gyro = Vector3.Zero;
|
|
}
|
|
|
|
gyro *= (sensitivity / 100f);
|
|
|
|
Gyroscrope = gyro;
|
|
|
|
float deltaTime = MathF.Abs((long)(timestamp - TimeStamp) / 1000000f);
|
|
|
|
Vector3 deltaGyro = gyro * deltaTime;
|
|
|
|
Rotation += deltaGyro;
|
|
|
|
_filter.SamplePeriod = deltaTime;
|
|
_filter.Update(accel, DegreeToRad(gyro));
|
|
}
|
|
|
|
TimeStamp = timestamp;
|
|
}
|
|
|
|
public Matrix4x4 GetOrientation()
|
|
{
|
|
return Matrix4x4.CreateFromQuaternion(_filter.Quaternion);
|
|
}
|
|
|
|
private static Vector3 DegreeToRad(Vector3 degree)
|
|
{
|
|
return degree * (MathF.PI / 180);
|
|
}
|
|
}
|
|
} |