Pascal Serrarens 17741d862a First commit
2022-01-12 10:50:57 +01:00

116 lines
4.4 KiB
C#

using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace Passer.Humanoid {
using Passer.Tracking;
public class HeadSensor : HumanoidSensor {
protected HeadTarget headTarget {
get { return target as HeadTarget; }
}
protected HumanoidControl humanoid {
get { return headTarget.humanoid; }
}
protected new Humanoid.Tracking.HeadSensor sensor;
public SensorComponent hmd;
#region Manage
public virtual void CheckSensor(HeadTarget headTarget) {
if (this.headTarget == null)
this.target = headTarget;
}
#endregion
#region Start
public virtual void Init(HeadTarget headTarget) {
target = headTarget;
}
public override void Start(HumanoidControl _humanoid, Transform targetTransform) {
target = targetTransform.GetComponent<HeadTarget>();
base.Start(_humanoid, targetTransform);
}
#if UNITY_EDITOR
public void InitController(SerializedProperty sensorProp, HeadTarget target) {
if (sensorProp == null)
return;
Init(target);
SerializedProperty sensorTransformProp = sensorProp.FindPropertyRelative("sensorTransform");
sensorTransformProp.objectReferenceValue = sensorTransform;
SerializedProperty targetProp = sensorProp.FindPropertyRelative("target");
targetProp.objectReferenceValue = base.target;
if (tracker == null || !tracker.enabled || !enabled)
return;
CheckSensorTransform();
ShowSensor(target.humanoid.showRealObjects && target.showRealObjects);
SerializedProperty sensor2TargetPositionProp = sensorProp.FindPropertyRelative("sensor2TargetPosition");
sensor2TargetPositionProp.vector3Value = sensor2TargetPosition;
SerializedProperty sensor2TargetRotationProp = sensorProp.FindPropertyRelative("sensor2TargetRotation");
sensor2TargetRotationProp.quaternionValue = sensor2TargetRotation;
}
public void RemoveController(SerializedProperty sensorProp) {
if (sensorProp == null)
return;
SerializedProperty sensorTransformProp = sensorProp.FindPropertyRelative("sensorTransform");
sensorTransformProp.objectReferenceValue = null;
}
#endif
protected virtual void CreateSensorTransform(string resourceName, Vector3 sensor2TargetPosition, Quaternion sensor2TargetRotation) {
CreateSensorTransform(headTarget.head.target.transform, resourceName, sensor2TargetPosition, sensor2TargetRotation);
}
#endregion
#region Update
public override void Update() {
if (tracker == null || !tracker.enabled || !enabled)
return;
status = sensor.Update();
UpdateSensorTransform(sensor);
if (status != Tracker.Status.Tracking)
return;
UpdateHeadTargetTransform(sensor);
}
protected virtual void UpdateHeadTargetTransform(Humanoid.Tracking.HeadSensor headTracker) {
if (headTarget.head.target.transform != null) {
if (headTracker.head.confidence.rotation > 0)
headTarget.head.target.transform.rotation = HumanoidTarget.ToQuaternion(headTracker.head.rotation) * sensor2TargetRotation;
if (headTracker.head.confidence.position > 0)
headTarget.head.target.transform.position = HumanoidTarget.ToVector3(headTracker.head.position) + headTarget.head.target.transform.rotation * sensor2TargetPosition;
headTarget.head.target.confidence = headTracker.head.confidence;
}
}
virtual protected void UpdateNeckTargetFromHead() {
Vector3 headPosition = headTarget.head.target.transform.position;
Quaternion headRotation = headTarget.head.target.transform.rotation;
headTarget.neck.target.transform.rotation = headTarget.head.target.transform.rotation;
headTarget.neck.target.transform.position = headPosition - headTarget.neck.target.transform.rotation * Vector3.up * headTarget.neck.bone.length;
headTarget.head.target.transform.position = headPosition;
headTarget.head.target.transform.rotation = headRotation;
}
#endregion
}
}