-
Notifications
You must be signed in to change notification settings - Fork 341
ISX-2228: Add OrientationSensor (device orientation parity) #2468
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: im-parity/staging
Are you sure you want to change the base?
Changes from 4 commits
86d1342
9da5486
2bbf38b
732016b
c0e2796
50955a9
3699135
720fd82
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,44 @@ | ||
| using UnityEngine.InputSystem.Layouts; | ||
| using UnityEngine.InputSystem.LowLevel; | ||
|
|
||
| namespace UnityEngine.InputSystem.Controls | ||
| { | ||
| /// <summary> | ||
| /// A control reading a <see cref="DeviceOrientation"/> value. | ||
| /// </summary> | ||
| /// <remarks> | ||
| /// This is used by <see cref="OrientationSensor"/> to report the physical orientation of the device | ||
| /// (see <see cref="OrientationSensor.orientation"/>). It provides feature parity with the legacy | ||
| /// <c>UnityEngine.Input.deviceOrientation</c> property. | ||
| /// </remarks> | ||
| /// <seealso cref="OrientationSensor"/> | ||
| [InputControlLayout(hideInUI = true)] | ||
| public class OrientationControl : InputControl<DeviceOrientation> | ||
|
MorganHoarau marked this conversation as resolved.
Outdated
|
||
| { | ||
| /// <summary> | ||
| /// Default-initialize the control. | ||
| /// </summary> | ||
| /// <remarks> | ||
| /// Format of the control is <see cref="InputStateBlock.FormatInt"/> | ||
| /// by default. | ||
| /// </remarks> | ||
| public OrientationControl() | ||
| { | ||
| m_StateBlock.format = InputStateBlock.FormatInt; | ||
| } | ||
|
|
||
| /// <inheritdoc /> | ||
| public override unsafe DeviceOrientation ReadUnprocessedValueFromState(void* statePtr) | ||
| { | ||
| var intValue = stateBlock.ReadInt(statePtr); | ||
| return (DeviceOrientation)intValue; | ||
| } | ||
|
|
||
| /// <inheritdoc /> | ||
| public override unsafe void WriteValueIntoState(DeviceOrientation value, void* statePtr) | ||
| { | ||
| var valuePtr = (byte*)statePtr + (int)m_StateBlock.byteOffset; | ||
| *(int*)valuePtr = (int)value; | ||
| } | ||
|
Check warning on line 42 in Packages/com.unity.inputsystem/InputSystem/Runtime/Controls/OrientationControl.cs
|
||
| } | ||
| } | ||
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -60,6 +60,18 @@ internal struct LinearAccelerationState : IInputStateTypeInfo | |
|
|
||
| public FourCC format => kFormat; | ||
| } | ||
|
|
||
| internal struct OrientationState : IInputStateTypeInfo | ||
| { | ||
| public static FourCC kFormat => new FourCC('O', 'R', 'N', 'T'); | ||
|
|
||
| // Note: unlike the other sensors this value is *not* compensated for screen orientation. It reports | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Would it make sense to provide compensated value as well in the future you think? Generally I would argue that is a binding property - but just curious on your perspective after working with this?
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Doesn't this note now contradict current native implementation? |
||
| // the physical orientation of the device and thus must be independent of how the content is rendered. | ||
| [InputControl(name = "orientation", displayName = "Orientation", layout = "Orientation")] | ||
| public int orientation; | ||
|
|
||
| public FourCC format => kFormat; | ||
| } | ||
| } | ||
|
|
||
| namespace UnityEngine.InputSystem | ||
|
|
@@ -694,4 +706,109 @@ protected override void FinishSetup() | |
| base.FinishSetup(); | ||
| } | ||
| } | ||
|
|
||
| /// <summary> | ||
| /// Enum describing the physical orientation of a device as reported by <see cref="OrientationSensor"/>. | ||
| /// </summary> | ||
| /// <remarks> | ||
| /// The values mirror the legacy <c>UnityEngine.DeviceOrientation</c> enum so that content migrating from | ||
| /// <c>UnityEngine.Input.deviceOrientation</c> to the Input System observes identical semantics. Note that this | ||
| /// is a package-local enum, kept independent of the legacy input module. | ||
| /// </remarks> | ||
| /// <seealso cref="OrientationSensor"/> | ||
| public enum DeviceOrientation | ||
|
K-Tone marked this conversation as resolved.
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe it's just me but I find DeviceOrientation confusing since it's a quantised orientation of the screen more than anything else. Does it translate well to non-mobile sensors - I guess this mimics Input Manager president so fine by all means - just sharing a reaction since device orientation could also be seen as a Vector3 relative to some other reference Vector3 if not quantized. I would have suspected orientation could just be derived from the Attitude sensor as part of a binding but maybe I am wrong? At least that is how I have implemented orientation based bindings previously. How is this different from quantised Attitude sensor values? Is it due to getting corresponding enum from OS?
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Not sure it will cover everything, but Tomas wanted it named that way as there is also a concept of screen orientation. This one allow for value like device face up and down.
Currently, only mobile and web do have this. for gamepad, they are fed through device extension. |
||
| { | ||
| /// <summary>The orientation of the device cannot be determined.</summary> | ||
| Unknown = 0, | ||
|
|
||
| /// <summary>The device is in portrait mode, with the device held upright and the home button at the bottom.</summary> | ||
| Portrait = 1, | ||
|
|
||
| /// <summary>The device is in portrait mode but upside down, with the device held upright and the home button at the top.</summary> | ||
| PortraitUpsideDown = 2, | ||
|
|
||
| /// <summary>The device is in landscape mode, with the device held upright and the home button on the right side.</summary> | ||
| LandscapeLeft = 3, | ||
|
|
||
| /// <summary>The device is in landscape mode, with the device held upright and the home button on the left side.</summary> | ||
| LandscapeRight = 4, | ||
|
|
||
| /// <summary>The device is held parallel to the ground with the screen facing upwards.</summary> | ||
| FaceUp = 5, | ||
|
|
||
| /// <summary>The device is held parallel to the ground with the screen facing downwards.</summary> | ||
| FaceDown = 6, | ||
| } | ||
|
|
||
| /// <summary> | ||
| /// Input device representing the physical orientation of the device playing the content. | ||
| /// </summary> | ||
| /// <remarks> | ||
| /// The orientation sensor reports the physical orientation of the device (for example, whether it is held in | ||
| /// portrait or landscape, or lying face up or face down) as a discrete <see cref="DeviceOrientation"/> value. | ||
| /// It provides feature parity with the legacy <c>UnityEngine.Input.deviceOrientation</c> property. | ||
| /// | ||
| /// Unlike the other motion sensors, the reported value is not compensated for screen orientation; it always | ||
| /// describes the physical orientation of the hardware. | ||
| /// | ||
| /// <example> | ||
| /// <code> | ||
| /// class MyBehavior : MonoBehaviour | ||
| /// { | ||
| /// protected void OnEnable() | ||
| /// { | ||
| /// InputSystem.EnableDevice(OrientationSensor.current); | ||
| /// } | ||
| /// | ||
| /// protected void OnDisable() | ||
| /// { | ||
| /// InputSystem.DisableDevice(OrientationSensor.current); | ||
| /// } | ||
| /// | ||
| /// protected void Update() | ||
| /// { | ||
| /// var orientation = OrientationSensor.current.orientation.ReadValue(); | ||
| /// //... | ||
| /// } | ||
| /// } | ||
| /// </code> | ||
| /// </example> | ||
| /// </remarks> | ||
| [InputControlLayout(stateType = typeof(OrientationState), displayName = "Orientation")] | ||
| public class OrientationSensor : Sensor | ||
|
K-Tone marked this conversation as resolved.
Outdated
|
||
| { | ||
| /// <summary> | ||
| /// The physical orientation of the device. | ||
| /// </summary> | ||
| /// <value>Control reporting the current <see cref="DeviceOrientation"/>.</value> | ||
| public OrientationControl orientation { get; protected set; } | ||
|
|
||
| /// <summary> | ||
| /// The orientation sensor that was last added or had activity last. | ||
| /// </summary> | ||
| /// <value>Current orientation sensor or <c>null</c>.</value> | ||
| public static OrientationSensor current { get; private set; } | ||
|
|
||
| /// <inheritdoc /> | ||
| public override void MakeCurrent() | ||
| { | ||
| base.MakeCurrent(); | ||
| current = this; | ||
| } | ||
|
|
||
| /// <inheritdoc /> | ||
| protected override void OnRemoved() | ||
| { | ||
| base.OnRemoved(); | ||
| if (current == this) | ||
| current = null; | ||
| } | ||
|
|
||
| /// <inheritdoc /> | ||
| protected override void FinishSetup() | ||
| { | ||
| orientation = GetChildControl<OrientationControl>("orientation"); | ||
| base.FinishSetup(); | ||
| } | ||
| } | ||
| } | ||
Uh oh!
There was an error while loading. Please reload this page.