You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			85 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			85 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C#
		
	
using System.Collections;
 | 
						|
using System.Collections.Generic;
 | 
						|
using UnityEngine;
 | 
						|
 | 
						|
namespace Autohand{
 | 
						|
    public class GrabbablePoseCombiner : MonoBehaviour{
 | 
						|
        public List<GrabbablePose> poses = new List<GrabbablePose>();
 | 
						|
 | 
						|
        HandPoseData pose;
 | 
						|
 | 
						|
        public bool CanSetPose(Hand hand, Grabbable grab) {
 | 
						|
            foreach(var pose in poses) {
 | 
						|
                if(pose != null && pose.CanSetPose(hand, grab))
 | 
						|
                    return true;
 | 
						|
            }
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        public void AddPose(GrabbablePose pose) {
 | 
						|
            if(!poses.Contains(pose))
 | 
						|
                poses.Add(pose);
 | 
						|
        }
 | 
						|
 | 
						|
        private void OnDestroy()
 | 
						|
        {
 | 
						|
            for (int i = poses.Count - 1; i >= 0; i--)
 | 
						|
            {
 | 
						|
                Destroy(poses[i]);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public GrabbablePose GetClosestPose(Hand hand, Grabbable grab) {
 | 
						|
            List<GrabbablePose> possiblePoses = new List<GrabbablePose>();
 | 
						|
            foreach(var handPose in this.poses)
 | 
						|
                if(handPose != null && handPose.CanSetPose(hand, grab))
 | 
						|
                    possiblePoses.Add(handPose);
 | 
						|
            
 | 
						|
            float closestValue = float.MaxValue;
 | 
						|
            int closestIndex = 0;
 | 
						|
 | 
						|
 | 
						|
            for (int i = 0; i < possiblePoses.Count; i++){
 | 
						|
                var pregrabPos = hand.transform.position;
 | 
						|
                var pregrabRot = hand.transform.rotation;
 | 
						|
                var pregrabBodPos = hand.body.position;
 | 
						|
                var pregrabBodRot = hand.body.rotation;
 | 
						|
 | 
						|
                var tempContainer = AutoHandExtensions.transformRuler;
 | 
						|
                tempContainer.rotation = Quaternion.identity;
 | 
						|
                tempContainer.position = possiblePoses[i].transform.position;
 | 
						|
                tempContainer.localScale = possiblePoses[i].transform.lossyScale;
 | 
						|
 | 
						|
                var handMatch = AutoHandExtensions.transformRulerChild;
 | 
						|
                handMatch.position = hand.transform.position;
 | 
						|
                handMatch.rotation = hand.transform.rotation;
 | 
						|
 | 
						|
                pose = possiblePoses[i].GetHandPoseData(hand);
 | 
						|
 | 
						|
                handMatch.localPosition = pose.handOffset;
 | 
						|
                handMatch.localRotation = pose.localQuaternionOffset;
 | 
						|
 | 
						|
                var distance = Vector3.Distance(handMatch.position, pregrabPos);
 | 
						|
                var angleDistance = Quaternion.Angle(handMatch.rotation, pregrabRot) / 90f;
 | 
						|
 | 
						|
                var closenessValue = distance / possiblePoses[i].positionWeight + angleDistance / possiblePoses[i].rotationWeight;
 | 
						|
                if(closenessValue < closestValue) {
 | 
						|
                    closestIndex = i;
 | 
						|
                    closestValue = closenessValue;
 | 
						|
                }
 | 
						|
 | 
						|
                hand.transform.position = pregrabPos;
 | 
						|
                hand.transform.rotation = pregrabRot;
 | 
						|
                hand.body.position = pregrabBodPos;
 | 
						|
                hand.body.rotation = pregrabBodRot;
 | 
						|
            }
 | 
						|
 | 
						|
            return possiblePoses[closestIndex];
 | 
						|
        }
 | 
						|
 | 
						|
        internal int PoseCount() {
 | 
						|
            return poses.Count;
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |