Example #1
0
 private void RefreshPreview()
 {
     try
     {
         int n = listBox1.SelectedIndex;
         if (n == -1)
             return;
         status.Text = "Getting header infos from db...";
         Application.DoEvents();
         DBAccess.RESInformation ti = ttprevlist[n];
         DBAccess.BundleInformation buni = DBAccess.GetBundleInformationById(ti.bundlepath)[0];
         DBAccess.TOCInformation toci = DBAccess.GetTocInformationByIndex(buni.tocIndex);
         BinaryBundle b = new BinaryBundle();
         byte[] resdata = new byte[0];
         if (toci.incas)
         {
             status.Text = "Getting header data from sha1...";
             Application.DoEvents();
             resdata = SHA1Access.GetDataBySha1(Helpers.HexStringToByteArray(ti.sha1));
         }
         else
         {
             status.Text = "Getting header data from binary bundle...";
             Application.DoEvents();
             TOCFile toc = new TOCFile(toci.path);
             byte[] bundledata = toc.ExportBundleDataByPath(buni.bundlepath);
             b = new BinaryBundle(new MemoryStream(bundledata));
             foreach (BinaryBundle.ResEntry res in b.ResList)
                 if (res._name == ti.resname)
                 {
                     resdata = res._data;
                     break;
                 }
         }
         hb1.ByteProvider = new DynamicByteProvider(resdata);
         mesh = new Mesh(new MemoryStream(resdata));
         rtb1.Text = mesh.HeaderToStr();
         rtb2.Text = mesh.LODsToString();
         foreach (Mesh.MeshLOD lod in mesh.header.LODs)
         {
             byte[] id = lod.ChunkID;
             byte[] data = new byte[0];
             if (toci.incas)
             {
                 DBAccess.ChunkInformation ci = DBAccess.GetChunkInformationById(id);
                 if (ci.sha1 == null)
                     continue;
                 data = SHA1Access.GetDataBySha1(ci.sha1);
             }
             else
             {
                 byte t = id[0];
                 id[0] = id[3];
                 id[3] = t;
                 t = id[1];
                 id[1] = id[2];
                 id[2] = t;
                 t = id[6];
                 id[6] = id[7];
                 id[7] = t;
                 t = id[4];
                 id[4] = id[5];
                 id[5] = t;
                 foreach (BinaryBundle.ChunkEntry c in b.ChunkList)
                     if (Helpers.ByteArrayCompare(id, c.id))
                         data = c._data;
                 if (data.Length == 0)
                 {
                     DBAccess.ChunkInformation ci = DBAccess.GetChunkInformationById(id);
                     if (ci.sha1 == null)
                         continue;
                     data = SHA1Access.GetDataBySha1(ci.sha1);
                 }
             }
             mesh.LoadChunkData(lod, new MemoryStream(data));
         }
         MeshRenderObject mro = new MeshRenderObject(mesh);
         renderer.list.Clear();
         renderer.list.Add(mro);
         renderer.worldoffset = -mro.center;
         renderer.CamDistance = mro.min.Length() + mro.max.Length();
         listBox2.Items.Clear();
         int count = 0;
         foreach (Mesh.MeshLOD l in mesh.header.LODs)
             listBox2.Items.Add("LOD " + (count++) + " - Chunk-" + Helpers.ByteArrayToHexString(l.ChunkID));
         status.Text = "Ready";
     }
     catch (Exception ex)
     {
         status.Text = "General error, after state '" + status.Text + "' : " + ex.Message;
     }
 }