public Task DumpDiscardPsAsync(IProgress <int> progress) { return(Task.Run(() => { if (!Directory.Exists("shaderDump")) { Directory.CreateDirectory("shaderDump"); } for (var i = 0; i < _candidateIds.Count; i++) { var id = _candidateIds[i]; var filename = _archive.VfsFilename(id); var outputPath = "shaderDump/" + filename; var binary = _archive.Get(id); var disassembly = D3DCompiler.Disassemble(binary); if (disassembly.Contains("discard_z")) { File.WriteAllBytes(outputPath, binary); File.WriteAllText(outputPath + ".lst", disassembly); } progress.Report(i + 1); } })); }
public Task PatchAsync(IProgress <int> progress, PatchMode mode, float multiplier) { return(Task.Run(() => { var _multiplier = BitConverter.GetBytes(multiplier); for (var i = 0; i < _candidateIds.Count(); i++) { var id = _candidateIds[i]; var binary = _archive.Get(id); var disassembly = D3DCompiler.Disassemble(binary); if (disassembly.Contains("FP_FadePower")) { // actor - patching these causes glitches with camera-overlap fade progress.Report(i + 1); continue; } bool found = false; byte[] newBinary = (byte[])binary.Clone(); foreach (var pos in binary.SigScan(block_sig)) { switch (mode) { case PatchMode.DisableDithering: Buffer.BlockCopy(nop_12x, 0, newBinary, pos + block_discard_offset, 12); break; case PatchMode.NarrowDithering: Buffer.BlockCopy(_multiplier, 0, newBinary, pos + block_float_offset, 4); break; } found = true; } foreach (var pos in binary.SigScan(block2_sig)) { switch (mode) { case PatchMode.DisableDithering: Buffer.BlockCopy(nop_12x, 0, newBinary, pos + block2_discard_offset, 12); break; case PatchMode.NarrowDithering: Buffer.BlockCopy(_multiplier, 0, newBinary, pos + block2_float_offset, 4); break; } found = true; } if (found) { int[] checksum = DXBCChecksum.DXBCChecksum.CalculateDXBCChecksum(newBinary); Buffer.BlockCopy(checksum, 0, newBinary, 4, 16); _archive.Replace(id, newBinary); } progress.Report(i + 1); } })); }