62 lines
1.4 KiB
Python
62 lines
1.4 KiB
Python
def log2(n):
|
|
return {
|
|
1: 0,
|
|
2: 1,
|
|
4: 2,
|
|
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 npot(v):
|
|
v -= 1;
|
|
v |= v >> 1;
|
|
v |= v >> 2;
|
|
v |= v >> 4;
|
|
v |= v >> 8;
|
|
v |= v >> 16;
|
|
v += 1;
|
|
return v
|
|
|
|
def texture(dst, src, width, height):
|
|
pot_height = npot(height)
|
|
max_twiddle_ix = -1
|
|
for y in range(height):
|
|
for x in range(width):
|
|
twiddle_ix = from_xy(x, y, width, pot_height)
|
|
value = src[y * width + x]
|
|
dst[twiddle_ix] = value
|
|
if twiddle_ix > max_twiddle_ix:
|
|
max_twiddle_ix = twiddle_ix
|
|
return max_twiddle_ix
|