model_generator/twiddle.py

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