From 1676bbb886d82986f33d144042f1d056ac9dbb88 Mon Sep 17 00:00:00 2001 From: Minzkraut Date: Mon, 12 Jun 2023 23:42:25 +0200 Subject: [PATCH] Implement basic node side image caching --- .gitignore | 1 + Main.gd | 4 ++++ RemoteLoader.gd | 20 ++++++++++++++++++-- Renderer.gd | 2 +- example-config.cfg | 1 + 5 files changed, 25 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 5212c03..e361097 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ .godot/ /[Bb]uild/ /[Oo]utput/ +/[Cc]ache/ # Godot-specific ignores .import/ export.cfg diff --git a/Main.gd b/Main.gd index ef2b90f..48edc8b 100644 --- a/Main.gd +++ b/Main.gd @@ -5,6 +5,7 @@ var config = ConfigFile.new() var websocket_url var public_path var output_dir +var cache_dir var auth_key var rendering = false signal finished_rendering @@ -15,11 +16,14 @@ func _ready(): websocket_url = config.get_value("core", "websocket_url") public_path = config.get_value("core", "public_path") output_dir = config.get_value("core", "output_dir") + cache_dir = config.get_value("core", "cache_dir") auth_key = config.get_value("core", "auth_key") + print("Starting render node") var directory = DirAccess.open(".") directory.make_dir(output_dir) + directory.make_dir(cache_dir) $JobServer.InitWebsocket() func FinishedRendering(): diff --git a/RemoteLoader.gd b/RemoteLoader.gd index 2525b90..802385e 100644 --- a/RemoteLoader.gd +++ b/RemoteLoader.gd @@ -3,17 +3,33 @@ extends HTTPRequest func GetRemoteImage(url): var image = Image.new() print("Fetching remote image %s" % url) + var urlHash = str(url.hash()) + var outFile = "{dir}/{hash}-{fileName}.png".format({ + 'dir': $"/root/Main".cache_dir, + 'hash': urlHash, + 'fileName': url.get_file().rsplit(".", true, 1)[0] + }) + + if FileAccess.file_exists(outFile): + image.load(outFile) + print("Loaded image from cache. " + outFile) + return image + + timeout = 1000 request(url) var res = await request_completed var magicBytes = res[3].slice(0,8) print(magicBytes) + var fileType = url.get_extension() var error = null - if magicBytes == PackedByteArray([137, 80, 78, 71, 13, 10, 26, 10]): + if fileType == "png" or magicBytes == PackedByteArray([137, 80, 78, 71, 13, 10, 26, 10]): print("Detected PNG File") error = image.load_png_from_buffer(res[3]) - if magicBytes == PackedByteArray([255, 216, 255, 224, 0, 16, 74, 70]): + if ["jpg", "jpeg"].has(fileType) or magicBytes == PackedByteArray([255, 216, 255, 224, 0, 16, 74, 70]): print("Detected JPG File") error = image.load_jpg_from_buffer(res[3]) if error != OK: print("Error fetching image ", str(error)) + image.save_png(outFile) + print("Saved new image to cache. " + outFile) return image diff --git a/Renderer.gd b/Renderer.gd index ba5123f..1b2d8e2 100644 --- a/Renderer.gd +++ b/Renderer.gd @@ -45,7 +45,7 @@ func RenderJob(job): # Get rendered image var img = get_viewport().get_texture().get_image() - var outFile = "%s_%s.png" % [job["type"],job["jobId"]] + var outFile = "%s_%s.png" % [job["type"],str(job["elements"]).hash()] img.save_png("%s/%s" % [$"/root/Main".output_dir, outFile]) return outFile diff --git a/example-config.cfg b/example-config.cfg index 89adc07..66fa266 100644 --- a/example-config.cfg +++ b/example-config.cfg @@ -3,3 +3,4 @@ auth_key=ay1234 websocket_url="ws://localhost:6980" public_path="http://localhost:8899/" output_dir="./output" +cache_dir="./cache"