|  |  | @ -1,6 +1,8 @@ | 
			
		
	
		
		
			
				
					
					|  |  |  | class_name copyMediaPipe |  |  |  | class_name copyMediaPipe | 
			
		
	
		
		
			
				
					
					|  |  |  | extends Mod_Base |  |  |  | extends Mod_Base | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | var Blendshapes = preload("res://Mods/MediaPipe/MediaPipeController_BlendShapes.gd") | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | # ----------------------------------------------------------------------------- |  |  |  | # ----------------------------------------------------------------------------- | 
			
		
	
		
		
			
				
					
					|  |  |  | # Potentially configurable variables. |  |  |  | # Potentially configurable variables. | 
			
		
	
		
		
			
				
					
					|  |  |  | # ----------------------------------------------------------------------------- |  |  |  | # ----------------------------------------------------------------------------- | 
			
		
	
	
		
		
			
				
					|  |  | @ -27,12 +29,15 @@ var camera_aspect_ratio := 4.0 / 3.0 # Logitech C920 default? | 
			
		
	
		
		
			
				
					
					|  |  |  | var ik_chains: Array[copyMediaPipe_IKChain] = [] |  |  |  | var ik_chains: Array[copyMediaPipe_IKChain] = [] | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | @onready var tracking_root: Node3D = $TrackingRoot |  |  |  | @onready var tracking_root: Node3D = $TrackingRoot | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | @onready var landmark_template: MeshInstance3D = $TrackingRoot/LandmarkTemplate | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | @onready var head := { |  |  |  | @onready var head := { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	last_data     = null,                 # Most recent tracking data received. |  |  |  | 	last_data     = null,                 # Most recent tracking data received. | 
			
		
	
		
		
			
				
					
					|  |  |  | 	last_received = INF,                  # How long ago it was received (in seconds). |  |  |  | 	last_received = INF,                  # How long ago it was received (in seconds). | 
			
		
	
		
		
			
				
					
					|  |  |  | 	tracker       = $TrackingRoot/Head,   # Node for visualizing tracking data. |  |  |  | 	tracker       = $TrackingRoot/Head,   # Node for visualizing tracking data. | 
			
		
	
		
		
			
				
					
					|  |  |  | 	rest_pose     = Transform3D.IDENTITY, # Rest position of the head. |  |  |  | 	rest_pose     = Transform3D.IDENTITY, # Rest position of the head. | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | @onready var hands := { |  |  |  | @onready var hands := { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	left = { |  |  |  | 	left = { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		last_data     = null, |  |  |  | 		last_data     = null, | 
			
		
	
	
		
		
			
				
					|  |  | @ -90,11 +95,12 @@ func _process(delta: float) -> void: | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | ## Sets up 21 nodes for the landmarks that make up hand/finger tracking. |  |  |  | ## Sets up 21 nodes for the landmarks that make up hand/finger tracking. | 
			
		
	
		
		
			
				
					
					|  |  |  | func setup_hand_landmarks() -> void: |  |  |  | func setup_hand_landmarks() -> void: | 
			
		
	
		
		
			
				
					
					|  |  |  | 	const landmark_scene := preload("Resources/debug_landmark.tscn") |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 	for side in hands: |  |  |  | 	for side in hands: | 
			
		
	
		
		
			
				
					
					|  |  |  | 		var hand = hands[side] |  |  |  | 		var hand = hands[side] | 
			
		
	
		
		
			
				
					
					|  |  |  | 		for i in 21: |  |  |  | 		for i in 21: | 
			
		
	
		
		
			
				
					
					|  |  |  | 			var landmark := landmark_scene.instantiate() |  |  |  | 			var landmark: MeshInstance3D = landmark_template.duplicate(0) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			landmark.position = Vector3.ZERO | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			landmark.visible  = true | 
			
		
	
		
		
			
				
					
					|  |  |  | 			hand.tracker.add_child(landmark) |  |  |  | 			hand.tracker.add_child(landmark) | 
			
		
	
		
		
			
				
					
					|  |  |  | 			hand.landmarks.append(landmark) |  |  |  | 			hand.landmarks.append(landmark) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -349,8 +355,6 @@ func update_ik_chains() -> void: | 
			
		
	
		
		
			
				
					
					|  |  |  | 		chain.do_ik_chain() |  |  |  | 		chain.do_ik_chain() | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | func update_blendshapes() -> void: |  |  |  | func update_blendshapes() -> void: | 
			
		
	
		
		
			
				
					
					|  |  |  | 	const Blendshapes := preload("res://Mods/MediaPipe/MediaPipeController_BlendShapes.gd") |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 	var model := get_model() |  |  |  | 	var model := get_model() | 
			
		
	
		
		
			
				
					
					|  |  |  | 	if (not model) or (not head.last_data): return |  |  |  | 	if (not model) or (not head.last_data): return | 
			
		
	
		
		
			
				
					
					|  |  |  | 	var data: Dictionary = head.last_data.blendshapes |  |  |  | 	var data: Dictionary = head.last_data.blendshapes | 
			
		
	
	
		
		
			
				
					|  |  | @ -381,16 +385,16 @@ const INDEX_FINGER_DIP  :=  7 | 
			
		
	
		
		
			
				
					
					|  |  |  | const INDEX_FINGER_TIP  :=  8 |  |  |  | const INDEX_FINGER_TIP  :=  8 | 
			
		
	
		
		
			
				
					
					|  |  |  | const MIDDLE_FINGER_MCP :=  9 |  |  |  | const MIDDLE_FINGER_MCP :=  9 | 
			
		
	
		
		
			
				
					
					|  |  |  | const MIDDLE_FINGER_PIP := 10 |  |  |  | const MIDDLE_FINGER_PIP := 10 | 
			
		
	
		
		
			
				
					
					|  |  |  | const MIDDLE_FINGER_DIP := 11 |  |  |  | const MIDDLE_FINGER_DIP := 12 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | const MIDDLE_FINGER_TIP := 12 |  |  |  | const MIDDLE_FINGER_TIP := 13 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | const RING_FINGER_MCP   := 13 |  |  |  | const RING_FINGER_MCP   := 14 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | const RING_FINGER_PIP   := 14 |  |  |  | const RING_FINGER_PIP   := 15 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | const RING_FINGER_DIP   := 15 |  |  |  | const RING_FINGER_DIP   := 16 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | const RING_FINGER_TIP   := 16 |  |  |  | const RING_FINGER_TIP   := 17 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | const PINKY_MCP         := 17 |  |  |  | const PINKY_MCP         := 18 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | const PINKY_PIP         := 18 |  |  |  | const PINKY_PIP         := 19 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | const PINKY_DIP         := 19 |  |  |  | const PINKY_DIP         := 20 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | const PINKY_TIP         := 20 |  |  |  | const PINKY_TIP         := 21 | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | ## Calculate the hand rotation from the hand tracking's world landmarks. |  |  |  | ## Calculate the hand rotation from the hand tracking's world landmarks. | 
			
		
	
		
		
			
				
					
					|  |  |  | func get_hand_rotation(side: String, landmarks: Array[Vector3]) -> Basis: |  |  |  | func get_hand_rotation(side: String, landmarks: Array[Vector3]) -> Basis: | 
			
		
	
	
		
		
			
				
					|  |  | 
 |