Files
korenkonder_PD_Tool/KKdMainLib/A3DA.cs
T
korenkonder 8b46fbbe03 Release v0.4.11.0
`A3DA`: Added support for Raw Data Binary
`Aet`: Complete overhaul of AET writer
`FARC`: Fixed compressed files not having correct size and encrypted files not being encrypted
Updated libdeflate to 1.20
2024-05-11 13:00:07 +03:00

3073 lines
138 KiB
C#

using System;
using KKdBaseLib;
using KKdBaseLib.F2;
using KKdBaseLib.Auth3D;
using KKdMainLib.IO;
using Object = KKdBaseLib.Auth3D.Object;
using A3DADict = System.Collections.Generic.Dictionary<string, object>;
namespace KKdMainLib
{
public struct A3DA : IDisposable
{
public Data Data;
public A3DAHeader Head;
public static int Rounding = 9;
private Stream s;
private bool a3dc;
private int i, i0, i1;
private int soi;
private int soi0;
private int soi1;
private int[] so;
private int[] so0;
private int[] so1;
private string name;
private string nameView;
private string value;
private string[] dataArray;
private A3DADict dict;
private const string BO = ".bin_offset";
private const string MTBO = ".model_transform" + BO;
public int A3DAReader(string file)
{ using (s = File.OpenReader(file + ".a3da"))
return A3DAReader(ref s); }
public int A3DAReader(byte[] data)
{ using (s = File.OpenReader(data))
return A3DAReader(ref s); }
public byte[] A3DAWriter() => A3DAWriter(false);
private int A3DAReader(ref Stream s)
{
name = "";
nameView = "";
dataArray = new string[4];
dict = new A3DADict();
Data = new Data();
Head = new A3DAHeader();
Header header = new Header();
Head.Format = s.Format = Format.F;
uint signature = s.RU32();
if (signature == 0x41443341)
{ header = s.ReadHeader(true); Head.Format = header.Format; signature = s.RU32(); }
if (signature != 0x44334123) return 0;
s.O = s.P - 4;
signature = s.RU32();
if ((signature & 0xFF) == (uint)'A')
{
header.Format = s.Format = Format.DT;
Head.StringOffset = 0x10;
Head.StringLength = s.L - 0x10;
}
else if ((signature & 0xFF) == (uint)'C')
{
s.P = 0x10;
s.RI32();
s.RI32();
Head.SubHeadersOffset = s.RU32E(true);
Head.SubHeadersCount = s.RU16E(true);
Head.SubHeadersStride = s.RU16E(true);
if (Head.SubHeadersCount != 0x02) return 0;
s.PU32 = Head.SubHeadersOffset;
if (s.RI32() != 0x50) return 0;
Head.StringOffset = s.RI32E(true);
Head.StringLength = s.RI32E(true);
s.PU32 = Head.SubHeadersOffset + Head.SubHeadersStride;
if (s.RI32() != 0x4C42) return 0;
Head.BinaryOffset = s.RI32E(true);
Head.BinaryLength = s.RI32E(true);
}
else return 0;
s.P = Head.StringOffset;
string[] strData = s.RS(Head.StringLength).Replace("\r\n", "\n").Replace("\r", "\n").Split('\n');
for (i = 0; i < strData.Length; i++)
dict.GD(strData[i]);
strData = null;
A3DAReader();
if (signature == 0x5F5F5F43)
{
s.P = s.O + Head.BinaryOffset;
s.O = s.P;
s.P = 0;
byte[] data = s.RBy(Head.BinaryLength);
s.C();
s = File.OpenReader(data);
A3DCReader();
}
name = "";
nameView = "";
dataArray = null;
dict.Clear();
dict = null;
return 1;
}
private void A3DAReader()
{
if (dict.SW("_"))
{
Data._ = new _();
if (dict.FV(out int compressF16, "_.compress_f16"))
Data._.CompressF16 = (CompressF16)compressF16;
dict.FV(out Data._.ConverterVersion, "_.converter.version");
dict.FV(out Data._.FileName , "_.file_name" );
dict.FV(out Data._.PropertyVersion , "_.property.version" );
}
if (dict.SW("camera_auxiliary"))
{
name = "camera_auxiliary";
Data.CameraAuxiliary = new CameraAuxiliary
{
AutoExposure = RKN(name + ".auto_exposure" ),
Exposure = RKN(name + ".exposure" ),
ExposureRate = RKN(name + ".exposure_rate"),
Gamma = RKN(name + ".gamma" ),
GammaRate = RKN(name + ".gamma_rate" ),
Saturate = RKN(name + ".saturate" ),
};
if (Data.CameraAuxiliary.Value.ExposureRate.HasValue
|| Data.CameraAuxiliary.Value.GammaRate.HasValue)
if (Head.Format < Format.F || Head.Format == Format.AFT || Head.Format >= Format.FT)
Head.Format = Format.F;
}
if (dict.SW("play_control"))
{
name = "play_control";
Data.PlayControl = new PlayControl();
dict.FV(out Data.PlayControl.Begin , name + ".begin" );
dict.FV(out Data.PlayControl.Div , name + ".div" );
dict.FV(out Data.PlayControl.FPS , name + ".fps" );
dict.FV(out Data.PlayControl.Offset, name + ".offset");
dict.FV(out Data.PlayControl.Size , name + ".size" );
}
if (dict.SW("post_process"))
{
name = "post_process";
Data.PostProcess = new PostProcess()
{
Radius = RRGBAKN(name + ".Ambient" ),
Intensity = RRGBAKN(name + ".Diffuse" ),
SceneFade = RRGBAKN(name + ".Specular" ),
LensFlare = RKN (name + ".lens_flare"),
LensGhost = RKN (name + ".lens_ghost"),
LensShaft = RKN (name + ".lens_shaft"),
};
}
if (dict.FV(out value, "dof.name"))
{
Head.Format = Format.AFT;
Data.DOF = new DOF { MT = RMT("dof") };
}
if (dict.FV(out value, "ambient.length"))
{
Data.Ambient = new Ambient[int.Parse(value)];
Head.Format = Format.MGF;
for (i0 = 0; i0 < Data.Ambient.Length; i0++)
{
name = "ambient." + i0;
dict.FV(out Data.Ambient[i0].Name, name + ".name");
Data.Ambient[i0]. LightDiffuse = RRGBAKN(name + ".light.Diffuse");
Data.Ambient[i0].RimLightDiffuse = RRGBAKN(name + ".rimlight.Diffuse");
}
}
if (dict.FV(out value, "auth_2d.length"))
{
Data.Auth2D = new string[int.Parse(value)];
for (i0 = 0; i0 < Data.Ambient.Length; i0++)
{
name = "auth_2d." + i0;
dict.FV(out Data.Auth2D[i0], name + ".name");
}
}
if (dict.FV(out value, "camera_root.length"))
{
Data.CameraRoot = new CameraRoot[int.Parse(value)];
for (i0 = 0; i0 < Data.CameraRoot.Length; i0++)
{
name = "camera_root." + i0;
nameView = name + ".view_point";
dict.FV(out Data.CameraRoot[i0].VP.Aspect, nameView + ".aspect");
if (dict.FV(out i1, nameView + ".fov_is_horizontal"))
{
Data.CameraRoot[i0].VP.FOVIsHorizontal = i1 != 0;
Data.CameraRoot[i0].VP.FOV = RKNS(nameView + ".fov");
}
else
{
dict.FV(out Data.CameraRoot[i0].VP.
CameraApertureH, nameView + ".camera_aperture_h");
dict.FV(out Data.CameraRoot[i0].VP.
CameraApertureW, nameView + ".camera_aperture_w");
Data.CameraRoot[i0].VP.FocalLength = RKNS(nameView + ".focal_length");
}
Data.CameraRoot[i0]. MT = RMT(name);
Data.CameraRoot[i0].Interest = RMT(name + ".interest");
Data.CameraRoot[i0].VP. MT = RMT(nameView);
Data.CameraRoot[i0].VP.Roll = RKNS(nameView + ".roll");
}
}
if (dict.FV(out value, "chara.length"))
{
Data.Chara = new Chara[int.Parse(value)];
for (i0 = 0; i0 < Data.Chara.Length; i0++)
{
name = "chara." + i0;
dict.FV(out Data.Chara[i0].Name, name + ".name");
Data.Chara[i0].MT = RMT(name);
}
}
if (dict.FV(out value, "curve.length"))
{
Data.Curve = new Curve[int.Parse(value)];
for (i0 = 0; i0 < Data.Curve.Length; i0++)
{
name = "curve." + i0;
dict.FV(out Data.Curve[i0].Name, name + ".name");
Data.Curve[i0].CV = RK(name + ".cv");
}
}
if (dict.FV(out value, "event.length"))
{
Data.Event = new Event[int.Parse(value)];
for (i0 = 0; i0 < Data.Event.Length; i0++)
{
name = "event." + i0;
dict.FV(out Data.Event[i0].Begin , name + ".begin" );
dict.FV(out Data.Event[i0].ClipBegin , name + ".clip_begin" );
dict.FV(out Data.Event[i0].ClipEnd , name + ".clip_en" );
dict.FV(out Data.Event[i0].End , name + ".end" );
dict.FV(out Data.Event[i0].Name , name + ".name" );
dict.FV(out Data.Event[i0].Param1 , name + ".param1" );
dict.FV(out Data.Event[i0].Ref , name + ".ref" );
dict.FV(out Data.Event[i0].TimeRefScale, name + ".time_ref_scale");
dict.FV(out Data.Event[i0].Type , name + ".type" );
}
}
if (dict.FV(out value, "fog.length"))
{
Data.Fog = new Fog[int.Parse(value)];
for (i0 = 0; i0 < Data.Fog.Length; i0++)
{
name = "fog." + i0;
dict.FV(out Data.Fog[i0].Id, name + ".id");
Data.Fog[i0].Color = RRGBAKN(name + ".Diffuse");
Data.Fog[i0].Density = RKN (name + ".density");
Data.Fog[i0].End = RKN (name + ".end");
Data.Fog[i0].Start = RKN (name + ".start");
}
}
if (dict.FV(out value, "light.length"))
{
Data.Light = new Light[int.Parse(value)];
for (i0 = 0; i0 < Data.Light.Length; i0++)
{
name = "light." + i0;
dict.FV(out Data.Light[i0].Id , name + ".id" );
dict.FV(out Data.Light[i0].Type, name + ".type");
Data.Light[i0].Ambient = RRGBAKN(name + ".Ambient");
Data.Light[i0].ConeAngle = RKN (name + ".ConeAngle");
Data.Light[i0].Constant = RKN (name + ".CONSTANT");
Data.Light[i0].Diffuse = RRGBAKN(name + ".Diffuse");
Data.Light[i0].DropOff = RKN (name + ".DropOff");
Data.Light[i0].Far = RKN (name + ".FAR");
Data.Light[i0].ToneCurve = RRGBAKN(name + ".Incandescence");
Data.Light[i0].Intensity = RKN (name + ".Intensity");
Data.Light[i0].Linear = RKN (name + ".LINEAR");
Data.Light[i0].Quadratic = RKN (name + ".QUADRATIC");
Data.Light[i0].Specular = RRGBAKN(name + ".Specular");
Data.Light[i0].Position = RMT (name + ".position");
Data.Light[i0].SpotDirection = RMT (name + ".spot_direction");
if (Data.Light[i0].ConeAngle.HasValue || Data.Light[i0].Constant.HasValue
|| Data.Light[i0].DropOff.HasValue || Data.Light[i0].Far.HasValue
|| Data.Light[i0].Linear.HasValue || Data.Light[i0].Quadratic.HasValue
|| Data.Light[i0].Quadratic.HasValue)
Head.Format = Format.XHD;
}
}
if (dict.FV(out value, "m_objhrc.length"))
{
Data.MObjectHRC = new MObjectHRC[int.Parse(value)];
for (i0 = 0; i0 < Data.MObjectHRC.Length; i0++)
{
name = "m_objhrc." + i0;
dict.FV(out Data.MObjectHRC[i0].Name, name + ".name");
if (dict.FV(out value, name + ".instance.length"))
{
Data.MObjectHRC[i0].Instances = new MObjectHRC.Instance[int.Parse(value)];
for (i1 = 0; i1 < Data.MObjectHRC[i0].Instances.Length; i1++)
{
nameView = name + ".instance." + i1;
dict.FV(out Data.MObjectHRC[i0]
.Instances[i1]. Name, nameView + ".name");
dict.FV(out Data.MObjectHRC[i0]
.Instances[i1].UIDName, nameView + ".uid_name");
dict.FV(out int shadow, nameView + ".shadow");
Data.MObjectHRC[i0].Instances[i1].Shadow = shadow != 0;
Data.MObjectHRC[i0].Instances[i1].MT = RMT(nameView);
}
}
if (dict.FV(out value, name + ".node.length"))
{
Data.MObjectHRC[i0].Node = new ObjectNode[int.Parse(value)];
for (i1 = 0; i1 < Data.MObjectHRC[i0].Node.Length; i1++)
{
nameView = name + ".node." + i1;
if (dict.SW(nameView + ".joint_orient"))
{
Vec3 jointOrient = new Vec3();
dict.FV(out jointOrient.X, nameView + ".joint_orient.x");
dict.FV(out jointOrient.Y, nameView + ".joint_orient.y");
dict.FV(out jointOrient.Z, nameView + ".joint_orient.z");
Data.MObjectHRC[i0].Node[i1].JointOrient = jointOrient;
}
else
Data.MObjectHRC[i0].Node[i1].JointOrient = null;
dict.FV(out Data.MObjectHRC[i0].Node[i1].Name , nameView + ".name" );
dict.FV(out Data.MObjectHRC[i0].Node[i1].Parent, nameView + ".parent");
Data.MObjectHRC[i0].Node[i1].MT = RMT(nameView);
}
}
Data.MObjectHRC[i0].MT = RMT(name);
}
}
if (dict.FV(out value, "m_objhrc_list.length"))
{
Data.MObjectHRCList = new string[int.Parse(value)];
for (i0 = 0; i0 < Data.MObjectHRCList.Length; i0++)
dict.FV(out Data.MObjectHRCList[i0], "m_objhrc_list." + i0);
}
if (dict.FV(out value, "material_list.length"))
{
Data.MaterialList = new MaterialList[int.Parse(value)];
if (Head.Format != Format.XHD)
Head.Format = Format.X;
for (i0 = 0; i0 < Data.MaterialList.Length; i0++)
{
name = "material_list." + i0;
dict.FV(out Data.MaterialList[i0].Name, name + ".name");
Data.MaterialList[i0].BlendColor = RRGBAKN(name + ".blend_color");
Data.MaterialList[i0].GlowIntensity = RKN (name + ".glow_intensity");
Data.MaterialList[i0].Incandescence = RRGBAKN(name + ".incandescence");
}
}
if (dict.FV(out value, "motion.length"))
{
Data.Motion = new string[int.Parse(value)];
for (i0 = 0; i0 < Data.Motion.Length; i0++)
dict.FV(out Data.Motion[i0], "motion." + i0 + ".name");
}
if (dict.FV(out value, "object.length"))
{
Data.Object = new Object[int.Parse(value)];
for (i0 = 0; i0 < Data.Object.Length; i0++)
{
name = "object." + i0;
if (dict.FV(out Data.Object[i0].Morph , name + ".morph" ))
dict.FV(out Data.Object[i0].MorphOffset, name + ".morph_offset");
dict.FV(out Data.Object[i0]. Name, name + ".name");
dict.FV(out Data.Object[i0]. ParentName, name + ".parent_name");
dict.FV(out Data.Object[i0]. ParentNode, name + ".parent_node");
if (dict.FV(out Data.Object[i0]. Pat , name + ".pat" ))
dict.FV(out Data.Object[i0]. PatOffset, name + ".pat_offset");
dict.FV(out Data.Object[i0]. UIDName, name + ".uid_name");
if (dict.FV(out value, name + ".tex_pat.length"))
{
Data.Object[i0].TexPat = new Object.TexturePattern[int.Parse(value)];
for (i1 = 0; i1 < Data.Object[i0].TexPat.Length; i1++)
{
nameView = name + ".tex_pat." + i1;
dict.FV(out Data.Object[i0].TexPat[i1]
.Name , nameView + ".name" );
if (dict.FV(out Data.Object[i0].TexPat[i1]
.Pat , nameView + ".pat" ))
dict.FV(out Data.Object[i0].TexPat[i1]
.PatOffset, nameView + ".pat_offset");
}
}
if (dict.FV(out value, name + ".tex_transform.length"))
{
Data.Object[i0].TexTrans = new Object.TextureTransform[int.Parse(value)];
for (i1 = 0; i1 < Data.Object[i0].TexTrans.Length; i1++)
{
nameView = name + ".tex_transform." + i1;
dict.FV(out Data.Object[i0].TexTrans[i1].Name, nameView + ".name");
Data.Object[i0].TexTrans[i1].CoverageU = RKN(nameView + ".coverageU" );
Data.Object[i0].TexTrans[i1].CoverageV = RKN(nameView + ".coverageV" );
Data.Object[i0].TexTrans[i1].OffsetU = RKN(nameView + ".offsetU" );
Data.Object[i0].TexTrans[i1].OffsetV = RKN(nameView + ".offsetV" );
Data.Object[i0].TexTrans[i1].RepeatU = RKN(nameView + ".repeatU" );
Data.Object[i0].TexTrans[i1].RepeatV = RKN(nameView + ".repeatV" );
Data.Object[i0].TexTrans[i1]. Rotate = RKN(nameView + ".rotate" );
Data.Object[i0].TexTrans[i1]. RotateFrame = RKN(nameView + ".rotateFrame" );
Data.Object[i0].TexTrans[i1].TranslateFrameU = RKN(nameView + ".translateFrameU");
Data.Object[i0].TexTrans[i1].TranslateFrameV = RKN(nameView + ".translateFrameV");
}
}
Data.Object[i0].MT = RMT(name);
}
}
if (dict.FV(out value, "objhrc.length"))
{
Data.ObjectHRC = new ObjectHRC[int.Parse(value)];
for (i0 = 0; i0 < Data.ObjectHRC.Length; i0++)
{
name = "objhrc." + i0;
dict.FV(out Data.ObjectHRC[i0]. Name, name + ".name");
dict.FV(out Data.ObjectHRC[i0].ParentName, name + ".parent_name");
dict.FV(out Data.ObjectHRC[i0].ParentNode, name + ".parent_node");
dict.FV(out Data.ObjectHRC[i0]. UIDName, name + ".uid_name");
dict.FV(out int shadow, name + ".shadow");
Data.ObjectHRC[i0].Shadow = shadow != 0;
if (dict.FV(out value, name + ".node.length"))
{
Data.ObjectHRC[i0].Node = new ObjectNode[int.Parse(value)];
for (i1 = 0; i1 < Data.ObjectHRC[i0].Node.Length; i1++)
{
nameView = name + ".node." + i1;
if (dict.SW(nameView + ".joint_orient"))
{
Vec3 jointOrient = new Vec3();
dict.FV(out jointOrient.X, nameView + ".joint_orient.x");
dict.FV(out jointOrient.Y, nameView + ".joint_orient.y");
dict.FV(out jointOrient.Z, nameView + ".joint_orient.z");
Data.ObjectHRC[i0].Node[i1].JointOrient = jointOrient;
}
else
Data.ObjectHRC[i0].Node[i1].JointOrient = null;
dict.FV(out Data.ObjectHRC[i0].Node[i1].Name , nameView + ".name" );
dict.FV(out Data.ObjectHRC[i0].Node[i1].Parent, nameView + ".parent");
Data.ObjectHRC[i0].Node[i1].MT = RMT(nameView);
}
}
}
}
if (dict.FV(out value, "object_list.length"))
{
Data.ObjectList = new string[int.Parse(value)];
for (i0 = 0; i0 < Data.ObjectList.Length; i0++)
dict.FV(out Data.ObjectList[i0], "object_list." + i0);
}
if (dict.FV(out value, "objhrc_list.length"))
{
Data.ObjectHRCList = new string[int.Parse(value)];
for (i0 = 0; i0 < Data.ObjectHRCList.Length; i0++)
dict.FV(out Data.ObjectHRCList[i0], "objhrc_list." + i0);
}
if (dict.FV(out value, "point.length"))
{
Data.Point = new Point[int.Parse(value)];
for (i0 = 0; i0 < Data.Point.Length; i0++)
{
name = "point." + i0;
dict.FV(out Data.Point[i0].Name, name + ".name");
Data.Point[i0].MT = RMT(name);
}
}
}
private byte[] A3DAWriter(bool a3dc)
{
this.a3dc = a3dc;
s = File.OpenWriter();
DateTime date = DateTime.Now;
if (a3dc && Data._.CompressF16 != 0)
s.W("#-compress_f16\n");
if (!a3dc)
s.W("#A3DA__________\n");
s.W("#" + DateTime.UtcNow.ToString("ddd MMM dd HH:mm:ss yyyy",
System.Globalization.CultureInfo.InvariantCulture) + "\n");
if (a3dc && Data._.CompressF16 != 0)
W("_.compress_f16", (int)Data._.CompressF16);
W("_.converter.version", Data._.ConverterVersion);
W("_.file_name" , Data._.FileName );
W("_.property.version" , Data._. PropertyVersion);
if (Data.Ambient != null && Head.Format == Format.MGF)
{
so0 = Data.Ambient.Length.SW();
for (i0 = 0; i0 < Data.Ambient.Length; i0++)
{
soi0 = so0[i0];
name = "ambient." + soi0;
ref Ambient Ambient = ref Data.Ambient[soi0];
W(ref Ambient. LightDiffuse, name + ".light.Diffuse");
W(name + ".name", Ambient.Name);
W(ref Ambient.RimLightDiffuse, name + ".rimlight.Diffuse");
}
W("ambient.length", Data.Fog.Length);
}
if (Data.Auth2D != null)
{
so0 = Data.Auth2D.Length.SW();
for (i0 = 0; i0 < Data.Auth2D.Length; i0++)
{
soi0 = so0[i0];
name = "auth_2d." + soi0;
W(name + ".name", Data.Auth2D[soi0]);
}
W("auth_2d.length", Data.Fog.Length);
}
if (Data.CameraAuxiliary != null)
{
name = "camera_auxiliary";
CameraAuxiliary ca = Data.CameraAuxiliary.Value;
if (Head.Format != Format.F && (Head.Format <= Format.AFT || Head.Format >= Format.FT))
{
W(ref ca.AutoExposure , name + ".auto_exposure" );
W(ref ca. Exposure , name + ".exposure" );
}
if (Head.Format == Format.F || (Head.Format > Format.AFT && Head.Format < Format.FT))
W(ref ca. ExposureRate, name + ".exposure_rate");
if (Head.Format != Format.F && (Head.Format <= Format.AFT || Head.Format >= Format.FT))
W(ref ca.Gamma , name + ".gamma" );
if (Head.Format == Format.F || (Head.Format > Format.AFT && Head.Format < Format.FT))
W(ref ca.GammaRate , name + ".gamma_rate" );
W(ref ca.Saturate , name + ".saturate" );
Data.CameraAuxiliary = ca;
}
if (Data.CameraRoot != null)
{
so0 = Data.CameraRoot.Length.SW();
for (i0 = 0; i0 < Data.CameraRoot.Length; i0++)
{
soi0 = so0[i0];
name = "camera_root." + soi0;
nameView = name + ".view_point";
ref CameraRoot cr = ref Data.CameraRoot[soi0];
W(ref cr.Interest, name + ".interest");
W(ref cr.MT, name, 0b11110);
W(nameView + ".aspect", cr.VP.Aspect);
if (cr.VP.FOV.HasValue)
{
if (cr.VP.FOV.HasValue)
{
Key key = cr.VP.FOV.Value;
W(ref key, nameView + ".fov");
cr.VP.FOV = key;
}
W(nameView + ".fov_is_horizontal", cr.VP.FOVIsHorizontal ? 1 : 0);
}
else
{
W(nameView + ".camera_aperture_h", cr.VP.CameraApertureH);
W(nameView + ".camera_aperture_w", cr.VP.CameraApertureW);
if (cr.VP.FocalLength.HasValue)
{
Key key = cr.VP.FocalLength.Value;
W(ref key, nameView + ".focal_length");
cr.VP.FocalLength = key;
}
}
W(ref cr.VP.MT , nameView, 0b10000);
if (cr.VP.Roll.HasValue)
{
Key key = cr.VP.Roll.Value;
W(ref key, nameView + ".roll");
cr.VP.Roll = key;
}
W(ref cr.VP.MT , nameView, 0b01111);
W(ref cr.MT , name , 0b00001);
}
W("camera_root.length", Data.CameraRoot.Length);
}
if (Data.Chara != null)
{
so0 = Data.Chara.Length.SW();
for (i0 = 0; i0 < Data.Chara.Length; i0++)
{
W("chara." + so0[i0] + ".name", Data.Chara[so0[i0]].Name);
W(ref Data.Chara[so0[i0]].MT, "chara." + so0[i0]);
}
W("chara.length", Data.Chara.Length);
}
if (Data.Curve != null)
{
so0 = Data.Curve.Length.SW();
for (i0 = 0; i0 < Data.Curve.Length; i0++)
{
soi0 = so0[i0];
name = "curve." + soi0;
ref Curve curve = ref Data.Curve[soi0];
W(ref curve.CV, name + ".cv");
W(name + ".name", curve.Name);
}
W("curve.length", Data.Curve.Length);
}
if (Data.DOF != null && (Head.Format == Format.AFT || Head.Format == Format.FT))
{
DOF dof = Data.DOF.Value;
W("dof.name", "DOF");
W(ref dof.MT, "dof");
Data.DOF = dof;
}
if (Data.Event != null)
{
so0 = Data.Event.Length.SW();
for (i0 = 0; i0 < Data.Event.Length; i0++)
{
soi0 = so0[i0];
name = "event." + soi0;
ref Event @event = ref Data.Event[soi0];
W(name + ".begin" , @event.Begin );
W(name + ".clip_begin" , @event.ClipBegin );
W(name + ".clip_en" , @event.ClipEnd );
W(name + ".end" , @event.End );
W(name + ".name" , @event.Name );
W(name + ".param1" , @event.Param1 );
W(name + ".ref" , @event.Ref );
W(name + ".time_ref_scale", @event.TimeRefScale);
W(name + ".type" , @event.Type );
}
W("event.length", Data.Event.Length);
}
if (Data.Fog != null)
{
so0 = Data.Fog.Length.SW();
for (i0 = 0; i0 < Data.Fog.Length; i0++)
{
soi0 = so0[i0];
name = "fog." + soi0;
ref Fog fog = ref Data.Fog[soi0];
W(ref fog.Color , name + ".Diffuse");
W(ref fog.Density, name + ".density");
W(ref fog.End , name + ".end" );
W(name + ".id", fog.Id);
W(ref fog.Start , name + ".start" );
}
W("fog.length", Data.Fog.Length);
}
if (Data.Light != null)
{
so0 = Data.Light.Length.SW();
for (i0 = 0; i0 < Data.Light.Length; i0++)
{
soi0 = so0[i0];
name = "light." + soi0;
ref Light light = ref Data.Light[soi0];
W(ref light.Ambient , name + ".Ambient" );
if (Head.Format == Format.XHD)
{
W(ref light.Constant , name + ".CONSTANT" );
W(ref light.ConeAngle , name + ".ConeAngle" );
}
W(ref light.Diffuse, name + ".Diffuse");
if (Head.Format == Format.XHD)
{
W(ref light.DropOff , name + ".DropOff" );
W(ref light.Far , name + ".FAR" );
}
W(ref light.ToneCurve, name + ".Incandescence");
if (Head.Format == Format.XHD)
{
W(ref light.Intensity , name + ".Intensity" );
W(ref light.Linear , name + ".LINEAR" );
W(ref light.Quadratic , name + ".QUADRATIC" );
}
W(ref light.Specular , name + ".Specular" );
W(name + ".id" , light.Id );
W(name + ".name", light.Id switch
{
0 => "Char",
1 => "Stage",
2 => "Sun",
3 => "Reflect",
5 => "CharColor",
6 => "ToneCurve",
_ => "none",
});
W(ref light.Position , name + ".position" );
W(ref light.SpotDirection, name + ".spot_direction");
W(name + ".type", light.Type);
}
W("light.length", Data.Light.Length);
}
if (Data.MObjectHRC != null)
{
so0 = Data.MObjectHRC.Length.SW();
for (i0 = 0; i0 < Data.MObjectHRC.Length; i0++)
{
soi0 = so0[i0];
name = "m_objhrc." + soi0;
ref MObjectHRC mObjectHRC = ref Data.MObjectHRC[soi0];
if (mObjectHRC.Instances != null)
{
so1 = mObjectHRC.Instances.Length.SW();
for (i1 = 0; i1 < mObjectHRC.Instances.Length; i1++)
{
soi1 = so1[i1];
nameView = name + ".instance." + soi1;
ref MObjectHRC.Instance instance = ref mObjectHRC.Instances[soi1];
W(ref instance.MT, nameView, 0b10000);
W(nameView + ".name", instance. Name);
W(ref instance.MT, nameView, 0b01100);
if (instance.Shadow)
W(nameView + ".shadow", 1);
W(ref instance.MT, nameView, 0b00010);
W(nameView + ".uid_name", instance.UIDName);
W(ref instance.MT, nameView, 0b00001);
}
W(name + ".instance.length", mObjectHRC.Instances.Length);
}
W(ref mObjectHRC.MT, name, 0b10000);
W(name + ".name", mObjectHRC.Name);
if (mObjectHRC.Node != null)
{
so1 = mObjectHRC.Node.Length.SW();
for (i1 = 0; i1 < mObjectHRC.Node.Length; i1++)
{
soi1 = so1[i1];
nameView = name + ".node." + soi1;
ref ObjectNode node = ref mObjectHRC.Node[soi1];
if (node.JointOrient.HasValue)
{
Vec3 jointOrient = node.JointOrient.Value;
W(nameView + ".joint_orient.x", jointOrient.X);
W(nameView + ".joint_orient.y", jointOrient.Y);
W(nameView + ".joint_orient.z", jointOrient.Z);
}
W(ref node.MT, nameView, 0b10000);
W(nameView + ".name", node.Name );
W(nameView + ".parent", node.Parent);
W(ref node.MT, nameView, 0b01111);
}
W(name + ".node.length", mObjectHRC.Node.Length);
}
W(ref mObjectHRC.MT, name, 0b01111);
}
W("m_objhrc.length", Data.MObjectHRC.Length);
}
if (Data.MObjectHRCList != null)
{
so0 = Data.MObjectHRCList.Length.SW();
for (i0 = 0; i0 < Data.MObjectHRCList.Length; i0++)
W("m_objhrc_list." + so0[i0], Data.MObjectHRCList[so0[i0]]);
W("m_objhrc_list.length", Data.MObjectHRCList.Length);
}
if (Data.MaterialList != null && (Head.Format == Format.X || Head.Format == Format.XHD))
{
so0 = Data.MaterialList.Length.SW();
for (i0 = 0; i0 < Data.MaterialList.Length; i0++)
{
soi0 = so0[i0];
name = "material_list." + soi0;
ref MaterialList ml = ref Data.MaterialList[soi0];
W(ref ml.BlendColor , name + ".blend_color" );
W(ref ml.GlowIntensity, name + ".glow_intensity");
W(name + ".hash_name", HashExt.HashMurmurHash(ml.Name.ToUTF8()));
W(ref ml.Incandescence, name + ".incandescence" );
W(name + ".name", ml.Name);
}
W("material_list.length", Data.MaterialList.Length);
}
if (Data.Motion != null)
{
so0 = Data.Motion.Length.SW();
for (i0 = 0; i0 < Data.Motion.Length; i0++)
W(name + "." + so0[i0] + ".name", Data.Motion[so0[i0]]);
W("motion.length", Data.Motion.Length);
}
if (Data.Object != null)
{
so0 = Data.Object.Length.SW();
for (i0 = 0; i0 < Data.Object.Length; i0++)
{
soi0 = so0[i0];
name = "object." + soi0;
ref Object @object = ref Data.Object[soi0];
W(ref @object.MT, name, 0b10000);
if (@object.Morph != null)
{
W(name + ".morph" , @object.Morph );
W(name + ".morph_offset", @object.MorphOffset);
}
W(name + ".name" , @object.Name );
W(name + ".parent_name", @object.ParentName);
W(name + ".parent_node", @object.ParentNode);
if (@object.Pat != null)
{
W(name + ".pat" , @object.Pat );
W(name + ".pat_offset", @object.PatOffset);
}
W(ref @object.MT, name, 0b01100);
if (@object.TexPat != null)
{
so1 = @object.TexPat.Length.SW();
for (i1 = 0; i1 < @object.TexPat.Length; i1++)
{
soi1 = so1[i1];
nameView = name + ".tex_pat." + soi1;
ref Object.TexturePattern texPat = ref @object.TexPat[soi1];
W(nameView + ".name" , texPat.Name );
W(nameView + ".pat" , texPat.Pat );
W(nameView + ".pat_offset", texPat.PatOffset);
}
W(name + ".tex_pat.length", @object.TexPat.Length);
}
if (@object.TexTrans != null)
{
so1 = @object.TexTrans.Length.SW();
for (i1 = 0; i1 < @object.TexTrans.Length; i1++)
{
soi1 = so1[i1];
nameView = name + ".tex_transform." + soi1;
ref Object.TextureTransform texTrans = ref @object.TexTrans[soi1];
W(ref texTrans.CoverageU , nameView + ".coverageU" );
W(ref texTrans.CoverageV , nameView + ".coverageV" );
W(nameView + ".name", @object.TexTrans[soi1].Name);
W(ref texTrans.OffsetU , nameView + ".offsetU" );
W(ref texTrans.OffsetV , nameView + ".offsetV" );
W(ref texTrans.RepeatU , nameView + ".repeatU" );
W(ref texTrans.RepeatV , nameView + ".repeatV" );
W(ref texTrans. Rotate , nameView + ".rotate" );
W(ref texTrans. RotateFrame , nameView + ".rotateFrame" );
W(ref texTrans.TranslateFrameU, nameView + ".translateFrameU");
W(ref texTrans.TranslateFrameV, nameView + ".translateFrameV");
}
W(name + ".tex_transform.length", @object.TexTrans.Length);
}
W(ref @object.MT, name, 0b00010);
W(name + ".uid_name", @object.UIDName);
W(ref @object.MT, name, 0b00001);
}
W("object.length", Data.Object.Length);
}
if (Data.ObjectList != null)
{
so0 = Data.ObjectList.Length.SW();
for (i0 = 0; i0 < Data.ObjectList.Length; i0++)
W("object_list." + so0[i0], Data.ObjectList[so0[i0]]);
W("object_list.length", Data.ObjectList.Length);
}
if (Data.ObjectHRC != null)
{
so0 = Data.ObjectHRC.Length.SW();
for (i0 = 0; i0 < Data.ObjectHRC.Length; i0++)
{
soi0 = so0[i0];
name = "objhrc." + soi0;
ref ObjectHRC objectHRC = ref Data.ObjectHRC[soi0];
W(name + ".name", objectHRC.Name);
if (objectHRC.Node != null)
{
so1 = objectHRC.Node.Length.SW();
for (i1 = 0; i1 < objectHRC.Node.Length; i1++)
{
soi1 = so1[i1];
nameView = name + ".node." + soi1;
ref ObjectNode node = ref objectHRC.Node[soi1];
if (node.JointOrient.HasValue)
{
Vec3 jointOrient = node.JointOrient.Value;
W(nameView + ".joint_orient.x", jointOrient.X);
W(nameView + ".joint_orient.y", jointOrient.Y);
W(nameView + ".joint_orient.z", jointOrient.Z);
}
W(ref node.MT, nameView, 0b10000);
W(nameView + ".name" , node.Name );
W(nameView + ".parent", node.Parent);
W(ref node.MT, nameView, 0b01111);
}
W(name + ".node.length", objectHRC.Node.Length);
}
W(name + ".parent_name", objectHRC.ParentName);
W(name + ".parent_node", objectHRC.ParentNode);
if (objectHRC.Shadow)
W(name + ".shadow", 1);
W(name + ".uid_name", objectHRC. UIDName);
}
W("objhrc.length", Data.ObjectHRC.Length);
}
if (Data.ObjectHRCList != null)
{
so0 = Data.ObjectHRCList.Length.SW();
for (i0 = 0; i0 < Data.ObjectHRCList.Length; i0++)
W("objhrc_list." + so0[i0], Data.ObjectHRCList[so0[i0]]);
W("objhrc_list.length", Data.ObjectHRCList.Length);
}
W("play_control.begin", Data.PlayControl.Begin);
if (Head.Format > Format.AFT && Head.Format < Format.FT)
W("play_control.div", Data.PlayControl.Div);
W("play_control.fps", Data.PlayControl.FPS);
if (Data.PlayControl.Offset != null)
{ if (Head.Format > Format.AFT && Head.Format < Format.FT)
{ W("play_control.offset", Data.PlayControl.Offset);
W("play_control.size" , Data.PlayControl.Size ); }
else W("play_control.size" , Data.PlayControl.Size + Data.PlayControl.Offset);
}
else W("play_control.size" , Data.PlayControl.Size);
if (Data.PostProcess != null)
{
PostProcess pp = Data.PostProcess.Value;
name = "post_process";
W(ref pp.Radius , name + ".Ambient" );
W(ref pp.Intensity, name + ".Diffuse" );
W(ref pp.SceneFade, name + ".Specular" );
W(ref pp.LensFlare, name + ".lens_flare");
W(ref pp.LensGhost, name + ".lens_ghost");
W(ref pp.LensShaft, name + ".lens_shaft");
Data.PostProcess = pp;
}
if (Data.Point != null)
{
so0 = Data.Point.Length.SW();
for (i0 = 0; i0 < Data.Point.Length; i0++)
{
W("point." + so0[i0] + ".name", Data.Point[so0[i0]].Name);
W(ref Data.Point[so0[i0]].MT, "point." + so0[i0]);
}
W("point.length", Data.Point.Length);
}
s.A(0x1, true);
byte[] data = s.ToArray();
s.Dispose();
return data;
}
private ModelTransform RMT(string str)
{
ModelTransform mt = new ModelTransform();
dict.FV(out mt.BinOffset, str + MTBO);
mt.Rot = RV3(str + ".rot" );
mt.Scale = RV3(str + ".scale" );
mt.Trans = RV3(str + ".trans" );
mt.Visibility = RK (str + ".visibility");
return mt;
}
private Vec4<Key?>? RRGBAKN(string str) =>
dict.SW(str) ? (Vec4<Key?>?)new Vec4<Key?> { W = RKNS(str + ".a"), Z = RKNS(str + ".b"),
Y = RKNS(str + ".g"), X = RKNS(str + ".r") } : null;
private Vec3<Key> RV3(string str) =>
new Vec3<Key> { X = RK(str + ".x"), Y = RK(str + ".y"), Z = RK(str + ".z") };
private Key? RKNS(string str) =>
dict.SW(str) ? (Key?)RK(str) : null;
private Key? RKN(string str) =>
dict.FV(out bool b, str + ".") && b ? (Key?)RK(str) : null;
private Key RK(string str)
{
Key key = new Key();
if ( dict.FV(out key.BinOffset, str + BO )) return key;
if (!dict.FV(out int type , str + ".type")) return default;
key.Type = (KeyType)type;
if (key.Type == KeyType.None ) return key;
if (key.Type == KeyType.Static) { dict.FV(out key.Value, str + ".value"); return key; }
int i = 0;
if (dict.FV(out int epTypePost, str + ".ep_type_post"))
key.EPTypePost = (EPType)epTypePost;
if (dict.FV(out int epTypePre , str + ".ep_type_pre" ))
key.EPTypePre = (EPType)epTypePre;
dict.FV(out int length, str + ".key.length");
dict.FV(out key.Max , str + ".max" );
int keyType = 0;
if (dict.SW(str + ".raw_data"))
dict.FV(out keyType, str + ".raw_data_key_type");
if (keyType != 0)
{
dict.FV(out string valueType, str + ".raw_data.value_type");
dict.FV(out int valueListSize, str + ".raw_data.value_list_size");
if (dict.FV(out int valueListOffset, str + ".raw_data.value_list_offset"))
{
if (keyType != 3)
return default;
key.RawData = true;
key.RawDataBinary = true;
key.RawDataValueListSize = valueListSize;
key.RawDataValueListOffset = valueListOffset;
return key;
}
string[] VL = null;
if (dict.FV(out value, str + ".raw_data.value_list"))
VL = value.Split(',');
value = "";
int ds = keyType + 1;
length = valueListSize / ds;
key.Keys = new KFT3[length];
if (keyType == 0)
for (i = 0; i < length; i++)
key.Keys[i] = new KFT3(VL[i * ds + 0].ToF32());
else if (keyType == 1)
for (i = 0; i < length; i++)
key.Keys[i] = new KFT3(VL[i * ds + 0].ToF32(), VL[i * ds + 1].ToF32());
else if (keyType == 2)
for (i = 0; i < length; i++)
key.Keys[i] = new KFT3(VL[i * ds + 0].ToF32(), VL[i * ds + 1].ToF32(),
VL[i * ds + 2].ToF32());
else if (keyType == 3)
for (i = 0; i < length; i++)
key.Keys[i] = new KFT3(VL[i * ds + 0].ToF32(), VL[i * ds + 1].ToF32(),
VL[i * ds + 2].ToF32(), VL[i * ds + 3].ToF32());
}
else
{
key.Keys = new KFT3[length];
for (i = 0; i < length; i++)
{
if (!dict.FV(out value, str + ".key." + i + ".data")) continue;
dataArray = value.Replace("(", "").Replace(")", "").Split(',');
type = dataArray.Length - 1;
if (type == 0) key.Keys[i] = new KFT3
(dataArray[0].ToF32());
else if (type == 1) key.Keys[i] = new KFT3
(dataArray[0].ToF32(), dataArray[1].ToF32());
else if (type == 2) key.Keys[i] = new KFT3
(dataArray[0].ToF32(), dataArray[1].ToF32(), dataArray[2].ToF32());
else if (type == 3) key.Keys[i] = new KFT3
(dataArray[0].ToF32(), dataArray[1].ToF32(), dataArray[2].ToF32(), dataArray[3].ToF32());
}
}
return key;
}
private void W(ref ModelTransform mt, string str, byte flags = 0b11111)
{
if (a3dc) { if ((flags & 0b10000) != 0) W(str + MTBO, mt.BinOffset); }
else
{
if ((flags & 0b01000) != 0) W(ref mt.Rot , str + ".rot" );
if ((flags & 0b00100) != 0) W(ref mt.Scale , str + ".scale" );
if ((flags & 0b00010) != 0) W(ref mt.Trans , str + ".trans" );
if ((flags & 0b00001) != 0) W(ref mt.Visibility, str + ".visibility", a3dc);
}
}
private void W(ref Vec4<Key?>? rgba, string str)
{
if (!rgba.HasValue) return;
bool a3dc = Head.Format != Format.AFT && this.a3dc; // A3DC reading is bugged in AFT
Vec4<Key?> rgbav = rgba.Value;
W(str, "true");
if (rgbav.W.HasValue) { Key k = rgbav.W.Value; W(ref k, str + ".a", a3dc); rgbav.W = k; }
if (rgbav.Z.HasValue) { Key k = rgbav.Z.Value; W(ref k, str + ".b", a3dc); rgbav.Z = k; }
if (rgbav.Y.HasValue) { Key k = rgbav.Y.Value; W(ref k, str + ".g", a3dc); rgbav.Y = k; }
if (rgbav.X.HasValue) { Key k = rgbav.X.Value; W(ref k, str + ".r", a3dc); rgbav.X = k; }
rgba = rgbav;
}
private void W(ref Vec3<Key> key, string str)
{ W(ref key.X, str + ".x", a3dc); W(ref key.Y, str + ".y", a3dc); W(ref key.Z, str + ".z", a3dc); }
private void W(ref Key? key, string str)
{ if (!key.HasValue) return; Key k = key.Value; W(str, "true"); W(ref k, str, a3dc); key = k; }
private void W(ref Key key, string str) =>
W(ref key, str, a3dc);
private void W(ref Key key, string str, bool a3dc)
{
if (a3dc && !(key.RawData && key.RawDataBinary)) { W(str + BO, key.BinOffset); return; }
int i = 0;
if (key.Type < KeyType.Linear || key.Keys == null || (key.Keys != null && key.Keys.Length == 0))
{
W(str + ".type", (int)key.Type);
if (key.Type > 0) W(str + ".value", key.Value);
return;
}
if (key.EPTypePost != EPType.None) W(str + ".ep_type_post", (int)key.EPTypePost);
if (key.EPTypePre != EPType.None) W(str + ".ep_type_pre" , (int)key.EPTypePre );
if (!key.RawData && key.Keys != null)
{
int length = key.Keys.Length;
IKF kf;
so = length.SW();
for (i = 0; i < length; i++)
{
soi = so[i];
kf = key.Keys[soi].Check();
W(str + ".key." + soi + ".data", kf.ToString());
int Type = 0;
if (kf is KFT0) Type = 0;
else if (kf is KFT1) Type = 1;
else if (kf is KFT2) Type = 2;
else if (kf is KFT3) Type = 3;
W(str + ".key." + soi + ".type", Type);
}
W(str + ".key.length", length);
W(str + ".max", (float)(key.Max ?? Data.PlayControl.Size));
W(str + ".type", (int)key.Type);
}
else if (key.Keys != null)
{
int length = key.Keys.Length;
W(str + ".max", (float)(key.Max ?? Data.PlayControl.Size));
int keyType = 0;
if (key.RawDataBinary)
{
W(str + ".raw_data.value_list_offset", key.RawDataValueListOffset);
keyType = 3;
}
else
{
for (i = 0; i < length && keyType < 3; i++)
{
IKF kf = key.Keys[i].Check();
if (kf is KFT0 && keyType < 0) keyType = 0;
else if (kf is KFT1 && keyType < 1) keyType = 1;
else if (kf is KFT2 && keyType < 2) keyType = 2;
else if (kf is KFT3 && keyType < 3) keyType = 3;
}
s.W(str + ".raw_data.value_list=");
if (keyType == 0) for (i = 0; i < length; i++)
s.W(key.Keys[i].ToT0().ToString(false) + (i + 1 < length ? "," : ""));
else if (keyType == 1) for (i = 0; i < length; i++)
s.W(key.Keys[i].ToT1().ToString(false) + (i + 1 < length ? "," : ""));
else if (keyType == 2) for (i = 0; i < length; i++)
s.W(key.Keys[i].ToT2().ToString(false) + (i + 1 < length ? "," : ""));
else if (keyType == 3) for (i = 0; i < length; i++)
s.W(key.Keys[i] .ToString(false) + (i + 1 < length ? "," : ""));
s.P--;
s.W('\n');
}
W(str + ".raw_data.value_list_size", length * keyType + length);
W(str + ".raw_data.value_type" , "float" );
W(str + ".raw_data_key_type" , keyType );
W(str + ".type", (int)key.Type);
}
}
private void W(string Data, long? val)
{ if (val != null) W(Data, ( long)val ); }
private void W(string Data, ulong? val)
{ if (val != null) W(Data, (ulong)val ); }
private void W(string Data, float? val)
{ if (val != null) W(Data, (float)val ); }
private void W(string Data, double? val)
{ if (val != null) W(Data, (float)val ); }
private void W(string Data, long val) =>
W(Data, val.ToS());
private void W(string Data, ulong val) =>
W(Data, val.ToS());
private void W(string Data, float val) =>
W(Data, val.ToS(Rounding));
private void W(string Data, double val) =>
W(Data, val.ToS(Rounding));
private void W(string Data, string val)
{ if (val != null) s.W(Data + "=" + val + "\n"); }
private void A3DCReader()
{
if (Data.Ambient != null)
for (i0 = 0; i0 < Data.Ambient.Length; i0++)
{
RRGBAKN(ref Data.Ambient[i0]. LightDiffuse);
RRGBAKN(ref Data.Ambient[i0].RimLightDiffuse);
}
if (Data.CameraAuxiliary != null)
{
CameraAuxiliary ca = Data.CameraAuxiliary.Value;
RKN(ref ca.AutoExposure );
RKN(ref ca. Exposure );
RKN(ref ca. ExposureRate);
RKN(ref ca.Gamma );
RKN(ref ca.GammaRate );
RKN(ref ca.Saturate );
Data.CameraAuxiliary = ca;
}
if (Data.CameraRoot != null)
for (i0 = 0; i0 < Data.CameraRoot.Length; i0++)
{
RMT(ref Data.CameraRoot[i0]. MT);
RMT(ref Data.CameraRoot[i0].Interest);
RMT(ref Data.CameraRoot[i0].VP. MT);
RKN(ref Data.CameraRoot[i0].VP.FocalLength);
RKN(ref Data.CameraRoot[i0].VP.FOV );
RKN(ref Data.CameraRoot[i0].VP.Roll );
}
if (Data.Chara != null)
for (i0 = 0; i0 < Data.Chara.Length; i0++)
RMT(ref Data.Chara[i0].MT);
if (Data.Curve != null)
for (i0 = 0; i0 < Data.Curve.Length; i0++)
RK(ref Data.Curve[i0].CV);
if (Data.DOF != null)
{
DOF dof = Data.DOF.Value;
RMT(ref dof.MT);
Data.DOF = dof;
}
if (Data.Fog != null)
for (i0 = 0; i0 < Data.Fog.Length; i0++)
{
RRGBAKN(ref Data.Fog[i0].Color );
RKN (ref Data.Fog[i0].Density);
RKN (ref Data.Fog[i0].End );
RKN (ref Data.Fog[i0].Start );
}
if (Data.Light != null)
for (i0 = 0; i0 < Data.Light.Length; i0++)
{
RRGBAKN(ref Data.Light[i0].Ambient );
if (Head.Format == Format.XHD)
{
RKN (ref Data.Light[i0].ConeAngle );
RKN (ref Data.Light[i0].Constant );
}
RRGBAKN(ref Data.Light[i0].Diffuse );
if (Head.Format == Format.XHD)
{
RKN (ref Data.Light[i0].DropOff );
RKN (ref Data.Light[i0].Far );
}
RRGBAKN(ref Data.Light[i0].ToneCurve);
if (Head.Format == Format.XHD)
{
RKN (ref Data.Light[i0].Intensity );
RKN (ref Data.Light[i0].Linear );
}
RMT (ref Data.Light[i0].Position );
if (Head.Format == Format.XHD)
RKN (ref Data.Light[i0].Quadratic );
RRGBAKN(ref Data.Light[i0].Specular );
RMT (ref Data.Light[i0].SpotDirection);
}
if (Data.MObjectHRC != null)
for (i0 = 0; i0 < Data.MObjectHRC.Length; i0++)
{
RMT(ref Data.MObjectHRC[i0].MT);
if (Data.MObjectHRC[i0].Instances != null)
for (i1 = 0; i1 < Data.MObjectHRC[i0].Instances.Length; i1++)
RMT(ref Data.MObjectHRC[i0].Instances[i1].MT);
if (Data.MObjectHRC[i0].Node != null)
for (i1 = 0; i1 < Data.MObjectHRC[i0].Node.Length; i1++)
RMT(ref Data.MObjectHRC[i0].Node[i1].MT);
}
if (Data.MaterialList != null)
for (i0 = 0; i0 < Data.MaterialList.Length; i0++)
{
RRGBAKN(ref Data.MaterialList[i0].BlendColor );
RKN (ref Data.MaterialList[i0].GlowIntensity);
RRGBAKN(ref Data.MaterialList[i0].Incandescence);
}
if (Data.Object != null)
for (i0 = 0; i0 < Data.Object.Length; i0++)
{
RMT(ref Data.Object[i0].MT);
if (Data.Object[i0].TexTrans != null)
for (i1 = 0; i1 < Data.Object[i0].TexTrans.Length; i1++)
{
RKN(ref Data.Object[i0].TexTrans[i1].CoverageU );
RKN(ref Data.Object[i0].TexTrans[i1].CoverageV );
RKN(ref Data.Object[i0].TexTrans[i1].OffsetU );
RKN(ref Data.Object[i0].TexTrans[i1].OffsetV );
RKN(ref Data.Object[i0].TexTrans[i1].RepeatU );
RKN(ref Data.Object[i0].TexTrans[i1].RepeatV );
RKN(ref Data.Object[i0].TexTrans[i1]. Rotate );
RKN(ref Data.Object[i0].TexTrans[i1]. RotateFrame );
RKN(ref Data.Object[i0].TexTrans[i1].TranslateFrameU);
RKN(ref Data.Object[i0].TexTrans[i1].TranslateFrameV);
}
}
if (Data.ObjectHRC != null)
for (i0 = 0; i0 < Data.ObjectHRC.Length; i0++)
if (Data.ObjectHRC[i0].Node != null)
for (i1 = 0; i1 < Data.ObjectHRC[i0].Node.Length; i1++)
RMT(ref Data.ObjectHRC[i0].Node[i1].MT);
if (Data.Point != null)
for (i0 = 0; i0 < Data.Point.Length; i0++)
RMT(ref Data.Point[i0].MT);
if (Data.PostProcess != null)
{
PostProcess pp = Data.PostProcess.Value;
RRGBAKN(ref pp.Radius );
RRGBAKN(ref pp.Intensity);
RRGBAKN(ref pp.SceneFade);
RKN (ref pp.LensFlare);
RKN (ref pp.LensGhost);
RKN (ref pp.LensShaft);
Data.PostProcess = pp;
}
}
public byte[] A3DCWriter()
{
Data._.CompressF16 = Head.Format > Format.AFT && Head.Format < Format.FT ?
(Head.Format == Format.MGF ? CompressF16.Type2 : CompressF16.Type1) : 0;
s = File.OpenWriter();
for (byte i = 0; i < 2; i++)
{
bool ReturnToOffset = i == 1;
s.P = 0;
if (Data.CameraRoot != null)
for (i0 = 0; i0 < Data.CameraRoot.Length; i0++)
{
WO(ref Data.CameraRoot[i0]. MT, ReturnToOffset);
WO(ref Data.CameraRoot[i0].VP. MT, ReturnToOffset);
WO(ref Data.CameraRoot[i0].Interest, ReturnToOffset);
}
if (Data.Chara != null)
for (i0 = 0; i0 < Data.Chara.Length; i0++)
WO(ref Data.Chara[i0].MT, ReturnToOffset);
if (Data.Light != null)
for (i0 = 0; i0 < Data.Light.Length; i0++)
{
WO(ref Data.Light[i0].Position , ReturnToOffset);
WO(ref Data.Light[i0].SpotDirection, ReturnToOffset);
}
if (Data.MObjectHRC != null)
for (i0 = 0; i0 < Data.MObjectHRC.Length; i0++)
{
WO(ref Data.MObjectHRC[i0].MT, ReturnToOffset);
if (Data.MObjectHRC[i0].Node != null)
for (i1 = 0; i1 < Data.MObjectHRC[i0].Node.Length; i1++)
WO(ref Data.MObjectHRC[i0].Node[i1].MT, ReturnToOffset);
if (Data.MObjectHRC[i0].Instances != null)
for (i1 = 0; i1 < Data.MObjectHRC[i0].Instances.Length; i1++)
WO(ref Data.MObjectHRC[i0].Instances[i1].MT, ReturnToOffset);
}
if (Data.Object != null)
for (i0 = 0; i0 < Data.Object.Length; i0++)
WO(ref Data.Object[i0].MT, ReturnToOffset);
if (Data.ObjectHRC != null)
for (i0 = 0; i0 < Data.ObjectHRC.Length; i0++)
if (Data.ObjectHRC[i0].Node != null)
for (i1 = 0; i1 < Data.ObjectHRC[i0].Node.Length; i1++)
WO(ref Data.ObjectHRC[i0].Node[i1].MT, ReturnToOffset);
if (Data.Point != null)
for (i0 = 0; i0 < Data.Point.Length; i0++)
WO(ref Data.Point[i0].MT, ReturnToOffset);
if (ReturnToOffset) continue;
if (Data.Ambient != null)
for (i0 = 0; i0 < Data.Ambient.Length; i0++)
{
W(ref Data.Ambient[i0]. LightDiffuse);
W(ref Data.Ambient[i0].RimLightDiffuse);
}
if (Data.CameraAuxiliary != null)
{
CameraAuxiliary ca = Data.CameraAuxiliary.Value;
W(ref ca.AutoExposure );
W(ref ca. Exposure );
W(ref ca. ExposureRate);
W(ref ca.Gamma );
W(ref ca.GammaRate );
W(ref ca.Saturate );
Data.CameraAuxiliary = ca;
}
if (Data.CameraRoot != null)
for (i0 = 0; i0 < Data.CameraRoot.Length; i0++)
{
W(ref Data.CameraRoot[i0]. MT);
W(ref Data.CameraRoot[i0].VP. MT);
W(ref Data.CameraRoot[i0].VP.Roll );
W(ref Data.CameraRoot[i0].VP.FocalLength);
W(ref Data.CameraRoot[i0].VP.FOV );
W(ref Data.CameraRoot[i0].Interest);
}
if (Data.Chara != null)
for (i0 = 0; i0 < Data.Chara.Length; i0++)
W(ref Data.Chara[i0].MT);
if (Data.Curve != null)
for (i0 = 0; i0 < Data.Curve.Length; i0++)
W(ref Data.Curve[i0].CV);
if (Data.Light != null)
for (i0 = 0; i0 < Data.Light.Length; i0++)
{
W(ref Data.Light[i0].Position );
W(ref Data.Light[i0].SpotDirection);
W(ref Data.Light[i0].Ambient );
W(ref Data.Light[i0].Diffuse );
W(ref Data.Light[i0].Specular );
W(ref Data.Light[i0].ToneCurve );
if (Head.Format == Format.XHD)
{
W(ref Data.Light[i0].Intensity );
W(ref Data.Light[i0].Far );
W(ref Data.Light[i0].Constant );
W(ref Data.Light[i0].Linear );
W(ref Data.Light[i0].Quadratic );
W(ref Data.Light[i0].DropOff );
W(ref Data.Light[i0].ConeAngle );
}
}
if (Data.Fog != null)
for (i0 = 0; i0 < Data.Fog.Length; i0++)
{
W(ref Data.Fog[i0].Density);
W(ref Data.Fog[i0].Start );
W(ref Data.Fog[i0].End );
W(ref Data.Fog[i0].Color);
}
if (Data.MObjectHRC != null)
for (i0 = 0; i0 < Data.MObjectHRC.Length; i0++)
{
W(ref Data.MObjectHRC[i0].MT);
if (Data.MObjectHRC[i0].Node != null)
for (i1 = 0; i1 < Data.MObjectHRC[i0].Node.Length; i1++)
W(ref Data.MObjectHRC[i0].Node[i1].MT);
if (Data.MObjectHRC[i0].Instances != null)
for (i1 = 0; i1 < Data.MObjectHRC[i0].Instances.Length; i1++)
W(ref Data.MObjectHRC[i0].Instances[i1].MT);
}
if (Data.MaterialList != null && (Head.Format == Format.X || Head.Format == Format.XHD))
for (i0 = 0; i0 < Data.MaterialList.Length; i0++)
{
W(ref Data.MaterialList[i0].GlowIntensity);
W(ref Data.MaterialList[i0].BlendColor );
W(ref Data.MaterialList[i0].Incandescence);
}
if (Data.Object != null)
for (i0 = 0; i0 < Data.Object.Length; i0++)
{
W(ref Data.Object[i0].MT);
if (Data.Object[i0].TexTrans != null)
for (i1 = 0; i1 < Data.Object[i0].TexTrans.Length; i1++)
{
W(ref Data.Object[i0].TexTrans[i1].CoverageU );
W(ref Data.Object[i0].TexTrans[i1].CoverageV );
W(ref Data.Object[i0].TexTrans[i1].RepeatU );
W(ref Data.Object[i0].TexTrans[i1].RepeatV );
W(ref Data.Object[i0].TexTrans[i1].OffsetU );
W(ref Data.Object[i0].TexTrans[i1].OffsetV );
W(ref Data.Object[i0].TexTrans[i1]. Rotate );
W(ref Data.Object[i0].TexTrans[i1]. RotateFrame );
W(ref Data.Object[i0].TexTrans[i1].TranslateFrameU);
W(ref Data.Object[i0].TexTrans[i1].TranslateFrameV);
}
}
if (Data.ObjectHRC != null)
for (i0 = 0; i0 < Data.ObjectHRC.Length; i0++)
if (Data.ObjectHRC[i0].Node != null)
for (i1 = 0; i1 < Data.ObjectHRC[i0].Node.Length; i1++)
W(ref Data.ObjectHRC[i0].Node[i1].MT);
if (Data.Point != null)
for (i0 = 0; i0 < Data.Point.Length; i0++)
W(ref Data.Point[i0].MT);
if (Data.PostProcess != null)
{
PostProcess pp = Data.PostProcess.Value;
W(ref pp.LensFlare);
W(ref pp.LensShaft);
W(ref pp.LensGhost);
W(ref pp.Intensity);
W(ref pp.Radius );
W(ref pp.SceneFade);
Data.PostProcess = pp;
}
s.A(0x10, true);
}
byte[] A3DCData = s.ToArray(); s.Dispose();
byte[] A3DAData = A3DAWriter(true);
s = File.OpenWriter();
s.O = Head.Format > Format.AFT && Head.Format < Format.FT ? 0x40 : 0;
s.P = 0x40;
Head.StringOffset = s.P;
Head.StringLength = A3DAData.Length;
s.W(A3DAData);
s.A(0x20, true);
Head.BinaryOffset = s.P;
Head.BinaryLength = A3DCData.Length;
s.W(A3DCData);
s.A(0x10, true);
uint A3DCEnd = s.PU32;
s.P = 0;
s.W("#A3DC__________\n");
s.W(0x2000);
s.W(0x00);
s.WE(0x20, true);
s.WE((ushort)0x02, true);
s.WE((ushort)0x10, true);
s.W('P');
s.A(0x04);
s.WE(Head.StringOffset, true);
s.WE(Head.StringLength, true);
s.WE(0x01, true);
s.W('B');
s.W('L');
s.A(0x04);
s.WE(Head.BinaryOffset, true);
s.WE(Head.BinaryLength, true);
s.WE(0x20, true);
if (Head.Format > Format.AFT && Head.Format < Format.FT)
{
s.PU32 = A3DCEnd;
s.WEOFC(0);
s.O = 0;
s.P = 0;
Header header = new Header { Signature = 0x41443341,
InnerSignature = Head.Format == Format.XHD ? 0x00131010u : 0x01131010u,
Format = Format.F2, DataSize = A3DCEnd, SectionSize = A3DCEnd, UseSectionSize = true };
s.W(header, true);
}
byte[] data = s.ToArray();
s.Dispose();
return data;
}
private void RMT(ref ModelTransform mt)
{
if (mt.BinOffset.HasValue)
{
s.P = (int)mt.BinOffset;
ReadOffset(out mt.Scale);
ReadOffset(out mt.Rot);
ReadOffset(out mt.Trans);
mt.Visibility = new Key { BinOffset = s.RI32() };
}
RV3(ref mt.Scale );
RV3(ref mt.Rot , true);
RV3(ref mt.Trans );
RK (ref mt.Visibility);
}
private void RRGBAKN(ref Vec4<Key?>? rgba)
{
if (!rgba.HasValue) return;
Vec4<Key?> rgbav = rgba.Value;
RKN(ref rgbav.X); RKN(ref rgbav.Y);
RKN(ref rgbav.Z); RKN(ref rgbav.W);
rgba = rgbav;
}
private void RV3(ref Vec3<Key> key, bool f16 = false)
{ RK(ref key.X, f16); RK(ref key.Y, f16); RK(ref key.Z, f16); }
private void RKN(ref Key? key)
{ if (!key.HasValue) return; Key k = key.Value; RK(ref k); key = k; }
private void RK(ref Key key, bool f16 = false)
{
int length;
if (key.RawData)
{
if (!key.RawDataBinary)
return;
s.P = (int)key.RawDataValueListOffset;
key.RawDataValueListOffset = 0;
length = (int)key.RawDataValueListSize / 4;
key.Keys = new KFT3[length];
for (int i = 0; i < key.Keys.Length; i++)
{ ref KFT3 kf = ref key.Keys[i]; Vec4 v = s.RV4(); kf.F = v.X; kf.V = v.Y;
kf.T1 = v.Z; kf.T2 = v.W; }
return;
}
if (key.BinOffset == null || key.BinOffset < 0) return;
s.P = (int)key.BinOffset;
int Type = s.RI32();
key.Value = s.RF32();
key.Type = (KeyType)(Type & 0xFF);
if (key.Type < KeyType.Linear) return;
key.Max = s.RF32();
length = s.RI32();
key.EPTypePost = (EPType)((Type >> 12) & 0xF);
key.EPTypePre = (EPType)((Type >> 8) & 0xF);
key.Keys = new KFT3[length];
if (f16 && Data._.CompressF16 == CompressF16.Type2)
for (int i = 0; i < key.Keys.Length; i++)
{ ref KFT3 kf = ref key.Keys[i]; kf.F = s.RI16(); kf.V = s.RF16();
kf.T1 = s.RF16(); kf.T2 = s.RF16(); }
else if (f16 && Data._.CompressF16 > 0)
for (int i = 0; i < key.Keys.Length; i++)
{ ref KFT3 kf = ref key.Keys[i]; kf.F = s.RI16(); kf.V = s.RF16();
kf.T1 = s.RF32(); kf.T2 = s.RF32(); }
else
for (int i = 0; i < key.Keys.Length; i++)
{ ref KFT3 kf = ref key.Keys[i]; Vec4 v = s.RV4(); kf.F = v.X; kf.V = v.Y;
kf.T1 = v.Z; kf.T2 = v.W; }
}
private void ReadOffset(out Vec3<Key> key)
{ key = new Vec3<Key> { X = new Key { BinOffset = s.RI32() },
Y = new Key { BinOffset = s.RI32() },
Z = new Key { BinOffset = s.RI32() }, }; }
private void WO(ref ModelTransform mt, bool ReturnToOffset)
{
if (ReturnToOffset)
{
s.P = (int)mt.BinOffset;
WriteOffset(mt.Scale);
WriteOffset(mt.Rot );
WriteOffset(mt.Trans);
s.W(mt.Visibility.BinOffset);
}
else { mt.BinOffset = s.P; s.P += 0x30; s.L += 0x30; }
}
private void WriteOffset(Vec3<Key> key)
{ s.W(key.X.BinOffset); s.W(key.Y.BinOffset); s.W(key.Z.BinOffset); }
private void W(ref ModelTransform mt)
{ W(ref mt.Scale); W(ref mt.Rot, true); W(ref mt.Trans); W(ref mt.Visibility); }
private void W(ref Vec4<Key?>? rgba)
{
if (!rgba.HasValue || Head.Format == Format.AFT) return;
Vec4<Key?> rgbav = rgba.Value;
W(ref rgbav.X); W(ref rgbav.Y);
W(ref rgbav.Z); W(ref rgbav.W);
rgba = rgbav;
}
private void W(ref Vec3<Key> key, bool f16 = false)
{ W(ref key.X, f16); W(ref key.Y, f16); W(ref key.Z, f16); }
private void W(ref Key? key)
{ if (!key.HasValue) return; Key k = key.Value; W(ref k); key = k; }
private void W(ref Key key, bool f16 = false)
{
if (key.RawData) {
if (!key.RawDataBinary)
return;
key.RawDataValueListOffset = s.P;
key.RawDataValueListSize = key.Keys.Length * 4;
for (i = 0; i < key.Keys.Length; i++)
{ ref KFT3 kf = ref key.Keys[i]; s.W(new Vec4(kf.F, kf.V, kf.T1, kf.T2)); }
return;
}
key.BinOffset = s.P;
if (key.Type > KeyType.Static && key.Keys != null)
{
int i = 0;
int Type = (int)key.Type & 0xFF;
Type |= ((int)key.EPTypePost & 0xF) << 12;
Type |= ((int)key.EPTypePre & 0xF) << 8;
s.W(Type);
s.W(0x00);
s.W((float)(key.Max ?? Data.PlayControl.Size));
s.W(key.Keys.Length);
if (f16 && Data._.CompressF16 == CompressF16.Type2)
for (i = 0; i < key.Keys.Length; i++)
{ ref KFT3 kf = ref key.Keys[i]; s.W((short)kf.F.Round()); s.W((Half)kf.V );
s.W(( Half)kf.T1 ); s.W((Half)kf.T2); }
else if (f16 && Data._.CompressF16 > 0)
for (i = 0; i < key.Keys.Length; i++)
{ ref KFT3 kf = ref key.Keys[i]; s.W((short)kf.F.Round()); s.W((Half)kf.V );
s.W( kf.T1 ); s.W( kf.T2); }
else
for (i = 0; i < key.Keys.Length; i++)
{ ref KFT3 kf = ref key.Keys[i]; s.W(new Vec4(kf.F, kf.V, kf.T1, kf.T2)); }
}
else if (key.Type == KeyType.Static) { s.W((int)key.Type); s.W((float)key.Value); }
else s.W(0x00L);
}
public void A3DAMerger(ref Data mData)
{
if (Data.Ambient != null && mData.Ambient != null)
for (i0 = 0; i0 < Data.Ambient.Length && i0 < mData.Ambient.Length; i0++)
{
MRGBAKN(ref Data.Ambient[i0]. LightDiffuse, ref mData.Ambient[i0]. LightDiffuse);
MRGBAKN(ref Data.Ambient[i0].RimLightDiffuse, ref mData.Ambient[i0].RimLightDiffuse);
}
if (Data.CameraAuxiliary != null && mData.CameraAuxiliary != null)
{
CameraAuxiliary mCA = mData.CameraAuxiliary.Value;
CameraAuxiliary ca = Data.CameraAuxiliary.Value;
MKN(ref ca.AutoExposure , ref mCA.AutoExposure );
MKN(ref ca. Exposure , ref mCA. Exposure );
MKN(ref ca. ExposureRate, ref mCA. ExposureRate);
MKN(ref ca.Gamma , ref mCA.Gamma );
MKN(ref ca.GammaRate , ref mCA.GammaRate );
MKN(ref ca.Saturate , ref mCA.Saturate );
Data.CameraAuxiliary = ca;
mData.CameraAuxiliary = mCA;
}
if (Data.CameraRoot != null && mData.CameraRoot != null)
for (i0 = 0; i0 < Data.CameraRoot.Length && i0 < mData.CameraRoot.Length; i0++)
{
MMT(ref Data.CameraRoot[i0]. MT, ref mData.CameraRoot[i0]. MT);
MMT(ref Data.CameraRoot[i0].Interest, ref mData.CameraRoot[i0].Interest);
MMT(ref Data.CameraRoot[i0].VP. MT, ref mData.CameraRoot[i0].VP. MT);
MKN(ref Data.CameraRoot[i0].VP.FocalLength, ref mData.CameraRoot[i0].VP.FocalLength);
MKN(ref Data.CameraRoot[i0].VP.FOV , ref mData.CameraRoot[i0].VP.FOV );
MKN(ref Data.CameraRoot[i0].VP.Roll , ref mData.CameraRoot[i0].VP.Roll );
}
if (Data.Chara != null && mData.Chara != null)
for (i0 = 0; i0 < Data.Chara.Length && i0 < mData.Chara.Length; i0++)
MMT(ref Data.Chara[i0].MT, ref mData.Chara[i0].MT);
if (Data.Curve != null && mData.Curve != null)
for (i0 = 0; i0 < Data.Curve.Length && i0 < mData.Curve.Length; i0++)
MK(ref Data.Curve[i0].CV, ref mData.Curve[i0].CV);
if (Data.DOF != null && mData.DOF != null)
{
DOF mDOF = mData.DOF.Value;
DOF dof = Data.DOF.Value;
MMT(ref dof.MT, ref mDOF.MT);
Data.DOF = dof;
mData.DOF = mDOF;
}
if (Data.Fog != null && mData.Fog != null)
for (i0 = 0; i0 < Data.Fog.Length && i0 < Data.Fog.Length; i0++)
{
MRGBAKN(ref Data.Fog[i0].Color , ref mData.Fog[i0].Color );
MKN (ref Data.Fog[i0].Density, ref mData.Fog[i0].Density);
MKN (ref Data.Fog[i0].End , ref mData.Fog[i0].End );
MKN (ref Data.Fog[i0].Start , ref mData.Fog[i0].Start );
}
if (Data.Light != null && mData.Light != null)
for (i0 = 0; i0 < Data.Light.Length; i0++)
{
MRGBAKN(ref Data.Light[i0].Ambient , ref mData.Light[i0].Ambient );
if (Head.Format == Format.XHD)
{
MKN (ref Data.Light[i0].ConeAngle , ref mData.Light[i0].ConeAngle );
MKN (ref Data.Light[i0].Constant , ref mData.Light[i0].Constant );
}
MRGBAKN(ref Data.Light[i0].Diffuse , ref mData.Light[i0].Diffuse );
if (Head.Format == Format.XHD)
{
MKN (ref Data.Light[i0].DropOff , ref mData.Light[i0].DropOff );
MKN (ref Data.Light[i0].Far , ref mData.Light[i0].Far );
}
MRGBAKN(ref Data.Light[i0].ToneCurve, ref mData.Light[i0].ToneCurve);
if (Head.Format == Format.XHD)
{
MKN (ref Data.Light[i0].Intensity , ref mData.Light[i0].Intensity );
MKN (ref Data.Light[i0].Linear , ref mData.Light[i0].Linear );
}
MMT (ref Data.Light[i0].Position , ref mData.Light[i0].Position );
if (Head.Format == Format.XHD)
MKN (ref Data.Light[i0].Quadratic , ref mData.Light[i0].Quadratic);
MRGBAKN(ref Data.Light[i0].Specular , ref mData.Light[i0].Specular );
MMT (ref Data.Light[i0].SpotDirection, ref mData.Light[i0].SpotDirection);
}
if (Data.MObjectHRC != null && mData.MObjectHRC != null)
for (i0 = 0; i0 < Data.MObjectHRC.Length && i0 < mData.MObjectHRC.Length; i0++)
{
MMT(ref Data.MObjectHRC[i0].MT, ref mData.MObjectHRC[i0].MT);
if (Data.MObjectHRC[i0].Instances != null && mData.MObjectHRC[i0].Instances != null)
{
ref MObjectHRC.Instance[] mI = ref mData.MObjectHRC[i0].Instances;
ref MObjectHRC.Instance[] i = ref Data.MObjectHRC[i0].Instances;
for (i1 = 0; i1 < i.Length && i1 < mI.Length; i1++)
MMT(ref i[i1].MT, ref mI[i1].MT);
}
if (Data.MObjectHRC[i0].Node != null && mData.MObjectHRC[i0].Node != null)
{
ref ObjectNode[] mN = ref mData.MObjectHRC[i0].Node;
ref ObjectNode[] n = ref Data.MObjectHRC[i0].Node;
for (i1 = 0; i1 < n.Length && i1 < mN.Length; i1++)
MMT(ref n[i1].MT, ref mN[i1].MT);
}
}
if (Data.MaterialList != null && mData.MaterialList != null)
for (i0 = 0; i0 < Data.MaterialList.Length; i0++)
{
ref MaterialList mML = ref mData.MaterialList[i0];
ref MaterialList ml = ref Data.MaterialList[i0];
MRGBAKN(ref ml.BlendColor , ref mML.BlendColor );
MKN (ref ml.GlowIntensity, ref mML.GlowIntensity);
MRGBAKN(ref ml.Incandescence, ref mML.Incandescence);
}
if (Data.Object != null && mData.Object != null)
for (i0 = 0; i0 < Data.Object.Length && i0 < mData.Object.Length; i0++)
{
MMT(ref Data.Object[i0].MT, ref mData.Object[i0].MT);
if (Data.Object[i0].TexTrans != null && mData.Object[i0].TexTrans != null)
for (i1 = 0; i1 < Data.Object[i0].TexTrans.Length &&
i1 < mData.Object[i0].TexTrans.Length; i1++)
{
ref Object.TextureTransform mTT = ref mData.Object[i0].TexTrans[i1];
ref Object.TextureTransform tt = ref Data.Object[i0].TexTrans[i1];
MKN(ref tt.CoverageU , ref mTT.CoverageU );
MKN(ref tt.CoverageV , ref mTT.CoverageV );
MKN(ref tt.OffsetU , ref mTT.OffsetU );
MKN(ref tt.OffsetV , ref mTT.OffsetV );
MKN(ref tt.RepeatU , ref mTT.RepeatU );
MKN(ref tt.RepeatV , ref mTT.RepeatV );
MKN(ref tt. Rotate , ref mTT. Rotate );
MKN(ref tt. RotateFrame , ref mTT. RotateFrame );
MKN(ref tt.TranslateFrameU, ref mTT.TranslateFrameU);
MKN(ref tt.TranslateFrameV, ref mTT.TranslateFrameV);
}
}
if (Data.ObjectHRC != null && mData.ObjectHRC != null)
for (i0 = 0; i0 < Data.ObjectHRC.Length && i0 < mData.ObjectHRC.Length; i0++)
if (Data.ObjectHRC[i0].Node != null && mData.ObjectHRC[i0].Node != null)
{
ref ObjectNode[] mN = ref mData.ObjectHRC[i0].Node;
ref ObjectNode[] n = ref Data.ObjectHRC[i0].Node;
for (i1 = 0; i1 < n.Length && i1 < mN.Length; i1++)
MMT(ref n[i1].MT, ref mN[i1].MT);
}
if (Data.Point != null && mData.Point != null)
for (i0 = 0; i0 < Data.Point.Length && i0 < mData.Point.Length; i0++)
MMT(ref Data.Point[i0].MT, ref mData.Point[i0].MT);
if (Data.PostProcess != null && mData.PostProcess != null)
{
PostProcess mPP = mData.PostProcess.Value;
PostProcess pp = Data.PostProcess.Value;
MRGBAKN(ref pp.Radius , ref mPP.Radius );
MRGBAKN(ref pp.Intensity, ref mPP.Intensity);
MRGBAKN(ref pp.SceneFade, ref mPP.SceneFade);
MKN (ref pp.LensFlare, ref mPP.LensFlare);
MKN (ref pp.LensGhost, ref mPP.LensGhost);
MKN (ref pp.LensShaft, ref mPP.LensShaft);
Data.PostProcess = pp;
mData.PostProcess = mPP;
}
}
private void MMT(ref ModelTransform mt, ref ModelTransform mMT)
{
MV3(ref mt.Scale , ref mMT.Scale );
MV3(ref mt.Rot , ref mMT.Rot );
MV3(ref mt.Trans , ref mMT.Trans );
MK (ref mt.Visibility, ref mMT.Visibility);
}
private void MRGBAKN(ref Vec4<Key?>? rgba, ref Vec4<Key?>? mRGBA)
{
if (!rgba.HasValue) return;
Vec4<Key?> rgbav = rgba.Value;
Vec4<Key?> mrgbav = mRGBA.Value;
MKN(ref rgbav.X, ref mrgbav.X); MKN(ref rgbav.Y, ref mrgbav.Y);
MKN(ref rgbav.Z, ref mrgbav.Z); MKN(ref rgbav.W, ref mrgbav.W);
mRGBA = mrgbav;
}
private void MV3(ref Vec3<Key> key, ref Vec3<Key> mKey)
{ MK(ref key.X, ref mKey.X); MK(ref key.Y, ref mKey.Y); MK(ref key.Z, ref mKey.Z); }
private void MKN(ref Key? key, ref Key? mKey)
{ if (!key.HasValue || !mKey.HasValue) return;
Key k = key.Value; Key mk = mKey.Value; MK(ref k, ref mk); key = k; mKey = mk; }
private void MK(ref Key key, ref Key mKey)
{
if (key.Keys == null && mKey.Keys != null)
return;
if (key.Keys != null && mKey.Keys == null)
return;
if (key.Keys == null || mKey.Keys == null)
return;
if (key.Keys.Length >= 1 && mKey.Keys.Length == 1)
{
key.Max = (int)key.Keys[key.Keys.Length - 1].F + 1;
return;
}
else if (key.Keys.Length == 1 && mKey.Keys.Length > 1)
{
if (key.Keys[0] == mKey.Keys[0])
{
key.Keys = mKey.Keys;
key.Max = (int)mKey.Keys[mKey.Keys.Length - 1].F + 1;
return;
}
return;
}
int i = key.Keys.Length;
bool found = false;
while (i > 0 && !found)
if (key.Keys[--i] == mKey.Keys[0])
found = true;
if (!found) return;
int OldLength = i;
Array.Resize(ref key.Keys, OldLength + mKey.Keys.Length);
Array.Copy(mKey.Keys, 0, key.Keys, OldLength, mKey.Keys.Length);
key.Max = (int)key.Keys[key.Keys.Length - 1].F + 1;
}
public void MsgPackReader(string file, bool json)
{
MsgPack msgPack = file.ReadMPAllAtOnce(json);
MsgPack a3d = msgPack["A3D"];
if (a3d.NotNull) MsgPackReader(a3d);
msgPack.Dispose();
}
public void MsgPackWriter(string file, bool json) =>
MsgPackWriter().Write(false, true, file, json);
private void MsgPackReader(MsgPack a3d)
{
MsgPack temp = MsgPack.New, temp1 = MsgPack.New, temp2 = MsgPack.New;
if ((temp = a3d["_"]).NotNull)
{
Data._ = new _
{
ConverterVersion = temp.RS("ConverterVersion"),
FileName = temp.RS("FileName" ),
PropertyVersion = temp.RS("PropertyVersion" ),
};
}
if ((temp = a3d["Ambient", true]).NotNull)
{
Data.Ambient = new Ambient[temp.Array.Length];
for (i = 0; i < Data.Ambient.Length; i++)
Data.Ambient[i] = new Ambient
{
Name = temp[i].RS ( "Name"),
LightDiffuse = temp[i].RRGBAKN( "LightDiffuse"),
RimLightDiffuse = temp[i].RRGBAKN("RimLightDiffuse"),
};
}
if ((temp = a3d["Auth2D", true]).NotNull)
{
Data.Auth2D = new string[temp.Array.Length];
for (i = 0; i < Data.Auth2D.Length; i++)
Data.Auth2D[i] = temp[i].RS();
}
if ((temp = a3d["CameraAuxiliary"]).NotNull)
Data.CameraAuxiliary = new CameraAuxiliary
{
AutoExposure = temp.RKN("AutoExposure" ),
Exposure = temp.RKN( "Exposure" ),
ExposureRate = temp.RKN( "ExposureRate"),
Gamma = temp.RKN("Gamma" ),
GammaRate = temp.RKN("GammaRate" ),
Saturate = temp.RKN("Saturate" ),
};
if ((temp = a3d["CameraRoot", true]).NotNull)
{
Data.CameraRoot = new CameraRoot[temp.Array.Length];
for (i = 0; i < Data.CameraRoot.Length; i++)
{
Data.CameraRoot[i] = new CameraRoot
{
MT = temp[i].RMT(),
Interest = temp[i].RMT("Interest"),
};
if ((temp1 = temp[i]["ViewPoint"]).IsNull) continue;
if (temp1["FOVHorizontal"].Object != null || temp1["FOVIsHorizontal"].Object != null)
Data.CameraRoot[i].VP = new CameraRoot.ViewPoint
{
MT = temp1.RMT(),
Aspect = temp1.RF32("Aspect"),
FOVIsHorizontal = temp1.RB(temp1["FOVHorizontal"].Object != null
? "FOVHorizontal" : "FOVIsHorizontal"),
FOV = temp1.RK ("FOV" ),
Roll = temp1.RK ("Roll" ),
};
else
Data.CameraRoot[i].VP = new CameraRoot.ViewPoint
{
MT = temp1.RMT(),
Aspect = temp1.RF32("Aspect" ),
CameraApertureH = temp1.RF32("CameraApertureH"),
CameraApertureW = temp1.RF32("CameraApertureW"),
FocalLength = temp1.RK ("FocalLength" ),
Roll = temp1.RK ("Roll" ),
};
}
}
if ((temp = a3d["Chara", true]).NotNull)
{
Data.Chara = new Chara[temp.Array.Length];
for (i = 0; i < Data.Chara.Length; i++)
Data.Chara[i] = new Chara
{
MT = temp[i].RMT(),
Name = temp[i].RS("Name"),
};
}
if ((temp = a3d["Curve", true]).NotNull)
{
Data.Curve = new Curve[temp.Array.Length];
for (i = 0; i < Data.Curve.Length; i++)
Data.Curve[i] = new Curve
{
Name = temp[i].RS("Name"),
CV = temp[i].RK("CV" ),
};
}
if ((temp = a3d["DOF"]).NotNull)
Data.DOF = new DOF { MT = temp.RMT() };
if ((temp = a3d["Event", true]).NotNull)
{
Data.Event = new Event[temp.Array.Length];
for (i = 0; i < Data.Event.Length; i++)
Data.Event[i] = new Event
{
Begin = temp[i].RF32( "Begin" ),
ClipBegin = temp[i].RF32("ClipBegin" ),
ClipEnd = temp[i].RF32("ClipEnd" ),
End = temp[i].RF32( "End" ),
Name = temp[i].RS ("Name" ),
Param1 = temp[i].RS ("Param1" ),
Ref = temp[i].RS ("Ref" ),
TimeRefScale = temp[i].RF32("TimeRefScale"),
Type = temp[i].RI32("Type" ),
};
}
if ((temp = a3d["Fog", true]).NotNull)
{
Data.Fog = new Fog[temp.Array.Length];
for (i = 0; i < Data.Fog.Length; i++)
if (temp1[i]["Diffuse"].NotNull)
Data.Fog[i] = new Fog
{
Color = temp[i].RRGBAKN("Diffuse"),
Id = temp[i].RI32 ("Id" ),
Density = temp[i].RKN ("Density"),
End = temp[i].RKN ("End" ),
Start = temp[i].RKN ("Start" ),
};
else
Data.Fog[i] = new Fog
{
Color = temp[i].RRGBAKN("Color" ),
Id = temp[i].RI32 ("Id" ),
Density = temp[i].RKN ("Density"),
End = temp[i].RKN ("End" ),
Start = temp[i].RKN ("Start" ),
};
}
if ((temp = a3d["Light", true]).NotNull)
{
Data.Light = new Light[temp.Array.Length];
for (i = 0; i < Data.Light.Length; i++)
if (temp1[i]["Incandescence"].NotNull)
Data.Light[i] = new Light
{
Id = temp[i].RI32 ("Id" ),
Type = temp[i].RS ("Type" ),
Ambient = temp[i].RRGBAKN("Ambient" ),
ConeAngle = temp[i].RKN ("ConeAngle" ),
Constant = temp[i].RKN ("Constant" ),
Diffuse = temp[i].RRGBAKN("Diffuse" ),
DropOff = temp[i].RKN ("DropOff" ),
Far = temp[i].RKN ("Far" ),
ToneCurve = temp[i].RRGBAKN("Incandescence"),
Intensity = temp[i].RKN ("Intensity" ),
Linear = temp[i].RKN ("Linear" ),
Position = temp[i].RMT ("Position" ),
Quadratic = temp[i].RKN ("Quadratic" ),
Specular = temp[i].RRGBAKN("Specular" ),
SpotDirection = temp[i].RMT ("SpotDirection"),
};
else
Data.Light[i] = new Light
{
Id = temp[i].RI32 ("Id" ),
Type = temp[i].RS ("Type" ),
Ambient = temp[i].RRGBAKN("Ambient" ),
ConeAngle = temp[i].RKN ("ConeAngle" ),
Constant = temp[i].RKN ("Constant" ),
Diffuse = temp[i].RRGBAKN("Diffuse" ),
DropOff = temp[i].RKN ("DropOff" ),
Far = temp[i].RKN ("Far" ),
Intensity = temp[i].RKN ("Intensity" ),
Linear = temp[i].RKN ("Linear" ),
Position = temp[i].RMT ("Position" ),
Quadratic = temp[i].RKN ("Quadratic" ),
Specular = temp[i].RRGBAKN("Specular" ),
SpotDirection = temp[i].RMT ("SpotDirection"),
ToneCurve = temp[i].RRGBAKN("ToneCurve" ),
};
}
if ((temp = a3d["MaterialList", true]).NotNull)
{
Data.MaterialList = new MaterialList[temp.Array.Length];
for (i = 0; i < Data.MaterialList.Length; i++)
Data.MaterialList[i] = new MaterialList
{
Name = temp[i].RS ( "Name"),
BlendColor = temp[i].RRGBAKN( "BlendColor"),
GlowIntensity = temp[i].RKN ("GlowIntensity"),
Incandescence = temp[i].RRGBAKN("Incandescence"),
};
}
if ((temp = a3d["MObjectHRC", true]).NotNull)
{
Data.MObjectHRC = new MObjectHRC[temp.Array.Length];
for (i0 = 0; i0 < Data.MObjectHRC.Length; i0++)
{
Data.MObjectHRC[i0] = new MObjectHRC
{
MT = temp[i0].RMT(),
Name = temp[i0].RS("Name"),
};
if ((temp1 = temp[i0]["Instance", true]).NotNull)
{
Data.MObjectHRC[i0].Instances = new MObjectHRC.Instance[temp1.Array.Length];
for (i1 = 0; i1 < Data.MObjectHRC[i0].Instances.Length; i1++)
Data.MObjectHRC[i0].Instances[i1] = new MObjectHRC.Instance
{
MT = temp1[i1].RMT(),
Name = temp1[i1].RS( "Name"),
Shadow = temp1[i1].RB( "Shadow"),
UIDName = temp1[i1].RS("UIDName"),
};
}
if ((temp1 = temp[i0]["Node", true]).NotNull)
{
Data.MObjectHRC[i0].Node = new ObjectNode[temp1.Array.Length];
for (i1 = 0; i1 < Data.MObjectHRC[i0].Node.Length; i1++)
{
Data.MObjectHRC[i0].Node[i1] = new ObjectNode
{
MT = temp1[i1].RMT(),
Name = temp1[i1].RS ( "Name"),
Parent = temp1[i1].RI32("Parent"),
};
if ((temp2 = temp1[i1]["JointOrient"]).NotNull)
Data.MObjectHRC[i0].Node[i1].JointOrient = new Vec3
{
X = temp1.RF32("X"),
Y = temp1.RF32("Y"),
Z = temp1.RF32("Z"),
};
}
}
}
}
if ((temp = a3d["MObjectHRCList", true]).NotNull)
{
Data.MObjectHRCList = new string[temp.Array.Length];
for (i = 0; i < Data.MObjectHRCList.Length; i++)
Data.MObjectHRCList[i] = temp[i].RS();
}
if ((temp = a3d["Motion", true]).NotNull)
{
Data.Motion = new string[temp.Array.Length];
for (i = 0; i < Data.Motion.Length; i++)
Data.Motion[i] = temp[i].RS();
}
if ((temp = a3d["Object", true]).NotNull)
{
Data.Object = new Object[temp.Array.Length];
for (i0 = 0; i0 < Data.Object.Length; i0++)
{
Data.Object[i0] = new Object
{
MT = temp[i0].RMT(),
Morph = temp[i0].RS ("Morph" ),
MorphOffset = temp[i0].RF32("MorphOffset"),
Name = temp[i0].RS ( "Name"),
ParentName = temp[i0].RS ( "ParentName"),
ParentNode = temp[i0].RS ( "ParentNode"),
Pat = temp[i0].RS ( "Pat" ),
PatOffset = temp[i0].RF32( "PatOffset"),
UIDName = temp[i0].RS ( "UIDName"),
};
if ((temp1 = temp[i0]["TexturePattern", true]).NotNull)
{
Data.Object[i0].TexPat = new Object.TexturePattern[temp1.Array.Length];
for (i1 = 0; i1 < Data.Object[i0].TexPat.Length; i1++)
Data.Object[i0].TexPat[i1] = new Object.TexturePattern
{
Name = temp1[i1].RS ("Name" ),
Pat = temp1[i1].RS ("Pat" ),
PatOffset = temp1[i1].RI32("PatOffset"),
};
}
if ((temp1 = temp[i0]["TextureTransform", true]).NotNull)
{
Data.Object[i0].TexTrans = new Object.TextureTransform[temp1.Array.Length];
for (i1 = 0; i1 < Data.Object[i0].TexTrans.Length; i1++)
{
ref Object.TextureTransform texTrans = ref Data.Object[i0].TexTrans[i1];
texTrans = new Object.TextureTransform
{
Name = temp1[i1].RS ("Name" ),
CoverageU = temp1[i1].RKN("CoverageU" ),
CoverageV = temp1[i1].RKN("CoverageV" ),
OffsetU = temp1[i1].RKN("OffsetU" ),
OffsetV = temp1[i1].RKN("OffsetV" ),
RepeatU = temp1[i1].RKN("RepeatU" ),
RepeatV = temp1[i1].RKN("RepeatV" ),
Rotate = temp1[i1].RKN( "Rotate" ),
RotateFrame = temp1[i1].RKN( "RotateFrame" ),
TranslateFrameU = temp1[i1].RKN("TranslateFrameU"),
TranslateFrameV = temp1[i1].RKN("TranslateFrameV"),
};
rkuv(temp1[i1], "Coverage",
ref texTrans.CoverageU , ref texTrans.CoverageV );
rkuv(temp1[i1], "Offset",
ref texTrans.OffsetU , ref texTrans.OffsetV );
rkuv(temp1[i1], "Repeat",
ref texTrans.RepeatU , ref texTrans.RepeatV );
rkuv(temp1[i1], "TranslateFrame",
ref texTrans.TranslateFrameU, ref texTrans.TranslateFrameV);
static void rkuv(MsgPack msgPack, string name, ref Key? u, ref Key? v)
{
if (!u.HasValue)
u = msgPack[name].RKN("U");
if (!v.HasValue)
v = msgPack[name].RKN("V");
}
}
}
}
}
if ((temp = a3d["ObjectHRC", true]).NotNull)
{
Data.ObjectHRC = new ObjectHRC[temp.Array.Length];
for (i0 = 0; i0 < Data.ObjectHRC.Length; i0++)
{
Data.ObjectHRC[i0] = new ObjectHRC
{
Name = temp[i0].RS( "Name"),
ParentName = temp[i0].RS("ParentName"),
ParentNode = temp[i0].RS("ParentNode"),
Shadow = temp[i0].RB( "Shadow"),
UIDName = temp[i0].RS( "UIDName"),
};
if ((temp1 = temp[i0]["Node", true]).NotNull)
{
Data.ObjectHRC[i0].Node = new ObjectNode[temp1.Array.Length];
for (i1 = 0; i1 < Data.ObjectHRC[i0].Node.Length; i1++)
{
Data.ObjectHRC[i0].Node[i1] = new ObjectNode
{
MT = temp1[i1].RMT(),
Name = temp1[i1].RS ( "Name"),
Parent = temp1[i1].RI32("Parent"),
};
if ((temp2 = temp1[i1]["JointOrient"]).NotNull)
Data.ObjectHRC[i0].Node[i1].JointOrient = new Vec3
{
X = temp1.RF32("X"),
Y = temp1.RF32("Y"),
Z = temp1.RF32("Z"),
};
}
}
}
}
if ((temp = a3d["ObjectHRCList", true]).NotNull)
{
Data.ObjectHRCList = new string[temp.Array.Length];
for (i = 0; i < Data.ObjectHRCList.Length; i++)
Data.ObjectHRCList[i] = temp[i].RS();
}
if ((temp = a3d["ObjectList", true]).NotNull)
{
Data.ObjectList = new string[temp.Array.Length];
for (i = 0; i < Data.ObjectList.Length; i++)
Data.ObjectList[i] = temp[i].RS();
}
if ((temp = a3d["PlayControl"]).NotNull)
Data.PlayControl = new PlayControl
{
Begin = temp. RI32("Begin" ),
Div = temp.RnI32("Div" ),
FPS = temp. RI32("FPS" ),
Offset = temp.RnI32("Offset"),
Size = temp. RI32("Size" ),
};
if ((temp = a3d["Point", true]).NotNull)
{
Data.Point = new Point[temp.Array.Length];
for (i = 0; i < Data.Point.Length; i++)
Data.Point[i] = new Point
{
MT = temp[i].RMT(),
Name = temp[i].RS("Name"),
};
}
if ((temp = a3d["PostProcess"]).NotNull)
if (temp["Ambient"].NotNull)
Data.PostProcess = new PostProcess
{
Radius = temp.RRGBAKN("Ambient" ),
Intensity = temp.RRGBAKN("Diffuse" ),
LensFlare = temp.RKN ("LensFlare"),
LensGhost = temp.RKN ("LensGhost"),
LensShaft = temp.RKN ("LensShaft"),
SceneFade = temp.RRGBAKN("Specular" ),
};
else
Data.PostProcess = new PostProcess
{
Intensity = temp.RRGBAKN("Intensity"),
LensFlare = temp.RKN ("LensFlare"),
LensGhost = temp.RKN ("LensGhost"),
LensShaft = temp.RKN ("LensShaft"),
Radius = temp.RRGBAKN("Radius"),
SceneFade = temp.RRGBAKN("SceneFade"),
};
temp1.Dispose();
temp.Dispose();
}
private MsgPack MsgPackWriter()
{
MsgPack a3d = new MsgPack("A3D")
.Add(new MsgPack("_").Add("ConverterVersion", Data._.ConverterVersion)
.Add("FileName" , Data._.FileName )
.Add("PropertyVersion" , Data._.PropertyVersion ));
if (Data.Ambient != null)
{
MsgPack ambient = new MsgPack(Data.Ambient.Length, "Ambient");
for (i = 0; i < Data.Ambient.Length; i++)
ambient[i] = MsgPack.New.Add("Name", Data.Ambient[i].Name)
.Add( "LightDiffuse", ref Data.Ambient[i]. LightDiffuse)
.Add("RimLightDiffuse", ref Data.Ambient[i].RimLightDiffuse);
a3d.Add(ambient);
}
if (Data.Auth2D != null)
{
MsgPack auth2D = new MsgPack(Data.Ambient.Length, "Auth2D");
for (i = 0; i < Data.Ambient.Length; i++)
auth2D[i] = new MsgPack(null, Data.Ambient[i].Name);
a3d.Add(auth2D);
}
if (Data.CameraAuxiliary != null)
{
CameraAuxiliary ca = Data.CameraAuxiliary.Value;
MsgPack cameraAuxiliary = new MsgPack("CameraAuxiliary")
.Add("AutoExposure", ref ca.AutoExposure)
.Add( "Exposure", ref ca. Exposure)
.Add("Gamma" , ref ca.Gamma )
.Add("GammaRate" , ref ca.GammaRate )
.Add("Saturate" , ref ca.Saturate );
a3d.Add(cameraAuxiliary);
Data.CameraAuxiliary = ca;
}
if (Data.CameraRoot != null)
{
MsgPack cameraRoot = new MsgPack(Data.CameraRoot.Length, "CameraRoot");
for (i = 0; i < Data.CameraRoot.Length; i++)
if (Data.CameraRoot[i].VP.FOV.HasValue)
cameraRoot[i] = MsgPack.New
.Add("Interest", ref Data.CameraRoot[i].Interest)
.Add(new MsgPack("ViewPoint")
.Add("Aspect" , Data.CameraRoot[i].VP.Aspect )
.Add("FOVIsHorizontal", Data.CameraRoot[i].VP.FOVIsHorizontal)
.Add("FOV" , ref Data.CameraRoot[i].VP.FOV )
.Add("Roll" , ref Data.CameraRoot[i].VP.Roll )
.Add(ref Data.CameraRoot[i].VP.MT))
.Add(ref Data.CameraRoot[i]. MT);
else
cameraRoot[i] = MsgPack.New
.Add("Interest", ref Data.CameraRoot[i].Interest)
.Add(new MsgPack("ViewPoint")
.Add("Aspect" , Data.CameraRoot[i].VP.Aspect )
.Add("CameraApertureH", Data.CameraRoot[i].VP.CameraApertureH)
.Add("CameraApertureW", Data.CameraRoot[i].VP.CameraApertureW)
.Add("FocalLength" , ref Data.CameraRoot[i].VP.FocalLength )
.Add("Roll" , ref Data.CameraRoot[i].VP.Roll )
.Add(ref Data.CameraRoot[i].VP.MT))
.Add(ref Data.CameraRoot[i]. MT);
a3d.Add(cameraRoot);
}
if (Data.Chara != null)
{
MsgPack chara = new MsgPack(Data.Chara.Length, "Chara");
for (i = 0; i < Data.Chara.Length; i++)
chara[i] = MsgPack.New.Add("Name", Data.Chara[i].Name).Add(ref Data.Chara[i].MT);
a3d.Add(chara);
}
if (Data.Curve != null)
{
MsgPack curve = new MsgPack(Data.Curve.Length, "Curve");
for (i = 0; i < Data.Curve.Length; i++)
curve[i] = MsgPack.New.Add("Name", Data.Curve[i].Name)
.Add("CV", ref Data.Curve[i].CV);
a3d.Add(curve);
}
if (Data.DOF != null)
{
DOF dof = Data.DOF.Value;
a3d.Add(new MsgPack("DOF").Add(ref dof.MT));
Data.DOF = dof;
}
if (Data.Event != null)
{
MsgPack @event = new MsgPack(Data.Event.Length, "Events");
for (i = 0; i < Data.Event.Length; i++)
@event[i] = MsgPack.New.Add("Begin" , Data.Event[i].Begin )
.Add("ClipBegin" , Data.Event[i].ClipBegin )
.Add("ClipEnd" , Data.Event[i].ClipEnd )
.Add("End" , Data.Event[i].End )
.Add("Name" , Data.Event[i].Name )
.Add("Param1" , Data.Event[i].Param1 )
.Add("Ref" , Data.Event[i].Ref )
.Add("TimeRefScale", Data.Event[i].TimeRefScale)
.Add("Type" , Data.Event[i].Type );
a3d.Add(@event);
}
if (Data.Fog != null)
{
MsgPack fog = new MsgPack(Data.Fog.Length, "Fog");
for (i = 0; i < Data.Fog.Length; i++)
fog[i] = MsgPack.New.Add("Id" , Data.Fog[i].Id)
.Add("Color" , ref Data.Fog[i].Color )
.Add("Density", ref Data.Fog[i].Density)
.Add("End" , ref Data.Fog[i].End )
.Add("Start" , ref Data.Fog[i].Start );
a3d.Add(fog);
}
if (Data.Light != null)
{
MsgPack light = new MsgPack(Data.Light.Length, "Light");
for (i = 0; i < Data.Light.Length; i++)
light[i] = MsgPack.New.Add("Id" , Data.Light[i].Id)
.Add("Type", Data.Light[i].Type)
.Add("Ambient" , ref Data.Light[i].Ambient )
.Add("ConeAngle" , ref Data.Light[i].ConeAngle )
.Add("Constant" , ref Data.Light[i].Constant )
.Add("Diffuse" , ref Data.Light[i].Diffuse )
.Add("DropOff" , ref Data.Light[i].DropOff )
.Add("Far" , ref Data.Light[i].Far )
.Add("Intensity" , ref Data.Light[i].Intensity )
.Add("Linear" , ref Data.Light[i].Linear )
.Add("Position" , ref Data.Light[i].Position )
.Add("Quadratic" , ref Data.Light[i].Quadratic )
.Add("Specular" , ref Data.Light[i].Specular )
.Add("SpotDirection", ref Data.Light[i].SpotDirection)
.Add("ToneCurve" , ref Data.Light[i].ToneCurve );
a3d.Add(light);
}
if (Data.MObjectHRC != null)
{
MsgPack mObjectHRC = new MsgPack(Data.MObjectHRC.Length, "MObjectHRC");
for (i0 = 0; i0 < Data.MObjectHRC.Length; i0++)
{
MsgPack _mObjectHRC = MsgPack.New.Add("Name", Data.MObjectHRC[i0].Name);
if (Data.MObjectHRC[i0].Instances != null)
{
MsgPack instance = new MsgPack(Data.MObjectHRC[i0].Instances.Length, "Instance");
for (i1 = 0; i1 < Data.MObjectHRC[i0].Instances.Length; i1++)
{
MsgPack _instance = MsgPack.New.Add("Name", Data.MObjectHRC[i0].Instances[i1].Name);
if (Data.MObjectHRC[i0].Instances[i1].Shadow)
_instance.Add("Shadow", true);
_instance.Add("UIDName", Data.MObjectHRC[i0].Instances[i1].UIDName);
instance[i1] = _instance.Add(ref Data.MObjectHRC[i0].Instances[i1].MT);
}
_mObjectHRC.Add(instance);
}
if (Data.MObjectHRC[i0].Node != null)
{
MsgPack node = new MsgPack(Data.MObjectHRC[i0].Node.Length, "Node");
for (i1 = 0; i1 < Data.MObjectHRC[i0].Node.Length; i1++)
{
MsgPack _node = MsgPack.New
.Add("Name" , Data.MObjectHRC[i0].Node[i1].Name )
.Add("Parent", Data.MObjectHRC[i0].Node[i1].Parent);
if (Data.MObjectHRC[i0].Node[i1].JointOrient.HasValue)
{
Vec3 jointOrient = Data.MObjectHRC[i0].Node[i1].JointOrient.Value;
_node.Add(new MsgPack("JointOrient")
.Add("X", jointOrient.X)
.Add("Y", jointOrient.Y)
.Add("Z", jointOrient.Z));
}
node[i1] = _node.Add(ref Data.MObjectHRC[i0].Node[i1].MT);
}
_mObjectHRC.Add(node);
}
mObjectHRC[i0] = _mObjectHRC.Add(ref Data.MObjectHRC[i0].MT);
}
a3d.Add(mObjectHRC);
}
if (Data.MObjectHRCList != null)
{
MsgPack mObjectHRCList = new MsgPack(Data.MObjectHRCList.Length, "MObjectHRCList");
for (i = 0; i < Data.MObjectHRCList.Length; i++)
mObjectHRCList[i] = Data.MObjectHRCList[i];
a3d.Add(mObjectHRCList);
}
if (Data.MaterialList != null)
{
MsgPack materialList = new MsgPack(Data.MaterialList.Length, "MaterialList");
for (i = 0; i < Data.MaterialList.Length; i++)
materialList[i] = new MsgPack("Material")
.Add("Name", Data.MaterialList[i].Name)
.Add("BlendColor", ref Data.MaterialList[i].BlendColor)
.Add("GlowIntensity", ref Data.MaterialList[i].GlowIntensity)
.Add("Incandescence", ref Data.MaterialList[i].Incandescence);
a3d.Add(materialList);
}
if (Data.Motion != null)
{
MsgPack motion = new MsgPack(Data.Motion.Length, "Motion");
for (i = 0; i < Data.Motion.Length; i++) motion[i] = Data.Motion[i];
a3d.Add(motion);
}
if (Data.Object != null)
{
MsgPack @object = new MsgPack(Data.Object.Length, "Object");
for (i0 = 0; i0 < Data.Object.Length; i0++)
{
MsgPack _object = MsgPack.New;
if (Data.Object[i0].Morph != null)
_object = _object.Add("Morph" , Data.Object[i0].Morph )
.Add("MorphOffset", Data.Object[i0].MorphOffset);
_object.Add("Name", Data.Object[i0].Name);
if (Data.Object[i0].Pat != null)
_object = _object.Add("Pat" , Data.Object[i0].Pat )
.Add("PatOffset", Data.Object[i0].PatOffset);
_object = _object.Add("ParentName", Data.Object[i0].ParentName)
.Add("ParentNode", Data.Object[i0].ParentNode)
.Add( "UIDName", Data.Object[i0]. UIDName);
if (Data.Object[i0].TexPat != null)
{
MsgPack texPat = new MsgPack(Data.Object[i0].TexPat.Length, "TexturePattern");
for (i1 = 0; i1 < Data.Object[i0].TexPat.Length; i1++)
{
MsgPack _texPat = MsgPack.New.Add("Name", Data.Object[i0].TexPat[i1].Name);
if (Data.Object[i0].TexPat[i1].Pat != null)
_texPat.Add("Pat" , Data.Object[i0].TexPat[i1].Pat )
.Add("PatOffset", Data.Object[i0].TexPat[i1].PatOffset);
texPat[i1] = _texPat;
}
_object.Add(texPat);
}
if (Data.Object[i0].TexTrans != null)
{
MsgPack texTrans = new MsgPack(Data.Object[i0]
.TexTrans.Length, "TextureTransform");
for (i1 = 0; i1 < Data.Object[i0].TexTrans.Length; i1++)
texTrans[i1] = MsgPack.New
.Add("Name", Data.Object[i0].TexTrans[i1].Name)
.Add("CoverageU" , ref Data.Object[i0].TexTrans[i1].CoverageU )
.Add("CoverageV" , ref Data.Object[i0].TexTrans[i1].CoverageV )
.Add("OffsetU" , ref Data.Object[i0].TexTrans[i1].OffsetU )
.Add("OffsetV" , ref Data.Object[i0].TexTrans[i1].OffsetV )
.Add("RepeatU" , ref Data.Object[i0].TexTrans[i1].RepeatU )
.Add("RepeatV" , ref Data.Object[i0].TexTrans[i1].RepeatV )
.Add( "Rotate" , ref Data.Object[i0].TexTrans[i1]. Rotate )
.Add( "RotateFrame" , ref Data.Object[i0].TexTrans[i1]. RotateFrame )
.Add("TranslateFrameU", ref Data.Object[i0].TexTrans[i1].TranslateFrameU)
.Add("TranslateFrameV", ref Data.Object[i0].TexTrans[i1].TranslateFrameV);
_object.Add(texTrans);
}
@object[i0] = _object.Add(ref Data.Object[i0].MT);
}
a3d.Add(@object);
}
if (Data.ObjectHRC != null)
{
MsgPack objectHRC = new MsgPack(Data.ObjectHRC.Length, "ObjectHRC");
for (i0 = 0; i0 < Data.ObjectHRC.Length; i0++)
{
MsgPack _objectHRC = MsgPack.New
.Add("Name", Data.ObjectHRC[i0].Name)
.Add("ParentName", Data.ObjectHRC[i0].ParentName)
.Add("ParentNode", Data.ObjectHRC[i0].ParentNode);
if (Data.ObjectHRC[i0].Shadow)
_objectHRC.Add("Shadow", true);
_objectHRC.Add("UIDName", Data.ObjectHRC[i0].UIDName);
if (Data.ObjectHRC[i0].Node != null)
{
MsgPack node = new MsgPack(Data.ObjectHRC[i0].Node.Length, "Node");
for (i1 = 0; i1 < Data.ObjectHRC[i0].Node.Length; i1++)
{
MsgPack _node = MsgPack.New
.Add("Name" , Data.ObjectHRC[i0].Node[i1].Name )
.Add("Parent", Data.ObjectHRC[i0].Node[i1].Parent);
if (Data.ObjectHRC[i0].Node[i1].JointOrient.HasValue)
{
Vec3 jointOrient = Data.ObjectHRC[i0].Node[i1].JointOrient.Value;
_node.Add(new MsgPack("JointOrient")
.Add("X", jointOrient.X)
.Add("Y", jointOrient.Y)
.Add("Z", jointOrient.Z));
}
node[i1] = _node.Add(ref Data.ObjectHRC[i0].Node[i1].MT);
}
_objectHRC.Add(node);
}
objectHRC[i0] = _objectHRC;
}
a3d.Add(objectHRC);
}
if (Data.ObjectHRCList != null)
{
MsgPack objectHRCList = new MsgPack(Data.ObjectHRCList.Length, "ObjectHRCList");
for (i = 0; i < Data.ObjectHRCList.Length; i++) objectHRCList[i] = Data.ObjectHRCList[i];
a3d.Add(objectHRCList);
}
if (Data.ObjectList != null)
{
MsgPack objectList = new MsgPack(Data.ObjectList.Length, "ObjectList");
for (i = 0; i < Data.ObjectList.Length; i++) objectList[i] = Data.ObjectList[i];
a3d.Add(objectList);
}
a3d.Add(new MsgPack("PlayControl")
.Add("Begin" , Data.PlayControl.Begin )
.Add("Div" , Data.PlayControl.Div )
.Add("FPS" , Data.PlayControl.FPS )
.Add("Offset", Data.PlayControl.Offset)
.Add("Size" , Data.PlayControl.Size ));
if (Data.Point != null)
{
MsgPack point = new MsgPack(Data.Point.Length, "Point");
for (i = 0; i < Data.Point.Length; i++)
point[i] = MsgPack.New.Add("Name", Data.Point[i].Name).Add(ref Data.Point[i].MT);
a3d.Add(point);
}
if (Data.PostProcess != null)
{
PostProcess pp = Data.PostProcess.Value;
a3d.Add(new MsgPack("PostProcess").Add("Intensity", ref pp.Intensity)
.Add("LensFlare", ref pp.LensFlare)
.Add("LensGhost", ref pp.LensGhost)
.Add("LensShaft", ref pp.LensShaft)
.Add("Radius" , ref pp.Radius )
.Add("SceneFade", ref pp.SceneFade));
Data.PostProcess = pp;
}
return a3d;
}
public void Dispose()
{
i = i0 = i1 = soi0 = soi1 = 0;
so0 = so1 = null;
name = nameView = value = null;
dataArray = null;
dict = null;
s = null;
Data = default;
Head = default;
}
}
public static class A3DAExt
{
public static ModelTransform RMT(this MsgPack msgPack, string name) =>
msgPack[name].RMT();
public static ModelTransform RMT(this MsgPack msgPack) =>
new ModelTransform { Rot = msgPack.RV3("Rot" ), Scale = msgPack.RV3("Scale" ),
Trans = msgPack.RV3("Trans"), Visibility = msgPack.RK ("Visibility") };
public static Vec4<Key?>? RRGBAKN(this MsgPack msgPack, string name) =>
msgPack[name].NotNull ? (Vec4<Key?>?)msgPack[name].RRGBAK() : null;
public static Vec4<Key?> RRGBAK(this MsgPack msgPack) =>
new Vec4<Key?> { X = msgPack.RKN("R"), Y = msgPack.RKN("G"),
Z = msgPack.RKN("B"), W = msgPack.RKN("A") };
public static Vec3<Key> RV3(this MsgPack msgPack, string name) =>
msgPack[name].RV3();
public static Vec3<Key> RV3(this MsgPack msgPack) =>
new Vec3<Key> { X = msgPack.RK("X"), Y = msgPack.RK("Y"), Z = msgPack.RK("Z") };
public static Key? RKN(this MsgPack msgPack, string name) =>
msgPack[name].Object != null ? (Key?)msgPack[name].RK() : default;
public static Key RK(this MsgPack msgPack, string name) =>
msgPack[name].RK();
public static Key RK(this MsgPack msgPack)
{
if (msgPack.Object == null) return default;
Key key = default;
if (Enum.TryParse(msgPack.RS("EPTypePost"), out EPType epTypePost)) key.EPTypePost = epTypePost;
if (Enum.TryParse(msgPack.RS("EPTypePre" ), out EPType epTypePre )) key.EPTypePre = epTypePre;
if (!Enum.TryParse(msgPack.RS("Type"), out KeyType keyType))
{
string type = msgPack.RS("Type");
if (type == null || type == "") { key.Value = 0; return key; }
{
if (type == "Null" ) keyType = KeyType.None;
else if (type == "Value") keyType = KeyType.Static;
else if (type == "Lerp" ) keyType = KeyType.Linear;
}
}
key.Max = msgPack.RnF32("Max");
key.Value = msgPack.RF32("Value");
key.Type = keyType;
if (key.Type == 0) { key.Value = 0; return key; }
else if (key.Type < KeyType.Linear) return key;
key.RawData = msgPack.RB("RawData");
key.RawDataBinary = msgPack.RB("RawDataBinary");
MsgPack trans;
if ((trans = msgPack["Keys", true]).IsNull && (trans = msgPack["Trans", true]).IsNull) return key;
int length = trans.Array.Length;
key.Keys = new KFT3[length];
for (int i = 0; i < length; i++)
{
if (trans[i].Array == null) continue;
else if (trans[i].Array.Length == 0) continue;
else if (trans[i].Array.Length == 1)
key.Keys[i] = new KFT3
(trans[i][0].RF32());
else if (trans[i].Array.Length == 2)
key.Keys[i] = new KFT3
(trans[i][0].RF32(), trans[i][1].RF32());
else if (trans[i].Array.Length == 3)
key.Keys[i] = new KFT3
(trans[i][0].RF32(), trans[i][1].RF32(), trans[i][2].RF32());
else if (trans[i].Array.Length == 4)
key.Keys[i] = new KFT3
(trans[i][0].RF32(), trans[i][1].RF32(), trans[i][2].RF32(), trans[i][3].RF32());
}
return key;
}
public static MsgPack Add(this MsgPack msgPack, ref ModelTransform mt) =>
msgPack.Add("Rot" , ref mt.Rot )
.Add("Scale" , ref mt.Scale )
.Add("Trans" , ref mt.Trans )
.Add("Visibility", ref mt.Visibility);
public static MsgPack Add(this MsgPack msgPack, string name, ref ModelTransform mt) =>
msgPack.Add(new MsgPack(name).Add("Rot" , ref mt.Rot )
.Add("Scale" , ref mt.Scale )
.Add("Trans" , ref mt.Trans )
.Add("Visibility", ref mt.Visibility));
public static MsgPack Add(this MsgPack msgPack, string name, ref Vec4<Key?>? rgba)
{
if (!rgba.HasValue) return msgPack;
Vec4<Key?> rgbav = rgba.Value;
msgPack = msgPack.Add(new MsgPack(name).Add("R", ref rgbav.X).Add("G", ref rgbav.Y)
.Add("B", ref rgbav.Z).Add("A", ref rgbav.W));
rgba = rgbav;
return msgPack;
}
public static MsgPack Add(this MsgPack msgPack, string name, ref Vec3<Key> key)
{
MsgPack m = new MsgPack(name).Add("X", ref key.X).Add("Y", ref key.Y).Add("Z", ref key.Z);
return m.List.Count > 0 ? msgPack.Add(m) : msgPack;
}
public static MsgPack Add(this MsgPack msgPack, string name, ref Key? key)
{
if (!key.HasValue) return msgPack;
Key k = key.Value;
msgPack = msgPack.Add(name, ref k);
key = k;
return msgPack;
}
public static MsgPack Add(this MsgPack msgPack, string name, ref Key key)
{
MsgPack keys = new MsgPack(name).Add("Type", key.Type.ToString());
if (key.Keys != null && key.Type > KeyType.Static)
{
keys.Add("Max", key.Max);
if (key.EPTypePost != EPType.None)
keys.Add("EPTypePost", key.EPTypePost.ToString());
if (key.EPTypePre != EPType.None)
keys.Add("EPTypePre", key.EPTypePre.ToString());
if (key.RawData ) keys.Add("RawData" , true);
if (key.RawDataBinary) keys.Add("RawDataBinary", true);
int length = key.Keys.Length;
MsgPack Keys = new MsgPack(length, "Keys");
for (int i = 0; i < length; i++)
{
IKF kf = key.Keys[i].Check();
if (kf is KFT0 kft0) Keys[i] = new MsgPack(null,
new MsgPack[] { kft0.F });
else if (kf is KFT1 kft1) Keys[i] = new MsgPack(null,
new MsgPack[] { kft1.F, kft1.V });
else if (kf is KFT2 kft2) Keys[i] = new MsgPack(null,
new MsgPack[] { kft2.F, kft2.V, kft2.T });
else if (kf is KFT3 kft3) Keys[i] = new MsgPack(null,
new MsgPack[] { kft3.F, kft3.V, kft3.T1, kft3.T2, });
}
keys.Add(Keys);
}
else if (key.Type != KeyType.None) keys.Add("Value", key.Value);
msgPack.Add(keys);
return msgPack;
}
}
public struct A3DAHeader
{
public uint SubHeadersOffset;
public ushort SubHeadersCount;
public ushort SubHeadersStride;
public int BinaryLength;
public int BinaryOffset;
public int StringLength;
public int StringOffset;
public Format Format;
}
}