model_generator/twiddle.py
2025-01-31 15:48:40 -06:00

44 lines
1.1 KiB
Python

def log2(n):
return {
8: 3,
16: 4,
32: 5,
64: 6,
128: 7,
256: 8,
512: 9,
1024: 10,
}[n]
def from_xy(x, y, width, height):
# maximum texture size : 1024x1024
# maximum 1-dimensional index: 0xfffff
# bits : 19-0
# y bits: 0, 2, 4, 6, 8, 10, 12, 14, 16, 18
# x bits: 1, 3, 5, 7, 9, 11, 13, 15, 17, 19
width_max = log2(width)
height_max = log2(height)
twiddle_ix = 0
for i in range(20 // 2):
if (i < width_max and i < height_max):
twiddle_ix |= ((y >> i) & 1) << (i * 2 + 0)
twiddle_ix |= ((x >> i) & 1) << (i * 2 + 1)
elif (i < width_max):
twiddle_ix |= ((x >> i) & 1) << (i + height_max)
elif (i < height_max):
twiddle_ix |= ((y >> i) & 1) << (i + width_max)
else:
break
return twiddle_ix
def texture(dst, src, width, height):
for y in range(height):
for x in range(width):
twiddle_ix = from_xy(x, y, width, height)
value = src[y * width + x]
dst[twiddle_ix] = value