SHARE
TWEET

[C#] FF8 Stage model to OBJ - VT calc/automation script v3

MaKiPL Mar 21st, 2015 239 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.  *
  3.  * FF8 Stage .X to .OBJ converter
  4.  * Texture coordinates calculator/parser
  5.  * Version 1.2
  6.  * By MaKiPL (makipol@gmail.com)
  7.  *
  8.  * List of change:
  9.  * 1.1=Added TPage resolving and calculation. //IMPORTANT UPDATE!
  10.  *              Now, the texture are no longer X axis moved, and everything is
  11.                 cool and amazing. :)
  12.  * 1.2=CurrRUN is no longer dirty. This is now you just enter
  13.  *      where quad does really start, not the first VT
  14.  *      also it calculates end point based on quad count
  15.  *      not on manual break point. This is easier use
  16.  *      and no more infinity loop or exception, when
  17.  *      end point was not exactly the 24+. :)
  18.  * 1.3=MAJOR update. Added triangle support and a bool to switch between
  19.  *      triangle or quads.
  20.  */
  21.  
  22. using System;
  23. using System.Collections.Generic;
  24. using System.Linq;
  25. using System.Text;
  26. using System.Threading.Tasks;
  27. using System.IO;
  28.  
  29. namespace VT_automationScript
  30. {
  31.     class Program
  32.     {
  33.  
  34.         public static int ByteSearch(byte[] searchIn, byte[] searchBytes, int start = 0)
  35.         {
  36.             int found = -1;
  37.             bool matched = false;
  38.            
  39.             if (searchIn.Length > 0 && searchBytes.Length > 0 && start <= (searchIn.Length - searchBytes.Length) && searchIn.Length >= searchBytes.Length)
  40.             {
  41.                
  42.                 for (int i = start; i <= searchIn.Length - searchBytes.Length; i++)
  43.                 {
  44.                    
  45.                     if (searchIn[i] == searchBytes[0])
  46.                     {
  47.                         if (searchIn.Length > 1)
  48.                         {
  49.                            
  50.                             matched = true;
  51.                             for (int y = 1; y <= searchBytes.Length - 1; y++)
  52.                             {
  53.                                 if (searchIn[i + y] != searchBytes[y])
  54.                                 {
  55.                                     matched = false;
  56.                                     break;
  57.                                 }
  58.                             }
  59.                            
  60.                             if (matched)
  61.                             {
  62.                                 found = i;
  63.                                 break;
  64.                             }
  65.  
  66.                         }
  67.                         else
  68.                         {
  69.                            
  70.                             found = i;
  71.                             break;
  72.                         }
  73.  
  74.                     }
  75.                 }
  76.  
  77.             }
  78.             return found;
  79.         }
  80.  
  81.         static void Main(string[] args)
  82.         {
  83.  
  84.  
  85.  
  86.  
  87.  
  88.             String tt = null;
  89.             System.Globalization.CultureInfo customCulture = (System.Globalization.CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
  90.             customCulture.NumberFormat.NumberDecimalSeparator = ".";
  91.  
  92.             System.Threading.Thread.CurrentThread.CurrentCulture = customCulture;
  93.  
  94.            
  95.             Byte[] OPN = File.ReadAllBytes(@"C:\Users\Example\Desktop\a0stg013.x"); //PATH to your .X model!!
  96.  
  97.  
  98.             Byte[] TIMtexture = { 0x10, 0x00, 0x00, 0x00, 0x09 };
  99.             int TIMoffset = ByteSearch(OPN, TIMtexture, 0);
  100.             int TIMoffsetCLUTetc = TIMoffset + 18;
  101.             Byte[] CLUT = new byte[2];
  102.             Array.Copy(OPN, TIMoffsetCLUTetc, CLUT, 0, 2);
  103.             UInt16 CLUTsize = BitConverter.ToUInt16(CLUT, 0);
  104.             //DETERMINE HOW MUCH TO PASS
  105.             TIMoffsetCLUTetc += 2 + (CLUTsize * 512) + 8;
  106.             Byte[] szer = new byte[2];
  107.             Byte[] wyso = new byte[2];
  108.             Array.Copy(OPN, TIMoffsetCLUTetc, szer, 0, 2);
  109.             Array.Copy(OPN, TIMoffsetCLUTetc + 2, wyso, 0, 2);
  110.             UInt16 szerU = BitConverter.ToUInt16(szer, 0);
  111.             UInt16 wysoU = BitConverter.ToUInt16(wyso, 0);
  112.             int newSzerU = szerU * 2;
  113.  
  114.  
  115.             bool bex = File.Exists(@"C:\Users\Example\Desktop\test\vt.txt"); //PATH to output
  116.             if (bex)
  117.             {
  118.                 File.Delete(@"C:\Users\Example\Desktop\test\vt.txt"); //NEEDS TO BE SAME AS ABOVE
  119.             }
  120.             StreamWriter sw = File.AppendText(@"C:\Users\Example\Desktop\test\vt.txt"); //NEEDS TO BE SAME AS ABOVE
  121.  
  122.  
  123.  
  124.             bool bQuad = true; //CHANGE HERE - IMPORTANT!
  125.  
  126.  
  127.             int currRUN = 12512; //CHANGE HERE (Offset of first triangle/quad)
  128.             if (bQuad)
  129.                 currRUN += 8; //Pass thru face indices
  130.             else
  131.                 currRUN += 6; //Pass thru face indices
  132.  
  133.             int QuadCount = 64; //CHANGE HERE
  134.             int TrisCount = 64; //CHANGE HERE
  135.             QuadCount = currRUN + (QuadCount * 24);
  136.             TrisCount = currRUN + (TrisCount * 20);
  137.  
  138.            
  139.  
  140.             while (true)
  141.             {
  142.                 if (bQuad)
  143.                 {
  144.                     Byte U1 = OPN[currRUN];
  145.                     Byte V1 = OPN[currRUN + 1];
  146.                     Byte U2 = OPN[currRUN + 4];
  147.                     Byte V2 = OPN[currRUN + 5];
  148.                     Byte U3 = OPN[currRUN + 8];
  149.                     Byte V3 = OPN[currRUN + 9];
  150.                     Byte U4 = OPN[currRUN + 10];
  151.                     Byte V4 = OPN[currRUN + 11];
  152.  
  153.                     //Get Bit
  154.                     string StrByte = OPN[currRUN + 6].ToString("X2");
  155.                     StrByte = "0" + StrByte.Substring(1);
  156.                     Byte TPage = Byte.Parse(StrByte);
  157.                     int TPageINT = TPage * 128;
  158.  
  159.                     float UU1 = (float)U1 / (float)newSzerU + ((float)TPageINT / newSzerU);
  160.                     float VV1 = 1.0f - (V1 / 256.0f);
  161.                     float UU2 = (float)U2 / (float)newSzerU + ((float)TPageINT / newSzerU);
  162.                     float VV2 = 1.0f - (V2 / 256.0f);
  163.                     float UU3 = (float)U3 / (float)newSzerU + ((float)TPageINT / newSzerU);
  164.                     float VV3 = 1.0f - ((float)V3 / 256.0f);
  165.                     float UU4 = (float)U4 / (float)newSzerU + ((float)TPageINT / newSzerU);
  166.                     float VV4 = 1.0f - ((float)V4 / 256.0f);
  167.                     tt += string.Format("vt {0} {1}" + Environment.NewLine, UU1, VV1);
  168.                     tt += string.Format("vt {0} {1}" + Environment.NewLine, UU2, VV2);
  169.                     tt += string.Format("vt {0} {1}" + Environment.NewLine, UU3, VV3);
  170.                     tt += string.Format("vt {0} {1}" + Environment.NewLine, UU4, VV4);
  171.                     if (currRUN == QuadCount)
  172.                     {
  173.                         break;
  174.                     }
  175.                     else
  176.                         currRUN += 24;
  177.                 }
  178.                 else
  179.                 {
  180.                     Byte U1 = OPN[currRUN];
  181.                     Byte V1 = OPN[currRUN + 1];
  182.                     Byte U2 = OPN[currRUN + 2];
  183.                     Byte V2 = OPN[currRUN + 3];
  184.                     Byte U3 = OPN[currRUN + 6];
  185.                     Byte V3 = OPN[currRUN + 7];
  186.  
  187.                     //Get Bit
  188.                     string StrByte = OPN[currRUN + 8].ToString("X2");
  189.                     StrByte = "0" + StrByte.Substring(1);
  190.                     Byte TPage = Byte.Parse(StrByte);
  191.                     int TPageINT = TPage * 128;
  192.  
  193.                     float UU1 = (float)U1 / (float)newSzerU + ((float)TPageINT / newSzerU);
  194.                     float VV1 = 1.0f - (V1 / 256.0f);
  195.                     float UU2 = (float)U2 / (float)newSzerU + ((float)TPageINT / newSzerU);
  196.                     float VV2 = 1.0f - (V2 / 256.0f);
  197.                     float UU3 = (float)U3 / (float)newSzerU + ((float)TPageINT / newSzerU);
  198.                     float VV3 = 1.0f - ((float)V3 / 256.0f);
  199.                     tt += string.Format("vt {0} {1}" + Environment.NewLine, UU1, VV1);
  200.                     tt += string.Format("vt {0} {1}" + Environment.NewLine, UU2, VV2);
  201.                     tt += string.Format("vt {0} {1}" + Environment.NewLine, UU3, VV3);
  202.                     if (currRUN == TrisCount)
  203.                     {
  204.                         break;
  205.                     }
  206.                     else
  207.                         currRUN += 20;
  208.                 }
  209.             }
  210.             sw.WriteLine(tt);
  211.             sw.Close();
  212.         }
  213.     }
  214. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top