public void LoadTextures() { DialogResult r = MessageBox.Show("Load textures too?", "", MessageBoxButtons.YesNo); if (r == DialogResult.No) { for (int i = 0; i < UStat.Count; i++) { UStat[i].LP.textureindex = -1; } return; } r = MessageBox.Show("Load from tfcs?", "", MessageBoxButtons.YesNo); string ptex = "", pctex = ""; if (r == DialogResult.Yes) { OpenFileDialog d = new OpenFileDialog(); d.Filter = "Textures.tfc|Textures.tfc"; if (d.ShowDialog() == DialogResult.OK) { ptex = d.FileName; } d.Filter = "CharTextures.tfc|CharTextures.tfc"; if (d.ShowDialog() == DialogResult.OK) { pctex = d.FileName; } } int count = 50; int counttex = 0; int countmat = 0; for (int i = 0; i < UStat.Count; i++) { if (UStat[i].Materials == null || UStat[i].Materials.Count() == 0) { if (count < 49) { count++; } else { count = 0; TextOut("\n" + i.ToString() + "\t"); } TextOut("x"); UStat[i].LP.textureindex = -1; } else { if (count < 49) { count++; } else { count = 0; TextOut("\n" + i.ToString() + "\t"); } UStat[i].LP.textureindex = -1; int stype = -1;//0=MIC 1=MAT int index = -1; for (int k = 0; k < UStat[i].Materials.Count; k++) { byte[] buff = UStat[i].Materials[k].raw; for (int j = 0; j < 11; j++) { int idx = BitConverter.ToInt32(buff, j * 4); if (idx > 0 && idx < pcc.Header.ExportCount) { string s = pcc.getClassName(pcc.Export[idx].Class); if (s == "MaterialInstanceConstant") { index = idx; stype = 0; break; } if (s == "Material") { index = idx; stype = 1; break; } } } } if (index < 0) { TextOut("?"); continue; } #region MIC if (stype == 0) { UnrealObject UOb = new UnrealObject(pcc.EntryToBuff(index), pcc.getClassName(pcc.Export[index].Class), pcc.names); string l = Path.GetDirectoryName(Application.ExecutablePath); UOb.UUkn.UPR = UPR; UOb.UUkn.Deserialize(); int entry = UPR.FindProperty("TextureParameterValues", UOb.UUkn.Properties); if (entry != -1) { entry += 4; index = -1; bool stopme = false; while (entry < UOb.UUkn.Properties.Count() && UOb.UUkn.Properties[entry].name == "ParameterValue" && !stopme) { entry++; int n = BitConverter.ToInt32(UOb.UUkn.Properties[entry].raw, UOb.UUkn.Properties[entry].raw.Length - 4) - 1; if (n > 0) { index = n; if (pcc.names[pcc.Export[n].Name].ToLower().Contains("diff")) { stopme = true; } } entry += 5; } if (index != -1) { bool found = false; for (int j = 0; j < Tex.Count(); j++) { if (index == Tex[j].index) { UStat[i].LP.textureindex = j; TextOut("f"); found = true; break; } } if (!found) { UOb = new UnrealObject(pcc.EntryToBuff(index), "Texture2D", pcc.names); TextureEntry t = new TextureEntry(); int tfc = -1; for (int j = 0; j < UOb.UTex2D.TextureTFCs.Count; j++) { if (UOb.UTex2D.TextureTFCs[j].size > 0 && UOb.UTex2D.TextureTFCs[j].offset > 0 && UOb.UTex2D.TextureTFCs[j].size != UOb.UTex2D.TextureTFCs[j].offset) { tfc = j; break; } } t.tex = UOb.UTex2D.ExportToTexture(device, tfc, ptex, pctex); t.index = index; t.name = pcc.names[pcc.Export[t.index].Name]; t.name = t.name.Substring(0, t.name.Length - 1); Tex.Add(t); UStat[i].LP.textureindex = Tex.Count - 1; TextOut("l"); counttex++; } } else { TextOut("?"); } } else { TextOut("?"); } } #endregion if (stype == 1) { UnrealObject UOb = new UnrealObject(pcc.EntryToBuff(index), pcc.getClassName(pcc.Export[index].Class), pcc.names); string l = Path.GetDirectoryName(Application.ExecutablePath); UOb.UMat.UPR = UPR; UOb.UMat.Deserialize(); int entry = UPR.FindProperty("Expressions", UOb.UMat.props); if (entry == 0) { entry++; int len = UOb.UMat.props[1].raw.Length; int cnt = (len - 20) / 4; index = -1; for (int j = 0; j < cnt; j++) { index = BitConverter.ToInt32(UOb.UMat.props[1].raw, 20 + j * 4) - 1; if (pcc.getClassName(pcc.Export[index].Class) == "MaterialExpressionTextureSampleParamter2D") { break; } } if (index == -1) { TextOut("?"); continue; } UnrealObject UUOb2 = new UnrealObject(pcc.EntryToBuff(index), "MaterialExpressionTextureSampleParameter2D", pcc.names); UUOb2.UUkn.UPR = UPR; UUOb2.UUkn.Deserialize(); index = -1; for (int j = 0; j < UUOb2.UUkn.Properties.Count; j++) { if (UUOb2.UUkn.Properties[j].name == "Texture") { index = PropToInt(UUOb2.UUkn.Properties[j].raw); } } if (index != -1 && !(index < 0)) { index--; bool found = false; for (int j = 0; j < Tex.Count(); j++) { if (index == Tex[j].index) { UStat[i].LP.textureindex = j; TextOut("F"); found = true; break; } } if (!found) { UOb = new UnrealObject(pcc.EntryToBuff(index), "Texture2D", pcc.names); TextureEntry t = new TextureEntry(); int tfc = -1; for (int j = 0; j < UOb.UTex2D.TextureTFCs.Count; j++) { if (UOb.UTex2D.TextureTFCs[j].size > 0 && UOb.UTex2D.TextureTFCs[j].offset > 0 && UOb.UTex2D.TextureTFCs[j].size != UOb.UTex2D.TextureTFCs[j].offset) { tfc = j; break; } } t.tex = UOb.UTex2D.ExportToTexture(device, tfc, ptex, pctex); t.index = index; t.name = pcc.names[pcc.Export[t.index].Name]; t.name = t.name.Substring(0, t.name.Length - 1); Tex.Add(t); UStat[i].LP.textureindex = Tex.Count - 1; TextOut("M"); countmat++; } } else { TextOut("?"); } } else { TextOut("?"); } } } } TextOut("\nLoaded Textures: " + counttex.ToString()); TextOut("\nLoaded Materials: " + countmat.ToString()); }