Created
September 26, 2023 07:32
-
-
Save erodozer/64f3fc9b222b0226083bf3357b4519f6 to your computer and use it in GitHub Desktop.
Godot Spout2 example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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