-
Notifications
You must be signed in to change notification settings - Fork 1
/
pack-sprites.sc
66 lines (55 loc) · 1.62 KB
/
pack-sprites.sc
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
63
64
65
66
using import Array
load-library "lib/libgame.so"
load-library "lib/libphysfs.so"
run-stage;
let cjson = (import .src.FFI.cjson)
let physfs = (import .src.FFI.physfs)
let stbi = (import .src.FFI.stbi)
using import .src.common
let argc argv = (launch-args)
if (not (physfs.init (argv @ 0)))
error "Failed to initialize PHYSFS."
physfs.mount "./source-assets" "/" true
physfs.setWriteDir "./data"
local sheet =
Struct.__typecall ImageData
width = 1024
height = 1024
channels = 4
data = ((Array u8))
'resize sheet.data (* sheet.width sheet.height sheet.channels)
fn paste-image (src dst dx dy)
let sw sh = src.width src.height
let dw dh = dst.width dst.height
assert
and
sw <= dw
sh <= dh
if (or
((dx + sw) > dw)
((dy + sh) > dh))
raise none
using import itertools
for x y in (dim sw sh)
src-texel := y * sw * 4 + x * 4
dst-texel := ((dy + y) * dw + dx + x) * 4
va-map
inline (offset)
dst.data @ (dst-texel + offset) = (src.data @ (src-texel + offset))
va-range 4
;
let base-path = "Roguelike Dungeon - Asset Bundle/Sprites/Monsters/Skeleton/Variant1"
let files =
physfs.enumerateFiles base-path
loop (idx x y = 0 0:usize 0:usize)
let cur = (files @ idx)
if (cur == null)
break;
let img = (ImageData (base-path .. "/" .. (string cur)))
try
paste-image img sheet x y
else
;
_ (idx + 1) (x + (copy img.width)) 0:usize
stbi.write_png "sheet.png" 1024 1024 4 sheet.data (1024 * 4)
physfs.freeList (files as voidstar)