diff --git a/JobServer.gd b/JobServer.gd index 57564cd..6ed2613 100644 --- a/JobServer.gd +++ b/JobServer.gd @@ -1,8 +1,59 @@ extends HTTPRequest -func GetJob(): - print("Fetching Job") - request("http://127.0.0.1:8000/template.json") - var res = await request_completed - var json = JSON.parse_string(res[3].get_string_from_utf8()) - return json +var socket = WebSocketPeer.new() + +func InitWebsocket(): + print("Connecting websocket ") + var i = 0 + while socket.get_ready_state() != WebSocketPeer.STATE_OPEN: + socket.connect_to_url($"/root/Main".websocket_url, TLSOptions.client_unsafe()) + socket.poll() + + + socket.send_text(str({"register": 1})) + print("Connected") + while true: + await PollWebsocket() + + +func PollWebsocket(): + var main = $"/root/Main" + socket.poll() + var state = socket.get_ready_state() + if state == WebSocketPeer.STATE_OPEN: + while socket.get_available_packet_count(): + var packet = socket.get_packet() + var json = JSON.parse_string(packet.get_string_from_utf8()) + print("Packet: ", packet.slice(0,5), "...") + if "welcome" in json: + print("Registered as client %s" % json["welcome"]["clientId"]) + if "job" in json: + var job = json["job"] + print("Recevied Job ", job["jobId"]) + main.rendering = true + var result = await $"../Renderer".RenderJob(job) + var response = { + "result": { + "jobId": job["jobId"], + "path": $"/root/Main".public_path + result + } + } + socket.send_text(str(response)) + print("Sent result ", result) + main.rendering = false + elif state == WebSocketPeer.STATE_CLOSING: + # Keep polling to achieve proper close. + pass + elif state == WebSocketPeer.STATE_CLOSED: + var code = socket.get_close_code() + var reason = socket.get_close_reason() + print("WebSocket closed with code: %d, reason %s. Clean: %s" % [code, reason, code != -1]) + print("Attempting reconnect in 10") + set_process(false) # Stop processing. + await get_tree().create_timer(10).timeout + InitWebsocket() + +func _process(_delta): + pass + + diff --git a/Main.gd b/Main.gd new file mode 100644 index 0000000..5ccaa8b --- /dev/null +++ b/Main.gd @@ -0,0 +1,20 @@ +extends Node2D + +var config = ConfigFile.new() + +var websocket_url +var public_path +var rendering = false +signal finished_rendering + +# Called when the node enters the scene tree for the first time. +func _ready(): + config.load("res://config.cfg") + websocket_url = config.get_value("core", "websocket_url") + public_path = config.get_value("core", "public_path") + + print("Starting render node") + $JobServer.InitWebsocket() + +func FinishedRendering(): + rendering = false diff --git a/render.gd b/Renderer.gd similarity index 74% rename from render.gd rename to Renderer.gd index 41caa41..b3cefe5 100644 --- a/render.gd +++ b/Renderer.gd @@ -1,9 +1,11 @@ extends Node2D var counter = 1 + # Called when the node enters the scene tree for the first time. func _ready(): - print("render ready") + pass + """ var job = await $JobServer.GetJob() var jobHash = str([job["size"], job["elements"]]).sha1_text() print("Job hash %s" % jobHash) @@ -13,20 +15,38 @@ func _ready(): print("Skipping, file exists") get_tree().quit() return + """ + #DisplayServer.window_set_size(Vector2(job["size"]["width"], job["size"]["height"])) + #await RenderComposition(job["elements"]) + #await RenderingServer.frame_post_draw + # Get rendered image + #var img = get_viewport().get_texture().get_image() + + #img.save_png(outFile) + #get_tree().quit() + +func RenderJob(job): + print("Rendering ", job["jobId"]) + var renderContainer = $"/root/Main/RenderContainer" + for node in renderContainer.get_children(): + renderContainer.remove_child(node) + node.free() + print("Cleared Render container") DisplayServer.window_set_size(Vector2(job["size"]["width"], job["size"]["height"])) await RenderComposition(job["elements"]) await RenderingServer.frame_post_draw # Get rendered image var img = get_viewport().get_texture().get_image() + var outFile = "%s_%s.png" % [job["type"],job["jobId"]] + img.save_png("output/" + outFile) - img.save_png(outFile) - #get_tree().quit() + return outFile # Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta): +func _process(_delta): pass func run_test(): @@ -46,12 +66,12 @@ func RenderComposition(composition): func RenderImage(def): var imageNode = TextureRect.new() var image = Image.new() - image = await $Remote.GetRemoteImage(def["asset"]) + image = await $"../Remote".GetRemoteImage(def["asset"]) var texture = ImageTexture.new() texture = ImageTexture.create_from_image(image) texture.set_size_override(Vector2(def["width"], def["height"])) imageNode.texture = texture - $Placeholder.add_sibling(imageNode) + $"/root/Main/RenderContainer".add_child(imageNode) func RenderLabel(def): var textNode = Label.new() @@ -72,11 +92,11 @@ func RenderLabel(def): var alignments = { "left": HORIZONTAL_ALIGNMENT_LEFT, "right": HORIZONTAL_ALIGNMENT_RIGHT, "center": HORIZONTAL_ALIGNMENT_CENTER, "fill": HORIZONTAL_ALIGNMENT_FILL } textNode.horizontal_alignment = alignments[def["horizontalAlignment"]] - get_tree().get_root().add_child(textNode) + $"/root/Main/RenderContainer".add_child(textNode) func render(): print("Rendering frame %s" % counter) - var tstamp_label = $Placeholder/tstamp + var tstamp_label = $"../Placeholder/tstamp" var tstamp = Time.get_ticks_usec() tstamp_label.text = str(tstamp) + "\n %s" % counter await RenderingServer.frame_post_draw diff --git a/config.cfg b/config.cfg new file mode 100644 index 0000000..1f08f52 --- /dev/null +++ b/config.cfg @@ -0,0 +1,3 @@ +[core] +websocket_url="ws://127.0.0.1:6980" +public_path="http://localhost:8899/" diff --git a/node_2d.tscn b/node_2d.tscn index 59feb1c..5f269ad 100644 --- a/node_2d.tscn +++ b/node_2d.tscn @@ -1,12 +1,13 @@ -[gd_scene load_steps=5 format=3 uid="uid://dpcjcts1oj1xb"] +[gd_scene load_steps=6 format=3 uid="uid://8flqeh3gn68"] -[ext_resource type="Script" path="res://render.gd" id="1_13t8u"] +[ext_resource type="Script" path="res://Renderer.gd" id="1_0maq1"] +[ext_resource type="Script" path="res://Main.gd" id="1_6qp7h"] [ext_resource type="Texture2D" uid="uid://skthvfx7pq6m" path="res://_e2199ab5-ff42-4ddf-8540-1c16e2d7889f.jpeg" id="1_la77t"] [ext_resource type="Script" path="res://JobServer.gd" id="3_mg2dt"] [ext_resource type="Script" path="res://RemoteLoader.gd" id="4_k4afm"] -[node name="Node2D" type="Node2D"] -script = ExtResource("1_13t8u") +[node name="Main" type="Node2D"] +script = ExtResource("1_6qp7h") [node name="JobServer" type="HTTPRequest" parent="."] script = ExtResource("3_mg2dt") @@ -19,3 +20,8 @@ visible = false position = Vector2(580.25, 314.25) scale = Vector2(0.532715, 0.532715) texture = ExtResource("1_la77t") + +[node name="Renderer" type="Node2D" parent="."] +script = ExtResource("1_0maq1") + +[node name="RenderContainer" type="Node" parent="."] diff --git a/output/.gitkeep b/output/.gitkeep deleted file mode 100644 index e69de29..0000000