-
Notifications
You must be signed in to change notification settings - Fork 3
/
screenshotqueue.gd
62 lines (38 loc) · 1.11 KB
/
screenshotqueue.gd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
extends Node
var thread
var mutex
var queue = []
const MAX_QUEUE_LENGTH = 4
func _ready():
thread = Thread.new()
mutex = Mutex.new()
func _exit_tree():
if thread.is_active():
thread.wait_to_finish()
func snap(var viewport : Viewport):
var dt = OS.get_datetime()
var timestamp = "%04d%02d%02d%02d%02d%02d" % [dt["year"], dt["month"], dt["day"], dt["hour"], dt["minute"], dt["second"]]
var image = viewport.get_texture().get_data()
save(image, "user://screenshot-" + timestamp + ".png")
func save(var image : Image, path : String):
mutex.lock()
if queue.size() < MAX_QUEUE_LENGTH:
queue.push_back({"image" : image, "path" : path})
else:
print("Screenshot queue overflow")
if queue.size() == 1:
if thread.is_active():
thread.wait_to_finish()
thread.start(self, "worker_function")
mutex.unlock()
func worker_function(_userdata):
mutex.lock()
while not queue.empty():
var item = queue.front()
mutex.unlock()
print("Saving screenshot to " + item["path"])
item["image"].flip_y()
item["image"].save_png(item["path"])
mutex.lock()
queue.pop_front()
mutex.unlock()