Skip to content

Instantly share code, notes, and snippets.

@erodozer
Created September 26, 2023 07:32
Show Gist options
  • Save erodozer/64f3fc9b222b0226083bf3357b4519f6 to your computer and use it in GitHub Desktop.
Save erodozer/64f3fc9b222b0226083bf3357b4519f6 to your computer and use it in GitHub Desktop.
Godot Spout2 example
# requires https://github.com/you-win/spout-gd
extends TextureRect
@export var receiver_name: String = "" : set = update_receiver_name
@export var sender_name: String = "GodotSprout" : set = update_sender_name
var spout: Spout
# receiving image buffer
var image: Image
var is_sender = false : get = _is_sender
var sender_list = []
func _is_sender():
return not sender_name.is_empty()
func update_sender_name(sname):
sender_name = sname
if spout == null:
return
# in case a connection was already open
spout.release_receiver()
spout.release_sender()
if _is_sender():
print("sending image on sprout %s" % sname)
spout.set_sender_name(sname) # opens new connection
func update_receiver_name(rname):
receiver_name = rname
if spout == null:
return
# in case a connection was already open
spout.release_receiver()
spout.release_sender()
if not (receiver_name in sender_list):
print("sender not found %s" % rname)
return
if not _is_sender():
print("preparing to receive from sprout %s" % rname)
spout.set_receiver_name(rname)
image = Image.create(
spout.get_sender_width(), spout.get_sender_height(),
false,
Image.FORMAT_RGBA8
)
# Called when the node enters the scene tree for the first time.
func _ready():
spout = Spout.new()
image = Image.create(
100, 100, # placeholder buffer until we get a real image to show off
false,
Image.FORMAT_RGBA8
)
# existing receivers
sender_list = []
for i in range(spout.get_sender_count()):
var ext_sender_name = spout.get_sender(i)
sender_list.append(ext_sender_name)
print("spout sender found: %s" % ext_sender_name)
update_sender_name(sender_name)
update_receiver_name(receiver_name)
func send_image():
if not self.is_sender:
return
spout.send_image(
texture.get_image(),
texture.get_width(), texture.get_height(),
)
func receive_image():
if self.is_sender:
return
var active_name = spout.get_sender_name()
if active_name != receiver_name:
update_receiver_name(receiver_name)
return
# detect if source info has changed
# this is required before every receive call
if spout.is_updated():
image = Image.create(
spout.get_sender_width(), spout.get_sender_height(),
false,
Image.FORMAT_RGBA8
)
if spout.receive_image(image, Spout.FORMAT_RGBA):
texture.set_image(image)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
send_image()
receive_image()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment