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); } }
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) { } }
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)); } }
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; }
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); }
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; } } } }
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; } } } }
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; } }
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; }
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"); //} }