Colour Cube: Difference between revisions
Added information on 16*16*16 cubes (e.g. for NFS:HP)
Smilingfrog (talk | contribs) No edit summary |
Smilingfrog (talk | contribs) (Added information on 16*16*16 cubes (e.g. for NFS:HP)) |
||
Line 33:
== Xbox 360 Swizzle Algorithm ==
The following algorithm assumes that the data is stored
{| class="wikitable"
|-
! x !! y !! z !! offset (m_size = 16)
|- style="vertical-align:top;"
| <syntaxhighlight>xxxx
3210</syntaxhighlight> || <syntaxhighlight>yyyy
3210</syntaxhighlight> || <syntaxhighlight>zzzz
3210</syntaxhighlight> || <syntaxhighlight>o0=x0
o1=x1
o2=y0
o3=x2
o4=x3
o5=y1
o6=y2
o7=z0
o8=y3^z2
o9=z1
o10=z2
o11=z3</syntaxhighlight>
|}
{| class="wikitable"
|-
! x !! y !! z !! offset (m_size = 32)
|- style="vertical-align:top;"
| <syntaxhighlight>xxxxx
Line 72 ⟶ 93:
# calculate offset, in pixels, of where to find the (x,y,z) pixel in the Xbox 360 data
# pixel offset in PC file is m_size * m_size * z + m_size * y + x
def calc_offset(m_size, x, y, z)
case m_size
when 16
calc_offset16(x, y, z)
when 32
calc_offset32(x, y, z)
else
raise "Unsupported m_size: #{m_size}"
end
end
def calc_offset16(x, y, z)
x0 = (x >> 0) & 0b1
x1 = (x >> 1) & 0b1
x2 = (x >> 2) & 0b1
x3 = (x >> 3) & 0b1
y0 = (y >> 0) & 0b1
y1 = (y >> 1) & 0b1
y2 = (y >> 2) & 0b1
y3 = (y >> 3) & 0b1
z0 = (z >> 0) & 0b1
z1 = (z >> 1) & 0b1
z2 = (z >> 2) & 0b1
z3 = (z >> 3) & 0b1
o=(z3<<11)|
(z2<<10)|
(z1<<9)|
((y3<<8)^(z2<<8))|
(z0<<7)|
(y2<<6)|
(y1<<5)|
(x3<<4)|
(x2<<3)|
(y0<<2)|
(x1<<1)|
(x0<<0)
end
def calc_offset32(x, y, z)
x0 = (x >> 0) & 0b1
x1 = (x >> 1) & 0b1
|