using System; using UnityEngine; namespace UDE_HAND_INTERACTION { public class HandStaticPose : MonoBehaviour { private StaticPoseDetector staticPoseDetector => GetComponentInParent(); public HandPose _handPose; [HideInInspector] public HandPose HandPose { get { if (_handPose == null) { _handPose = new(); if(name.Contains("left") || name.Contains("Left")) { _handPose.Handedness = Handedness.Left; } else { _handPose.Handedness = Handedness.Right; } } return _handPose; } } public enum Handness { Left, Right } public Handness handness => (Handness)_handPose.Handedness; [HideInInspector] public HandPerfabResource _HPResource; [HideInInspector] public GameObject _virtualHand; [Space(5)] public bool ConsiderWrist = false; private bool InDetected = false; public class StaticPoseDetectEventArgs : EventArgs { public HandStaticPose _Pose { get; private set; } public bool IsDetected { get; private set; } public StaticPoseDetectEventArgs(HandStaticPose pose, bool isDetected) { _Pose = pose; IsDetected = isDetected; } } public delegate void StaticPoseDetectResultEventHandler(object sender, StaticPoseDetectEventArgs e); public event StaticPoseDetectResultEventHandler OnPoseDetectResult; public void CreateVisualModel() { void Create() { var virtualHand = Instantiate(_HPResource.GetHand(HandPose.Handedness), transform); _virtualHand = virtualHand.gameObject; _virtualHand.name = "Visual" + transform.name; _virtualHand.GetComponentInChildren().material = staticPoseDetector.DefaultGrid; Pose pose = PoseManager.GlobalPoseScaled(transform, transform.GetPose(Space.Self)); virtualHand.SetPose(HandPose, pose); DestroyImmediate(virtualHand); DestroyImmediate(_virtualHand.GetComponent()); _virtualHand.transform.SetLocalPositionAndRotation(Vector3.zero, Quaternion.identity); } if(_virtualHand != null) { DestroyImmediate(_virtualHand); } Create(); } public void IsPoseDetected(bool result) { if (result != InDetected) { InDetected = result; OnPoseDetectResult(this, new StaticPoseDetectEventArgs(this, result)); } } } }