OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-tps / scenes / test / bridge_player.gd

69 lines · gd ref:
@tool
## Bridge wrapper for player_procedural — opens the bridge and exports
## the player's skeleton + meshes for posing in Blender.
##
## Usage:
##   1. Open this scene in the Godot editor
##   2. In Blender, connect to the bridge
##   3. Pose the skeleton in Blender → see it update here in real-time
##   4. F6 to re-export if needed
extends Node3D

@export var auto_start: bool = true
@export var socket_path: String = "/tmp/blender_bridge.sock"

var _bridge: BlenderBridge
var _started: bool = false


func _enter_tree() -> void:
	if not Engine.is_editor_hint():
		return
	call_deferred("_deferred_start")


func _deferred_start() -> void:
	if not auto_start or _started:
		return
	if not is_inside_tree():
		return

	_bridge = $BlenderBridge as BlenderBridge
	if _bridge == null:
		push_warning("BlenderBridge node not found")
		return

	_bridge.start_server(socket_path)

	# Export the player subtree (skeleton + meshes)
	var player: Node = $PlayerProcedural
	if player:
		_bridge.export_scene(player)

	_bridge.auto_sync = true
	_started = true
	print("[BridgePlayer] Server started — waiting for Blender connection")


func _exit_tree() -> void:
	if not Engine.is_editor_hint():
		return
	if _bridge != null and _started:
		_bridge.auto_sync = false
		_bridge.stop_server()
		_started = false
		print("[BridgePlayer] Server stopped")


func _process(_delta: float) -> void:
	if not Engine.is_editor_hint() or not _started:
		return
	if _bridge == null:
		return

	if Input.is_key_pressed(KEY_F6):
		var player: Node = $PlayerProcedural
		if player:
			_bridge.export_scene(player)
			print("[BridgePlayer] Player re-exported (F6)")