| 
						
						
						
					 | 
					 | 
					@ -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: | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |