Advertisement
Dageron

PS2 texture unswizzling procedures C#

Aug 4th, 2011
236
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.78 KB | None | 0 0
  1. private void readTexPSMT4(int dbp, int dbw, int dsax, int dsay, int rrw, int rrh, ref byte[] data)
  2. {
  3.     dbw = dbw >> 1;
  4.     int index = 0;
  5.     int num2 = dbp * 0x40;
  6.     bool flag = false;
  7.     for (int i = dsay; i < (dsay + rrh); i++)
  8.     {
  9.         for (int j = dsax; j < (dsax + rrw); j++)
  10.         {
  11.             int num5 = j / 0x80;
  12.             int num6 = i / 0x80;
  13.             int num7 = num5 + (num6 * dbw);
  14.             int num8 = j - (num5 * 0x80);
  15.             int num9 = i - (num6 * 0x80);
  16.             int num10 = num8 / 0x20;
  17.             int num11 = num9 / 0x10;
  18.             int num12 = this.block4[num10 + (num11 * 4)];
  19.             int num13 = num8 - (num10 * 0x20);
  20.             int num14 = num9 - (num11 * 0x10);
  21.             int num15 = num14 / 4;
  22.             int num16 = num13;
  23.             int num17 = num14 - (num15 * 4);
  24.             int num18 = this.columnWord4[num15 & 1, num16 + (num17 * 0x20)];
  25.             int num19 = this.columnByte4[num16 + (num17 * 0x20)];
  26.             int num20 = ((((num2 + (num7 * 0x800)) + (num12 * 0x40)) + (num15 * 0x10)) + num18) * 4;
  27.             byte num21 = data[index];
  28.             byte num22 = this.gsmem[num20 + (num19 >> 1)];
  29.             if ((num19 & 1) != 0)
  30.             {
  31.                 if (flag)
  32.                 {
  33.                     data[index] = (byte) ((num21 & 15) | (num22 & 240));
  34.                 }
  35.                 else
  36.                 {
  37.                     data[index] = (byte) ((num21 & 240) | ((num22 >> 4) & 15));
  38.                 }
  39.             }
  40.             else if (flag)
  41.             {
  42.                 data[index] = (byte) ((num21 & 15) | ((num22 << 4) & 240));
  43.             }
  44.             else
  45.             {
  46.                 data[index] = (byte) ((num21 & 240) | (num22 & 15));
  47.             }
  48.             if (flag)
  49.             {
  50.                 index++;
  51.             }
  52.             flag = !flag;
  53.         }
  54.     }
  55. }
  56.  
  57. private void readTexPSMT8(int dbp, int dbw, int dsax, int dsay, int rrw, int rrh, ref byte[] data)
  58. {
  59.     dbw = dbw >> 1;
  60.     int index = 0;
  61.     int num2 = dbp * 0x40;
  62.     for (int i = dsay; i < (dsay + rrh); i++)
  63.     {
  64.         for (int j = dsax; j < (dsax + rrw); j++)
  65.         {
  66.             int num5 = j / 0x80;
  67.             int num6 = i / 0x40;
  68.             int num7 = num5 + (num6 * dbw);
  69.             int num8 = j - (num5 * 0x80);
  70.             int num9 = i - (num6 * 0x40);
  71.             int num10 = num8 / 0x10;
  72.             int num11 = num9 / 0x10;
  73.             int num12 = this.block8[num10 + (num11 * 8)];
  74.             int num13 = num8 - (num10 * 0x10);
  75.             int num14 = num9 - (num11 * 0x10);
  76.             int num15 = num14 / 4;
  77.             int num16 = num13;
  78.             int num17 = num14 - (num15 * 4);
  79.             int num18 = this.columnWord8[num15 & 1, num16 + (num17 * 0x10)];
  80.             int num19 = this.columnByte8[num16 + (num17 * 0x10)];
  81.             int num20 = ((((num2 + (num7 * 0x800)) + (num12 * 0x40)) + (num15 * 0x10)) + num18) * 4;
  82.             data[index] = this.gsmem[num20 + num19];
  83.             index++;
  84.         }
  85.     }
  86. }
  87.  
  88.  
  89. private void writeTexPSMCT32(int dbp, int dbw, int dsax, int dsay, int rrw, int rrh, byte[] data)
  90. {
  91.     int index = 0;
  92.     int num2 = dbp * 0x40;
  93.     for (int i = dsay; i < (dsay + rrh); i++)
  94.     {
  95.         for (int j = dsax; j < (dsax + rrw); j++)
  96.         {
  97.             int num5 = j / 0x40;
  98.             int num6 = i / 0x20;
  99.             int num7 = num5 + (num6 * dbw);
  100.             int num8 = j - (num5 * 0x40);
  101.             int num9 = i - (num6 * 0x20);
  102.             int num10 = num8 / 8;
  103.             int num11 = num9 / 8;
  104.             int num12 = this.block32[num10 + (num11 * 8)];
  105.             int num13 = num8 - (num10 * 8);
  106.             int num14 = num9 - (num11 * 8);
  107.             int num15 = num14 / 2;
  108.             int num16 = num13;
  109.             int num17 = num14 - (num15 * 2);
  110.             int num18 = this.columnWord32[num16 + (num17 * 8)];
  111.             int num19 = ((((num2 + (num7 * 0x800)) + (num12 * 0x40)) + (num15 * 0x10)) + num18) * 4;
  112.             this.gsmem[num19] = data[index];
  113.             this.gsmem[num19 + 1] = data[index + 1];
  114.             this.gsmem[num19 + 2] = data[index + 2];
  115.             this.gsmem[num19 + 3] = data[index + 3];
  116.             index += 4;
  117.         }
  118.     }
  119. }
  120.  
  121. private void writeTexPSMCT16(int dbp, int dbw, int dsax, int dsay, int rrw, int rrh, byte[] data)
  122. {
  123.     int index = 0;
  124.     int num2 = dbp * 0x40;
  125.     for (int i = dsay; i < (dsay + rrh); i++)
  126.     {
  127.         for (int j = dsax; j < (dsax + rrw); j++)
  128.         {
  129.             int num5 = j / 0x40;
  130.             int num6 = i / 0x40;
  131.             int num7 = num5 + (num6 * dbw);
  132.             int num8 = j - (num5 * 0x40);
  133.             int num9 = i - (num6 * 0x40);
  134.             int num10 = num8 / 0x10;
  135.             int num11 = num9 / 8;
  136.             int num12 = this.block16[num10 + (num11 * 4)];
  137.             int num13 = num8 - (num10 * 0x10);
  138.             int num14 = num9 - (num11 * 8);
  139.             int num15 = num14 / 2;
  140.             int num16 = num13;
  141.             int num17 = num14 - (num15 * 2);
  142.             int num18 = this.columnWord16[num16 + (num17 * 0x10)];
  143.             int num19 = this.columnHalf16[num16 + (num17 * 0x10)];
  144.             int num20 = ((((num2 + (num7 * 0x800)) + (num12 * 0x40)) + (num15 * 0x10)) + num18) * 4;
  145.             this.gsmem[num20 + num19] = data[index];
  146.             this.gsmem[(num20 + num19) + 1] = data[index + 1];
  147.             index += 2;
  148.         }
  149.     }
  150. }
  151.  
  152. public byte[] Unswizzle(byte[] data, int width, int height)
  153. {
  154.     byte[] buffer = new byte[data.Length];
  155.     this.gsmem = new byte[0x400000];
  156.     if (this.textureInfo.BitsPerPixel == 8)
  157.     {
  158.         int rrw = width / 2;
  159.         int rrh = height / 2;
  160.         this.writeTexPSMCT32(0, rrw / 0x40, 0, 0, rrw, rrh, data);
  161.         this.readTexPSMT8(0, width / 0x40, 0, 0, width, height, ref buffer);
  162.     }
  163.     else if (this.textureInfo.BitsPerPixel == 4)
  164.     {
  165.         int num3 = width / 2;
  166.         int num4 = height / 2;
  167.         this.writeTexPSMCT16(0, num3 / 0x40, 0, 0, num3, num4, data);
  168.         this.readTexPSMT4(0, width / 0x40, 0, 0, width, height, ref buffer);
  169.         byte[] buffer2 = new byte[data.Length];
  170.         int[] numArray = new int[] { 5, 4, 7, 6, 1, 0, 3, 2 };
  171.         int[] numArray2 = new int[] { 2, 3, 0, 1 };
  172.         for (int i = 0; i < height; i++)
  173.         {
  174.             for (int j = 0; j < width; j++)
  175.             {
  176.                 int index = j - (8 * (j / 8));
  177.                 int num8 = i - (4 * (i / 4));
  178.                 byte num9 = buffer[(i * (width / 2)) + (j / 2)];
  179.                 if ((j & 1) == 0)
  180.                 {
  181.                     num9 = (byte) (num9 & 240);
  182.                     num9 = (byte) (num9 >> 4);
  183.                 }
  184.                 else
  185.                 {
  186.                     num9 = (byte) (num9 & 15);
  187.                 }
  188.                 int num10 = numArray[index];
  189.                 int num11 = numArray2[num8];
  190.                 int num12 = num10 + (8 * (j / 8));
  191.                 int num13 = num11 + (4 * (i / 4));
  192.                 if ((num12 & 1) == 0)
  193.                 {
  194.                     buffer2[(num13 * (width / 2)) + (num12 / 2)] = (byte) (buffer2[(num13 * (width / 2)) + (num12 / 2)] & 15);
  195.                     num9 = (byte) (num9 << 4);
  196.                     buffer2[(num13 * (width / 2)) + (num12 / 2)] = (byte) (buffer2[(num13 * (width / 2)) + (num12 / 2)] | num9);
  197.                 }
  198.                 else
  199.                 {
  200.                     buffer2[(num13 * (width / 2)) + (num12 / 2)] = (byte) (buffer2[(num13 * (width / 2)) + (num12 / 2)] & 240);
  201.                     buffer2[(num13 * (width / 2)) + (num12 / 2)] = (byte) (buffer2[(num13 * (width / 2)) + (num12 / 2)] | num9);
  202.                 }
  203.             }
  204.         }
  205.         buffer = buffer2;
  206.     }
  207.     this.gsmem = null;
  208.     GC.Collect();
  209.     return buffer;
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement