Files
korenkonder_PD_Tool/KKdMainLib/F2/DOF.cs
T
2021-11-09 14:34:27 +03:00

351 lines
12 KiB
C#

using KKdBaseLib;
using KKdBaseLib.F2;
using KKdMainLib.IO;
namespace KKdMainLib.F2
{
public struct DOF : System.IDisposable
{
private int i;
private Stream s;
public bool IsX;
public CountPointer<DFT> DFTs;
public void DFTReader(string file)
{
IsX = false;
DFTs = default;
byte[] dftData = File.ReadAllBytes(file + ".dft");
Struct _DOFT = dftData.RSt(); dftData = null;
if (_DOFT.Header.Signature != 0x54464F44) return;
s = File.OpenReader(_DOFT.Data);
s.IsBE = _DOFT.Header.UseBigEndian;
DFTs = s.RCPE<DFT>();
if (DFTs.C < 1) { s.C(); DFTs.C = -1; return; }
if (!(DFTs.C > 0 && DFTs.O == 0))
{
s.PI64 = DFTs.O - _DOFT.Header.Length;
for (i = 0; i < DFTs.C; i++)
{
ref DFT dft = ref DFTs.E[i];
dft.Flags = (Flags)s.RI32E();
dft.Focus = s.RF32E();
dft.FocusRange = s.RF32E();
dft.FuzzingRange = s.RF32E();
dft.Ratio = s.RF32E();
dft.Quality = s.RF32E();
}
}
else
{
IsX = true;
s.IsX = true;
DFTs.O = (int)s.RI64E();
s.PI64 = DFTs.O;
for (i = 0; i < DFTs.C; i++)
{
ref DFT dft = ref DFTs.E[i];
dft.Flags = (Flags)s.RI32E();
dft.Focus = s.RF32E();
dft.FocusRange = s.RF32E();
dft.FuzzingRange = s.RF32E();
dft.Ratio = s.RF32E();
dft.Quality = s.RF32E();
dft.Unk = s.RI32 ();
}
}
s.C();
}
public void DFTWriter(string file)
{
if (DFTs.E == null || DFTs.C < 1) return;
if (file.EndsWith("_dof"))
file = file.Substring(0, file.Length - 4);
s = File.OpenWriter();
s.IsBE = false;
s.Format = Format.F2;
ENRS e = default;
POF p = default;
p.Offsets = KKdList<long>.New;
if (!IsX)
{
s.W(DFTs.C);
s.W(0x50);
s.A(0x10);
for (i = 0; i < DFTs.C; i++)
{
ref DFT dft = ref DFTs.E[i];
s.W((int)dft.Flags);
s.W(dft.Focus );
s.W(dft.FocusRange );
s.W(dft.FuzzingRange);
s.W(dft.Ratio );
s.W(dft.Quality );
}
e.Array = new ENRS.ENRSEntry[2];
e.Array[0] = new ENRS.ENRSEntry(0x00, 0x01, 0x10, 0x01);
e.Array[0].Sub[0] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x02, ENRS.ENRSEntry.Type.DWORD);
e.Array[1] = new ENRS.ENRSEntry(0x10, 0x01, 0x18, DFTs.C);
e.Array[1].Sub[0] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x06, ENRS.ENRSEntry.Type.DWORD);
p.Offsets.Add(0x44);
}
else
{
s.W(DFTs.C);
s.A(0x08);
s.W(0x10L);
s.A(0x10);
for (i = 0; i < DFTs.C; i++)
{
ref DFT dft = ref DFTs.E[i];
s.W((int)dft.Flags);
s.W(dft.Focus );
s.W(dft.FocusRange );
s.W(dft.FuzzingRange);
s.W(dft.Ratio );
s.W(dft.Quality );
s.W(dft.Unk );
}
e.Array = new ENRS.ENRSEntry[2];
e.Array[0] = new ENRS.ENRSEntry(0x00, 0x02, 0x10, 0x01);
e.Array[0].Sub[0] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x01, ENRS.ENRSEntry.Type.DWORD);
e.Array[0].Sub[1] = new ENRS.ENRSEntry.SubENRSEntry(0x04, 0x01, ENRS.ENRSEntry.Type.QWORD);
e.Array[1] = new ENRS.ENRSEntry(0x10, 0x01, 0x1C, DFTs.C);
e.Array[1].Sub[0] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x06, ENRS.ENRSEntry.Type.DWORD);
p.Offsets.Add(0x08);
}
s.A(0x10, true);
byte[] data = s.ToArray(true);
Struct _DOFT = default;
_DOFT.Header.Signature = 0x54464F44;
_DOFT.Header.DataSize = (uint)data.Length;
_DOFT.Header.Length = 0x40;
_DOFT.Header.Depth = 0;
_DOFT.Header.SectionSize = (uint)data.Length;
_DOFT.Header.Version = 0;
_DOFT.Header.InnerSignature = 0x03;
_DOFT.Header.UseBigEndian = false;
_DOFT.Header.UseSectionSize = true;
_DOFT.Header.Format = Format.F2;
_DOFT.Data = data;
_DOFT.ENRS = e;
_DOFT.POF = p;
File.WriteAllBytes(file + ".dft", _DOFT.W(IsX, true));
}
public void MsgPackReader(string file, bool json)
{
IsX = false;
DFTs = default;
MsgPack msgPack = file.ReadMPAllAtOnce(json);
MsgPack dof;
if ((dof = msgPack["DOF", true]).NotNull)
{
DFTs.E = new DFT[dof.Array.Length];
for (i = 0; i < DFTs.C; i++)
{
ref DFT dft = ref DFTs.E[i];
dft = default;
MsgPack d = dof[i];
MsgPack temp;
if ((temp = d["Focus"]).Object != null)
{
dft.Flags |= Flags.Focus;
dft.Focus = temp.RF32();
}
if ((temp = d["FocusRange"]).Object != null)
{
dft.Flags |= Flags.FocusRange;
dft.FocusRange = temp.RF32();
}
if ((temp = d["FuzzingRange"]).Object != null)
{
dft.Flags |= Flags.FuzzingRange;
dft.FuzzingRange = temp.RF32();
}
if ((temp = d["Ratio"]).Object != null)
{
dft.Flags |= Flags.Ratio;
dft.Ratio = temp.RF32();
}
if ((temp = d["Quality"]).Object != null)
{
dft.Flags |= Flags.Quality;
dft.Quality = temp.RF32();
}
}
}
else if ((dof = msgPack["DOFX", true]).NotNull)
{
IsX = true;
DFTs.E = new DFT[dof.Array.Length];
for (i = 0; i < DFTs.C; i++)
{
ref DFT dft = ref DFTs.E[i];
dft = default;
MsgPack d = dof[i];
MsgPack temp;
if ((temp = d["Focus"]).Object != null)
{
dft.Flags |= Flags.Focus;
dft.Focus = temp.RF32();
}
if ((temp = d["FocusRange"]).Object != null)
{
dft.Flags |= Flags.FocusRange;
dft.FocusRange = temp.RF32();
}
if ((temp = d["FuzzingRange"]).Object != null)
{
dft.Flags |= Flags.FuzzingRange;
dft.FuzzingRange = temp.RF32();
}
if ((temp = d["Ratio"]).Object != null)
{
dft.Flags |= Flags.Ratio;
dft.Ratio = temp.RF32();
}
if ((temp = d["Quality"]).Object != null)
{
dft.Flags |= Flags.Quality;
dft.Quality = temp.RF32();
}
if ((temp = d["Unk"]).Object != null)
{
dft.Flags |= Flags.Unk;
dft.Unk = temp.RI32();
}
}
}
dof.Dispose();
msgPack.Dispose();
}
public void MsgPackWriter(string file, bool json)
{
if (DFTs.E == null || DFTs.C < 1) return;
MsgPack dof;
if (!IsX)
{
dof = new MsgPack(DFTs.C, "DOF");
for (i = 0; i < DFTs.C; i++)
{
ref DFT dft = ref DFTs.E[i];
MsgPack d = MsgPack.New;
if ((dft.Flags & Flags.Focus) != 0)
d.Add("Focus", dft.Focus);
if ((dft.Flags & Flags.FocusRange) != 0)
d.Add("FocusRange", dft.FocusRange);
if ((dft.Flags & Flags.FuzzingRange) != 0)
d.Add("FuzzingRange", dft.FuzzingRange);
if ((dft.Flags & Flags.Ratio) != 0)
d.Add("Ratio", dft.Ratio);
if ((dft.Flags & Flags.Quality) != 0)
d.Add("Quality", dft.Quality);
dof[i] = d;
}
}
else
{
dof = new MsgPack(DFTs.C, "DOFX");
for (i = 0; i < DFTs.C; i++)
{
ref DFT dft = ref DFTs.E[i];
MsgPack d = MsgPack.New;
if ((dft.Flags & Flags.Focus) != 0)
d.Add("Focus", dft.Focus);
if ((dft.Flags & Flags.FocusRange) != 0)
d.Add("FocusRange", dft.FocusRange);
if ((dft.Flags & Flags.FuzzingRange) != 0)
d.Add("FuzzingRange", dft.FuzzingRange);
if ((dft.Flags & Flags.Ratio) != 0)
d.Add("Ratio", dft.Ratio);
if ((dft.Flags & Flags.Quality) != 0)
d.Add("Quality", dft.Quality);
if ((dft.Flags & Flags.Unk) != 0)
d.Add("Unk", dft.Unk);
dof[i] = d;
}
}
dof.Write(false, true, file + "_dof", json);
}
public void TXTWriter(string file)
{
if (DFTs.C < 1) return;
s = File.OpenWriter();
s.WPSSJIS("ID,Focus,FocusRange,FuzzingRange,Ratio,Quality\n");
for (i = 0; i < DFTs.C; i++)
s.W($"{i},{DFTs[i]}\n");
File.WriteAllBytes($"{file}_dof.txt", s.ToArray(true));
}
private bool disposed;
public void Dispose()
{ if (!disposed) { if (s != null) s.D(); s = null; DFTs = default; IsX = false; disposed = true; } }
public struct DFT
{
public Flags Flags;
public float Focus;
public float FocusRange;
public float FuzzingRange;
public float Ratio;
public float Quality;
public int Unk;
public override string ToString() =>
((Flags & Flags.Focus) != 0
? $"{Focus.ToS(6)}," : ",") +
((Flags & Flags.FocusRange) != 0
? $"{FocusRange.ToS(6)}," : ",") +
((Flags & Flags.FuzzingRange) != 0
? $"{FuzzingRange.ToS(6)}," : ",") +
((Flags & Flags.Ratio) != 0
? $"{Ratio.ToS(6)}," : ",") +
((Flags & Flags.Quality) != 0
? $"{Quality.ToS(6)}" : "");
}
public enum Flags : int
{
Focus = 0b000001,
FocusRange = 0b000010,
FuzzingRange = 0b000100,
Ratio = 0b001000,
Quality = 0b010000,
Unk = 0b100000,
}
}
}