示例#1
0
        private void listBox1_SelectedIndexChanged_1(object sender, EventArgs e)
        {
            int n = listBox1.SelectedIndex;

            if (n == -1)
            {
                return;
            }
            n = Objects[n];
            lODToolStripMenuItem.Visible = false;
            UnCheckLODs();
            stm = null;
            skm = null;
            preview?.Dispose();
            preview                          = null;
            MaterialBox.Visible              = false;
            MaterialApplyButton.Visible      = false;
            MaterialIndexBox.Visible         = false;
            MaterialIndexApplyButton.Visible = false;
            if (Pcc.GetUExport(n).ClassName == "StaticMesh")
            {
                LoadStaticMesh(n);
            }
            if (Pcc.GetUExport(n).ClassName == "SkeletalMesh")
            {
                LoadSkeletalMesh(n);
            }
        }
示例#2
0
 public void LoadSkeletalMesh(int index)
 {
     try
     {
         DisableLODs();
         skm = new SkeletalMesh(pcc, index);
         skmold = new SkeletalMeshOld(pcc, pcc.Exports[index].Data);
         hb1.ByteProvider = new DynamicByteProvider(pcc.Exports[index].Data);
         Preview3D.StatMesh = null;
         Preview3D.SkelMesh = skm;
         Preview3D.CamDistance = skm.Bounding.r * 2.0f;
         Preview3D.CamOffset = skm.Bounding.origin;
         treeView1.Nodes.Clear();
         treeView1.Nodes.Add(skm.ToTree());
         treeView1.Nodes[0].Expand();
         lODToolStripMenuItem.Visible = true;
         lOD1ToolStripMenuItem.Enabled = true;
         lOD1ToolStripMenuItem.Checked = true;
         if (skm.LODModels.Count > 1)
             lOD2ToolStripMenuItem.Enabled = true;
         if (skm.LODModels.Count > 2)
             lOD3ToolStripMenuItem.Enabled = true;
         if (skm.LODModels.Count > 3)
             lOD4ToolStripMenuItem.Enabled = true;
     }
     catch (Exception)
     {
     }
 }
示例#3
0
        public void LoadSkeletalMesh(int uindex)
        {
            DisableLODs();
            UnCheckLODs();
            try
            {
                skm = new SkeletalMesh(Pcc.GetUExport(uindex));

                // Load preview model
                preview?.Dispose();
                preview = new ModelPreview(view.Context.Device, skm, view.Context.TextureCache);
                RefreshChosenMaterialsList();
                CenterView();

                // Update treeview
                treeView1.BeginUpdate();
                treeView1.Nodes.Clear();
                treeView1.Nodes.Add(skm.ToTree());
                treeView1.Nodes[0].Expand();
                treeView1.EndUpdate();
                lODToolStripMenuItem.Visible  = true;
                lOD0ToolStripMenuItem.Enabled = true;
                lOD0ToolStripMenuItem.Checked = true;
                if (skm.LODModels.Count > 1)
                {
                    lOD1ToolStripMenuItem.Enabled = true;
                }
                if (skm.LODModels.Count > 2)
                {
                    lOD2ToolStripMenuItem.Enabled = true;
                }
                if (skm.LODModels.Count > 3)
                {
                    lOD3ToolStripMenuItem.Enabled = true;
                }
                MaterialBox.Visible              = false;
                MaterialApplyButton.Visible      = false;
                MaterialIndexBox.Visible         = false;
                MaterialIndexApplyButton.Visible = false;
            }
            catch (Exception e)
            {
                MessageBox.Show(ExceptionHandlerDialogWPF.FlattenException(e));
            }
        }
示例#4
0
        private void importLODToolStripMenuItem_Click(object sender, EventArgs e)
        {
            int n = listBox1.SelectedIndex;
            if (n == -1)
                return;
            int m = listBox2.SelectedIndex;
            if (m == -1)
                return;
            TreeNode t1 = treeView1.SelectedNode;
            if (t1 == null || t1.Parent == null || t1.Name == "")
                return;
            PCCObject pcc = new PCCObject();
            SkeletalMesh skm = new SkeletalMesh();
            EntryStruct en;
            string loc = Path.GetDirectoryName(Application.ExecutablePath) + "\\exec\\";
            if (DisplayStyle == 0)
            {
                int o = 0;
                if (!Int32.TryParse(t1.Name, out o))
                    return;
                en = Entries[o];                
                if (!en.isDLC)
                {
                    pcc = new PCCObject(ME3Directory.cookedPath + en.Filename);
                    if (en.isSkeletal)
                    {
                        skm = new SkeletalMesh(pcc, en.Index);
                    }
                    else
                    {
                        return;
                    }
                }
                else
                {                    
                    string dirDLC = ME3Directory.DLCPath;
                    dirDLC += en.DLCName;
                    dirDLC += "\\CookedPCConsole\\Default.sfar";
                    DLCBase dlc = new DLCBase(dirDLC);
                    foreach (sfarFile file in dlc.fileList)
                        try
                        {
                            string filename = Path.GetFileName(file.fileName);
                            if (Path.GetExtension(filename).ToLower().EndsWith(".pcc") && filename == en.Filename)
                            {
                                if (File.Exists(loc + "dlc.pcc"))
                                    File.Delete(loc + "dlc.pcc");
                                using (Stream input = File.OpenRead(dirDLC), output = File.Create(loc + "dlc.pcc"))
                                {
                                    AmaroK86.MassEffect3.DLCUnpack.DecompressEntry(file, input, output, dlc.CompressionScheme);
                                }
                                if (File.Exists(loc + "dlc.pcc"))
                                {
                                    try
                                    {
                                        pcc = new PCCObject(loc + "dlc.pcc");
                                        if (en.isSkeletal)
                                        {
                                            skm = new SkeletalMesh(pcc, en.Index);
                                            break;
                                        }
                                        else
                                        {
                                            return;
                                        }
                                    }
                                    catch (Exception)
                                    {
                                        return;
                                    }
                                }
                            }
                        }
                        catch (Exception)
                        {
                            return;
                        }
                }
            }
            else
                return;
            if (!skm.Loaded || !pcc.Loaded)
                return;
            SkeletalMesh.LODModelStruct lodpcc = skm.LODModels[0];
            UDKExplorer.UDK.Classes.SkeletalMesh skmudk = new UDKExplorer.UDK.Classes.SkeletalMesh(udk, Objects[n]);
            UDKExplorer.UDK.Classes.SkeletalMesh.LODModelStruct lodudk = skmudk.LODModels[m];
            lodpcc.Sections = new List<SkeletalMesh.SectionStruct>();
            foreach (UDKExplorer.UDK.Classes.SkeletalMesh.SectionStruct secudk in lodudk.Sections)
            {
                SkeletalMesh.SectionStruct secpcc = new SkeletalMesh.SectionStruct();
                secpcc.BaseIndex = secudk.BaseIndex;
                secpcc.ChunkIndex = secudk.ChunkIndex;
                secpcc.MaterialIndex = secudk.MaterialIndex;
                secpcc.NumTriangles = secudk.NumTriangles;
                lodpcc.Sections.Add(secpcc);
            }
            lodpcc.IndexBuffer = new SkeletalMesh.MultiSizeIndexContainerStruct();
            lodpcc.IndexBuffer.IndexCount = lodudk.IndexBuffer.IndexCount;
            lodpcc.IndexBuffer.IndexSize = lodudk.IndexBuffer.IndexSize;
            lodpcc.IndexBuffer.Indexes = new List<ushort>();
            foreach (ushort Idx in lodudk.IndexBuffer.Indexes)
                lodpcc.IndexBuffer.Indexes.Add(Idx);
            List<int> BoneMap = new List<int>();
            for (int i = 0; i < skmudk.Bones.Count; i++)
            {
                string udkb = udk.GetName(skmudk.Bones[i].Name);
                bool found = false;
                for (int j = 0; j < skm.Bones.Count; j++)
                {
                    string pccb = pcc.getNameEntry(skm.Bones[j].Name);
                    if (pccb == udkb)
                    {
                        found = true;
                        BoneMap.Add(j);
                        if (importBonesToolStripMenuItem.Checked)
                        {
                            SkeletalMesh.BoneStruct bpcc = skm.Bones[j];
                            UDKExplorer.UDK.Classes.SkeletalMesh.BoneStruct budk = skmudk.Bones[i];
                            bpcc.Orientation = budk.Orientation;
                            bpcc.Position = budk.Position;
                            skm.Bones[j] = bpcc;
                        }
                    }
                }
                if (!found)
                {
                    DebugOutput.PrintLn("ERROR: Cant Match Bone \"" + udkb + "\"");
                    BoneMap.Add(0);
                }
            }

            lodpcc.ActiveBones = new List<ushort>();
            foreach (ushort Idx in lodudk.ActiveBones)
                lodpcc.ActiveBones.Add((ushort)BoneMap[Idx]);
            lodpcc.Chunks = new List<SkeletalMesh.SkelMeshChunkStruct>();
            foreach (UDKExplorer.UDK.Classes.SkeletalMesh.SkelMeshChunkStruct chunkudk in lodudk.Chunks)
            {
                SkeletalMesh.SkelMeshChunkStruct chunkpcc = new SkeletalMesh.SkelMeshChunkStruct();
                chunkpcc.BaseVertexIndex = chunkudk.BaseVertexIndex;
                chunkpcc.MaxBoneInfluences = chunkudk.MaxBoneInfluences;
                chunkpcc.NumRigidVertices = chunkudk.NumRigidVertices;
                chunkpcc.NumSoftVertices = chunkudk.NumSoftVertices;
                chunkpcc.BoneMap = new List<ushort>();
                chunkpcc.RiginSkinVertices = new List<SkeletalMesh.RigidSkinVertexStruct>();
                chunkpcc.SoftSkinVertices = new List<SkeletalMesh.SoftSkinVertexStruct>();
                foreach (ushort Idx in chunkudk.BoneMap)
                    chunkpcc.BoneMap.Add((ushort)BoneMap[Idx]);
                lodpcc.Chunks.Add(chunkpcc);
            }
            lodpcc.Size = lodudk.Size;
            lodpcc.NumVertices = lodudk.NumVertices;
            lodpcc.RequiredBones = new List<byte>();
            foreach (byte b in lodudk.RequiredBones)
                lodpcc.RequiredBones.Add(b);
            lodpcc.VertexBufferGPUSkin = new SkeletalMesh.VertexBufferGPUSkinStruct();
            lodpcc.VertexBufferGPUSkin.NumTexCoords = lodudk.VertexBufferGPUSkin.NumTexCoords;
            lodpcc.VertexBufferGPUSkin.Extension = lodudk.VertexBufferGPUSkin.Extension;
            lodpcc.VertexBufferGPUSkin.Origin = lodudk.VertexBufferGPUSkin.Origin;
            lodpcc.VertexBufferGPUSkin.VertexSize = lodudk.VertexBufferGPUSkin.VertexSize;
            lodpcc.VertexBufferGPUSkin.Vertices = new List<SkeletalMesh.GPUSkinVertexStruct>();
            foreach (UDKExplorer.UDK.Classes.SkeletalMesh.GPUSkinVertexStruct vudk in lodudk.VertexBufferGPUSkin.Vertices)
            {
                SkeletalMesh.GPUSkinVertexStruct vpcc = new SkeletalMesh.GPUSkinVertexStruct();
                vpcc.TangentX = vudk.TangentX;
                vpcc.TangentZ = vudk.TangentZ;
                vpcc.Position = vudk.Position;
                vpcc.InfluenceBones = vudk.InfluenceBones;
                vpcc.InfluenceWeights = vudk.InfluenceWeights;
                vpcc.U = vudk.U;
                vpcc.V = vudk.V;
                lodpcc.VertexBufferGPUSkin.Vertices.Add(vpcc);
            }
            for (int i = 0; i < skm.LODModels.Count; i++)
                skm.LODModels[i] = lodpcc;
            SerializingContainer con = new SerializingContainer();
            con.Memory = new MemoryStream();
            con.isLoading = false;
            skm.Serialize(con);
            int end = skm.GetPropertyEnd();
            MemoryStream mem = new MemoryStream();
            mem.Write(pcc.Exports[en.Index].Data, 0, end);
            mem.Write(con.Memory.ToArray(), 0, (int)con.Memory.Length);
            pcc.Exports[en.Index].Data = mem.ToArray();
            pcc.altSaveToFile(pcc.pccFileName, true);
            if (!en.isDLC)
                MessageBox.Show("Done");
            else
                MessageBox.Show("Done. The file is now in following folder, please replace it back to DLC :\n" + loc + "dlc.pcc");
            globalTreeToolStripMenuItem.Visible =
            optionsToolStripMenuItem.Visible =
            transferToolStripMenuItem.Visible =
            splitContainer1.Visible = true;
            fileToolStripMenuItem.Visible =
            importLODToolStripMenuItem.Visible =
            splitContainer3.Visible = false;
        }
示例#5
0
 private void listBox1_SelectedIndexChanged_1(object sender, EventArgs e)
 {
     int n = listBox1.SelectedIndex;
     if (n == -1)
         return;
     lODToolStripMenuItem.Visible = false;
     UnCheckLODs();
     stm = null;
     skm = null;
     skmold = null;
     Preview3D.SkelMesh = null;
     Preview3D.StatMesh = null;
     if (pcc.Exports[Objects[n].index].ClassName == "StaticMesh")
         LoadStaticMesh(Objects[n].index);
     if (pcc.Exports[Objects[n].index].ClassName == "SkeletalMesh")
         LoadSkeletalMesh(Objects[n].index);
 }
示例#6
0
        public override void handleUpdate(List <PackageUpdate> updates)
        {
            IEnumerable <PackageUpdate> relevantUpdates = updates.Where(x => x.change != PackageChange.Import &&
                                                                        x.change != PackageChange.ImportAdd &&
                                                                        x.change != PackageChange.Names);
            List <int> updatedExports = relevantUpdates.Select(x => x.index).ToList();

            if (skm != null && updatedExports.Contains(skm.Export.Index)) //Property updates are done through Index, not UIndex unfortunately.
            {
                //loaded SkeletalMesh is no longer a SkeletalMesh
                if (skm.Export.ClassName != "SkeletalMesh")
                {
                    skm = null;
                    preview?.Dispose();
                    preview = null;
                    treeView1.Nodes.Clear();
                    RefreshMeshList();
                }
                else
                {
                    LoadSkeletalMesh(skm.Export.UIndex); //this will be refactored someday
                }
                updatedExports.Remove(skm.Export.Index);
            }
            else if (stm != null && updatedExports.Contains(stm.Export.Index))
            {
                int index = stm.Export.Index;
                //loaded SkeletalMesh is no longer a SkeletalMesh
                if (Pcc.getExport(index).ClassName != "StaticMesh")
                {
                    stm = null;
                    preview?.Dispose();
                    preview = null;
                    treeView1.Nodes.Clear();
                    RefreshMeshList();
                }
                else
                {
                    LoadStaticMesh(index);
                }
                updatedExports.Remove(index);
            }
            if (updatedExports.Intersect(Materials).Count() > 0)
            {
                RefreshMaterialList();
            }
            else
            {
                foreach (var i in updatedExports)
                {
                    string className = Pcc.getExport(i).ClassName;
                    if (className == "MaterialInstanceConstant" || className == "Material")
                    {
                        RefreshMaterialList();
                        break;
                    }
                }
            }
            if (updatedExports.Intersect(Objects).Count() > 0)
            {
                RefreshMeshList();
            }
            else
            {
                foreach (var i in updatedExports)
                {
                    string className = Pcc.getExport(i).ClassName;
                    if (className == "SkeletalMesh" || className == "StaticMesh")
                    {
                        RefreshMeshList();
                        break;
                    }
                }
            }
        }
示例#7
0
 public override void handleUpdate(List<PackageUpdate> updates)
 {
     IEnumerable<PackageUpdate> relevantUpdates = updates.Where(x => x.change != PackageChange.Import &&
                                                                     x.change != PackageChange.ImportAdd &&
                                                                     x.change != PackageChange.Names);
     List<int> updatedExports = relevantUpdates.Select(x => x.index).ToList();
     if (skm != null && updatedExports.Contains(skm.MyIndex))
     {
         int index = skm.MyIndex;
         //loaded SkeletalMesh is no longer a SkeletalMesh
         if (pcc.getExport(index).ClassName != "SkeletalMesh")
         {
             skm = null;
             skmold = null;
             Preview3D.SkelMesh = null;
             treeView1.Nodes.Clear();
             hb1.ByteProvider = new DynamicByteProvider(new List<byte>());
             RefreshMeshList();
         }
         else
         {
             LoadSkeletalMesh(index);
         }
         updatedExports.Remove(index);
     }
     else if (stm != null && updatedExports.Contains(stm.index))
     {
         int index = stm.index;
         //loaded SkeletalMesh is no longer a SkeletalMesh
         if (pcc.getExport(index).ClassName != "StaticMesh")
         {
             stm = null;
             Preview3D.StatMesh = null;
             treeView1.Nodes.Clear();
             hb1.ByteProvider = new DynamicByteProvider(new List<byte>());
             RefreshMeshList();
         }
         else
         {
             LoadStaticMesh(index);
         }
         updatedExports.Remove(index);
     }
     if (updatedExports.Intersect(Materials).Count() > 0)
     {
         RefreshMaterialList();
     }
     else
     {
         foreach (var i in updatedExports)
         {
             string className = pcc.getExport(i).ClassName;
             if (className == "MaterialInstanceConstant" || className == "Material")
             {
                 RefreshMaterialList();
                 break;
             }
         }
     }
     if (updatedExports.Intersect(Objects).Count() > 0)
     {
         RefreshMeshList();
     }
     else
     {
         foreach (var i in updatedExports)
         {
             string className = pcc.getExport(i).ClassName;
             if (className == "SkeletalMesh" || className == "StaticMesh")
             {
                 RefreshMeshList();
                 break;
             }
         }
     }
 }
示例#8
0
 public void LoadSkeletalMesh(int index)
 {
     try
     {
         DisableLODs();
         UnCheckLODs();
         skm = new SkeletalMesh(pcc as ME3Package, index);
         skmold = new SkeletalMeshOld(pcc as ME3Package, index);
         hb1.ByteProvider = new DynamicByteProvider(pcc.Exports[index].Data);
         bool foundTex = false;
         try
         {
             for (int i = 0; i < skm.MatInsts.Count; i++)
             {
                 for (int j = 0; j < skm.MatInsts[i].Textures.Count; j++)
                 {
                     if (skm.MatInsts[i].Textures[j].Desc.Contains("Diffuse"))
                     {
                         Preview3D.setTex(skm.MatInsts[i].Textures[j].Texture);
                         foundTex = true;
                         break;
                     }
                 }
             }
         }
         catch
         {
         }
         if (!foundTex)
         {
             Preview3D.setTex();
         }
         Preview3D.StatMesh = null;
         Preview3D.SkelMesh = skm;
         Preview3D.CamDistance = skm.Bounding.r * 2.0f;
         Preview3D.CamOffset = skm.Bounding.origin;
         treeView1.BeginUpdate();
         treeView1.Nodes.Clear();
         treeView1.Nodes.Add(skm.ToTree());
         treeView1.Nodes[0].Expand();
         treeView1.EndUpdate();
         lODToolStripMenuItem.Visible = true;
         lOD0ToolStripMenuItem.Enabled = true;
         lOD0ToolStripMenuItem.Checked = true;
         if (skm.LODModels.Count > 1)
             lOD1ToolStripMenuItem.Enabled = true;
         if (skm.LODModels.Count > 2)
             lOD2ToolStripMenuItem.Enabled = true;
         if (skm.LODModels.Count > 3)
             lOD3ToolStripMenuItem.Enabled = true;
     }
     catch
     {
         return;
     }
 }
示例#9
0
 private bool importExport(IMEPackage importpcc, int n, int link)
 {
     IExportEntry ex = importpcc.getExport(n);
     IExportEntry nex = null;
     switch (pcc.Game)
     {
         case MEGame.ME1:
             nex = new ME1ExportEntry(pcc as ME1Package);
             break;
         case MEGame.ME2:
             nex = new ME2ExportEntry(pcc as ME2Package);
             break;
         case MEGame.ME3:
             nex = new ME3ExportEntry(pcc as ME3Package);
             break;
     }
     byte[] idata = ex.Data;
     PropertyCollection props = ex.GetProperties();
     int start = ex.GetPropertyStart();
     int end = props.endOffset;
     MemoryStream res = new MemoryStream();
     if ((importpcc.getExport(n).ObjectFlags & (ulong)UnrealFlags.EObjectFlags.HasStack) != 0)
     {
         byte[] stackdummy = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, //Lets hope for the best :D
                               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,};
         if (pcc.Game != MEGame.ME3)
         {
             stackdummy = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
                               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,};
         }
         res.Write(stackdummy, 0, stackdummy.Length);
     }
     else
     {
         res.Write(new byte[start], 0, start);
     }
     //store copy of names list in case something goes wrong
     List<string> names = pcc.Names.ToList();
     try
     {
         props.WriteTo(res, pcc);
     }
     catch (Exception exception)
     {
         //restore namelist
         pcc.setNames(names);
         MessageBox.Show("Error occured while trying to import " + ex.ObjectName + " : " + exception.Message);
         return false;
     }
     if (importpcc.Game == MEGame.ME3 && importpcc.getObjectName(ex.idxClass) == "SkeletalMesh")
     {
         SkeletalMesh skl = new SkeletalMesh(importpcc as ME3Package, n);
         SkeletalMesh.BoneStruct bone;
         for (int i = 0; i < skl.Bones.Count; i++)
         {
             bone = skl.Bones[i];
             string s = importpcc.getNameEntry(bone.Name);
             bone.Name = pcc.FindNameOrAdd(s);
             skl.Bones[i] = bone;
         }
         SkeletalMesh.TailNamesStruct tailName;
         for (int i = 0; i < skl.TailNames.Count; i++)
         {
             tailName = skl.TailNames[i];
             string s = importpcc.getNameEntry(tailName.Name);
             tailName.Name = pcc.FindNameOrAdd(s);
             skl.TailNames[i] = tailName;
         }
         SerializingContainer container = new SerializingContainer(res);
         container.isLoading = false;
         skl.Serialize(container);
     }
     else
     {
         res.Write(idata, end, idata.Length - end);
     }
     nex.setHeader((byte[])ex.header.Clone());
     nex.Data = res.ToArray();
     nex.idxObjectName = pcc.FindNameOrAdd(importpcc.getNameEntry(ex.idxObjectName));
     nex.idxLink = link;
     nex.idxArchtype = nex.idxClass = nex.idxClassParent = 0;
     pcc.addExport(nex);
     return true;
 }
示例#10
0
        private void importLODToolStripMenuItem_Click(object sender, EventArgs e)
        {
            int n = listBox1.SelectedIndex;
            if (n == -1)
                return;
            int m = listBox2.SelectedIndex;
            if (m == -1)
                return;
            SkeletalMesh skm = new SkeletalMesh(MPOpt.pcc, MPOpt.SelectedObject);
            SkeletalMesh.LODModelStruct lodpcc = skm.LODModels[MPOpt.SelectedLOD];
            UDKExplorer.UDK.Classes.SkeletalMesh skmudk = new UDKExplorer.UDK.Classes.SkeletalMesh(udk, Objects[n]);
            if (skm.Bones.Count != skmudk.Bones.Count)
            {
                MessageBox.Show("Your imported mesh has a different count of Bones! This would crash your game, stopping now.");
                return;
            }
            UDKExplorer.UDK.Classes.SkeletalMesh.LODModelStruct lodudk = skmudk.LODModels[m];
            lodpcc.Sections = new List<SkeletalMesh.SectionStruct>();
            foreach (UDKExplorer.UDK.Classes.SkeletalMesh.SectionStruct secudk in lodudk.Sections)
            {
                SkeletalMesh.SectionStruct secpcc = new SkeletalMesh.SectionStruct();
                secpcc.BaseIndex = secudk.BaseIndex;
                secpcc.ChunkIndex = secudk.ChunkIndex;
                secpcc.MaterialIndex = secudk.MaterialIndex;
                secpcc.NumTriangles = secudk.NumTriangles;
                lodpcc.Sections.Add(secpcc);
            }
            lodpcc.IndexBuffer = new SkeletalMesh.MultiSizeIndexContainerStruct();
            lodpcc.IndexBuffer.IndexCount = lodudk.IndexBuffer.IndexCount;
            lodpcc.IndexBuffer.IndexSize = lodudk.IndexBuffer.IndexSize;
            lodpcc.IndexBuffer.Indexes = new List<ushort>();
            foreach (ushort Idx in lodudk.IndexBuffer.Indexes)
                lodpcc.IndexBuffer.Indexes.Add(Idx);
            List<int> BoneMap = new List<int>();
            for (int i = 0; i < skmudk.Bones.Count; i++)
            {
                string udkb = udk.GetName(skmudk.Bones[i].Name);
                bool found = false;
                for (int j = 0; j < skm.Bones.Count; j++)
                {
                    string pccb = MPOpt.pcc.getNameEntry(skm.Bones[j].Name);
                    if (pccb == udkb)
                    {
                        found = true;
                        BoneMap.Add(j);
                        if (MPOpt.SKM_importbones)
                        {
                            SkeletalMesh.BoneStruct bpcc = skm.Bones[j];
                            UDKExplorer.UDK.Classes.SkeletalMesh.BoneStruct budk = skmudk.Bones[i];
                            bpcc.Orientation = budk.Orientation;                   
                            bpcc.Position = budk.Position;
                            skm.Bones[j] = bpcc;
                        }
                    }
                }
                if (!found)
                {
                    DebugOutput.PrintLn("ERROR: Cant Match Bone \"" + udkb + "\"");
                    BoneMap.Add(0);
                }
            }

            lodpcc.ActiveBones = new List<ushort>();
            foreach (ushort Idx in lodudk.ActiveBones)
                lodpcc.ActiveBones.Add((ushort)BoneMap[Idx]);
            lodpcc.Chunks = new List<SkeletalMesh.SkelMeshChunkStruct>();
            foreach (UDKExplorer.UDK.Classes.SkeletalMesh.SkelMeshChunkStruct chunkudk in lodudk.Chunks)
            {
                SkeletalMesh.SkelMeshChunkStruct chunkpcc = new SkeletalMesh.SkelMeshChunkStruct();
                chunkpcc.BaseVertexIndex = chunkudk.BaseVertexIndex;
                chunkpcc.MaxBoneInfluences = chunkudk.MaxBoneInfluences;
                chunkpcc.NumRigidVertices = chunkudk.NumRigidVertices;
                chunkpcc.NumSoftVertices = chunkudk.NumSoftVertices;
                chunkpcc.BoneMap = new List<ushort>();
                chunkpcc.RiginSkinVertices = new List<SkeletalMesh.RigidSkinVertexStruct>();
                chunkpcc.SoftSkinVertices = new List<SkeletalMesh.SoftSkinVertexStruct>();
                foreach (ushort Idx in chunkudk.BoneMap)
                    chunkpcc.BoneMap.Add((ushort)BoneMap[Idx]);
                lodpcc.Chunks.Add(chunkpcc);
            }
            lodpcc.Size = lodudk.Size;
            lodpcc.NumVertices = lodudk.NumVertices;
            lodpcc.RequiredBones = new List<byte>();
            foreach (byte b in lodudk.RequiredBones)
                lodpcc.RequiredBones.Add(b);
            lodpcc.VertexBufferGPUSkin = new SkeletalMesh.VertexBufferGPUSkinStruct();
            lodpcc.VertexBufferGPUSkin.NumTexCoords = lodudk.VertexBufferGPUSkin.NumTexCoords;
            lodpcc.VertexBufferGPUSkin.Extension = lodudk.VertexBufferGPUSkin.Extension;
            lodpcc.VertexBufferGPUSkin.Origin = lodudk.VertexBufferGPUSkin.Origin;
            lodpcc.VertexBufferGPUSkin.VertexSize = lodudk.VertexBufferGPUSkin.VertexSize;
            lodpcc.VertexBufferGPUSkin.Vertices = new List<SkeletalMesh.GPUSkinVertexStruct>();
            foreach (UDKExplorer.UDK.Classes.SkeletalMesh.GPUSkinVertexStruct vudk in lodudk.VertexBufferGPUSkin.Vertices)
            {
                SkeletalMesh.GPUSkinVertexStruct vpcc = new SkeletalMesh.GPUSkinVertexStruct();
                vpcc.TangentX = vudk.TangentX;
                vpcc.TangentZ = vudk.TangentZ;
                vpcc.Position = vudk.Position;
                vpcc.InfluenceBones = vudk.InfluenceBones;
                vpcc.InfluenceWeights = vudk.InfluenceWeights;
                vpcc.U = vudk.U;
                vpcc.V = vudk.V;
                lodpcc.VertexBufferGPUSkin.Vertices.Add(vpcc);
            }
            skm.LODModels[MPOpt.SelectedLOD] = lodpcc;
            SerializingContainer con = new SerializingContainer();
            con.Memory = new MemoryStream();
            con.isLoading = false;
            skm.Serialize(con);
            int end = skm.GetPropertyEnd();
            MemoryStream mem = new MemoryStream();
            mem.Write(MPOpt.pcc.Exports[MPOpt.SelectedObject].Data, 0, end);
            mem.Write(con.Memory.ToArray(), 0, (int)con.Memory.Length);
            MPOpt.pcc.Exports[MPOpt.SelectedObject].Data = mem.ToArray();
            MPOpt.pcc.altSaveToFile(MPOpt.pcc.pccFileName, true);
            //SaveFileDialog d = new SaveFileDialog();
            //d.Filter = "*.bin|*.bin";
            //if (d.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            //{
            //    FileStream fs = new FileStream(d.FileName, FileMode.Create, FileAccess.Write);
            //    fs.Write(mem.ToArray(), 0, (int)mem.Length);
            //    fs.Close();
                MessageBox.Show("Done");
            //}
        }