Compare commits

..
2 Commits
Author SHA1 Message Date
korenkonder 036863a5a6 Update README.md 2020-09-16 04:11:30 +03:00
korenkonder b6017d1d70 Release v0.4.9.8
A3DA, Bloom, Color Correction, DOF, Light
2020-09-16 04:07:06 +03:00
31 changed files with 546 additions and 533 deletions
+12 -11
View File
@@ -11,13 +11,10 @@ namespace KKdBaseLib
public EPType EPTypePost;
public float FrameDelta;
public float ValueDelta;
public int Unk1C;
public int Unk20;
public int Unk24;
public int Unk28;
public int Unk2C;
public int Unk30;
public int Unk34;
public int Padding;
public long FirstKey;
public long SecondKey;
public long AfterLastKey;
public long Length;
public long DataOffset; //Used only in-game and points to KFT3 Array
@@ -26,17 +23,17 @@ namespace KKdBaseLib
public A3DAKey(Key k)
{
Type = 0; Value = MaxFrames = FrameDelta = ValueDelta = 0; EPTypePre = EPTypePost = 0;
Unk1C = Unk20 = Unk24 = Unk28 = Unk2C = Unk30 = Unk34 = 0;
FirstKey = SecondKey = AfterLastKey = Padding = 0;
Length = DataOffset = 0; Keys = null;
EPTypePost = k.EPTypePost;
EPTypePre = k.EPTypePre;
MaxFrames = k.Max ?? 0;
if (k.Type > KeyType.Value && k.Length > 1)
if (k.Type > KeyType.Static && k.Length > 1)
{
Type = k.Type;
Length = k.Length;
Keys = k.Keys;
EPTypePost = k.EPTypePost;
EPTypePre = k.EPTypePre;
FrameDelta = k.Keys[k.Length - 1].F - k.Keys[0].F;
ValueDelta = k.Keys[k.Length - 1].V - k.Keys[0].V;
}
@@ -44,6 +41,10 @@ namespace KKdBaseLib
{
Type = k.Type;
Value = k.Type > 0 ? k.Value : 0.0f;
EPTypePost = 0;
EPTypePre = 0;
FrameDelta = 0;
ValueDelta = Value;
}
}
}
+12 -12
View File
@@ -104,23 +104,23 @@ namespace KKdBaseLib.Auth3D
public enum CompressF16 : int
{
F32F32F32F32 = 0,
I16F16F32F32 = 1,
I16F16F16F16 = 2,
Type0 = 0,
Type1 = 1,
Type2 = 2,
}
public enum EPType : int
public enum EPType : int // Pre/Post Infinity
{
EP_1 = 1,
EP_2 = 2,
EP_3 = 3,
Linear = 1,
Cycle = 2,
CycleOffset = 3,
}
public enum KeyType : int
{
Null = 0,
Value = 1,
Lerp = 2,
None = 0,
Static = 1,
Linear = 2,
Hermite = 3,
Hold = 4,
}
@@ -157,7 +157,7 @@ namespace KKdBaseLib.Auth3D
}
else if (k.Length == 1)
{
Type = KeyType.Value;
Type = KeyType.Static;
Value = k.Keys[0].V;
}
}
@@ -259,7 +259,7 @@ namespace KKdBaseLib.Auth3D
public struct ObjectHRC
{
public int? Shadow;
public bool? Shadow;
public string Name;
public string UIDName;
public Node[] Node;
+1 -1
View File
@@ -276,7 +276,7 @@ namespace KKdBaseLib
public static string ToS(this ulong? d) => (d ?? default).ToString();
public static string ToS(this ulong d) => d.ToString();
public static string ToS(this float? d, int round) => (d ?? default).ToS(round);
public static string ToS(this float? d) => (d ?? default).ToS();
public static string ToS(this float? d) => (d ?? default).ToS(15);
public static string ToS(this float d, int round)
{ string s = (d.ToU32() & 0x80000000) != 0 ? "-" : ""; d = (d.ToU32() & 0x7FFFFFFF).ToF32();
return s + Math.Round(d, round).ToString().ToLower().Replace(NDS, "."); }
+2 -2
View File
@@ -148,7 +148,7 @@ namespace KKdBaseLib.F2
value = (ENRSEntry.Value)((*ptr & 0xC0) >> 6);
ptr++;
if (value == ENRSEntry.Value.Int32 ) v = (((((v << 8) | *ptr++) << 8) | *ptr++) << 8) | *ptr++;
else if (value == ENRSEntry.Value.Int16 ) v = (v << 8) | *ptr++;
else if (value == ENRSEntry.Value.Int16 ) v = (v << 8) | *ptr++;
else if (value == ENRSEntry.Value.Invalid) { v = 0; return true; }
return false;
}
@@ -159,7 +159,7 @@ namespace KKdBaseLib.F2
value = (ENRSEntry.Value)((*ptr & 0xC0) >> 6);
ptr++;
if (value == ENRSEntry.Value.Int32 ) v = (((((v << 8) | *ptr++) << 8) | *ptr++) << 8) | *ptr++;
else if (value == ENRSEntry.Value.Int16 ) v = (v << 8) | *ptr++;
else if (value == ENRSEntry.Value.Int16 ) v = (v << 8) | *ptr++;
else if (value == ENRSEntry.Value.Invalid) { v = 0; return true; }
return false;
}
+2 -2
View File
@@ -55,7 +55,7 @@ namespace KKdBaseLib.F2
WritePOFValue(ref l, 0x7FFFFFFF);
break;
}
k = o - j;
if (i > 0 & k == 0)
continue;
@@ -75,7 +75,7 @@ namespace KKdBaseLib.F2
value = (Value)((*ptr & 0xC0) >> 6);
ptr++;
if (value == Value.Int32 ) v = (((((v << 8) | *ptr++) << 8) | *ptr++) << 8) | *ptr++;
else if (value == Value.Int16 ) v = (v << 8) | *ptr++;
else if (value == Value.Int16 ) v = (v << 8) | *ptr++;
else if (value == Value.Invalid) { v = 0; return true; }
return false;
}
+49 -32
View File
@@ -4,67 +4,84 @@ namespace KKdBaseLib
{
public struct Half : IFormattable
{
private ushort _value;
private ushort value;
public static Half NaN => new Half { _value = 0x7FFF };
public static Half PositiveNaN => new Half { _value = 0x7FFF };
public static Half NegativeNaN => new Half { _value = 0xFFFF };
public static Half PositiveZero => new Half { _value = 0x0000 };
public static Half NegativeZero => new Half { _value = 0x8000 };
public static Half PositiveInfinity => new Half { _value = 0x7C00 };
public static Half NegativeInfinity => new Half { _value = 0xFC00 };
public static Half NaN => new Half { value = 0x7FFF };
public static Half PositiveNaN => new Half { value = 0x7FFF };
public static Half NegativeNaN => new Half { value = 0xFFFF };
public static Half PositiveZero => new Half { value = 0x0000 };
public static Half NegativeZero => new Half { value = 0x8000 };
public static Half PositiveInfinity => new Half { value = 0x7C00 };
public static Half NegativeInfinity => new Half { value = 0xFC00 };
public static explicit operator Half(ushort bits) => new Half() { _value = bits };
public static explicit operator Half(ushort bits) => new Half() { value = bits };
public static explicit operator ushort(Half bits) => bits._value;
public static explicit operator ushort(Half bits) => bits.value;
public static unsafe implicit operator float(Half h)
{
int sign = (h._value >> 15) & 0x001;
int exponent = ((h._value >> 10) & 0x01F) + 127 - 15;
int mantissa = h._value & 0x3FF;
int si32;
int sign = (h.value >> 15) & 0x001;
int exponent = (h.value >> 10) & 0x01F;
int mantissa = h.value & 0x3FF;
unchecked { si32 = sign != 0 ? (int)0x80000000 : 0x00000000; }
int si32 = (sign << 31) | (exponent << 23) | (mantissa << 13);
if (exponent == 0x1F) si32 |= 0x7F800000;
else if (exponent != 0x00) si32 |= (exponent - 15 + 127) << 23;
si32 |= mantissa << 13;
return *(float*)&si32;
}
public static unsafe explicit operator Half(float val)
{
int si32 = *(int*)&val;
ushort sign = (ushort)( (si32 >> 16) & 0x8000);
short exponent = ( short)(((si32 >> 23) & 0x00FF) - 127 + 15);
ushort mantissa = (ushort)( (si32 >> 13) & 0x03FF);
int sign = (si32 >> 31) & 0x001;
int exponent = (si32 >> 23) & 0x0FF;
int mantissa = si32 & 0x3FF;
if ( si32 == 0x00000000) return new Half { value = 0x0000 };
else if ((uint)si32 == 0x80000000) return new Half { value = 0x8000 };
else
{
if (exponent < 0) { exponent = 0; mantissa = 0; }
else if (exponent > 30) exponent = 31;
return new Half { value = (ushort)(sign | (exponent << 10) | mantissa) };
}
if (exponent < 0) { exponent = 0; mantissa = 0; }
else if (exponent > 30) exponent = 31;
return new Half { _value = (ushort)(sign | (exponent << 10) | mantissa) };
}
public static unsafe implicit operator double(Half h)
{
int sign = (h._value >> 15) & 0x001;
int exponent = ((h._value >> 10) & 0x01F) + 1023 - 15;
int mantissa = h._value & 0x3FF;
long si64;
long sign = (h.value >> 15) & 0x001;
long exponent = (h.value >> 10) & 0x01F;
long mantissa = h.value & 0x3FF;
unchecked { si64 = sign != 0 ? (long)0x8000000000000000 : 0x0000000000000000; }
long si64 = ((long)sign << 63) | ((long)exponent << 52) | ((long)mantissa << 42);
if (exponent == 0x1F) si64 |= 0x7FF0000000000000;
else if (exponent != 0x00) si64 |= (exponent - 15 + 1023) << 52;
si64 |= mantissa << 42;
return *(double*)&si64;
}
public static unsafe explicit operator Half(double val)
{
long si64 = *(long*)&val;
ushort sign = (ushort) ((si64 >> 48) & 0x8000);
short exponent = ( short)(((si64 >> 52) & 0x07FF) - 1023 + 15);
ushort mantissa = (ushort) ((si64 >> 42) & 0x03FF);
if ( si64 == 0x0000000000000000) return new Half { value = 0x0000 };
else if ((ulong)si64 == 0x8000000000000000) return new Half { value = 0x8000 };
else
{
ushort sign = (ushort) ((si64 >> 63) & 0x8000);
short exponent = ( short)(((si64 >> 52) & 0x07FF) - 1023 + 15);
ushort mantissa = (ushort) ((si64 >> 42) & 0x03FF);
if (exponent < 0) { exponent = 0; mantissa = 0; }
else if (exponent > 30) exponent = 31;
if (exponent < 0) { exponent = 0; mantissa = 0; }
else if (exponent > 30) exponent = 31;
return new Half { _value = (ushort)(sign | (exponent << 10) | mantissa) };
return new Half { value = (ushort)(sign | (exponent << 10) | mantissa) };
}
}
public static Half operator - (Half a ) => new Half() { _value = (ushort)(a._value ^ 0x8000) };
public static Half operator - (Half a ) => new Half() { value = (ushort)(a.value ^ 0x8000) };
public static Half operator + (Half a, Half b) => (Half)((float)a + (float)b);
public static Half operator - (Half a, Half b) => (Half)((float)a - (float)b);
public static Half operator * (Half a, Half b) => (Half)((float)a * (float)b);
+40 -44
View File
@@ -2,7 +2,7 @@ using KKdBaseLib.Auth3D;
namespace KKdBaseLib.Interpolation
{
public class A3DAI : IInterpolation<float> //A3DA Interpolation
public class A3DAI : IInterpolation<float>, System.IDisposable //A3DA Interpolation
{
private A3DAKey a3daKey;
@@ -113,54 +113,44 @@ namespace KKdBaseLib.Interpolation
{
float df = 0;
float ep = 0;
float f = (int)frame;
if (f < firstKey.F)
if (frame < firstKey.F)
{
if (a3daKey.EPTypePost < EPType.EP_1 || a3daKey.EPTypePost > EPType.EP_3) return firstKey.V;
if (a3daKey.EPTypePost < EPType.Linear || a3daKey.EPTypePost > EPType.CycleOffset)
return firstKey.V;
df = firstKey.F - frame;
if (a3daKey.EPTypePre == EPType.EP_1) return firstKey.V - df * firstKey.T1;
if (a3daKey.EPTypePre == EPType.Linear)
return firstKey.V - df * firstKey.T1;
frame = lastKey.F - df % a3daKey.FrameDelta;
f = (int)frame;
if (a3daKey.EPTypePre == EPType.EP_3)
{
ep = df / a3daKey.FrameDelta;
ep = (ep > 0 && ep != (int)ep) ? (ep - (int)ep > 0 ? 1 : 0) : ep;
ep = -(ep + 1) * a3daKey.ValueDelta;
}
if (a3daKey.EPTypePre == EPType.CycleOffset)
ep = -(float)((int)(df / a3daKey.FrameDelta) + 1) * a3daKey.ValueDelta;
}
else if (f >= lastKey.F)
else if (frame >= lastKey.F)
{
if (a3daKey.EPTypePost < EPType.EP_1 || a3daKey.EPTypePost > EPType.EP_3) return lastKey.V;
if (a3daKey.EPTypePost < EPType.Linear || a3daKey.EPTypePost > EPType.CycleOffset)
return lastKey.V;
df = frame - lastKey.F;
if (a3daKey.EPTypePost == EPType.EP_1) return lastKey.V + df * lastKey.T2;
if (a3daKey.EPTypePost == EPType.Linear)
return lastKey.V + df * lastKey.T2;
frame = firstKey.F + df % a3daKey.FrameDelta;
f = (int)frame;
if (a3daKey.EPTypePost == EPType.EP_3)
{
ep = df / a3daKey.FrameDelta;
ep = (ep > 0 && ep != (int)ep) ? (ep - (int)ep > 0 ? 1 : 0) : ep;
ep = (ep + 1) * a3daKey.ValueDelta;
}
if (a3daKey.EPTypePost == EPType.CycleOffset)
ep = (float)((int)(df / a3daKey.FrameDelta) + 1) * a3daKey.ValueDelta;
}
if (f <= firstKey.F) return firstKey.V + ep;
else if (f >= lastKey.F) return lastKey.V + ep;
KFT3 c, n;
long key = 0;
unsafe
{
fixed (KFT3* ptr = a3daKey.Keys)
{
long key = 0;
long length = a3daKey.Length;
long temp;
while (length > 0)
if (f > a3daKey.Keys[key + (temp = length >> 1)].F)
if (frame >= ptr[key + (temp = length >> 1)].F)
{
key += temp + 1;
length -= temp + 1;
@@ -172,29 +162,35 @@ namespace KKdBaseLib.Interpolation
}
}
float result;
if (frame > c.F && frame < n.F)
float v;
if (frame <= c.F || frame >= n.F)
v = frame > c.F ? n.V : c.V;
else if (a3daKey.Type == KeyType.Linear || (a3daKey.Type == KeyType.Hermite && n.T1 == c.T2 && n.T1 == 0.0f))
{
if (a3daKey.Type == KeyType.Lerp)
{
float t = (frame - c.F) / (n.F - c.F);
result = (1 - t) * c.V + t * n.V;
}
else if (a3daKey.Type == KeyType.Hermite)
{
float t = (frame - c.F) / (n.F - c.F);
float t_2 = (1 - t) * (1 - t);
result = t_2 * c.V * (1 + 2 * t) + (t * n.V * (3 - 2 * t) +
(t_2 * c.T2 + t * (t - 1) * n.T1) * (n.F - c.F)) * t;
}
else result = c.V;
float t = (frame - c.F) / (n.F - c.F);
v = (1.0f - t) * c.V + t * n.V;
}
else result = frame > c.F ? n.V : c.V;
return result + ep;
else if (a3daKey.Type == KeyType.Hermite)
{
float t = (frame - c.F) / (n.F - c.F);
float t_2 = (1.0f - t) * (1.0f - t);
v = t_2 * c.V * (1.0f + 2.0f * t) + (t * n.V * (3.0f - 2.0f * t) +
(t_2 * c.T2 + t * (t - 1.0f) * n.T1) * (n.F - c.F)) * t;
}
else v = c.V;
return v + ep;
}
public void ResetFrameCount() { f = -df; t = f / rf; }
public override string ToString() => $"F: {f}; T: {t}; V: {v}";
public void Dispose()
{
a3daKey.Keys = null;
a3daKey = default;
f = t = v = df = @if = rf = default;
firstKey = lastKey = default;
}
}
}
+17 -13
View File
@@ -87,10 +87,8 @@ namespace KKdBaseLib.Interpolation
private float Interpolate(float frame)
{
float f = (int)frame;
if (f <= firstKey.F) return firstKey.V;
else if (f >= lastKey.F) return lastKey.V;
if (frame <= firstKey.F) return firstKey.V;
else if (frame >= lastKey.F) return lastKey.V;
KFT2 c, n;
unsafe
@@ -101,7 +99,7 @@ namespace KKdBaseLib.Interpolation
long length = this.length;
long temp;
while (length > 0)
if (f > array[key + (temp = length >> 1)].F)
if (frame >= ptr[key + (temp = length >> 1)].F)
{
key += temp + 1;
length -= temp + 1;
@@ -113,16 +111,22 @@ namespace KKdBaseLib.Interpolation
}
}
float result;
if (frame > c.F && frame < n.F)
float v;
if (frame <= c.F || frame >= n.F)
v = frame > c.F ? n.V : c.V;
else if (n.T == c.T && n.T == 0.0f)
{
float t = (this.f - c.F) / (n.F - c.F);
float t_1 = t - 1;
result = (t_1 * 2 - 1) * (c.V - n.V) * t * t +
(t_1 * c.T + t * n.T) * t_1 * (this.f - c.F) + c.V;
float t = (frame - c.F) / (n.F - c.F);
v = (1.0f - t) * c.V + t * n.V;
}
else result = frame > c.F ? n.V : c.V;
return result;
else
{
float t = (frame - c.F) / (n.F - c.F);
float t_1 = t - 1.0f;
v = (t_1 * 2.0f - 1.0f) * (c.V - n.V) * t * t +
(t_1 * c.T + t * n.T) * t_1 * (frame - c.F) + c.V;
}
return v;
}
public void ResetFrameCount() { f = -df; t = f / rf; }
+2 -2
View File
@@ -6,12 +6,12 @@
<Configuration></Configuration>
<Copyright>korenkonder (C) 2019-2020</Copyright>
<Description>A base library</Description>
<FileVersion>0.4.9.7</FileVersion>
<FileVersion>0.4.9.8</FileVersion>
<PackageId>KKdBaseLib</PackageId>
<Product>KKdBaseLib</Product>
<TargetFramework>net461</TargetFramework>
<Title>KKdBaseLib</Title>
<Version>0.4.9.7</Version>
<Version>0.4.9.8</Version>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
+7 -8
View File
@@ -199,7 +199,7 @@ namespace KKdBaseLib
public static int[] SW(this int length)
{
int i, j, l, m;
int i, j, m;
if (length <= 0) return new int[0];
if (length == 1) return new int[1] { 0 };
@@ -212,7 +212,6 @@ namespace KKdBaseLib
m = 1;
while (m < length)
m *= 10;
l = 0;
while (i < length)
{
if (j * 10 < m)
@@ -229,19 +228,19 @@ namespace KKdBaseLib
j++;
}
else if (j % 10 != 9)
sort[i++] = j++;
sort[i++] = j++;
if (i < length)
if (j == length && j % 10 != 9)
{
m /= 10;
j /= 10;
{
m /= 10;
j /= 10;
while (j % 10 == 9) j /= 10;
j++;
}
else if (j < length && j % 10 == 9)
{
sort[i++] = j;
sort[i++] = j;
while (j % 10 == 9) j /= 10;
j++;
}
+1 -1
View File
@@ -10,7 +10,7 @@ namespace KKdBaseLib
public Vec2 Column0 { get => new Vec2(Row0.X, Row1.X);
set { Row0.X = value.X; Row1.X = value.Y; } }
public Vec2 Column1 { get => new Vec2(Row0.Y, Row1.X);
public Vec2 Column1 { get => new Vec2(Row0.Y, Row1.Y);
set { Row0.Y = value.X; Row1.Y = value.Y; } }
public static Mat2 Identity => new Mat2(new Vec2(1.0f, 0.0f),
+1 -1
View File
@@ -11,7 +11,7 @@ namespace KKdBaseLib
public Vec3 Column0 { get => new Vec3(Row0.X, Row1.X, Row2.X);
set { Row0.X = value.X; Row1.X = value.Y; Row2.X = value.Z; } }
public Vec3 Column1 { get => new Vec3(Row0.Y, Row1.X, Row2.Y);
public Vec3 Column1 { get => new Vec3(Row0.Y, Row1.Y, Row2.Y);
set { Row0.Y = value.X; Row1.Y = value.Y; Row2.Y = value.Z; } }
public Vec3 Column2 { get => new Vec3(Row0.Z, Row1.Z, Row2.Z);
set { Row0.Z = value.X; Row1.Z = value.Y; Row2.Z = value.Z;} }
+1 -1
View File
@@ -12,7 +12,7 @@ namespace KKdBaseLib
public Vec4 Column0 { get => new Vec4(Row0.X, Row1.X, Row2.X, Row3.X);
set { Row0.X = value.X; Row1.X = value.Y; Row2.X = value.Z; Row3.X = value.W; } }
public Vec4 Column1 { get => new Vec4(Row0.Y, Row1.X, Row2.Y, Row3.Y);
public Vec4 Column1 { get => new Vec4(Row0.Y, Row1.Y, Row2.Y, Row3.Y);
set { Row0.Y = value.X; Row1.Y = value.Y; Row2.Y = value.Z; Row3.Y = value.W; } }
public Vec4 Column2 { get => new Vec4(Row0.Z, Row1.Z, Row2.Z, Row3.Z);
set { Row0.Z = value.X; Row1.Z = value.Y; Row2.Z = value.Z; Row3.Z = value.W; } }
+45 -54
View File
@@ -12,33 +12,33 @@ namespace KKdBaseLib
public static Quat Identity => new Quat(0.0f, 0.0f, 0.0f, 1.0f);
public Quat(float X, float Y, float Z)
public Quat(float x, float y, float z)
{
X *= 0.5f;
Y *= 0.5f;
Z *= 0.5f;
x *= 0.5f;
y *= 0.5f;
z *= 0.5f;
var c1 = (float)System.Math.Cos(X);
var c2 = (float)System.Math.Cos(Y);
var c3 = (float)System.Math.Cos(Z);
var s1 = (float)System.Math.Sin(X);
var s2 = (float)System.Math.Sin(Y);
var s3 = (float)System.Math.Sin(Z);
var c1 = (float)System.Math.Cos(x);
var c2 = (float)System.Math.Cos(y);
var c3 = (float)System.Math.Cos(z);
var s1 = (float)System.Math.Sin(x);
var s2 = (float)System.Math.Sin(y);
var s3 = (float)System.Math.Sin(z);
this.X = s1 * c2 * c3 + c1 * s2 * s3;
this.Y = c1 * s2 * c3 - s1 * c2 * s3;
this.Z = c1 * c2 * s3 + s1 * s2 * c3;
W = c1 * c2 * c3 - s1 * s2 * s3;
X = s1 * c2 * c3 + c1 * s2 * s3;
Y = c1 * s2 * c3 - s1 * c2 * s3;
Z = c1 * c2 * s3 + s1 * s2 * c3;
W = c1 * c2 * c3 - s1 * s2 * s3;
}
public Quat(Vec3 vec) : this(vec.X, vec.Y, vec.Z)
{ }
public Quat(float X, float Y, float Z, float W)
{ this.X = X; this.Y = Y; this.Z = Z; this.W = W; }
public Quat(float x, float y, float z, float w)
{ X = x; Y = y; Z = z; W = w; }
public Quat(Vec3 vec, float W)
{ X = vec.X; Y = vec.Y; Z = vec.Z; this.W = W; }
public Quat(Vec3 vec, float w)
{ X = vec.X; Y = vec.Y; Z = vec.Z; W = w; }
public Quat(Vec4 vec)
{ X = vec.X; Y = vec.Y; Z = vec.Z; W = vec.W; }
@@ -97,7 +97,7 @@ namespace KKdBaseLib
public static Quat operator -(Quat left, Quat right)
{ left.X -= right.X; left.Y -= right.Y; left.Z -= right.Z; left.W -= right.W; return left; }
public static Quat operator -(Quat quat) =>
new Quat(-quat.X, -quat.Y, -quat.Z, quat.W);
new Quat(-quat.X, -quat.Y, -quat.Z, -quat.W);
public static Quat operator *( Quat quat, float scale)
{ quat.X *= scale ; quat.Y *= scale ; quat.Z *= scale ; quat.W *= scale ; return quat; }
public static Quat operator *(float scale, Quat quat)
@@ -112,55 +112,46 @@ namespace KKdBaseLib
public static bool operator ==(Quat A, Quat B) => A.Equals(B);
public static bool operator !=(Quat A, Quat B) => !A.Equals(B);
public static float Distance (Vec4 left, Vec4 right) =>
public static float Distance (Quat left, Quat right) =>
((right.X - left.X) * (right.X - left.X) + (right.Y - left.Y) * (right.Y - left.Y) +
(right.Z - left.Z) * (right.Z - left.Z) + (right.W - left.W) * (right.W - left.W)).Sqrt();
public static float DistanceSquared(Vec4 left, Vec4 right) =>
public static float DistanceSquared(Quat left, Quat right) =>
(right.X - left.X) * (right.X - left.X) + (right.Y - left.Y) * (right.Y - left.Y) +
(right.Z - left.Z) * (right.Z - left.Z) + (right.W - left.W) * (right.W - left.W);
public static float Dot(Vec4 left, Vec4 right) =>
public static float Dot(Quat left, Quat right) =>
left.X * right.X + left.Y * right.Y + left.Z * right.Z + left.W * right.W;
public Vec4 Round( ) =>
new Vec4 { X = X.Round( ), Y = Y.Round( ), Z = Z.Round( ), W = W.Round( ) };
public Vec4 Round(int d) =>
new Vec4 { X = X.Round(d), Y = Y.Round(d), Z = Z.Round(d), W = W.Round(d) };
public Quat Round( ) =>
new Quat { X = X.Round( ), Y = Y.Round( ), Z = Z.Round( ), W = W.Round( ) };
public Quat Round(int d) =>
new Quat { X = X.Round(d), Y = Y.Round(d), Z = Z.Round(d), W = W.Round(d) };
public static Quat Slerp(Quat q1, Quat q2, float blend)
{
if (q1.LengthSquared == 0.0f)
return q2.LengthSquared == 0.0f ? Identity : q2;
else if (q2.LengthSquared == 0.0f)
return q1;
q1 = q1.Normalized;
q2 = q2.Normalized;
float cosHalfAngle = Vec4.Dot((Vec4)q1, (Vec4)q2);
if (cosHalfAngle >= 1.0f || cosHalfAngle <= -1.0f)
return q1;
if (cosHalfAngle < 0.0f)
float dot = Dot(q1, q2);
if (dot < 0.0f)
{
q2.XYZ = -q2.XYZ;
q2.W = -q2.W;
cosHalfAngle = -cosHalfAngle;
q2 = -q2;
dot = -dot;
}
float blendA;
float blendB;
if (cosHalfAngle < 0.99f)
Quat result;
const float DOT_THRESHOLD = 0.9995f;
if (dot <= DOT_THRESHOLD)
{
float halfAngle = (float)System.Math.Acos(cosHalfAngle);
float sinHalfAngle = (float)System.Math.Sin(halfAngle);
float oneOverSinHalfAngle = 1.0f / sinHalfAngle;
blendA = (float)System.Math.Sin(halfAngle * (1.0f - blend)) * oneOverSinHalfAngle;
blendB = (float)System.Math.Sin(halfAngle * blend) * oneOverSinHalfAngle;
float theta_0 = (float)System.Math.Acos(dot);
float theta = theta_0 * blend;
float sin_theta = (float)System.Math.Sin(theta);
float sin_theta_0 = (float)System.Math.Sin(theta_0);
float s0 = (float)System.Math.Cos(theta) - dot * sin_theta / sin_theta_0;
float s1 = sin_theta / sin_theta_0;
result = s0 * q1 + s1 * q2;
}
else
{
blendA = 1.0f - blend;
blendB = blend;
}
Quat result = new Quat(blendA * q1.XYZ + blendB * q2.XYZ, blendA * q1.W + blendB * q2.W);
result = (1.0f - blend) * q1 + blend * q2;
return result.Normalized;
}
@@ -169,7 +160,7 @@ namespace KKdBaseLib
public static explicit operator Quat(Vec4 vec) =>
new Quat( vec.XYZ, vec.W);
public bool Equals(Vec4 other) =>
public bool Equals(Quat other) =>
X == other.X && Y == other.Y && Z == other.Z && W == other.W;
public override bool Equals(object obj) => base.Equals(obj);
+56 -46
View File
@@ -5,7 +5,7 @@ using KKdBaseLib.Auth3D;
using KKdMainLib.IO;
using Object = KKdBaseLib.Auth3D.Object;
using A3DADict = System.Collections.Generic.Dictionary<string, object>;
using UsedDict = System.Collections.Generic.Dictionary< int?, float?>;
using UsedDict = System.Collections.Generic.Dictionary< int, KKdBaseLib.KeyValuePair<int, float>>;
namespace KKdMainLib
{
@@ -857,7 +857,7 @@ namespace KKdMainLib
}
if (objectHRC.Shadow != null)
W(name + "shadow", objectHRC.Shadow);
W(name + "shadow", objectHRC.Shadow.HasValue && objectHRC.Shadow.Value ? 1 : 0);
W(name + "uid_name", objectHRC.UIDName);
}
W("objhrc.length", Data.ObjectHRC.Length);
@@ -947,10 +947,10 @@ namespace KKdMainLib
if (type == 0x0001) { 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 ;
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 key.Length, str + "key.length");
dict.FV(out key.Max , str + "max" );
if (dict.SW(str + "raw_data"))
@@ -1048,7 +1048,7 @@ namespace KKdMainLib
if (a3dc) { W(str + BO + "", key.BinOffset); return; }
int i = 0;
if (key.Type < KeyType.Lerp || key.Keys == null || (key.Keys != null && key.Keys.Length == 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);
@@ -1074,7 +1074,7 @@ namespace KKdMainLib
W(str + "key" + d + soi + d + "type", Type);
}
W(str + "key.length", key.Length);
if (key.Max != null) W(str + "max", key.Max);
W(str + "max", (float)(key.Max ?? Data.PlayControl.Size));
W(str + "type", (int)key.Type);
}
else if (key.Keys != null)
@@ -1083,7 +1083,7 @@ namespace KKdMainLib
ref int keyType = ref key.RawData.KeyType;
keyType = 0;
IKF kf;
if (key.Max != null) W(str + "max", key.Max);
W(str + "max", (float)(key.Max ?? Data.PlayControl.Size));
for (i = 0; i < length && keyType < 3; i++)
{
kf = key.Keys[i].Check();
@@ -1109,7 +1109,6 @@ namespace KKdMainLib
W(str + "raw_data_key_type" , key.RawData. KeyType );
W(str + "type", (int)key.Type);
}
W(str + "type", (int)key.Type);
}
private void W(string Data, long? val)
@@ -1119,7 +1118,7 @@ namespace KKdMainLib
private void W(string Data, long val) =>
W(Data, val.ToS());
private void W(string Data, float val) =>
W(Data, val.ToS());
W(Data, val.ToS(9));
private void W(string Data, string val)
{ if (val != null) s.W(Data + "=" + val + "\n"); }
@@ -1255,7 +1254,7 @@ namespace KKdMainLib
{
if (a3dcOpt) usedValues = new UsedDict();
Data._.CompressF16 = Head.Format > Format.AFT && Head.Format < Format.FT ?
(Head.Format == Format.MGF ? CompressF16.I16F16F16F16 : CompressF16.I16F16F32F32) : 0;
(Head.Format == Format.MGF ? CompressF16.Type2 : CompressF16.Type1) : 0;
s = File.OpenWriter();
for (byte i = 0; i < 2; i++)
@@ -1536,17 +1535,14 @@ namespace KKdMainLib
int Type = s.RI32();
key.Value = s.RF32();
key.Type = (KeyType)(Type & 0xFF);
if (key.Type < KeyType.Lerp) return;
if (key.Type < KeyType.Linear) return;
key.Max = s.RF32();
key.Length = s.RI32 ();
if (Type >> 8 != 0)
{
key.EPTypePost = (EPType)((Type >> 12) & 0xF);
key.EPTypePre = (EPType)((Type >> 8) & 0xF);
}
key.Length = s.RI32();
key.EPTypePost = (EPType)((Type >> 12) & 0xF);
key.EPTypePre = (EPType)((Type >> 8) & 0xF);
key.Keys = new KFT3[key.Length];
if (f16 && Data._.CompressF16 == CompressF16.I16F16F16F16)
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.RU16(); kf.V = s.RF16();
kf.T1 = s.RF16(); kf.T2 = s.RF16(); }
@@ -1556,8 +1552,8 @@ namespace KKdMainLib
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]; kf.F = s.RF32(); kf.V = s.RF32();
kf.T1 = s.RF32(); kf.T2 = s.RF32(); }
{ 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)
@@ -1606,7 +1602,7 @@ namespace KKdMainLib
private void W(ref Key key, bool f16 = false)
{
int i = 0;
if (key.Type > KeyType.Value && key.Keys != null)
if (key.Type > KeyType.Static && key.Keys != null)
{
key.BinOffset = s.P;
int Type = (int)key.Type & 0xFF;
@@ -1614,10 +1610,10 @@ namespace KKdMainLib
Type |= ((int)key.EPTypePre & 0xF) << 8;
s.W(Type);
s.W(0x00);
s.W((float)key.Max);
s.W((float)(key.Max ?? Data.PlayControl.Size));
s.W(key.Keys.Length);
if (f16 && Data._.CompressF16 == CompressF16.I16F16F16F16)
if (f16 && Data._.CompressF16 == CompressF16.Type2)
for (i = 0; i < key.Keys.Length; i++)
{ ref KFT3 kf = ref key.Keys[i]; s.W((ushort)kf.F ); s.W((Half)kf.V );
s.W(( Half)kf.T1); s.W((Half)kf.T2); }
@@ -1627,25 +1623,25 @@ namespace KKdMainLib
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( kf.F ); s.W( kf.V );
s.W( kf.T1); s.W( kf.T2); }
{ ref KFT3 kf = ref key.Keys[i]; s.W(new Vec4(kf.F, kf.V, kf.T1, kf.T2)); }
}
else
{
KeyValuePair<int, float> kvp = new KeyValuePair<int, float>((int)key.Type, key.Value);
if (!a3dcOpt)
{
key.BinOffset = s.P;
if (key.Type == 0) s.W(0x00L);
else { s.W((int)key.Type); s.W((float)key.Value); }
}
else if (!usedValues.ContainsValue(key.Value))
else if (!usedValues.ContainsValue(kvp))
{
key.BinOffset = s.P;
if (key.Type == 0) s.W(0x00L);
else { s.W((int)key.Type); s.W((float)key.Value); }
usedValues.Add(key.BinOffset, key.Value);
usedValues.Add(key.BinOffset.Value, kvp);
}
else key.BinOffset = usedValues.GK(key.Value);
else key.BinOffset = usedValues.GK(kvp);
}
}
@@ -1824,7 +1820,7 @@ namespace KKdMainLib
private void MKUV(ref Vec2<Key?> uv, ref Vec2<Key?> mUV)
{ MK(ref uv.X, ref mUV.X); MK(ref uv.Y, ref mUV.Y); }
private void MK(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; }
@@ -2146,9 +2142,9 @@ namespace KKdMainLib
{
Data.ObjectHRC[i0] = new ObjectHRC
{
Name = temp[i0].RS ( "Name"),
Shadow = temp[i0].RnI32( "Shadow"),
UIDName = temp[i0].RS ("UIDName"),
Name = temp[i0].RS ( "Name"),
Shadow = temp[i0].RnB( "Shadow"),
UIDName = temp[i0].RS ("UIDName"),
};
if ((temp1 = temp[i0]["JointOrient"]).NotNull)
@@ -2546,7 +2542,7 @@ namespace KKdMainLib
public static Vec4<Key> RRGBAK(this MsgPack msgPack) =>
new Vec4<Key> { X = msgPack.RK("R"), Y = msgPack.RK("G"),
Z = msgPack.RK("B"), W = msgPack.RK("A") };
Z = msgPack.RK("B"), W = msgPack.RK("A") };
public static Vec3<Key> RV3(this MsgPack msgPack, string name) =>
msgPack[name].RV3();
@@ -2570,13 +2566,24 @@ namespace KKdMainLib
{
if (msgPack.Object == null) return default;
Key key = new Key { Max = msgPack.RnF32("Max"), Value = msgPack.RF32("Value") };
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)) { key.Value = 0; return key; }
key.Type = KeyType;
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.Lerp) return key;
else if (key.Type < KeyType.Linear) return key;
if (msgPack.RB("RawData")) key.RawData = new Key.RawD() { KeyType = -1, ValueType = "float" };
MsgPack trans;
@@ -2627,11 +2634,14 @@ namespace KKdMainLib
return msgPack;
}
public static MsgPack Add(this MsgPack msgPack, string name, ref Vec3<Key> key) =>
msgPack.Add(new MsgPack(name).Add("X", ref key.X).Add("Y", ref key.Y).Add("Z", ref key.Z));
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 Vec2<Key?> uv)
{
{
if (!uv.X.HasValue && !uv.Y.HasValue) return msgPack;
MsgPack m = new MsgPack(name);
if (uv.X.HasValue) m = m.Add("U", ref uv.X);
@@ -2652,7 +2662,7 @@ namespace KKdMainLib
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.Null)
if (key.Keys != null && key.Type > KeyType.Static)
{
keys.Add("Max", key.Max);
if ((int)key.EPTypePost > 0)
@@ -2677,7 +2687,7 @@ namespace KKdMainLib
}
keys.Add(Trans);
}
else if (key.Value != 0) keys.Add("Value", key.Value);
else if (key.Type != KeyType.None) keys.Add("Value", key.Value);
msgPack.Add(keys);
return msgPack;
}
+77 -77
View File
@@ -1,6 +1,5 @@
//Original: https://github.com/blueskythlikesclouds/MikuMikuLibrary/
using System.Collections.Generic;
using KKdBaseLib;
using KKdMainLib.IO;
@@ -9,39 +8,39 @@ namespace KKdMainLib.DB
public class Aet : System.IDisposable
{
private int i, i0, i1, i2;
private Stream _IO;
private Stream s;
public AetSet[] AetSets;
public void BINReader(string file)
{
_IO = File.OpenReader(file + ".bin");
s = File.OpenReader(file + ".bin");
int aetSetsLength = _IO.RI32();
int aetSetsOffset = _IO.RI32();
int aetsLength = _IO.RI32();
int aetsOffset = _IO.RI32();
int aetSetsLength = s.RI32();
int aetSetsOffset = s.RI32();
int aetsLength = s.RI32();
int aetsOffset = s.RI32();
_IO.P = aetSetsOffset;
s.P = aetSetsOffset;
AetSets = new AetSet[aetSetsLength];
for (i = 0; i < aetSetsLength; i++)
{
AetSets[i].Id = _IO.RI32();
AetSets[i].Name = _IO.RSaO();
AetSets[i].FileName = _IO.RSaO();
_IO.RI32();
AetSets[i].SpriteSetId = _IO.RI32();
AetSets[i].Id = s.RI32();
AetSets[i].Name = s.RSaO();
AetSets[i].FileName = s.RSaO();
s.RI32();
AetSets[i].SpriteSetId = s.RI32();
}
int setIndex;
AET aet = new AET();
int[] AetCount = new int[aetSetsLength];
_IO.P = aetsOffset;
s.P = aetsOffset;
for (i = 0; i < aetsLength; i++)
{
_IO.PI64 += 10;
setIndex = _IO.RI16();
s.PI64 += 10;
setIndex = s.RI16();
AetCount[setIndex]++;
}
@@ -51,18 +50,18 @@ namespace KKdMainLib.DB
AetCount[i] = 0;
}
_IO.P = aetsOffset;
s.P = aetsOffset;
for (i = 0; i < aetsLength; i++)
{
aet.Id = _IO.RI32();
aet.Name = _IO.RSaO();
_IO.RI16();
setIndex = _IO.RI16();
aet.Id = s.RI32();
aet.Name = s.RSaO();
s.RI16();
setIndex = s.RI16();
AetSets[setIndex].Aets[AetCount[setIndex]] = aet; AetCount[setIndex]++;
}
_IO.C();
s.C();
}
@@ -71,13 +70,13 @@ namespace KKdMainLib.DB
if (AetSets == null) return;
if (AetSets.Length == 0) return;
List<string> SetName = new List<string>();
List<string> SetFileName = new List<string>();
KKdList<string> setName = KKdList<string>.New;
KKdList<string> setFileName = KKdList<string>.New;
List<int> Ids = new List<int>();
List<int> SetIds = new List<int>();
KKdList<int> ids = KKdList<int>.New;
KKdList<int> setIds = KKdList<int>.New;
List<int> NotAdd = new List<int>();
KKdList<int> notAdd = KKdList<int>.New;
AET temp;
AetSet set;
@@ -85,11 +84,11 @@ namespace KKdMainLib.DB
{
set = AetSets[i];
if (set. Name != null)
if (SetName .Contains(set. Name)) { NotAdd.Add(i); continue; }
else SetName .Add (set. Name);
if (setName .Contains(set. Name)) { notAdd.Add(i); continue; }
else setName .Add (set. Name);
if (set.FileName != null)
if (SetFileName.Contains(set.FileName)) { NotAdd.Add(i); continue; }
else SetFileName.Add (set.FileName);
if (setFileName.Contains(set.FileName)) { notAdd.Add(i); continue; }
else setFileName.Add (set.FileName);
if (set.NewId)
{
@@ -99,93 +98,94 @@ namespace KKdMainLib.DB
}
if (set.Id != null)
if (SetIds.Contains((int)set.Id)) { NotAdd.Add(i); continue; }
else SetIds.Add ((int)set.Id);
if (setIds.Contains((int)set.Id)) { notAdd.Add(i); continue; }
else setIds.Add ((int)set.Id);
for (i0 = 0; i0 < set.Aets.Length; i0++)
{
temp = set.Aets[i0];
if (temp.Id != null)
if ( Ids.Contains((int)temp.Id)) { NotAdd.Add(i); break; }
else Ids.Add ((int)temp.Id);
if ( ids.Contains((int)temp.Id)) { notAdd.Add(i); break; }
else ids.Add ((int)temp.Id);
}
}
SetName = null;
SetFileName = null;
setName .Dispose();
setFileName.Dispose();
for (i = 0; i < AetSets.Length; i++)
{
set = AetSets[i];
if (NotAdd.Contains(i)) continue;
if (notAdd.Contains(i)) continue;
if (!set.NewId) continue;
i1 = 0;
if (set.Id == null) while (true)
{ if (!SetIds.Contains(i1)) { AetSets[i].Id = i1; SetIds.Add(i1); break; } i1++; }
{ if (!setIds.Contains(i1)) { AetSets[i].Id = i1; setIds.Add(i1); break; } i1++; }
for (i0 = 0, i1 = 0; i0 < set.Aets.Length; i0++)
if (set.Aets[i0].Id == null) while (true) { if (!Ids.Contains(i1))
{ AetSets[i].Aets[i0].Id = i1; Ids.Add(i1); break; } i1++; }
if (set.Aets[i0].Id == null) while (true) { if (!ids.Contains(i1))
{ AetSets[i].Aets[i0].Id = i1; ids.Add(i1); break; } i1++; }
}
Ids = null;
SetIds = null;
ids.Dispose();
setIds.Dispose();
for (i = 0, i0 = 0, i2 = 0; i < AetSets.Length; i++)
if (!NotAdd.Contains(i)) { i0 += AetSets[i].Aets.Length; i2++; }
if (!notAdd.Contains(i)) { i0 += AetSets[i].Aets.Length; i2++; }
i1 = i0 * 12;
i1 = i1.A(0x20) + 0x20;
_IO = File.OpenWriter(file + ".bin", true);
_IO.W(i2);
_IO.W(i1);
_IO.W(i0);
_IO.W(0x20);
_IO.W(0x9066906690669066);
_IO.W(0x9066906690669066);
s = File.OpenWriter(file + ".bin", true);
s.W(i2);
s.W(i1);
s.W(i0);
s.W(0x20);
s.W(0x9066906690669066);
s.W(0x9066906690669066);
_IO.P = (i1 + i2 * 0x14).A(0x20);
s.P = (i1 + i2 * 0x14).A(0x20);
for (i = 0; i < AetSets.Length; i++)
{
if (NotAdd.Contains(i)) continue;
AetSets[i]. NameOffset = _IO.P; _IO.W(AetSets[i]. Name + "\0");
AetSets[i].FileNameOffset = _IO.P; _IO.W(AetSets[i].FileName + "\0");
if (notAdd.Contains(i)) continue;
AetSets[i]. NameOffset = s.P; s.W(AetSets[i]. Name + "\0");
AetSets[i].FileNameOffset = s.P; s.W(AetSets[i].FileName + "\0");
}
for (i = 0; i < AetSets.Length; i++)
{
if (NotAdd.Contains(i)) continue;
if (notAdd.Contains(i)) continue;
for (i0 = 0; i0 < AetSets[i].Aets.Length; i0++)
{ AetSets[i].Aets[i0].NameOffset = _IO.P; _IO.W(AetSets[i].Aets[i0].Name + "\0"); }
{ AetSets[i].Aets[i0].NameOffset = s.P; s.W(AetSets[i].Aets[i0].Name + "\0"); }
}
_IO.A(0x08, true);
s.A(0x08, true);
_IO.P = 0x20;
s.P = 0x20;
for (i = 0, i2 = 0; i < AetSets.Length; i++)
{
if (NotAdd.Contains(i)) { i2++; continue; }
if (notAdd.Contains(i)) { i2++; continue; }
for (i0 = 0; i0 < AetSets[i].Aets.Length; i0++)
{
_IO.W(AetSets[i].Aets[i0].Id );
_IO.W(AetSets[i].Aets[i0].NameOffset);
_IO.W((ushort) i0 );
_IO.W((ushort)(i - i2));
s.W(AetSets[i].Aets[i0].Id );
s.W(AetSets[i].Aets[i0].NameOffset);
s.W((ushort) i0 );
s.W((ushort)(i - i2));
}
}
_IO.A(0x20);
s.A(0x20);
for (i = 0, i2 = 0; i < AetSets.Length; i++)
{
if (NotAdd.Contains(i)) { i2++; continue; }
if (notAdd.Contains(i)) { i2++; continue; }
_IO.W(AetSets[i].Id );
_IO.W(AetSets[i]. NameOffset);
_IO.W(AetSets[i].FileNameOffset);
_IO.W(i - i2);
_IO.W(AetSets[i].SpriteSetId );
s.W(AetSets[i].Id );
s.W(AetSets[i]. NameOffset);
s.W(AetSets[i].FileNameOffset);
s.W(i - i2);
s.W(AetSets[i].SpriteSetId );
}
_IO.C();
notAdd.Dispose();
s.C();
}
public void MsgPackReader(string file, bool json)
@@ -218,7 +218,7 @@ namespace KKdMainLib.DB
private bool disposed = false;
public void Dispose()
{ if (!disposed) { if (_IO != null) _IO.D(); _IO = null; AetSets = null; disposed = true; } }
{ if (!disposed) { if (s != null) s.D(); s = null; AetSets = null; disposed = true; } }
public struct AET
{
@@ -246,10 +246,10 @@ namespace KKdMainLib.DB
public void ReadMsgPack(MsgPack msg)
{
FileName = msg.RS ("FileName" );
FileName = msg.RS ("FileName" );
Id = msg.RnU16( "Id");
Name = msg.RS ( "Name" );
NewId = msg.RB("NewId" );
Name = msg.RS ( "Name" );
NewId = msg.RB ("NewId" );
SpriteSetId = msg.RnU16("SpriteSetId");
MsgPack Temp;
+20 -20
View File
@@ -8,7 +8,7 @@ namespace KKdMainLib.DB
public class Auth : IDisposable
{
private int i;
private Stream _IO;
private Stream s;
public string[] Category;
public UID[] UIDs;
@@ -17,16 +17,16 @@ namespace KKdMainLib.DB
{
A3DADict dict = new A3DADict();
_IO = File.OpenReader(file + ".bin");
s = File.OpenReader(file + ".bin");
_IO.Format = Format.F;
int signature = _IO.RI32();
s.Format = Format.F;
int signature = s.RI32();
if (signature != 0x44334123) return;
signature = _IO.RI32();
signature = s.RI32();
if (signature != 0x5F5F5F41) return;
_IO.RI64();
s.RI64();
string[] strData = _IO.RS(_IO.L - _IO.P).Replace("\r\n", "\n").Replace("\r", "\n").Split('\n');
string[] strData = s.RS(s.L - s.P).Replace("\r\n", "\n").Replace("\r", "\n").Split('\n');
for (i = 0; i < strData.Length; i++)
dict.GD(strData[i]);
strData = null;
@@ -51,25 +51,25 @@ namespace KKdMainLib.DB
}
}
_IO.C();
s.C();
dict.Clear();
dict = null;
}
public void BINWriter(string file)
{
_IO = File.OpenWriter(file + ".bin", true);
s = File.OpenWriter(file + ".bin", true);
_IO.W("#A3DA__________\n");
_IO.W("#" + DateTime.UtcNow.ToString("ddd MMM dd HH:mm:ss yyyy",
s.W("#A3DA__________\n");
s.W("#" + DateTime.UtcNow.ToString("ddd MMM dd HH:mm:ss yyyy",
System.Globalization.CultureInfo.InvariantCulture) + "\n");
if (Category != null)
{
int[] so = Category.Length.SW();
for (i = 0; i < Category.Length; i++)
_IO.W($"category.{so[i]}.value={ Category[so[i]]}\n");
_IO.W($"category.length={Category.Length}\n");
s.W($"category.{so[i]}.value={ Category[so[i]]}\n");
s.W($"category.length={Category.Length}\n");
}
if (UIDs != null)
@@ -78,18 +78,18 @@ namespace KKdMainLib.DB
for (i = 0; i < UIDs.Length; i++)
{
if (UIDs[so[i]].Category != null && UIDs[so[i]].Category != "")
_IO.W($"uid.{so[i]}.category=" + UIDs[so[i]].Category + "\n");
s.W($"uid.{so[i]}.category=" + UIDs[so[i]].Category + "\n");
if (UIDs[so[i]].OrgUid != null)
_IO.W($"uid.{so[i]}.org_uid=" + UIDs[so[i]].OrgUid + "\n");
s.W($"uid.{so[i]}.org_uid=" + UIDs[so[i]].OrgUid + "\n");
if (UIDs[so[i]].Size != null)
_IO.W($"uid.{so[i]}.size=" + UIDs[so[i]].Size + "\n");
s.W($"uid.{so[i]}.size=" + UIDs[so[i]].Size + "\n");
if (UIDs[so[i]].Value != null && UIDs[so[i]].Value != "")
_IO.W($"uid.{so[i]}.value=" + UIDs[so[i]].Value + "\n");
s.W($"uid.{so[i]}.value=" + UIDs[so[i]].Value + "\n");
}
_IO.W($"uid.length={UIDs.Length}\n");
s.W($"uid.length={UIDs.Length}\n");
}
_IO.C();
s.C();
}
public void MsgPackReader(string file, bool json)
@@ -151,7 +151,7 @@ namespace KKdMainLib.DB
private bool disposed = false;
public void Dispose()
{ if (!disposed) { if (_IO != null) _IO.D(); _IO = null; Category = null; UIDs = null; disposed = true; } }
{ if (!disposed) { if (s != null) s.D(); s = null; Category = null; UIDs = null; disposed = true; } }
public struct UID
{
+62 -65
View File
@@ -1,6 +1,5 @@
//Original: https://github.com/blueskythlikesclouds/MikuMikuLibrary/
using System.Collections.Generic;
using KKdBaseLib;
using KKdMainLib.IO;
@@ -9,27 +8,27 @@ namespace KKdMainLib.DB
public class Spr : System.IDisposable
{
private int i, i0, i1, i2;
private Stream _IO;
private Stream s;
public SpriteSet[] SpriteSets;
public void BINReader(string file)
{
_IO = File.OpenReader(file + ".bin");
s = File.OpenReader(file + ".bin");
int spriteSetsLength = _IO.RI32();
int spriteSetsOffset = _IO.RI32();
int spritesLength = _IO.RI32();
int spritesOffset = _IO.RI32();
int spriteSetsLength = s.RI32();
int spriteSetsOffset = s.RI32();
int spritesLength = s.RI32();
int spritesOffset = s.RI32();
_IO.P = spriteSetsOffset;
s.P = spriteSetsOffset;
SpriteSets = new SpriteSet[spriteSetsLength];
for (i = 0; i < spriteSetsLength; i++)
{
SpriteSets[i].Id = _IO.RI32();
SpriteSets[i].Name = _IO.RSaO();
SpriteSets[i].FileName = _IO.RSaO();
_IO.RI32();
SpriteSets[i].Id = s.RI32();
SpriteSets[i].Name = s.RSaO();
SpriteSets[i].FileName = s.RSaO();
s.RI32();
}
int setIndex;
@@ -38,11 +37,11 @@ namespace KKdMainLib.DB
int[] sprCount = new int[spriteSetsLength];
int[] texCount = new int[spriteSetsLength];
_IO.P = spritesOffset;
s.P = spritesOffset;
for (i = 0; i < spritesLength; i++)
{
_IO.PI64 += 10;
setIndex = _IO.RI16();
s.PI64 += 10;
setIndex = s.RI16();
isTexture = (setIndex & 0x1000) == 0x1000;
setIndex &= 0xFFF;
@@ -59,13 +58,13 @@ namespace KKdMainLib.DB
texCount[i] = 0;
}
_IO.P = spritesOffset;
s.P = spritesOffset;
for (i = 0; i < spritesLength; i++)
{
st.Id = _IO.RI32();
st.Name = _IO.RSaO();
_IO.RI16();
setIndex = _IO.RI16();
st.Id = s.RI32();
st.Name = s.RSaO();
s.RI16();
setIndex = s.RI16();
isTexture = (setIndex & 0x1000) == 0x1000;
setIndex &= 0xFFF;
@@ -73,7 +72,7 @@ namespace KKdMainLib.DB
else { SpriteSets[setIndex]. Sprites[sprCount[setIndex]] = st; sprCount[setIndex]++; }
}
_IO.C();
s.C();
}
public void BINWriter(string file)
@@ -81,13 +80,13 @@ namespace KKdMainLib.DB
if (SpriteSets == null) return;
if (SpriteSets.Length == 0) return;
List<string> setName = new List<string>();
List<string> setFileName = new List<string>();
KKdList<string> setName = KKdList<string>.New;
KKdList<string> setFileName = KKdList<string>.New;
List<int> ids = new List<int>();
List<int> setIds = new List<int>();
KKdList<int> ids = KKdList<int>.New;
KKdList<int> setIds = KKdList<int>.New;
List<int> notAdd = new List<int>();
KKdList<int> notAdd = KKdList<int>.New;
SpriteTexture temp;
SpriteSet set;
@@ -130,8 +129,8 @@ namespace KKdMainLib.DB
else ids.Add ((int)temp.Id);
}
}
setName = null;
setFileName = null;
setName .Dispose();
setFileName.Dispose();
for (i = 0; i < SpriteSets.Length; i++)
{
@@ -151,11 +150,8 @@ namespace KKdMainLib.DB
while (set. Sprites[i0].Id == null)
if (!ids.Contains(i1)) ids.Add((int)(SpriteSets[i]. Sprites[i0].Id = i1)); else i1++;
}
ids = null;
setIds = null;
ids.Dispose();
setIds.Dispose();
for (i = 0, i0 = 0, i2 = 0; i < SpriteSets.Length; i++)
if (!notAdd.Contains(i)) { i0 += SpriteSets[i].Sprites.Length + SpriteSets[i].Textures.Length; i2++; }
@@ -163,68 +159,69 @@ namespace KKdMainLib.DB
i1 = i0 * 12;
i1 = i1.A(0x20) + 0x20;
_IO = File.OpenWriter(file + ".bin", true);
_IO.W(i2);
_IO.W(i1);
_IO.W(i0);
_IO.W(0x20);
_IO.W(0x9066906690669066);
_IO.W(0x9066906690669066);
s = File.OpenWriter(file + ".bin", true);
s.W(i2);
s.W(i1);
s.W(i0);
s.W(0x20);
s.W(0x9066906690669066);
s.W(0x9066906690669066);
_IO.P = (i1 + i2 * 0x10).A(0x20);
s.P = (i1 + i2 * 0x10).A(0x20);
for (i = 0; i < SpriteSets.Length; i++)
{
if (notAdd.Contains(i)) continue;
for (i0 = 0; i0 < SpriteSets[i].Textures.Length; i0++)
{ SpriteSets[i].Textures[i0].NameOffset = _IO.P;
_IO.W(SpriteSets[i].Textures[i0].Name + "\0"); }
{ SpriteSets[i].Textures[i0].NameOffset = s.P;
s.W(SpriteSets[i].Textures[i0].Name + "\0"); }
for (i0 = 0; i0 < SpriteSets[i]. Sprites.Length; i0++)
{ SpriteSets[i]. Sprites[i0].NameOffset = _IO.P;
_IO.W(SpriteSets[i]. Sprites[i0].Name + "\0"); }
{ SpriteSets[i]. Sprites[i0].NameOffset = s.P;
s.W(SpriteSets[i]. Sprites[i0].Name + "\0"); }
}
for (i = 0; i < SpriteSets.Length; i++)
{
if (notAdd.Contains(i)) continue;
SpriteSets[i]. NameOffset = _IO.P; _IO.W(SpriteSets[i]. Name + "\0");
SpriteSets[i].FileNameOffset = _IO.P; _IO.W(SpriteSets[i].FileName + "\0");
SpriteSets[i]. NameOffset = s.P; s.W(SpriteSets[i]. Name + "\0");
SpriteSets[i].FileNameOffset = s.P; s.W(SpriteSets[i].FileName + "\0");
}
s.A(0x08, true);
_IO.A(0x08, true);
_IO.P = 0x20;
s.P = 0x20;
for (i = 0, i2 = 0; i < SpriteSets.Length; i++)
{
if (notAdd.Contains(i)) { i2++; continue; }
for (i0 = 0; i0 < SpriteSets[i].Textures.Length; i0++)
{
_IO.W(SpriteSets[i].Textures[i0].Id );
_IO.W(SpriteSets[i].Textures[i0].NameOffset);
_IO.W((ushort) i0 );
_IO.W((ushort)(0x1000 | (i - i2)));
s.W(SpriteSets[i].Textures[i0].Id );
s.W(SpriteSets[i].Textures[i0].NameOffset);
s.W((ushort) i0 );
s.W((ushort)(0x1000 | (i - i2)));
}
for (i0 = 0; i0 < SpriteSets[i]. Sprites.Length; i0++)
{
_IO.W(SpriteSets[i]. Sprites[i0].Id );
_IO.W(SpriteSets[i]. Sprites[i0].NameOffset);
_IO.W((ushort) i0 );
_IO.W((ushort)(i - i2));
s.W(SpriteSets[i]. Sprites[i0].Id );
s.W(SpriteSets[i]. Sprites[i0].NameOffset);
s.W((ushort) i0 );
s.W((ushort)(i - i2));
}
}
_IO.A(0x20);
s.A(0x20);
for (i = 0, i2 = 0; i < SpriteSets.Length; i++)
{
if (notAdd.Contains(i)) { i2++; continue; }
_IO.W(SpriteSets[i].Id );
_IO.W(SpriteSets[i]. NameOffset);
_IO.W(SpriteSets[i].FileNameOffset);
_IO.W(i - i2);
s.W(SpriteSets[i].Id );
s.W(SpriteSets[i]. NameOffset);
s.W(SpriteSets[i].FileNameOffset);
s.W(i - i2);
}
_IO.C();
notAdd.Dispose();
s.C();
}
public void MsgPackReader(string file, bool json = false)
@@ -256,7 +253,7 @@ namespace KKdMainLib.DB
private bool disposed = false;
public void Dispose()
{ if (!disposed) { if (_IO != null) _IO.D(); _IO = null; SpriteSets = null; disposed = true; } }
{ if (!disposed) { if (s != null) s.D(); s = null; SpriteSets = null; disposed = true; } }
public struct SpriteTexture
{
+2 -2
View File
@@ -68,7 +68,7 @@ namespace KKdMainLib
}
else s.W("%2A%2A%2A");
}
return s.ToArray(true);
}
@@ -231,7 +231,7 @@ namespace KKdMainLib
NameExtra = msg.RS ( "NameExtra");
Score = msg.RI32("Score");
ScoreExtra = msg.RI32("ScoreExtra");
if (Name == null)
{
Name = msg.RS ( "Name0");
+5 -11
View File
@@ -24,12 +24,6 @@ namespace KKdMainLib.F2
if (BLTs.C < 1) { s.C(); BLTs.C = -1; return; }
if (BLTs.C > 0 && BLTs.O == 0) { s.C(); BLTs.C = -1; return; }
/*{
_IO.Format = Header.Format = Format.X;
_IO.Offset = Header.Length;
_IO.Position = BLTs.Offset;
BLTs = _IO.ReadCountPointerX<BLT>();
}*/
s.P = BLTs.O;
for (i = 0; i < BLTs.C; i++)
@@ -54,8 +48,8 @@ namespace KKdMainLib.F2
s = File.OpenWriter();
s.WPSSJIS("ID,ColorR,ColorG,ColorB,BrightpassR,BrightpassG,BrightpassB,Range\n");
for (i = 0; i < BLTs.C; i++)
s.W(i + "," + BLTs[i] + "\n");
File.WriteAllBytes(file + "_bloom.txt", s.ToArray(true));
s.W($"{i},{ BLTs[i]}\n");
File.WriteAllBytes($"{file}_bloom.txt", s.ToArray(true));
}
private bool disposed;
@@ -68,9 +62,9 @@ namespace KKdMainLib.F2
public Vec3 Brightpass;
public float Range;
public override string ToString() => Color .ToString(6) + "," +
Brightpass.ToString(6) + "," +
Range .ToS(6);
public override string ToString() =>
$"{Color.X.ToS(6)},{Color.Y.ToS(6)},{Color.Z.ToS(6)},{Brightpass.X.ToS(6)}" +
$",{Brightpass.Y.ToS(6)},{Brightpass.Z.ToS(6)},{Range.ToS(6)}";
}
}
}
+5 -14
View File
@@ -24,12 +24,6 @@ namespace KKdMainLib.F2
if (CCTs.C < 1) { s.C(); CCTs.C = -1; return; }
if (CCTs.C > 0 && CCTs.O == 0) { s.C(); CCTs.C = -1; return; }
/*{
_IO.Format = Header.Format = Format.X;
_IO.Offset = Header.Length;
_IO.Position = CCTs.Offset;
CCTs = _IO.ReadCountPointerX<CCT>();
}*/
s.P = CCTs.O;
for (i = 0; i < CCTs.C; i++)
@@ -56,8 +50,8 @@ namespace KKdMainLib.F2
s = File.OpenWriter();
s.WPSSJIS("ID,Hue,Saturation,Lightness,Exposure,GammaR,GammaG,GammaB,Contrast\n");
for (i = 0; i < CCTs.C; i++)
s.W(i + "," + CCTs[i] + "\n");
File.WriteAllBytes(file + "_cc.txt", s.ToArray(true));
s.W($"{i},{CCTs[i]}\n");
File.WriteAllBytes($"{file}_cc.txt", s.ToArray(true));
}
private bool disposed;
@@ -73,12 +67,9 @@ namespace KKdMainLib.F2
public Vec3 Gamma;
public float Contrast;
public override string ToString() => Hue .ToS(6) + "," +
Saturation.ToS(6) + "," +
Lightness .ToS(6) + "," +
Exposure .ToS(6) + "," +
Gamma .ToString(6) + "," +
Contrast .ToS(6);
public override string ToString() =>
$"{Hue.ToS(6)},{Saturation.ToS(6)},{Lightness.ToS(6)},{Exposure.ToS(6)}" +
$",{Gamma.X.ToS(6)},{Gamma.Y.ToS(6)},{Gamma.Z.ToS(6)},{Contrast.ToS(6)}";
}
}
}
+4 -14
View File
@@ -24,12 +24,6 @@ namespace KKdMainLib.F2
if (DFTs.C < 1) { s.C(); DFTs.C = -1; return; }
if (DFTs.C > 0 && DFTs.O == 0) { s.C(); DFTs.C = -1; return; }
/*{
_IO.Format = Header.Format = Format.X;
_IO.Offset = Header.Length;
_IO.Position = DFTs.Offset;
DFTs = _IO.ReadCountPointerX<DFT>();
}*/
s.P = DFTs.O;
for (i = 0; i < DFTs.C; i++)
@@ -41,7 +35,6 @@ namespace KKdMainLib.F2
DFT.FuzzingRange = s.RF32E();
DFT.Ratio = s.RF32E();
DFT.Quality = s.RF32E();
if (s.IsX) s.RI32();
}
s.C();
@@ -54,8 +47,8 @@ namespace KKdMainLib.F2
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));
s.W($"{i},{DFTs[i]}\n");
File.WriteAllBytes($"{file}_dof.txt", s.ToArray(true));
}
private bool disposed;
@@ -70,11 +63,8 @@ namespace KKdMainLib.F2
public float Ratio;
public float Quality;
public override string ToString() => Focus .ToS(6) + "," +
FocusRange.ToS(6) + "," +
FuzzingRange.ToS(6) + "," +
Ratio .ToS(6) + "," +
Quality .ToS(6);
public override string ToString() =>
$"{Focus.ToS(6)},{FocusRange.ToS(6)},{FuzzingRange.ToS(6)},{Ratio.ToS(6)},{Quality.ToS(6)}";
}
}
}
+13 -18
View File
@@ -28,13 +28,6 @@ namespace KKdMainLib.F2
{
LITs[i] = s.RCPX<LIT>();
if ((LITs[i].C > 0 || LITs[i].O == 0) && !s.IsX) { s.C(); LITs.C = -1; return; }
/*{
_IO.Format = Header.Format = Format.X;
_IO.Offset = Header.Length;
_IO.Position = LITs.Offset;
LITs[i] = _IO.ReadCountPointerX<LIT>();
}
if (_IO.IsX) IO.ReadInt64();*/
}
for (i = 0; i < LITs.C; i++)
@@ -46,7 +39,6 @@ namespace KKdMainLib.F2
lit.Id = (Id )s.RI32E();
lit.Flags = (Flags)s.RI32E();
lit.Type = (Type )s.RI32E();
if (s.IsX) { s.RI64(); s.RI64(); s.RI64(); }
lit.Ambient .X = s.RF32E();
lit.Ambient .Y = s.RF32E();
lit.Ambient .Z = s.RF32E();
@@ -65,8 +57,6 @@ namespace KKdMainLib.F2
lit.ToneCurve.X = s.RF32E();
lit.ToneCurve.Y = s.RF32E();
lit.ToneCurve.Z = s.RF32E();
if (s.IsX) { s.RI64(); s.RI64(); s.RI64();
s.RI64(); s.RI64(); s.RI32(); }
}
}
s.C();
@@ -82,8 +72,8 @@ namespace KKdMainLib.F2
"SpecularB,SpecularA,PosX,PosY,PosZ,ToneCurveBegin,ToneCurveEnd,ToneCurveBlendRate," +
(file.EndsWith("_chara") ? "コメント" : "ID") + "\n");
for (i0 = 0; i0 < LITs[i].C; i0++)
s.W(LITs[i][i0] + "," + i + "\n");
File.WriteAllBytes(file + "_light.txt", s.ToArray(true));
s.W($"{LITs[i][i0]},{i}\n");
File.WriteAllBytes($"{file}_light.txt", s.ToArray(true));
}
public struct LIT
@@ -97,12 +87,17 @@ namespace KKdMainLib.F2
public Vec3 Position;
public Vec3 ToneCurve;
public override string ToString() => Flags == 0 ? ",,,,,,,,,,,,,,,," : Type + "," +
((Flags & Flags.Ambient ) == 0 ? ",,," : Ambient .ToString(6) + ",") +
((Flags & Flags.Diffuse ) == 0 ? ",,," : Diffuse .ToString(6) + ",") +
((Flags & Flags.Specular ) == 0 ? ",,,," : Specular .ToString(6) + ",") +
((Flags & Flags.Position ) == 0 ? ",,," : Position .ToString(6) + ",") +
((Flags & Flags.ToneCurve) == 0 ? ",,," : ToneCurve.ToString(6));
public override string ToString() => Flags == 0 ? ",,,,,,,,,,,,,,,," : $"{Type}," +
((Flags & Flags.Ambient ) != 0
? $"{Ambient .X.ToS(6)},{Ambient .Y.ToS(6)},{Ambient .Z.ToS(6)}," : ",,,") +
((Flags & Flags.Diffuse ) != 0
? $"{Diffuse .X.ToS(6)},{Diffuse .Y.ToS(6)},{Diffuse .Z.ToS(6)}," : ",,,") +
((Flags & Flags.Specular ) != 0
? $"{Specular .X.ToS(6)},{Specular .Y.ToS(6)},{Specular .Z.ToS(6)},{Specular .W.ToS(6)}," : ",,,,") +
((Flags & Flags.Position ) != 0
? $"{Position .X.ToS(6)},{Position .Y.ToS(6)},{Position .Z.ToS(6)}," : ",,,") +
((Flags & Flags.ToneCurve) != 0
? $"{ToneCurve.X.ToS(6)},{ToneCurve.Y.ToS(6)},{ToneCurve.Z.ToS(6)}" : ",,");
}
private bool disposed;
+1 -1
View File
@@ -8,7 +8,7 @@ namespace KKdMainLib.IO
private const string libDeflateString = "libdeflate.dll";
public static void CheckLib()
public static void CheckLib()
{
if (!File.Exists(libDeflateString))
File.WriteAllBytes(libDeflateString, Properties.Resources.libdeflate);
+2 -2
View File
@@ -6,12 +6,12 @@
<Configuration></Configuration>
<Copyright>korenkonder (C) 2018-2020</Copyright>
<Description>A simple library for working with Project Diva AC/DT/F/AFT/F2/X/FT/M39 files</Description>
<FileVersion>0.4.9.6</FileVersion>
<FileVersion>0.4.9.8</FileVersion>
<PackageId>KKdMainLib</PackageId>
<Product>KKdMainLib</Product>
<TargetFramework>net461</TargetFramework>
<Title>KKdMainLib</Title>
<Version>0.4.9.6</Version>
<Version>0.4.9.8</Version>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
+75 -51
View File
@@ -11,6 +11,8 @@ namespace KKdMainLib
public MotHeader[] MOT;
private Stream s;
[System.ThreadStatic] public bool Modern;
public void MOTReader(string file)
{
s = File.OpenReader(file + ".bin");
@@ -40,12 +42,12 @@ namespace KKdMainLib
i0 = 1;
s.P = mot.BoneInfo.O;
s.RU16();
while (s.RU16() != 0) i0++;
while (s.P < s.L && s.RU16() != 0) i0++;
mot.BoneInfo.V = new BoneInfo[i0];
mot.BoneInfo.V = new int[i0];
s.P = mot.BoneInfo.O;
for (i0 = 0; i0 < mot.BoneInfo.V.Length; i0++)
mot.BoneInfo.V[i0].Id = s.RU16();
mot.BoneInfo.V[i0] = s.RU16();
s.P = mot.KeySet.O;
int info = s.RU16();
@@ -67,7 +69,7 @@ namespace KKdMainLib
if (key.Type == KeySetType.Static)
{ key.Keys = new KFT2[1];
key.Keys[0].V = s.RF32(); }
else if (key.Type == KeySetType.Linear)
else if (key.Type == KeySetType.Linear && !Modern)
{
key.Keys = new KFT2[s.RU16()];
for (i1 = 0; i1 < key.Keys.Length; i1++)
@@ -76,7 +78,7 @@ namespace KKdMainLib
for (i1 = 0; i1 < key.Keys.Length; i1++)
key.Keys[i1].V = s.RF32();
}
else if (key.Type == KeySetType.Interpolated)
else if (key.Type == KeySetType.Tangent && !Modern)
{
key.Keys = new KFT2[s.RU16()];
for (i1 = 0; i1 < key.Keys.Length; i1++)
@@ -85,6 +87,27 @@ namespace KKdMainLib
for (i1 = 0; i1 < key.Keys.Length; i1++)
{ key.Keys[i1].V = s.RF32(); key.Keys[i1].T = s.RF32(); }
}
else if (key.Type != KeySetType.None)
{
key.Keys = new KFT2[s.RU16()];
ushort type = s.RU16();
if (key.Type == KeySetType.Tangent)
for (i1 = 0; i1 < key.Keys.Length; i1++)
key.Keys[i1].T = s.RF32();
if (type == 1)
{
for (i1 = 0; i1 < key.Keys.Length; i1++)
key.Keys[i1].V = s.RF16();
s.A(0x4);
}
else
for (i1 = 0; i1 < key.Keys.Length; i1++)
key.Keys[i1].V = s.RF32();
for (i1 = 0; i1 < key.Keys.Length; i1++)
key.Keys[i1].F = s.RU16();
s.A(0x4);
}
}
}
s.C();
@@ -120,30 +143,39 @@ namespace KKdMainLib
ref KeySet key = ref mot.KeySet.V[i0];
if (key.Type == KeySetType.Static)
s.W(key.Keys[0].V);
else if (key.Type == KeySetType.Linear)
else if ((key.Type == KeySetType.Linear
|| key.Type == KeySetType.Tangent) && !Modern)
{
s.W((ushort)key.Keys.Length);
for (i1 = 0; i1 < key.Keys.Length; i1++)
s.W((ushort)key.Keys[i1].F);
if (s.P % 4 != 0) s.W((ushort)0x00);
for (i1 = 0; i1 < key.Keys.Length; i1++)
s.W(key.Keys[i1].V);
if (key.Type == KeySetType.Tangent)
for (i1 = 0; i1 < key.Keys.Length; i1++)
{ s.W(key.Keys[i1].V); s.W(key.Keys[i1].T); }
else
for (i1 = 0; i1 < key.Keys.Length; i1++)
s.W(key.Keys[i1].V);
}
else if (key.Type == KeySetType.Interpolated)
else if (key.Type != KeySetType.None)
{
s.W((ushort)key.Keys.Length);
s.W((ushort)0);
if (key.Type == KeySetType.Tangent)
for (i1 = 0; i1 < key.Keys.Length; i1++)
s.W(key.Keys[i1].T);
for (i1 = 0; i1 < key.Keys.Length; i1++)
s.W((ushort)key.Keys[i1].F);
if (s.P % 4 != 0) s.W((ushort)0x00);
s.W(key.Keys[i1].V);
for (i1 = 0; i1 < key.Keys.Length; i1++)
{ s.W(key.Keys[i1].V); s.W(key.Keys[i1].T); }
s.W((ushort)key.Keys[i1].F);
s.A(0x4);
}
}
if (s.P % 4 != 0) s.W((ushort)0x00);
mot.BoneInfo.O = s.P;
for (i0 = 0; i0 < mot.BoneInfo.V.Length; i0++)
s.W((ushort)mot.BoneInfo.V[i0].Id);
s.W((ushort)mot.BoneInfo.V[i0]);
s.W((ushort)0);
}
if (s.P % 4 != 0) s.W((ushort)0x00);
@@ -210,14 +242,9 @@ namespace KKdMainLib
else if (keySet.Type == KeySetType.Static)
{
keySet.Keys = new KFT2[1];
if (temp1.Array == null) continue;
else if (temp1.Array.Length == 0) continue;
else if (temp1.Array[0].Array == null) continue;
else if (temp1.Array[0].Array.Length == 0) continue;
else if (temp1.Array[0].Array.Length == 1)
keySet.Keys[0] = new KFT2(temp1.Array[0][0].RF32());
else if (temp1.Array[0].Array.Length > 1)
keySet.Keys[0] = new KFT2(temp1.Array[0][0].RF32(), temp1.Array[0][1].RF32());
if (temp1.Array == null) continue;
else if (temp1.Array.Length == 0) continue;
else keySet.Keys[0] = new KFT2(0.0f, temp1.Array[0].RF32());
}
else if (keySet.Type == KeySetType.Linear)
{
@@ -233,7 +260,7 @@ namespace KKdMainLib
keySet.Keys[i1] = new KFT2(array[0].RF32(), array[1].RF32());
}
}
else if (keySet.Type == KeySetType.Interpolated)
else if (keySet.Type == KeySetType.Tangent)
{
keySet.Keys = new KFT2[temp1.Array.Length];
for (i1 = 0; i1 < temp1.Array.Length; i1++)
@@ -254,9 +281,9 @@ namespace KKdMainLib
if ((temp = msgPack["BoneInfo", true]).NotNull)
{
mot.BoneInfo.V = new BoneInfo[temp.Array.Length];
mot.BoneInfo.V = new int[temp.Array.Length];
for (i = 0; i < mot.BoneInfo.V.Length; i++)
mot.BoneInfo.V[i].Id = temp[i].RI32();
mot.BoneInfo.V[i] = temp[i].RI32();
}
temp.Dispose();
}
@@ -273,41 +300,43 @@ namespace KKdMainLib
keySets[i0] = new MsgPack(2);
keySets[i0].Array[0] = (byte)keySet.Type;
keySets[i0].Array[1] = new MsgPack(keySet.Keys.Length);
if (keySet.Type == KeySetType.Static)
{
IKF kf = keySet.Keys[0].Check();
if (kf is KFT0 KFT0) keySets[i0].Array[1][0] =
new MsgPack(null, new MsgPack[] { KFT0.F });
else if (kf is KFT1 KFT1) keySets[i0].Array[1][0] =
new MsgPack(null, new MsgPack[] { KFT1.F, KFT1.V });
MsgPack k = default;
if (kf is KFT0 KFT0) k = new MsgPack(null, new MsgPack[] { 0.0f });
else if (kf is KFT1 KFT1) k = new MsgPack(null, new MsgPack[] { KFT1.V });
keySets[i0].Array[1] = k;
}
else if (keySet.Type == KeySetType.Linear)
{
MsgPack k = new MsgPack(keySet.Keys.Length);
for (i1 = 0; i1 < keySet.Keys.Length; i1++)
{
IKF kf = keySet.Keys[i1].Check();
if (kf is KFT0 KFT0) keySets[i0].Array[1][i1] =
new MsgPack(null, new MsgPack[] { KFT0.F });
else if (kf is KFT1 KFT1) keySets[i0].Array[1][i1] =
new MsgPack(null, new MsgPack[] { KFT1.F, KFT1.V });
if (kf is KFT0 KFT0) k[i1] = new MsgPack(null, new MsgPack[] { KFT0.F });
else if (kf is KFT1 KFT1) k[i1] = new MsgPack(null, new MsgPack[] { KFT1.F, KFT1.V });
}
keySets[i0].Array[1] = k;
}
else
{
MsgPack k = new MsgPack(keySet.Keys.Length);
for (i1 = 0; i1 < keySet.Keys.Length; i1++)
{
IKF kf = keySet.Keys[i1].Check();
if (kf is KFT0 KFT0) keySets[i0].Array[1][i1] =
new MsgPack(null, new MsgPack[] { KFT0.F });
else if (kf is KFT1 KFT1) keySets[i0].Array[1][i1] =
new MsgPack(null, new MsgPack[] { KFT1.F, KFT1.V });
else if (kf is KFT2 KFT2) keySets[i0].Array[1][i1] =
new MsgPack(null, new MsgPack[] { KFT2.F, KFT2.V, KFT2.T });
if (kf is KFT0 KFT0) k[i1] = new MsgPack(null, new MsgPack[] { KFT0.F });
else if (kf is KFT1 KFT1) k[i1] = new MsgPack(null, new MsgPack[] { KFT1.F, KFT1.V });
else if (kf is KFT2 KFT2) k[i1] = new MsgPack(null, new MsgPack[] { KFT2.F, KFT2.V, KFT2.T });
}
keySets[i0].Array[1] = k;
}
}
mot.Add(keySets);
MsgPack boneInfo = new MsgPack(Mot.BoneInfo.V.Length, "BoneInfo");
for (i0 = 0; i0 < Mot.BoneInfo.V.Length; i0++)
boneInfo[i0] = Mot.BoneInfo.V[i0].Id;
boneInfo[i0] = Mot.BoneInfo.V[i0];
mot.Add(boneInfo);
return mot;
@@ -323,8 +352,8 @@ namespace KKdMainLib
{
public int KeySetOffset;
public int KeySetTypesOffset;
public Pointer< KeySet []> KeySet ;
public Pointer<BoneInfo[]> BoneInfo;
public Pointer<KeySet[]> KeySet ;
public Pointer< int[]> BoneInfo;
public int HighBits;
public int FrameCount;
@@ -335,8 +364,9 @@ namespace KKdMainLib
public KFT2[] Keys;
public KeySetType Type;
public override string ToString() => $"Type: {Type}" + (Type == KeySetType.Static ?
$"; Value: {Keys[0].V}" : Type > KeySetType.Static ? $"; Keys: {Keys.Length}" : "");
public override string ToString() =>
$"Type: {Type}" + (Type == KeySetType.Static ? $"; Value: {Keys[0].V}"
: Type > KeySetType.Static ? $"; Keys: {Keys.Length}; First Key: {Keys[0]}" : "");
}
public enum KeySetType : byte
@@ -344,13 +374,7 @@ namespace KKdMainLib
None = 0b00,
Static = 0b01,
Linear = 0b10,
Interpolated = 0b11,
}
public struct BoneInfo
{
public string Name;
public int Id;
Tangent = 0b11,
}
}
}
+4 -2
View File
@@ -47,7 +47,7 @@ namespace PD_Tool
private static void MainMenu()
{
Console.Title = "PD_Tool v0.4.9.7";
Console.Title = "PD_Tool v0.4.9.8";
Console.Clear();
ConsoleDesign(true);
@@ -77,6 +77,7 @@ namespace PD_Tool
if (choose == null || choose == "") return;
if (choose[0] == 'M') json = false;
else if (choose[0] == 'J') json = true ;
else if (choose[0] >= 'A' && choose[0] <= 'A') Functions();
}
private static void Functions()
@@ -95,7 +96,8 @@ namespace PD_Tool
Choose(1, "", out string[] FileNames);
foreach (string FileName in FileNames) DIVAFILE.Encrypt(FileName);
}
else if (choose[0] == '5') DataBase.Processor(json);
else if (choose[0] == '5')
DataBase.Processor(json, choose.Length > 1 ? choose[1] : '\0');
else if (choose[0] == '6')
{
string localChoose = "";
+2 -2
View File
@@ -11,5 +11,5 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]
[assembly: Guid("7B5D5A3A-A6F8-4813-C97D-ACFC98F7397E")]
[assembly: AssemblyVersion("0.4.9.7")]
[assembly: AssemblyFileVersion("0.4.9.7")]
[assembly: AssemblyVersion("0.4.9.8")]
[assembly: AssemblyFileVersion("0.4.9.8")]
+1 -2
View File
@@ -69,7 +69,6 @@ namespace PD_Tool
else
{
a3da.Head.Format = format;
File.WriteAllBytes(filepath + ".a3da", (choose == "1" ||
choose == "3") ? a3da.A3DAWriter() : a3da.A3DCWriter());
}
@@ -156,7 +155,7 @@ namespace PD_Tool
}
a3daArray[i].Data.PlayControl.Div = null;
}
farc.Files.Capacity = 0;
farc.Files.Capacity = list.Count;
for (int i = 0; i < list.Count; i++)
+22 -18
View File
@@ -8,25 +8,29 @@ namespace PD_Tool
{
public class DataBase
{
public static void Processor(bool json)
public static void Processor(bool json, char choose)
{
Console.Title = "DB Converter";
Console.Clear();
Program.ConsoleDesign(true);
Program.ConsoleDesign(" Choose type of DataBase file:");
Program.ConsoleDesign(false);
Program.ConsoleDesign("1. Auth DB Converter");
Program.ConsoleDesign("2. AET DB Converter");
Program.ConsoleDesign("3. SPR DB Converter");
Program.ConsoleDesign(false);
Program.ConsoleDesign("R. Return to Main Menu");
Program.ConsoleDesign(false);
Program.ConsoleDesign(true);
Console.WriteLine();
string format = Console.ReadLine().ToUpper();
if (format == "1") AuthDBProcessor(json);
if (format == "2") AETDBProcessor(json);
if (format == "3") SPRDBProcessor(json);
if (choose == '\0')
{
Console.Title = "DB Converter";
Console.Clear();
Program.ConsoleDesign(true);
Program.ConsoleDesign(" Choose type of DataBase file:");
Program.ConsoleDesign(false);
Program.ConsoleDesign("1. Auth DB Converter");
Program.ConsoleDesign("2. AET DB Converter");
Program.ConsoleDesign("3. SPR DB Converter");
Program.ConsoleDesign(false);
Program.ConsoleDesign("R. Return to Main Menu");
Program.ConsoleDesign(false);
Program.ConsoleDesign(true);
Console.WriteLine();
string format = Console.ReadLine().ToUpper();
if (format.Length > 0) choose = format[0];
}
if (choose == '1') AuthDBProcessor(json);
if (choose == '2') AETDBProcessor(json);
if (choose == '3') SPRDBProcessor(json);
}
public static void AuthDBProcessor(bool JSON)
+3 -4
View File
@@ -2,8 +2,7 @@
A simple tool for working with Project Diva AC/DT/F/AFT/F2/X/FT/M39 files
# Dependencies:
+ `.NET Standard 2.0`: Required to build KKdBaseLib, KKdMainLib and KKdSoundLib C# projects.
+ `.NET Framework 4.6.1`: Required to run/build PD_Tool C# project.
+ `.NET Framework 4.6.1`: Required to build KKdBaseLib, KKdMainLib and KKdSoundLib C# projects and to run/build PD_Tool C# project.
# Tools:
- `FARC Extract/Create`
@@ -20,8 +19,8 @@ A simple tool for working with Project Diva AC/DT/F/AFT/F2/X/FT/M39 files
- `DIVA Converter`
- `MotHead Converter`
- `MOT Converter`
- `Table Converter`
- `STR Converter`
- `Table Converter`
- `F/F2/FT Converting Tools`
- `A3DA Converter`
- `Bloom Converter`
@@ -43,5 +42,5 @@ A simple tool for working with Project Diva AC/DT/F/AFT/F2/X/FT/M39 files
- `DIVA Converter`
- `MotHead Converter`
- `MOT Converter`
- `Table Converter`
- `STR Converter`
- `Table Converter`