//todo: Fix left hand preference private static void ProcessHand(IScene scene, GameObject hand, SteamVR_Input_Sources inputSource, ref GripInfo gripInfo) { if (hand == null) { return; } var handTransform = new Transform(1, hand.transform.rotation.ToClarity(true), hand.transform.position.ToClarity()); if (SteamVR_Actions.default_GrabGrip.GetStateDown(inputSource)) { var handPosition = hand.transform.position.ToClarity(); var node = scene .EnumerateAllNodes() .Where(x => x.HasComponent <ManipulateInPresentationComponent>()) .Select(x => x.SearchComponent <ITransformable3DComponent>()) .Where(x => x != null) .FirstOrDefault(x => (x.LocalBoundingSphere * x.Node.GlobalTransform).Contains(handPosition)) ?.Node; if (node != null) { var gripTransform = node.GlobalTransform * handTransform.Invert(); gripInfo = new GripInfo(node, gripTransform); } } if (!SteamVR_Actions.default_GrabGrip.GetState(inputSource)) { gripInfo = null; return; } if (gripInfo == null) { return; } var newGlobalTransform = gripInfo.GripTransform * handTransform; gripInfo.Node.Transform = newGlobalTransform * (gripInfo.Node.ParentNode?.GlobalTransform.Invert() ?? Transform.Identity); }
public GripInfo(ISceneNode node, Transform gripTransform) { Node = node; GripTransform = gripTransform; }