132 lines
4.1 KiB
C#
132 lines
4.1 KiB
C#
/*
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
* All rights reserved.
|
|
*
|
|
* Licensed under the Oculus SDK License Agreement (the "License");
|
|
* you may not use the Oculus SDK except in compliance with the License,
|
|
* which is provided at the time of installation or download, or which
|
|
* otherwise accompanies this software in either electronic or hard copy form.
|
|
*
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* https://developer.oculus.com/licenses/oculussdk/
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, the Oculus SDK
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
using Oculus.Interaction.Body.Input;
|
|
using UnityEngine;
|
|
|
|
namespace Oculus.Interaction.Body.PoseDetection
|
|
{
|
|
public class BodyPoseComparerActiveStateDebugVisual : MonoBehaviour
|
|
{
|
|
[Tooltip("The PoseComparer to debug.")]
|
|
[SerializeField]
|
|
private BodyPoseComparerActiveState _bodyPoseComparer;
|
|
|
|
[Tooltip("Gizmos will be drawn at joint positions of this body pose.")]
|
|
[SerializeField, Interface(typeof(IBodyPose))]
|
|
private UnityEngine.Object _bodyPose;
|
|
private IBodyPose BodyPose;
|
|
|
|
[Tooltip("The root transform of the body skeleton. Debug " +
|
|
"gizmos will be drawn in the local space of this transform.")]
|
|
[SerializeField]
|
|
private Transform _root;
|
|
|
|
[Tooltip("The radius of the debug spheres.")]
|
|
[SerializeField, Delayed]
|
|
private float _radius = 0.1f;
|
|
|
|
public float Radius
|
|
{
|
|
get => _radius;
|
|
set => _radius = value;
|
|
}
|
|
|
|
protected virtual void Awake()
|
|
{
|
|
BodyPose = _bodyPose as IBodyPose;
|
|
}
|
|
|
|
protected virtual void Start()
|
|
{
|
|
this.AssertField(_bodyPoseComparer, nameof(_bodyPoseComparer));
|
|
this.AssertField(BodyPose, nameof(BodyPose));
|
|
this.AssertField(_root, nameof(BodyPose));
|
|
}
|
|
|
|
protected virtual void Update()
|
|
{
|
|
DrawJointSpheres();
|
|
}
|
|
|
|
private void DrawJointSpheres()
|
|
{
|
|
var featureStates = _bodyPoseComparer.FeatureStates;
|
|
foreach (var kvp in featureStates)
|
|
{
|
|
BodyJointId joint = kvp.Key.Joint;
|
|
var state = kvp.Value;
|
|
if (BodyPose.GetJointPoseFromRoot(joint, out Pose pose))
|
|
{
|
|
Vector3 jointPos = _root.TransformPoint(pose.position);
|
|
|
|
Color color;
|
|
if (state.Delta <= state.MaxDelta)
|
|
{
|
|
color = Color.green;
|
|
}
|
|
else if (state.MaxDelta > 0)
|
|
{
|
|
float amt = (state.Delta / state.MaxDelta) / 2f;
|
|
color = Color.Lerp(Color.yellow, Color.red, amt);
|
|
}
|
|
else
|
|
{
|
|
color = Color.red;
|
|
}
|
|
|
|
DebugGizmos.LineWidth = _radius / 2f;
|
|
DebugGizmos.Color = color;
|
|
DebugGizmos.DrawPoint(jointPos);
|
|
}
|
|
}
|
|
}
|
|
|
|
#region Inject
|
|
|
|
public void InjectAllBodyPoseComparerActiveStateDebugVisual(
|
|
BodyPoseComparerActiveState bodyPoseComparer,
|
|
IBodyPose bodyPose, Transform root)
|
|
{
|
|
InjectBodyPoseComparer(bodyPoseComparer);
|
|
InjectBodyPose(bodyPose);
|
|
InjectRootTransform(root);
|
|
}
|
|
|
|
public void InjectRootTransform(Transform root)
|
|
{
|
|
_root = root;
|
|
}
|
|
|
|
public void InjectBodyPoseComparer(BodyPoseComparerActiveState bodyPoseComparer)
|
|
{
|
|
_bodyPoseComparer = bodyPoseComparer;
|
|
}
|
|
|
|
public void InjectBodyPose(IBodyPose bodyPose)
|
|
{
|
|
_bodyPose = bodyPose as UnityEngine.Object;
|
|
BodyPose = bodyPose;
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|