临时提交

This commit is contained in:
DESKTOP-5RP3AKU\Jisol
2024-12-03 19:54:47 +08:00
parent e77dd9e841
commit 81c2bc83ff
145 changed files with 2922 additions and 30412 deletions
+1
View File
@@ -125,6 +125,7 @@
<None Include="Assets\Packages\TouchSocket.Http.2.0.16\lib\netstandard2.1\TouchSocket.Http.xml" /> <None Include="Assets\Packages\TouchSocket.Http.2.0.16\lib\netstandard2.1\TouchSocket.Http.xml" />
<None Include="Assets\Packages\System.Text.Encodings.Web.6.0.0\useSharedDesignerContext.txt" /> <None Include="Assets\Packages\System.Text.Encodings.Web.6.0.0\useSharedDesignerContext.txt" />
<None Include="Assets\Resources\Samples\map1.json" /> <None Include="Assets\Resources\Samples\map1.json" />
<None Include="Assets\Resources\Samples\Battle\Map\NavMesh\map1.json" />
<None Include="Assets\Packages\System.Text.Encodings.Web.6.0.0\lib\netstandard2.0\System.Text.Encodings.Web.xml" /> <None Include="Assets\Packages\System.Text.Encodings.Web.6.0.0\lib\netstandard2.0\System.Text.Encodings.Web.xml" />
<None Include="Assets\Samples\Cinemachine\2.10.1\Cinemachine Example Scenes\Scenes\FadeOutNearbyObjects\FadeOut.shader" /> <None Include="Assets\Samples\Cinemachine\2.10.1\Cinemachine Example Scenes\Scenes\FadeOutNearbyObjects\FadeOut.shader" />
<None Include="Assets\Scripts\BehaviorTreeSlayer\Examples\6 break running node\SampleIdleConfig.txt" /> <None Include="Assets\Scripts\BehaviorTreeSlayer\Examples\6 break running node\SampleIdleConfig.txt" />
@@ -0,0 +1,307 @@
/*
* @FileName: EditorCreateLUT.cs
* @Date: 2024-04-20 20:06:14
* @LastEditTime: 2024-04-22 22:15:46
* @Description: 生成三角函数速查表代码
*/
#if UNITY_EDITOR
using System;
using System.IO;
using System.Text;
using UnityEditor;
using UnityEngine;
namespace JNGame.Math
{
/// <summary>
/// 编辑模式下生成三角函数速查表代码
/// </summary>
public static class EditorCreateLUT
{
#region Unit Test
//[MenuItem("LockstepEngine/Math/TestAllLut")]
private static void TestAllLut()
{
TestSqrt(10000);
TestSqrt(65535);
TestSqrt(65536);
TestSqrt(0xffffffff);
TestSqrt(1000002L * 1000001L);
TestLutATan();
TestATan2();
TestLutASin();
TestLutACos();
TestLutSin();
TestLutCos();
}
private static void TestSqrt(ulong t)
{
var val = LMath.Sqrt(t);
UnityEngine.Debug.Log($"sqrt({t}) = {val}");
return;
}
//[MenuItem("LockstepEngine/Math/TestLutATan")]
private static void TestLutATan()
{
TestLut((i) => i, (i) => Mathf.Atan(i), (i) => LMath.Atan(i.ToLFloat()));
}
private static void TestLutASin()
{
TestLut((i) => i * 0.001f, (p) => Mathf.Asin(p), (p) => LMath.Asin(p.ToLFloat()));
}
private static void TestLutACos()
{
TestLut((i) => i * 0.001f, (p) => Mathf.Acos(p), (p) => LMath.Acos(p.ToLFloat()));
}
private static void TestLutSin()
{
TestLut((i) => i * 0.001f * Mathf.PI * 2 - Mathf.PI, (p) => Mathf.Sin(p), (p) => LMath.Sin(p.ToLFloat()));
}
private static void TestLutCos()
{
TestLut((i) => i * 0.001f * Mathf.PI * 2 - Mathf.PI, (p) => Mathf.Cos(p), (p) => LMath.Cos(p.ToLFloat()));
}
private static void TestLut(Func<int, float> funcPar, Func<float, float> rawFunc, Func<float, LFloat> lFunc)
{
StringBuilder sb = new StringBuilder();
int testSize1 = 1000;
for (int i = 1; i < testSize1; i++)
{
var par = funcPar(i);
var rawVal = rawFunc(par);
var myVal = lFunc(par).ToFloat();
var diff = rawVal - myVal;
if (diff > 0.01f)
{
sb.AppendLine($"i:{i} diff:{diff}");
}
}
UnityEngine.Debug.Log(sb.ToString());
}
//[MenuItem("LockstepEngine/Math/TestATan2")]
private static void TestATan2()
{
StringBuilder sb = new StringBuilder();
var v1 = Mathf.Atan2(1, 1);
var v2 = Mathf.Atan2(1, -1);
var v3 = Mathf.Atan2(-1, -1);
var v4 = Mathf.Atan2(-1, 1);
int testSize = 100;
for (int y = -testSize; y < testSize; y++)
{
for (int x = -testSize; x < testSize; x++)
{
var rawVal = Mathf.Atan2(y, x);
var myVal = LMath.Atan2(y, x); // new LFloat(true, LMath._Atan2(y, x)).ToFloat();
var diff = rawVal - myVal;
if (diff > 0.01f)
{
sb.AppendLine($"y:{y} x:{x} diff:{diff}");
}
}
}
UnityEngine.Debug.Log(sb.ToString());
}
#endregion
#region Code Generator
/// <summary>
/// 代码生成路径
/// </summary>
private static readonly string s_LUTDir = Application.dataPath + "/HotScripts/JNGame/Root/Math/LUT/";
/// <summary>
/// 生成三角函数速查表代码文件
/// </summary>
[MenuItem("LockstepEngine/Math/CreateAllLUT")]
static void CreateAllLUT()
{
CreateLutAtan2();
CreateLUTASinCos();
}
private static readonly string s_FilePrefixStr = @"
//#define DONT_USE_GENERATE_CODE
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by JNGame.CodeGenerator
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
";
private static void CreateLutAtan2()
{
var fileName = s_LUTDir + "LUTAtan2.cs";
string content = @"
using System;
using JNGame.Math;
namespace JNGame.Math
{
public static class LUTAtan2
{
public const int MaxQueryIdx = $MAX_QUERY_IDX;//Abs(y/x)from 1 to MaxQueryIdx
public static int[] _startIdx;
public static int[] _arySize;
public static int[] _tblTbl;
static LUTAtan2()
{
_startIdx = new int[MaxQueryIdx +1]{
$START_IDX
};
_arySize = new int[MaxQueryIdx +1]{
$ARY_SIZE
};
_tblTbl = new int[]{
$ALL_VALUES
};
}
}
}";
const int MaxQueryIdx = 1000;
const int interval = 1000;
// UnityEngine.Debug.LogError("tan Pi/4 = " + Mathf.Tan(Mathf.PI / 4));
// UnityEngine.Debug.LogError("atan 1 = " + Mathf.Atan(1) * Mathf.Rad2Deg);
StringBuilder ssb = new StringBuilder();
StringBuilder aryLne = new StringBuilder();
int sum = 0;
StringBuilder tblSb = new StringBuilder();
StringBuilder startSb = new StringBuilder();
StringBuilder arySizeSb = new StringBuilder();
string sprefix = "\t\t\t\t";
tblSb.Append(sprefix);
startSb.Append(sprefix);
arySizeSb.Append(sprefix);
for (int i = 0; i < MaxQueryIdx; i++)
{
var val = Mathf.Atan(i + 1) * Mathf.Rad2Deg;
var val2 = Mathf.Atan(i + 2) * Mathf.Rad2Deg;
var arryLen = (int)((val2 - val) * interval);
if (arryLen == 0)
{
arryLen = 1;
}
startSb.Append(sum + ", ");
arySizeSb.Append(arryLen + ", ");
for (int j = 0; j < arryLen; j++)
{
var rad = Mathf.Atan(i + 1 + (j * 1.0f / arryLen));
tblSb.Append((int)(rad * LFloat.Precision) + ", ");
sum++;
if (sum % 100 == 0)
{
tblSb.AppendLine();
tblSb.Append(sprefix);
}
}
if (i % 100 == 99)
{
startSb.AppendLine();
arySizeSb.AppendLine();
startSb.Append(sprefix);
arySizeSb.Append(sprefix);
}
}
startSb.Append("" + (sum + 1));
arySizeSb.Append("" + 1);
tblSb.Append("" + (int)(Mathf.PI / 4 * LFloat.Precision));
content = content
.Replace("$MAX_QUERY_IDX", MaxQueryIdx.ToString())
.Replace("$START_IDX", startSb.ToString())
.Replace("$ARY_SIZE", arySizeSb.ToString())
.Replace("$ALL_VALUES", tblSb.ToString());
//save to files
File.WriteAllText(fileName, s_FilePrefixStr + content);
AssetDatabase.Refresh();
return;
}
private static void CreateLUTASinCos()
{
int ACount = 4000;
CreateLUTA("LUTAsin", ACount, (i) =>
Mathf.Asin(Mathf.Clamp(-1.0f + i * 2.0f / ACount, -1f, 1f))
);
CreateLUTA("LUTAcos", ACount, (i) =>
Mathf.Acos(Mathf.Clamp(-1.0f + i * 2.0f / ACount, -1f, 1f))
);
int CCount = 7200;
CreateLUTA("LUTCos", CCount, (i) =>
Mathf.Cos(i * Mathf.PI * 2 / CCount)
);
CreateLUTA("LUTSin", CCount, (i) =>
Mathf.Sin(i * Mathf.PI * 2 / CCount)
);
}
private static void CreateLUTA(string clsName, int nLutAryCount, Func<int, float> itemCallBack)
{
var fileName = s_LUTDir + clsName + ".cs";
string content = @"using System;
using JNGame.Math;
namespace JNGame.Math
{
public static class $CLS_NAME
{
public static readonly int COUNT;
public static readonly int HALF_COUNT;
public static readonly int[] table;
static $CLS_NAME()
{
COUNT = $COUNT_VAL;
HALF_COUNT = COUNT >> 1;
table = new int[]
{
$ALL_VALUES
};
}
}
}";
StringBuilder sb = new StringBuilder();
string prefix = "\t\t\t\t";
sb.Append(prefix);
for (int i = 0; i <= nLutAryCount; i++)
{
int val = (int)(itemCallBack(i) * LFloat.Precision);
sb.Append(val.ToString() + ",");
if (i % 100 == 99)
{
sb.AppendLine();
sb.Append(prefix);
}
}
content = content
.Replace("$CLS_NAME", clsName.ToString())
.Replace("$COUNT_VAL", nLutAryCount.ToString())
.Replace("$ALL_VALUES", sb.ToString());
//save to files
File.WriteAllText(fileName, s_FilePrefixStr + content);
AssetDatabase.Refresh();
}
#endregion
}
}
#endif
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 5eb54a96f1904df2a6494a7d56f65aa5
timeCreated: 1732460759
@@ -445,7 +445,7 @@ namespace JNGame.PathFinding
{ {
GeometryUtil.GetClosestPointOnTriangle(ret.vertexA, ret.vertexB, ret.vertexC, point, ref pointOnTriangle); GeometryUtil.GetClosestPointOnTriangle(ret.vertexA, ret.vertexB, ret.vertexC, point, ref pointOnTriangle);
// 稍微向三角形方向内部一点,避免严格在边上,三角形落位判断问题 // 稍微向三角形方向内部一点,避免严格在边上,三角形落位判断问题
pointOnTriangle = point + (pointOnTriangle - point) * new LFloat(true, 1010000); pointOnTriangle = point + (pointOnTriangle - point) * new LFloat("", 1010);
} }
} }
else else
@@ -12,7 +12,7 @@ using JNGame.Math;
using UnityEngine; using UnityEngine;
using UnityEngine.AI; using UnityEngine.AI;
namespace JNGame.Map.DotRecast namespace JNGame.Map.DotRecast.Editor
{ {
public class DotRecastController : MonoBehaviour public class DotRecastController : MonoBehaviour
{ {
@@ -12,6 +12,8 @@ namespace JNGame.Map.DotRecast.Util
public MeshData() { } public MeshData() { }
#if UNITY_EDITOR
public MeshData(UnityEngine.Mesh mesh) public MeshData(UnityEngine.Mesh mesh)
{ {
vertexCount = mesh.vertexCount; vertexCount = mesh.vertexCount;
@@ -23,5 +25,7 @@ namespace JNGame.Map.DotRecast.Util
vertices[i] = new LVector3((LFloat)vertice.x,(LFloat)vertice.y,(LFloat)vertice.z); vertices[i] = new LVector3((LFloat)vertice.x,(LFloat)vertice.y,(LFloat)vertice.z);
} }
} }
#endif
} }
} }
@@ -34,7 +34,7 @@ namespace DotRecast.Core.Buffers
if (0 >= source.Length) if (0 >= source.Length)
return 0; return 0;
return source.Sum() / (LFloat)source.Length; return source.Sum().ToLFloat() / source.Length;
} }
private static long Min(this ReadOnlySpan<long> source) private static long Min(this ReadOnlySpan<long> source)
@@ -96,7 +96,7 @@ namespace DotRecast.Core.Buffers
public static LFloat Average(this RcCyclicBuffer<long> source) public static LFloat Average(this RcCyclicBuffer<long> source)
{ {
return Sum(source) / (LFloat)source.Size; return Sum(source).ToLFloat() / source.Size;
} }
public static long Min(this RcCyclicBuffer<long> source) public static long Min(this RcCyclicBuffer<long> source)
@@ -657,7 +657,7 @@ namespace DotRecast.Core.Compression
public static long EstimateCompressedSize(long size) public static long EstimateCompressedSize(long size)
{ {
long estimatedSize = (long)LMath.Ceiling(size * (LFloat)1.06f); long estimatedSize = (long)LMath.Ceiling(size * (new LFloat("",1060)));
return LMath.Max(estimatedSize, 66); return LMath.Max(estimatedSize, 66);
} }
} }
@@ -8,10 +8,10 @@ namespace DotRecast.Core.Numerics
{ {
private static readonly RcMatrix4x4f _identity = new RcMatrix4x4f private static readonly RcMatrix4x4f _identity = new RcMatrix4x4f
( (
(LFloat)1f, (LFloat)0f, (LFloat)0f, (LFloat)0f, LFloat.L1, LFloat.L0, LFloat.L0, LFloat.L0,
(LFloat)0f, (LFloat)1f, (LFloat)0f, (LFloat)0f, LFloat.L0, LFloat.L1, LFloat.L0, LFloat.L0,
(LFloat)0f, (LFloat)0f, (LFloat)1f, (LFloat)0f, LFloat.L0, LFloat.L0, LFloat.L1, LFloat.L0,
(LFloat)0f, (LFloat)0f, (LFloat)0f, (LFloat)1f LFloat.L0, LFloat.L0, LFloat.L0, LFloat.L1
); );
public LFloat M11; // 0 public LFloat M11; // 0
@@ -104,10 +104,10 @@ namespace DotRecast.Core.Numerics
public readonly bool IsIdentity => public readonly bool IsIdentity =>
M11.Equals(1f) && M22.Equals(1f) && M33.Equals(1f) && M44.Equals(1f) && M11.Equals(1f) && M22.Equals(1f) && M33.Equals(1f) && M44.Equals(1f) &&
M12 == 0f && M13 == 0f && M14 == 0f && M12 == LFloat.L0 && M13 == LFloat.L0 && M14 == LFloat.L0 &&
M21 == 0f && M23 == 0f && M24 == 0f && M21 == LFloat.L0 && M23 == LFloat.L0 && M24 == LFloat.L0 &&
M31 == 0f && M32 == 0f && M34 == 0f && M31 == LFloat.L0 && M32 == LFloat.L0 && M34 == LFloat.L0 &&
M41 == 0f && M42 == 0f && M43 == 0f; M41 == LFloat.L0 && M42 == LFloat.L0 && M43 == LFloat.L0;
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static RcMatrix4x4f Mul(ref RcMatrix4x4f left, ref RcMatrix4x4f right) public static RcMatrix4x4f Mul(ref RcMatrix4x4f left, ref RcMatrix4x4f right)
@@ -182,10 +182,10 @@ namespace DotRecast.Core.Numerics
public static RcMatrix4x4f CreateFromRotate(LFloat a, LFloat x, LFloat y, LFloat z) public static RcMatrix4x4f CreateFromRotate(LFloat a, LFloat x, LFloat y, LFloat z)
{ {
var matrix = new RcMatrix4x4f(); var matrix = new RcMatrix4x4f();
a = (LFloat)(a * LMath.PI / 180.0); // convert to radians a = (a * LMath.PI / 180); // convert to radians
LFloat s = LMath.Sin(a); LFloat s = LMath.Sin(a);
LFloat c = LMath.Cos(a); LFloat c = LMath.Cos(a);
LFloat t = (LFloat)1.0f - c; LFloat t = LFloat.L1 - c;
LFloat tx = t * x; LFloat tx = t * x;
LFloat ty = t * y; LFloat ty = t * y;
@@ -28,11 +28,11 @@ namespace DotRecast.Core.Numerics
public LFloat Y; public LFloat Y;
public LFloat Z; public LFloat Z;
public static readonly RcVec3f Zero = new RcVec3f((LFloat)0.0f, (LFloat)0.0f, (LFloat)0.0f); public static readonly RcVec3f Zero = new RcVec3f(LFloat.L0, LFloat.L0, LFloat.L0);
public static readonly RcVec3f One = new RcVec3f((LFloat)1.0f); public static readonly RcVec3f One = new RcVec3f(LFloat.L1);
public static readonly RcVec3f UnitX = new RcVec3f((LFloat)1.0f, (LFloat)0.0f, (LFloat)0.0f); public static readonly RcVec3f UnitX = new RcVec3f(LFloat.L1, LFloat.L0, LFloat.L0);
public static readonly RcVec3f UnitY = new RcVec3f((LFloat)0.0f, (LFloat)1.0f, (LFloat)0.0f); public static readonly RcVec3f UnitY = new RcVec3f(LFloat.L0, LFloat.L1, LFloat.L0);
public static readonly RcVec3f UnitZ = new RcVec3f((LFloat)0.0f, (LFloat)0.0f, (LFloat)1.0f); public static readonly RcVec3f UnitZ = new RcVec3f(LFloat.L0, LFloat.L0, LFloat.L1);
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public RcVec3f(LFloat x, LFloat y, LFloat z) public RcVec3f(LFloat x, LFloat y, LFloat z)
@@ -186,7 +186,7 @@ namespace DotRecast.Core.Numerics
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static RcVec3f Lerp(RcVec3f value1, RcVec3f value2, LFloat amount) public static RcVec3f Lerp(RcVec3f value1, RcVec3f value2, LFloat amount)
{ {
return (value1 * ((LFloat)1f - amount)) + (value2 * amount); return (value1 * (LFloat.L1 - amount)) + (value2 * amount);
// return new RcVec3f( // return new RcVec3f(
// value1.X + (value2.X - value1.X) * amount, // value1.X + (value2.X - value1.X) * amount,
// value1.Y + (value2.Y - value1.Y) * amount, // value1.Y + (value2.Y - value1.Y) * amount,
@@ -157,7 +157,7 @@ namespace DotRecast.Core.Numerics
LFloat sqMag = RcMath.Sqr(v.X) + RcMath.Sqr(v.Y) + RcMath.Sqr(v.Z); LFloat sqMag = RcMath.Sqr(v.X) + RcMath.Sqr(v.Y) + RcMath.Sqr(v.Z);
if (sqMag > Epsilon) if (sqMag > Epsilon)
{ {
LFloat inverseMag = (LFloat)1.0f / LMath.Sqrt(sqMag); LFloat inverseMag = LFloat.L1 / LMath.Sqrt(sqMag);
return new RcVec3f( return new RcVec3f(
v.X *= inverseMag, v.X *= inverseMag,
v.Y *= inverseMag, v.Y *= inverseMag,
@@ -200,7 +200,7 @@ namespace DotRecast.Core.Numerics
{ {
LFloat dx = v2.X - v1.X; LFloat dx = v2.X - v1.X;
LFloat dz = v2.Z - v1.Z; LFloat dz = v2.Z - v1.Z;
return (LFloat)LMath.Sqrt(dx * dx + dz * dz); return LMath.Sqrt(dx * dx + dz * dz);
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
@@ -105,7 +105,9 @@ namespace DotRecast.Core
span.Reverse(); span.Reverse();
} }
return (LFloat)BitConverter.ToSingle(span); // @TODO 临时写死
// return (LFloat)BitConverter.ToSingle(span);
return LFloat.L0;
} }
public long GetLong() public long GetLong()
@@ -6,7 +6,10 @@ namespace DotRecast.Core
{ {
public static class RcFrequency public static class RcFrequency
{ {
public static readonly LFloat Frequency = (LFloat)TimeSpan.TicksPerSecond / Stopwatch.Frequency; //@TODO 临时写死
public static long Ticks => unchecked((long)(Stopwatch.GetTimestamp() * Frequency)); // public static readonly LFloat Frequency = (LFloat)TimeSpan.TicksPerSecond / Stopwatch.Frequency;
// public static long Ticks => unchecked((long)(Stopwatch.GetTimestamp() * Frequency));
public static readonly LFloat Frequency = LFloat.L1;
public static long Ticks => 1;
} }
} }
@@ -41,7 +41,7 @@ namespace DotRecast.Core
// Compute denominator d. If d <= 0, segment is parallel to or points // Compute denominator d. If d <= 0, segment is parallel to or points
// away from triangle, so exit early // away from triangle, so exit early
LFloat d = RcVec3f.Dot(qp, norm); LFloat d = RcVec3f.Dot(qp, norm);
if (d <= 0.0f) if (d <= LFloat.L0)
{ {
return false; return false;
} }
@@ -51,7 +51,7 @@ namespace DotRecast.Core
// dividing by d until intersection has been found to pierce triangle // dividing by d until intersection has been found to pierce triangle
RcVec3f ap = RcVec3f.Subtract(sp, a); RcVec3f ap = RcVec3f.Subtract(sp, a);
t = RcVec3f.Dot(ap, norm); t = RcVec3f.Dot(ap, norm);
if (t < 0.0f) if (t < LFloat.L0)
{ {
return false; return false;
} }
@@ -64,13 +64,13 @@ namespace DotRecast.Core
// Compute barycentric coordinate components and test if within bounds // Compute barycentric coordinate components and test if within bounds
RcVec3f e = RcVec3f.Cross(qp, ap); RcVec3f e = RcVec3f.Cross(qp, ap);
v = RcVec3f.Dot(ac, e); v = RcVec3f.Dot(ac, e);
if (v < 0.0f || v > d) if (v < LFloat.L0 || v > d)
{ {
return false; return false;
} }
w = -RcVec3f.Dot(ab, e); w = -RcVec3f.Dot(ab, e);
if (w < 0.0f || v + w > d) if (w < LFloat.L0 || v + w > d)
{ {
return false; return false;
} }
@@ -89,7 +89,7 @@ namespace DotRecast.Core
d.X = sq.X - sp.X; d.X = sq.X - sp.X;
d.Y = sq.Y - sp.Y; d.Y = sq.Y - sp.Y;
d.Z = sq.Z - sp.Z; d.Z = sq.Z - sp.Z;
tmin = (LFloat)0.0f; tmin = LFloat.L0;
tmax = LFloat.MaxValue; tmax = LFloat.MaxValue;
for (int i = 0; i < 3; i++) for (int i = 0; i < 3; i++)
@@ -103,7 +103,7 @@ namespace DotRecast.Core
} }
else else
{ {
LFloat ood = (LFloat)1.0f / d.Get(i); LFloat ood = LFloat.L1 / d.Get(i);
LFloat t1 = (amin.Get(i) - sp.Get(i)) * ood; LFloat t1 = (amin.Get(i) - sp.Get(i)) * ood;
LFloat t2 = (amax.Get(i) - sp.Get(i)) * ood; LFloat t2 = (amax.Get(i) - sp.Get(i)) * ood;
@@ -17,12 +17,12 @@ namespace DotRecast.Core
public LFloat Next() public LFloat Next()
{ {
return _random.Range((LFloat)0f,(LFloat)1f); return _random.Range(LFloat.L0,LFloat.L1);
} }
public LFloat NextDouble() public LFloat NextDouble()
{ {
return _random.Range((LFloat)0f,(LFloat)1f); return _random.Range(LFloat.L0,LFloat.L1);
} }
public int NextInt32() public int NextInt32()
@@ -34,8 +34,8 @@ namespace DotRecast.Core
var array_2_8_1 = RcStackArray2<RcStackArray8<LFloat>>.Empty; // 2 * 8 = 16 var array_2_8_1 = RcStackArray2<RcStackArray8<LFloat>>.Empty; // 2 * 8 = 16
var array_2_4_1 = RcStackArray2<RcStackArray2<LFloat>>.Empty; // 2 * 2 = 4 var array_2_4_1 = RcStackArray2<RcStackArray2<LFloat>>.Empty; // 2 * 2 = 4
LFloat f1 = (LFloat)0.0f; // 1 LFloat f1 = LFloat.L0; // 1
//LFloat f2 = 0.0f; // my system stack overflow! //LFloat f2 = (LFloat.L0); // my system stack overflow!
} }
@@ -150,7 +150,7 @@ namespace DotRecast.Detour.Crowd
public DtCrowd(DtCrowdConfig config, DtNavMesh nav, Func<int, IDtQueryFilter> queryFilterFactory) public DtCrowd(DtCrowdConfig config, DtNavMesh nav, Func<int, IDtQueryFilter> queryFilterFactory)
{ {
_config = config; _config = config;
_agentPlacementHalfExtents = new RcVec3f(config.maxAgentRadius * (LFloat)2.0f, config.maxAgentRadius * (LFloat)1.5f, config.maxAgentRadius * (LFloat)2.0f); _agentPlacementHalfExtents = new RcVec3f(config.maxAgentRadius * LFloat.L2, config.maxAgentRadius * new LFloat("",1500), config.maxAgentRadius * LFloat.L2);
_obstacleQuery = new DtObstacleAvoidanceQuery(config.maxObstacleAvoidanceCircles, config.maxObstacleAvoidanceSegments); _obstacleQuery = new DtObstacleAvoidanceQuery(config.maxObstacleAvoidanceCircles, config.maxObstacleAvoidanceSegments);
@@ -877,7 +877,7 @@ namespace DotRecast.Detour.Crowd
// Update the collision boundary after certain distance has been passed or // Update the collision boundary after certain distance has been passed or
// if it has become invalid. // if it has become invalid.
LFloat updateThr = ag.option.collisionQueryRange * (LFloat)0.25f; LFloat updateThr = ag.option.collisionQueryRange * new LFloat("",250);
if (RcVecUtils.Dist2DSqr(ag.npos, ag.boundary.GetCenter()) > RcMath.Sqr(updateThr) if (RcVecUtils.Dist2DSqr(ag.npos, ag.boundary.GetCenter()) > RcMath.Sqr(updateThr)
|| !ag.boundary.IsValid(_navQuery, _filters[ag.option.queryFilterType])) || !ag.boundary.IsValid(_navQuery, _filters[ag.option.queryFilterType]))
{ {
@@ -908,7 +908,7 @@ namespace DotRecast.Detour.Crowd
// Check for overlap. // Check for overlap.
RcVec3f diff = RcVec3f.Subtract(pos, ag.npos); RcVec3f diff = RcVec3f.Subtract(pos, ag.npos);
if (LMath.Abs(diff.Y) >= (height + ag.option.height) / 2.0f) if (LMath.Abs(diff.Y) >= (height + ag.option.height) / LFloat.L2)
{ {
continue; continue;
} }
@@ -995,7 +995,7 @@ namespace DotRecast.Detour.Crowd
} }
// Check // Check
LFloat triggerRadius = ag.option.radius * (LFloat)2.25f; LFloat triggerRadius = ag.option.radius * new LFloat("",2250);
if (ag.OverOffmeshConnection(triggerRadius)) if (ag.OverOffmeshConnection(triggerRadius))
{ {
// Prepare to off-mesh connection. // Prepare to off-mesh connection.
@@ -1009,8 +1009,8 @@ namespace DotRecast.Detour.Crowd
anim.initPos = ag.npos; anim.initPos = ag.npos;
anim.polyRef = refs[1]; anim.polyRef = refs[1];
anim.active = true; anim.active = true;
anim.t = (LFloat)0.0f; anim.t = LFloat.L0;
anim.tmax = (RcVecUtils.Dist2D(anim.startPos, anim.endPos) / ag.option.maxSpeed) * (LFloat)0.5f; anim.tmax = (RcVecUtils.Dist2D(anim.startPos, anim.endPos) / ag.option.maxSpeed) * LFloat.L0D5;
ag.state = DtCrowdAgentState.DT_CROWDAGENT_STATE_OFFMESH; ag.state = DtCrowdAgentState.DT_CROWDAGENT_STATE_OFFMESH;
ag.corners.Clear(); ag.corners.Clear();
@@ -1073,7 +1073,7 @@ namespace DotRecast.Detour.Crowd
if ((ag.option.updateFlags & DtCrowdAgentUpdateFlags.DT_CROWD_SEPARATION) != 0) if ((ag.option.updateFlags & DtCrowdAgentUpdateFlags.DT_CROWD_SEPARATION) != 0)
{ {
LFloat separationDist = ag.option.collisionQueryRange; LFloat separationDist = ag.option.collisionQueryRange;
LFloat invSeparationDist = (LFloat)1.0f / separationDist; LFloat invSeparationDist = LFloat.L1 / separationDist;
LFloat separationWeight = ag.option.separationWeight; LFloat separationWeight = ag.option.separationWeight;
LFloat w = 0; LFloat w = 0;
@@ -1087,7 +1087,9 @@ namespace DotRecast.Detour.Crowd
diff.Y = 0; diff.Y = 0;
LFloat distSqr = diff.LengthSquared(); LFloat distSqr = diff.LengthSquared();
if (distSqr < (LFloat)0.0001f) //@TODO 临时解决 这里可能出现闪现
// if (distSqr < (LFloat)0.0001f)
if (distSqr < new LFloat("",1))
{ {
continue; continue;
} }
@@ -1098,16 +1100,18 @@ namespace DotRecast.Detour.Crowd
} }
LFloat dist = LMath.Sqrt(distSqr); LFloat dist = LMath.Sqrt(distSqr);
LFloat weight = separationWeight * ((LFloat)1.0f - RcMath.Sqr(dist * invSeparationDist)); LFloat weight = separationWeight * (LFloat.L1 - RcMath.Sqr(dist * invSeparationDist));
disp = RcVecUtils.Mad(disp, diff, weight / dist); disp = RcVecUtils.Mad(disp, diff, weight / dist);
w += (LFloat)1.0f; w += LFloat.L1;
} }
if (w > (LFloat)0.0001f) //@TODO 临时解决 这里可能出现闪现
// if (w > (LFloat)0.0001f)
if (w > new LFloat("",1))
{ {
// Adjust desired velocity. // Adjust desired velocity.
dvel = RcVecUtils.Mad(dvel, disp, (LFloat)1.0f / w); dvel = RcVecUtils.Mad(dvel, disp, LFloat.L1 / w);
// Clamp desired velocity to desired speed. // Clamp desired velocity to desired speed.
LFloat speedSqr = dvel.LengthSquared(); LFloat speedSqr = dvel.LengthSquared();
LFloat desiredSqr = RcMath.Sqr(ag.desiredSpeed); LFloat desiredSqr = RcMath.Sqr(ag.desiredSpeed);
@@ -1153,7 +1157,7 @@ namespace DotRecast.Detour.Crowd
RcVec3f[] s = ag.boundary.GetSegment(j); RcVec3f[] s = ag.boundary.GetSegment(j);
RcVec3f s3 = s[1]; RcVec3f s3 = s[1];
//RcArrays.Copy(s, 3, s3, 0, 3); //RcArrays.Copy(s, 3, s3, 0, 3);
if (DtUtils.TriArea2D(ag.npos, s[0], s3) < 0.0f) if (DtUtils.TriArea2D(ag.npos, s[0], s3) < LFloat.L0)
{ {
continue; continue;
} }
@@ -1244,7 +1248,9 @@ namespace DotRecast.Detour.Crowd
dist = LMath.Sqrt(dist); dist = LMath.Sqrt(dist);
LFloat pen = (ag.option.radius + nei.option.radius) - dist; LFloat pen = (ag.option.radius + nei.option.radius) - dist;
if (dist < (LFloat)0.0001f) //@TODO 临时解决 这里可能出现闪现
// if (dist < (LFloat)0.0001f)
if (dist < new LFloat("",1))
{ {
// Agents on top of each other, try to choose diverging separation directions. // Agents on top of each other, try to choose diverging separation directions.
if (idx0 > idx1) if (idx0 > idx1)
@@ -1256,21 +1262,23 @@ namespace DotRecast.Detour.Crowd
diff = new RcVec3f(ag.dvel.Z, 0, -ag.dvel.X); diff = new RcVec3f(ag.dvel.Z, 0, -ag.dvel.X);
} }
pen = (LFloat)0.01f; pen = (new LFloat("",10));
} }
else else
{ {
pen = ((LFloat)1.0f / dist) * (pen * (LFloat)0.5f) * _config.collisionResolveFactor; pen = (LFloat.L1 / dist) * (pen * LFloat.L0D5) * _config.collisionResolveFactor;
} }
ag.disp = RcVecUtils.Mad(ag.disp, diff, pen); ag.disp = RcVecUtils.Mad(ag.disp, diff, pen);
w += (LFloat)1.0f; w += LFloat.L1;
} }
if (w > (LFloat)0.0001f) //@TODO 临时解决 这里可能出现闪现
// if (w > (LFloat)0.0001f)
if (w > new LFloat("",1))
{ {
LFloat iw = (LFloat)1.0f / w; LFloat iw = LFloat.L1 / w;
ag.disp = ag.disp.Scale(iw); ag.disp = ag.disp.Scale(iw);
} }
} }
@@ -1339,11 +1347,11 @@ namespace DotRecast.Detour.Crowd
} }
// Update position // Update position
LFloat ta = anim.tmax * (LFloat)0.15f; LFloat ta = anim.tmax * new LFloat("",150);
LFloat tb = anim.tmax; LFloat tb = anim.tmax;
if (anim.t < ta) if (anim.t < ta)
{ {
LFloat u = Tween(anim.t, (LFloat)0.0f, ta); LFloat u = Tween(anim.t, LFloat.L0, ta);
ag.npos = RcVec3f.Lerp(anim.initPos, anim.startPos, u); ag.npos = RcVec3f.Lerp(anim.initPos, anim.startPos, u);
} }
else else
@@ -1360,7 +1368,7 @@ namespace DotRecast.Detour.Crowd
private LFloat Tween(LFloat t, LFloat t0, LFloat t1) private LFloat Tween(LFloat t, LFloat t0, LFloat t1)
{ {
return LMath.Clamp((t - t0) / (t1 - t0), (LFloat)0.0f, (LFloat)1.0f); return LMath.Clamp((t - t0) / (t1 - t0), LFloat.L0, LFloat.L1);
} }
} }
} }
@@ -98,7 +98,9 @@ namespace DotRecast.Detour.Crowd
vel = RcVec3f.Add(vel, dv); vel = RcVec3f.Add(vel, dv);
// Integrate // Integrate
if (vel.Length() > (LFloat)0.0001f) // @TODO 可能会闪现
// if (vel.Length() > (LFloat)0.0001f)
if (vel.Length() > new LFloat("",1))
npos = RcVecUtils.Mad(npos, vel, dt); npos = RcVecUtils.Mad(npos, vel, dt);
else else
vel = RcVec3f.Zero; vel = RcVec3f.Zero;
@@ -152,12 +154,12 @@ namespace DotRecast.Detour.Crowd
LFloat len0 = dir0.Length(); LFloat len0 = dir0.Length();
LFloat len1 = dir1.Length(); LFloat len1 = dir1.Length();
if (len1 > (LFloat)0.001f) if (len1 > new LFloat("",1))
dir1 = dir1.Scale((LFloat)1.0f / len1); dir1 = dir1.Scale(LFloat.L1 / len1);
dir.X = dir0.X - dir1.X * len0 * (LFloat)0.5f; dir.X = dir0.X - dir1.X * len0 * LFloat.L0D5;
dir.Y = 0; dir.Y = 0;
dir.Z = dir0.Z - dir1.Z * len0 * (LFloat)0.5f; dir.Z = dir0.Z - dir1.Z * len0 * LFloat.L0D5;
dir = RcVec3f.Normalize(dir); dir = RcVec3f.Normalize(dir);
} }
@@ -11,7 +11,7 @@ namespace DotRecast.Detour.Crowd
public bool obstacleAvoidance = true; public bool obstacleAvoidance = true;
public int obstacleAvoidanceType = 3; public int obstacleAvoidanceType = 3;
public bool separation; public bool separation;
public LFloat separationWeight = (LFloat)2f; public LFloat separationWeight = LFloat.L2;
public int GetUpdateFlags() public int GetUpdateFlags()
{ {
@@ -28,11 +28,11 @@ namespace DotRecast.Detour.Crowd
public int pathQueueSize = 32; // Max number of path requests in the queue public int pathQueueSize = 32; // Max number of path requests in the queue
public int maxFindPathIterations = 100; // Max number of sliced path finding iterations executed per update (used to handle longer paths and replans) public int maxFindPathIterations = 100; // Max number of sliced path finding iterations executed per update (used to handle longer paths and replans)
public int maxTargetFindPathIterations = 20; // Max number of sliced path finding iterations executed per agent to find the initial path to target public int maxTargetFindPathIterations = 20; // Max number of sliced path finding iterations executed per agent to find the initial path to target
public LFloat topologyOptimizationTimeThreshold = (LFloat)0.5f; // Min time between topology optimizations (in seconds) public LFloat topologyOptimizationTimeThreshold = LFloat.L0D5; // Min time between topology optimizations (in seconds)
public int checkLookAhead = 10; // The number of polygons from the beginning of the corridor to check to ensure path validity public int checkLookAhead = 10; // The number of polygons from the beginning of the corridor to check to ensure path validity
public LFloat targetReplanDelay = (LFloat)1.0f; // Min time between target re-planning (in seconds) public LFloat targetReplanDelay = LFloat.L1; // Min time between target re-planning (in seconds)
public int maxTopologyOptimizationIterations = 32; // Max number of sliced path finding iterations executed per topology optimization per agent public int maxTopologyOptimizationIterations = 32; // Max number of sliced path finding iterations executed per topology optimization per agent
public LFloat collisionResolveFactor = (LFloat)0.7f; public LFloat collisionResolveFactor = LFloat.L0D7;
public int maxObstacleAvoidanceCircles = 6; // Max number of neighbour agents to consider in obstacle avoidance processing public int maxObstacleAvoidanceCircles = 6; // Max number of neighbour agents to consider in obstacle avoidance processing
public int maxObstacleAvoidanceSegments = 8; // Max number of neighbour segments to consider in obstacle avoidance processing public int maxObstacleAvoidanceSegments = 8; // Max number of neighbour segments to consider in obstacle avoidance processing
@@ -65,9 +65,9 @@ namespace DotRecast.Detour.Crowd
} }
LFloat penRange = maxPen - minPen; LFloat penRange = maxPen - minPen;
LFloat s = penRange > (LFloat)0.001f ? ((LFloat)1.0f / penRange) : 1; LFloat s = penRange > new LFloat("",1) ? (LFloat.L1 / penRange) : 1;
for (int i = 0; i < n; ++i) for (int i = 0; i < n; ++i)
arr[i] = LMath.Clamp((arr[i] - minPen) * s, (LFloat)0.0f, (LFloat)1.0f); arr[i] = LMath.Clamp((arr[i] - minPen) * s, LFloat.L0, LFloat.L1);
} }
public void NormalizeSamples() public void NormalizeSamples()
@@ -30,12 +30,12 @@ namespace DotRecast.Detour.Crowd
/// < adaptive /// < adaptive
public DtObstacleAvoidanceParams() public DtObstacleAvoidanceParams()
{ {
velBias = (LFloat)0.4f; velBias = LFloat.L0D4;
weightDesVel = (LFloat)2.0f; weightDesVel = LFloat.L2;
weightCurVel = (LFloat)0.75f; weightCurVel = (new LFloat("",750));
weightSide = (LFloat)0.75f; weightSide = (new LFloat("",750));
weightToi = (LFloat)2.5f; weightToi = (new LFloat("",2500));
horizTime = (LFloat)2.5f; horizTime = (new LFloat("",2500));
gridSize = 33; gridSize = 33;
adaptiveDivs = 7; adaptiveDivs = 7;
adaptiveRings = 2; adaptiveRings = 2;
@@ -31,7 +31,7 @@ namespace DotRecast.Detour.Crowd
{ {
public const int DT_MAX_PATTERN_DIVS = 32; // < Max numver of adaptive divs. public const int DT_MAX_PATTERN_DIVS = 32; // < Max numver of adaptive divs.
public const int DT_MAX_PATTERN_RINGS = 4; public const int DT_MAX_PATTERN_RINGS = 4;
public LFloat DT_PI = (LFloat)3.14159265f; public LFloat DT_PI = LMath.PI;
private DtObstacleAvoidanceParams m_params; private DtObstacleAvoidanceParams m_params;
private LFloat m_invHorizTime; private LFloat m_invHorizTime;
@@ -131,7 +131,7 @@ namespace DotRecast.Detour.Crowd
dv = RcVec3f.Subtract(cir.dvel, dvel); dv = RcVec3f.Subtract(cir.dvel, dvel);
LFloat a = DtUtils.TriArea2D(orig, cir.dp, dv); LFloat a = DtUtils.TriArea2D(orig, cir.dp, dv);
if (a < 0.01f) if (a < LFloat.L0)
{ {
cir.np.X = -cir.dp.Z; cir.np.X = -cir.dp.Z;
cir.np.Z = cir.dp.X; cir.np.Z = cir.dp.X;
@@ -148,7 +148,7 @@ namespace DotRecast.Detour.Crowd
DtObstacleSegment seg = m_segments[i]; DtObstacleSegment seg = m_segments[i];
// Precalc if the agent is really close to the segment. // Precalc if the agent is really close to the segment.
LFloat r = (LFloat)0.01f; LFloat r = (new LFloat("",10));
var distSqr = DtUtils.DistancePtSegSqr2D(pos, seg.p, seg.q, out var t); var distSqr = DtUtils.DistancePtSegSqr2D(pos, seg.p, seg.q, out var t);
seg.touch = distSqr < RcMath.Sqr(r); seg.touch = distSqr < RcMath.Sqr(r);
} }
@@ -156,7 +156,9 @@ namespace DotRecast.Detour.Crowd
private bool SweepCircleCircle(RcVec3f c0, LFloat r0, RcVec3f v, RcVec3f c1, LFloat r1, out LFloat tmin, out LFloat tmax) private bool SweepCircleCircle(RcVec3f c0, LFloat r0, RcVec3f v, RcVec3f c1, LFloat r1, out LFloat tmin, out LFloat tmax)
{ {
LFloat EPS = (LFloat)0.0001f; // TODO 闪现
// LFloat EPS = (LFloat)0.0001f;
LFloat EPS = LFloat.EPS_1MS;
tmin = 0; tmin = 0;
tmax = 0; tmax = 0;
@@ -171,10 +173,10 @@ namespace DotRecast.Detour.Crowd
// Overlap, calc time to exit. // Overlap, calc time to exit.
LFloat b = v.Dot2D(s); LFloat b = v.Dot2D(s);
LFloat d = b * b - a * c; LFloat d = b * b - a * c;
if (d < 0.0f) if (d < LFloat.L0)
return false; // no intersection. return false; // no intersection.
a = (LFloat)1.0f / a; a = LFloat.L1 / a;
LFloat rd = LMath.Sqrt(d); LFloat rd = LMath.Sqrt(d);
tmin = (b - rd) * a; tmin = (b - rd) * a;
@@ -191,7 +193,7 @@ namespace DotRecast.Detour.Crowd
if (LMath.Abs(d) < 1e-6f) if (LMath.Abs(d) < 1e-6f)
return false; return false;
d = (LFloat)1.0f / d; d = LFloat.L1 / d;
t = RcVecUtils.Perp2D(v, w) * d; t = RcVecUtils.Perp2D(v, w) * d;
if (t < 0 || t > 1) if (t < 0 || t > 1)
return false; return false;
@@ -223,7 +225,7 @@ namespace DotRecast.Detour.Crowd
// find the threshold hit time to bail out based on the early out penalty // find the threshold hit time to bail out based on the early out penalty
// (see how the penalty is calculated below to understand) // (see how the penalty is calculated below to understand)
LFloat minPen = minPenalty - vpen - vcpen; LFloat minPen = minPenalty - vpen - vcpen;
LFloat tThresold = (m_params.weightToi / minPen - (LFloat)0.1f) * m_params.horizTime; LFloat tThresold = (m_params.weightToi / minPen - LFloat.L0D1) * m_params.horizTime;
if (tThresold - m_params.horizTime > -LFloat.MinValue) if (tThresold - m_params.horizTime > -LFloat.MinValue)
return minPenalty; // already too much return minPenalty; // already too much
@@ -242,20 +244,20 @@ namespace DotRecast.Detour.Crowd
vab = RcVec3f.Subtract(vab, cir.vel); vab = RcVec3f.Subtract(vab, cir.vel);
// Side // Side
side += LMath.Clamp(LMath.Min(cir.dp.Dot2D(vab) * (LFloat)0.5f + (LFloat)0.5f, cir.np.Dot2D(vab) * 2), (LFloat)0.0f, (LFloat)1.0f); side += LMath.Clamp(LMath.Min(cir.dp.Dot2D(vab) * LFloat.L0D5 + LFloat.L0D5, cir.np.Dot2D(vab) * 2), LFloat.L0, LFloat.L1);
nside++; nside++;
if (!SweepCircleCircle(pos, rad, vab, cir.p, cir.rad, out var htmin, out var htmax)) if (!SweepCircleCircle(pos, rad, vab, cir.p, cir.rad, out var htmin, out var htmax))
continue; continue;
// Handle overlapping obstacles. // Handle overlapping obstacles.
if (htmin < 0.0f && htmax > 0.0f) if (htmin < LFloat.L0 && htmax > LFloat.L0)
{ {
// Avoid more when overlapped. // Avoid more when overlapped.
htmin = -htmin * (LFloat)0.5f; htmin = -htmin * LFloat.L0D5;
} }
if (htmin >= 0.0f) if (htmin >= LFloat.L0)
{ {
// The closest obstacle is somewhere ahead of us, keep track of nearest obstacle. // The closest obstacle is somewhere ahead of us, keep track of nearest obstacle.
if (htmin < tmin) if (htmin < tmin)
@@ -280,10 +282,10 @@ namespace DotRecast.Detour.Crowd
snorm.X = -sdir.Z; snorm.X = -sdir.Z;
snorm.Z = sdir.X; snorm.Z = sdir.X;
// If the velocity is pointing towards the segment, no collision. // If the velocity is pointing towards the segment, no collision.
if (snorm.Dot2D(vcand) < 0.0f) if (snorm.Dot2D(vcand) < LFloat.L0)
continue; continue;
// Else immediate collision. // Else immediate collision.
htmin = (LFloat)0.0f; htmin = LFloat.L0;
} }
else else
{ {
@@ -292,7 +294,7 @@ namespace DotRecast.Detour.Crowd
} }
// Avoid less when facing walls. // Avoid less when facing walls.
htmin *= (LFloat)2.0f; htmin *= LFloat.L2;
// The closest obstacle is somewhere ahead of us, keep track of nearest obstacle. // The closest obstacle is somewhere ahead of us, keep track of nearest obstacle.
if (htmin < tmin) if (htmin < tmin)
@@ -308,7 +310,7 @@ namespace DotRecast.Detour.Crowd
side /= nside; side /= nside;
LFloat spen = m_params.weightSide * side; LFloat spen = m_params.weightSide * side;
LFloat tpen = m_params.weightToi * ((LFloat)1.0f / ((LFloat)0.1f + tmin * m_invHorizTime)); LFloat tpen = m_params.weightToi * (LFloat.L1 / (LFloat.L0D1 + tmin * m_invHorizTime));
LFloat penalty = vpen + vcpen + spen + tpen; LFloat penalty = vpen + vcpen + spen + tpen;
// Store different penalties for debug viewing // Store different penalties for debug viewing
@@ -323,9 +325,9 @@ namespace DotRecast.Detour.Crowd
{ {
Prepare(pos, dvel); Prepare(pos, dvel);
m_params = option; m_params = option;
m_invHorizTime = (LFloat)1.0f / m_params.horizTime; m_invHorizTime = LFloat.L1 / m_params.horizTime;
m_vmax = vmax; m_vmax = vmax;
m_invVmax = vmax > 0 ? (LFloat)1.0f / vmax : LFloat.MaxValue; m_invVmax = vmax > 0 ? LFloat.L1 / vmax : LFloat.MaxValue;
nvel = RcVec3f.Zero; nvel = RcVec3f.Zero;
@@ -335,7 +337,7 @@ namespace DotRecast.Detour.Crowd
LFloat cvx = dvel.X * m_params.velBias; LFloat cvx = dvel.X * m_params.velBias;
LFloat cvz = dvel.Z * m_params.velBias; LFloat cvz = dvel.Z * m_params.velBias;
LFloat cs = vmax * 2 * (1 - m_params.velBias) / (m_params.gridSize - 1); LFloat cs = vmax * 2 * (1 - m_params.velBias) / (m_params.gridSize - 1);
LFloat half = (m_params.gridSize - 1) * cs * (LFloat)0.5f; LFloat half = (m_params.gridSize - 1) * cs * LFloat.L0D5;
LFloat minPenalty = LFloat.MaxValue; LFloat minPenalty = LFloat.MaxValue;
int ns = 0; int ns = 0;
@@ -344,7 +346,7 @@ namespace DotRecast.Detour.Crowd
{ {
for (int x = 0; x < m_params.gridSize; ++x) for (int x = 0; x < m_params.gridSize; ++x)
{ {
RcVec3f vcand = new RcVec3f(cvx + x * cs - half, (LFloat)0f, cvz + y * cs - half); RcVec3f vcand = new RcVec3f(cvx + x * cs - half, LFloat.L0, cvz + y * cs - half);
if (RcMath.Sqr(vcand.X) + RcMath.Sqr(vcand.Z) > RcMath.Sqr(vmax + cs / 2)) if (RcMath.Sqr(vcand.X) + RcMath.Sqr(vcand.Z) > RcMath.Sqr(vmax + cs / 2))
continue; continue;
@@ -368,7 +370,7 @@ namespace DotRecast.Detour.Crowd
LFloat d = LMath.Sqrt(v[0] * v[0] + v[2] * v[2]); LFloat d = LMath.Sqrt(v[0] * v[0] + v[2] * v[2]);
if (d == 0) if (d == 0)
return; return;
d = (LFloat)1.0f / d; d = LFloat.L1 / d;
v[0] *= d; v[0] *= d;
v[2] *= d; v[2] *= d;
} }
@@ -393,9 +395,9 @@ namespace DotRecast.Detour.Crowd
{ {
Prepare(pos, dvel); Prepare(pos, dvel);
m_params = option; m_params = option;
m_invHorizTime = (LFloat)1.0f / m_params.horizTime; m_invHorizTime = LFloat.L1 / m_params.horizTime;
m_vmax = vmax; m_vmax = vmax;
m_invVmax = vmax > 0 ? (LFloat)1.0f / vmax : LFloat.MaxValue; m_invVmax = vmax > 0 ? LFloat.L1 / vmax : LFloat.MaxValue;
nvel = RcVec3f.Zero; nvel = RcVec3f.Zero;
@@ -412,7 +414,7 @@ namespace DotRecast.Detour.Crowd
int nd = LMath.Clamp(ndivs, 1, DT_MAX_PATTERN_DIVS); int nd = LMath.Clamp(ndivs, 1, DT_MAX_PATTERN_DIVS);
int nr = LMath.Clamp(nrings, 1, DT_MAX_PATTERN_RINGS); int nr = LMath.Clamp(nrings, 1, DT_MAX_PATTERN_RINGS);
LFloat da = ((LFloat)1.0f / nd) * DT_PI * 2; LFloat da = (LFloat.L1 / nd) * DT_PI * 2;
LFloat ca = LMath.Cos(da); LFloat ca = LMath.Cos(da);
LFloat sa = LMath.Sin(da); LFloat sa = LMath.Sin(da);
@@ -422,7 +424,7 @@ namespace DotRecast.Detour.Crowd
ddir[1] = dvel.Y; ddir[1] = dvel.Y;
ddir[2] = dvel.Z; ddir[2] = dvel.Z;
DtNormalize2D(ddir); DtNormalize2D(ddir);
RcVec3f rotated = DtRotate2D(ddir, da * (LFloat)0.5f); // rotated by da/2 RcVec3f rotated = DtRotate2D(ddir, da * LFloat.L0D5); // rotated by da/2
ddir[3] = rotated.X; ddir[3] = rotated.X;
ddir[4] = rotated.Y; ddir[4] = rotated.Y;
ddir[5] = rotated.Z; ddir[5] = rotated.Z;
@@ -434,7 +436,7 @@ namespace DotRecast.Detour.Crowd
for (int j = 0; j < nr; ++j) for (int j = 0; j < nr; ++j)
{ {
LFloat r = (LFloat)(nr - j) / (LFloat)nr; LFloat r = (nr - j) / nr;
pat[npat * 2 + 0] = ddir[(j % 2) * 3] * r; pat[npat * 2 + 0] = ddir[(j % 2) * 3] * r;
pat[npat * 2 + 1] = ddir[(j % 2) * 3 + 2] * r; pat[npat * 2 + 1] = ddir[(j % 2) * 3 + 2] * r;
int last1 = npat * 2; int last1 = npat * 2;
@@ -464,7 +466,7 @@ namespace DotRecast.Detour.Crowd
} }
// Start sampling. // Start sampling.
LFloat cr = vmax * ((LFloat)1.0f - m_params.velBias); LFloat cr = vmax * (LFloat.L1 - m_params.velBias);
RcVec3f res = new RcVec3f(dvel.X * m_params.velBias, 0, dvel.Z * m_params.velBias); RcVec3f res = new RcVec3f(dvel.X * m_params.velBias, 0, dvel.Z * m_params.velBias);
int ns = 0; int ns = 0;
for (int k = 0; k < depth; ++k) for (int k = 0; k < depth; ++k)
@@ -475,8 +477,8 @@ namespace DotRecast.Detour.Crowd
for (int i = 0; i < npat; ++i) for (int i = 0; i < npat; ++i)
{ {
RcVec3f vcand = new RcVec3f(res.X + pat[i * 2 + 0] * cr, (LFloat)0f, res.Z + pat[i * 2 + 1] * cr); RcVec3f vcand = new RcVec3f(res.X + pat[i * 2 + 0] * cr, LFloat.L0, res.Z + pat[i * 2 + 1] * cr);
if (RcMath.Sqr(vcand.X) + RcMath.Sqr(vcand.Z) > RcMath.Sqr(vmax + (LFloat)0.001f)) if (RcMath.Sqr(vcand.X) + RcMath.Sqr(vcand.Z) > RcMath.Sqr(vmax + LFloat.EPS_1MS))
continue; continue;
LFloat penalty = ProcessSample(vcand, cr / 10, pos, rad, vel, dvel, minPenalty, debug); LFloat penalty = ProcessSample(vcand, cr / 10, pos, rad, vel, dvel, minPenalty, debug);
@@ -490,7 +492,7 @@ namespace DotRecast.Detour.Crowd
res = bvel; res = bvel;
cr *= (LFloat)0.5f; cr *= LFloat.L0D5;
} }
nvel = res; nvel = res;
@@ -136,7 +136,7 @@ namespace DotRecast.Detour.Crowd
/// @return The number of corners returned in the corner buffers. [0 <= value <= @p maxCorners] /// @return The number of corners returned in the corner buffers. [0 <= value <= @p maxCorners]
public int FindCorners(ref List<DtStraightPath> corners, int maxCorners, DtNavMeshQuery navquery, IDtQueryFilter filter) public int FindCorners(ref List<DtStraightPath> corners, int maxCorners, DtNavMeshQuery navquery, IDtQueryFilter filter)
{ {
LFloat MIN_TARGET_DIST = (LFloat)0.01f; LFloat MIN_TARGET_DIST = (new LFloat("",10));
var result = navquery.FindStraightPath(m_pos, m_target, m_path, m_npath, ref corners, maxCorners, 0); var result = navquery.FindStraightPath(m_pos, m_target, m_path, m_npath, ref corners, maxCorners, 0);
if (result.Succeeded()) if (result.Succeeded())
@@ -201,13 +201,13 @@ namespace DotRecast.Detour.Crowd
LFloat dist = RcVecUtils.Dist2D(m_pos, next); LFloat dist = RcVecUtils.Dist2D(m_pos, next);
// If too close to the goal, do not try to optimize. // If too close to the goal, do not try to optimize.
if (dist < 0.01f) if (dist < LFloat.L0)
{ {
return; return;
} }
// Overshoot a little. This helps to optimize open fields in tiled meshes. // Overshoot a little. This helps to optimize open fields in tiled meshes.
dist = LMath.Min(dist + (LFloat)0.01f, pathOptimizationRange); dist = LMath.Min(dist + (new LFloat("",10)), pathOptimizationRange);
// Adjust ray length. // Adjust ray length.
var delta = RcVec3f.Subtract(next, m_pos); var delta = RcVec3f.Subtract(next, m_pos);
@@ -217,7 +217,7 @@ namespace DotRecast.Detour.Crowd
var status = navquery.Raycast(m_path[0], m_pos, goal, filter, out var t, out var norm, ref res); var status = navquery.Raycast(m_path[0], m_pos, goal, filter, out var t, out var norm, ref res);
if (status.Succeeded()) if (status.Succeeded())
{ {
if (res.Count > 1 && t > 0.99f) if (res.Count > 1 && t > new LFloat("",990))
{ {
m_npath = DtPathUtils.MergeCorridorStartShortcut(ref m_path, m_npath, m_maxPath, res, res.Count); m_npath = DtPathUtils.MergeCorridorStartShortcut(ref m_path, m_npath, m_maxPath, res, res.Count);
} }
@@ -35,7 +35,7 @@ namespace DotRecast.Detour.Crowd
public DtProximityGrid(LFloat cellSize) public DtProximityGrid(LFloat cellSize)
{ {
_cellSize = cellSize; _cellSize = cellSize;
_invCellSize = (LFloat)1.0f / cellSize; _invCellSize = LFloat.L1 / cellSize;
_items = new Dictionary<long, List<DtCrowdAgent>>(); _items = new Dictionary<long, List<DtCrowdAgent>>();
} }
@@ -46,9 +46,9 @@ namespace DotRecast.Detour.Dynamic.Colliders
}; };
for (int i = 0; i < 8; ++i) for (int i = 0; i < 8; ++i)
{ {
LFloat s0 = (i & 1) != 0 ? (LFloat)1f : -(LFloat)1f; LFloat s0 = (i & 1) != 0 ? LFloat.L1 : -LFloat.L1;
LFloat s1 = (i & 2) != 0 ? (LFloat)1f : -(LFloat)1f; LFloat s1 = (i & 2) != 0 ? LFloat.L1 : -LFloat.L1;
LFloat s2 = (i & 4) != 0 ? (LFloat)1f : -(LFloat)1f; LFloat s2 = (i & 4) != 0 ? LFloat.L1 : -LFloat.L1;
LFloat vx = center.X + s0 * halfEdges[0].X + s1 * halfEdges[1].X + s2 * halfEdges[2].X; LFloat vx = center.X + s0 * halfEdges[0].X + s1 * halfEdges[1].X + s2 * halfEdges[2].X;
LFloat vy = center.Y + s0 * halfEdges[0].Y + s1 * halfEdges[1].Y + s2 * halfEdges[2].Y; LFloat vy = center.Y + s0 * halfEdges[0].Y + s1 * halfEdges[1].Y + s2 * halfEdges[2].Y;
LFloat vz = center.Z + s0 * halfEdges[0].Z + s1 * halfEdges[1].Z + s2 * halfEdges[2].Z; LFloat vz = center.Z + s0 * halfEdges[0].Z + s1 * halfEdges[1].Z + s2 * halfEdges[2].Z;
@@ -181,7 +181,7 @@ namespace DotRecast.Detour.Dynamic
} }
} }
hit = (LFloat)0.0f; hit = LFloat.L0;
return false; return false;
} }
} }
@@ -74,8 +74,8 @@ namespace DotRecast.Detour.Dynamic.Io
file.regionMergeArea = 6 * file.minRegionArea; file.regionMergeArea = 6 * file.minRegionArea;
file.vertsPerPoly = 6; file.vertsPerPoly = 6;
file.buildMeshDetail = true; file.buildMeshDetail = true;
file.detailSampleDistance = file.maxEdgeLen * (LFloat)0.5f; file.detailSampleDistance = file.maxEdgeLen * LFloat.L0D5;
file.detailSampleMaxError = file.maxSimplificationError * (LFloat)0.8f; file.detailSampleMaxError = file.maxSimplificationError * LFloat.L0D8;
} }
file.useTiles = buf.Get() != 0; file.useTiles = buf.Get() != 0;
@@ -93,9 +93,9 @@ namespace DotRecast.Detour.Dynamic.Io
if (isExportedFromAstar) if (isExportedFromAstar)
{ {
// bounds are saved as center + size // bounds are saved as center + size
file.bounds[0] -= (LFloat)0.5f * file.bounds[3]; file.bounds[0] -= LFloat.L0D5 * file.bounds[3];
file.bounds[1] -= (LFloat)0.5f * file.bounds[4]; file.bounds[1] -= LFloat.L0D5 * file.bounds[4];
file.bounds[2] -= (LFloat)0.5f * file.bounds[5]; file.bounds[2] -= LFloat.L0D5 * file.bounds[5];
file.bounds[3] += file.bounds[0]; file.bounds[3] += file.bounds[0];
file.bounds[4] += file.bounds[1]; file.bounds[4] += file.bounds[1];
file.bounds[5] += file.bounds[2]; file.bounds[5] += file.bounds[2];
@@ -30,7 +30,8 @@ namespace DotRecast.Detour.Extras.Jumplink
for (int i = 0; i < nsamples; ++i) for (int i = 0; i < nsamples; ++i)
{ {
LFloat u = i / (LFloat)(nsamples - 1); // TODO
LFloat u = i.ToLFloat() / (nsamples.ToLFloat() - 1);
GroundSample s = new GroundSample(); GroundSample s = new GroundSample();
seg.gsamples[i] = s; seg.gsamples[i] = s;
@@ -10,9 +10,9 @@ namespace DotRecast.Detour.Extras.Jumplink
{ {
return new RcVec3f() return new RcVec3f()
{ {
X = Lerp(start.X, end.X, LMath.Min((LFloat)2f * u, (LFloat)1f)), X = Lerp(start.X, end.X, LMath.Min(LFloat.L2 * u, LFloat.L1)),
Y = Lerp(start.Y, end.Y, LMath.Max((LFloat)0f, (LFloat)2f * u - (LFloat)1f)), Y = Lerp(start.Y, end.Y, LMath.Max(LFloat.L0, LFloat.L2 * u - LFloat.L1)),
Z = Lerp(start.Z, end.Z, LMath.Min((LFloat)2f * u, (LFloat)1f)) Z = Lerp(start.Z, end.Z, LMath.Min(LFloat.L2 * u, LFloat.L1))
}; };
} }
} }
@@ -41,7 +41,7 @@ namespace DotRecast.Detour.Extras.Jumplink
for (int j = 0; j < nsamples; ++j) for (int j = 0; j < nsamples; ++j)
{ {
LFloat v = (LFloat)j / (LFloat)(nsamples - 1); LFloat v = j.ToLFloat() / (nsamples.ToLFloat() - 1);
LFloat ox = 2 * acfg.agentRadius + dx * v; LFloat ox = 2 * acfg.agentRadius + dx * v;
Trans2d(ref offset, es.az, es.ay, new RcVec2f { X = ox, Y = acfg.minHeight }); Trans2d(ref offset, es.az, es.ay, new RcVec2f { X = ox, Y = acfg.minHeight });
GroundSegment end = new GroundSegment(); GroundSegment end = new GroundSegment();
@@ -72,7 +72,7 @@ namespace DotRecast.Detour.Extras.Jumplink
link.trajectory = es.trajectory; link.trajectory = es.trajectory;
for (int j = 0; j < link.nspine; ++j) for (int j = 0; j < link.nspine; ++j)
{ {
LFloat u = ((LFloat)j) / (link.nspine - 1); LFloat u = j.ToLFloat() / (link.nspine - 1);
RcVec3f p = es.trajectory.Apply(sp, ep, u); RcVec3f p = es.trajectory.Apply(sp, ep, u);
link.spine0[j * 3] = p.X; link.spine0[j * 3] = p.X;
link.spine0[j * 3 + 1] = p.Y; link.spine0[j * 3 + 1] = p.Y;
@@ -25,11 +25,11 @@ namespace DotRecast.Detour.Extras.Jumplink
private LFloat InterpolateHeight(LFloat ys, LFloat ye, LFloat u) private LFloat InterpolateHeight(LFloat ys, LFloat ye, LFloat u)
{ {
if (u == 0f) if (u == LFloat.L0)
{ {
return ys; return ys;
} }
else if (u == 1.0f) else if (u == LFloat.L1)
{ {
return ye; return ye;
} }
@@ -48,14 +48,14 @@ namespace DotRecast.Detour.Extras.Jumplink
h2 = jumpHeight; h2 = jumpHeight;
} }
LFloat t = (LFloat)(LMath.Sqrt(h1) / (LMath.Sqrt(h2) + LMath.Sqrt(h1))); LFloat t = (LMath.Sqrt(h1) / (LMath.Sqrt(h2) + LMath.Sqrt(h1)));
if (u <= t) if (u <= t)
{ {
LFloat v1 = (LFloat)1.0f - (u / t); LFloat v1 = LFloat.L1 - (u / t);
return ys + h1 - h1 * v1 * v1; return ys + h1 - h1 * v1 * v1;
} }
LFloat v = (u - t) / ((LFloat)1.0f - t); LFloat v = (u - t) / (LFloat.L1 - t);
return ys + h1 - h2 * v * v; return ys + h1 - h2 * v * v;
} }
} }
@@ -8,7 +8,7 @@ namespace DotRecast.Detour.Extras.Jumplink
{ {
public LFloat Lerp(LFloat f, LFloat g, LFloat u) public LFloat Lerp(LFloat f, LFloat g, LFloat u)
{ {
return u * g + ((LFloat)1f - u) * f; return u * g + (LFloat.L1 - u) * f;
} }
public virtual RcVec3f Apply(RcVec3f start, RcVec3f end, LFloat u) public virtual RcVec3f Apply(RcVec3f start, RcVec3f end, LFloat u)
@@ -40,7 +40,7 @@ namespace DotRecast.Detour.Extras.Jumplink
int nsamples = LMath.Max(2, (int)LMath.Ceiling(d / cs)); int nsamples = LMath.Max(2, (int)LMath.Ceiling(d / cs));
for (int i = 0; i < nsamples; ++i) for (int i = 0; i < nsamples; ++i)
{ {
LFloat u = (LFloat)i / (LFloat)(nsamples - 1); LFloat u = i.ToLFloat() / (nsamples - 1);
RcVec3f p = tra.Apply(pa, pb, u); RcVec3f p = tra.Apply(pa, pb, u);
if (CheckHeightfieldCollision(solid, p.X, p.Y + acfg.groundTolerance, p.Y + acfg.agentHeight, p.Z)) if (CheckHeightfieldCollision(solid, p.X, p.Y + acfg.groundTolerance, p.Y + acfg.agentHeight, p.Z))
{ {
@@ -25,7 +25,7 @@ namespace DotRecast.Detour.Extras.Unity.Astar
{ {
public class GraphMeshDataReader : ZipBinaryReader public class GraphMeshDataReader : ZipBinaryReader
{ {
public LFloat INT_PRECISION_FACTOR = (LFloat)1000f; public LFloat INT_PRECISION_FACTOR = LFloat.L1000;
public GraphMeshData Read(ZipArchive file, string filename, GraphMeta meta, int maxVertPerPoly) public GraphMeshData Read(ZipArchive file, string filename, GraphMeta meta, int maxVertPerPoly)
{ {
@@ -126,17 +126,17 @@ namespace DotRecast.Detour.Extras.Unity.Astar
header.detailMeshCount = nodeCount; header.detailMeshCount = nodeCount;
header.detailTriCount = nodeCount; header.detailTriCount = nodeCount;
header.maxLinkCount = nodeCount * 3 * 2; // XXX: Needed by Recast, not needed by recast4j header.maxLinkCount = nodeCount * 3 * 2; // XXX: Needed by Recast, not needed by recast4j
header.bmin.X = meta.forcedBoundsCenter.x - (LFloat)0.5f * meta.forcedBoundsSize.x + header.bmin.X = meta.forcedBoundsCenter.x - LFloat.L0D5 * meta.forcedBoundsSize.x +
meta.cellSize * meta.tileSizeX * x; meta.cellSize * meta.tileSizeX * x;
header.bmin.Y = ymin; header.bmin.Y = ymin;
header.bmin.Z = meta.forcedBoundsCenter.z - (LFloat)0.5f * meta.forcedBoundsSize.z + header.bmin.Z = meta.forcedBoundsCenter.z - LFloat.L0D5 * meta.forcedBoundsSize.z +
meta.cellSize * meta.tileSizeZ * z; meta.cellSize * meta.tileSizeZ * z;
header.bmax.X = meta.forcedBoundsCenter.x - (LFloat)0.5f * meta.forcedBoundsSize.x + header.bmax.X = meta.forcedBoundsCenter.x - LFloat.L0D5 * meta.forcedBoundsSize.x +
meta.cellSize * meta.tileSizeX * (x + 1); meta.cellSize * meta.tileSizeX * (x + 1);
header.bmax.Y = ymax; header.bmax.Y = ymax;
header.bmax.Z = meta.forcedBoundsCenter.z - (LFloat)0.5f * meta.forcedBoundsSize.z + header.bmax.Z = meta.forcedBoundsCenter.z - LFloat.L0D5 * meta.forcedBoundsSize.z +
meta.cellSize * meta.tileSizeZ * (z + 1); meta.cellSize * meta.tileSizeZ * (z + 1);
header.bvQuantFactor = (LFloat)1.0f / meta.cellSize; header.bvQuantFactor = LFloat.L1 / meta.cellSize;
header.offMeshBase = nodeCount; header.offMeshBase = nodeCount;
header.walkableClimb = meta.walkableClimb; header.walkableClimb = meta.walkableClimb;
header.walkableHeight = meta.walkableHeight; header.walkableHeight = meta.walkableHeight;
@@ -53,7 +53,7 @@ namespace DotRecast.Detour.Extras.Unity.Astar
{ {
l.clamped1, l.clamped2 l.clamped1, l.clamped2
}; };
connection.rad = (LFloat)0.1f; connection.rad = LFloat.L0D1;
connection.side = startTile == endTile connection.side = startTile == endTile
? 0xFF ? 0xFF
: DtNavMeshBuilder.ClassifyOffMeshPoint(connection.pos[1], startTile.header.bmin, startTile.header.bmax); : DtNavMeshBuilder.ClassifyOffMeshPoint(connection.pos[1], startTile.header.bmin, startTile.header.bmax);
@@ -63,9 +63,9 @@ namespace DotRecast.Detour.Extras.Unity.Astar
option.maxPolys = 32768; option.maxPolys = 32768;
option.tileWidth = graphMeta.tileSizeX * graphMeta.cellSize; option.tileWidth = graphMeta.tileSizeX * graphMeta.cellSize;
option.tileHeight = graphMeta.tileSizeZ * graphMeta.cellSize; option.tileHeight = graphMeta.tileSizeZ * graphMeta.cellSize;
option.orig.X = -(LFloat)0.5f * graphMeta.forcedBoundsSize.x + graphMeta.forcedBoundsCenter.x; option.orig.X = -LFloat.L0D5 * graphMeta.forcedBoundsSize.x + graphMeta.forcedBoundsCenter.x;
option.orig.Y = -(LFloat)0.5f * graphMeta.forcedBoundsSize.y + graphMeta.forcedBoundsCenter.y; option.orig.Y = -LFloat.L0D5 * graphMeta.forcedBoundsSize.y + graphMeta.forcedBoundsCenter.y;
option.orig.Z = -(LFloat)0.5f * graphMeta.forcedBoundsSize.z + graphMeta.forcedBoundsCenter.z; option.orig.Z = -LFloat.L0D5 * graphMeta.forcedBoundsSize.z + graphMeta.forcedBoundsCenter.z;
DtNavMesh mesh = new DtNavMesh(option, 3); DtNavMesh mesh = new DtNavMesh(option, 3);
foreach (DtMeshData t in graphMeshData.tiles) foreach (DtMeshData t in graphMeshData.tiles)
{ {
@@ -378,10 +378,10 @@ namespace DotRecast.Detour.TileCache
ob.type = DtTileCacheObstacleType.ORIENTED_BOX; ob.type = DtTileCacheObstacleType.ORIENTED_BOX;
ob.center = center; ob.center = center;
ob.extents = extents; ob.extents = extents;
LFloat coshalf = LMath.Cos((LFloat)0.5f * yRadians); LFloat coshalf = LMath.Cos(LFloat.L0D5 * yRadians);
LFloat sinhalf = LMath.Sin(-(LFloat)0.5f * yRadians); LFloat sinhalf = LMath.Sin(-LFloat.L0D5 * yRadians);
ob.rotAux[0] = coshalf * sinhalf; ob.rotAux[0] = coshalf * sinhalf;
ob.rotAux[1] = coshalf * coshalf - (LFloat)0.5f; ob.rotAux[1] = coshalf * coshalf - LFloat.L0D5;
return AddObstacleRequest(ob).refs; return AddObstacleRequest(ob).refs;
} }
@@ -710,7 +710,7 @@ namespace DotRecast.Detour.TileCache
} }
else if (ob.type == DtTileCacheObstacleType.ORIENTED_BOX) else if (ob.type == DtTileCacheObstacleType.ORIENTED_BOX)
{ {
LFloat maxr = (LFloat)1.41f * LMath.Max(ob.extents.X, ob.extents.Z); LFloat maxr = new LFloat("",1410) * LMath.Max(ob.extents.X, ob.extents.Z);
bmin.X = ob.center.X - maxr; bmin.X = ob.center.X - maxr;
bmax.X = ob.center.X + maxr; bmax.X = ob.center.X + maxr;
bmin.Y = ob.center.Y - ob.extents.Y; bmin.Y = ob.center.Y - ob.extents.Y;
@@ -609,7 +609,7 @@ namespace DotRecast.Detour.TileCache
int lh = layer.heights[idx]; int lh = layer.heights[idx];
if (LMath.Abs(lh - y) <= walkableClimb && layer.areas[idx] != DT_TILECACHE_NULL_AREA) if (LMath.Abs(lh - y) <= walkableClimb && layer.areas[idx] != DT_TILECACHE_NULL_AREA)
{ {
height = LMath.Max(height, (LFloat)(char)lh); height = LMath.Max(height, lh);
portal &= (layer.cons[idx] >> 4); portal &= (layer.cons[idx] >> 4);
if (preg != 0xff && preg != layer.regs[idx]) if (preg != 0xff && preg != layer.regs[idx])
allSameReg = false; allSameReg = false;
@@ -1812,12 +1812,12 @@ namespace DotRecast.Detour.TileCache
bmax.X = pos.X + radius; bmax.X = pos.X + radius;
bmax.Y = pos.Y + height; bmax.Y = pos.Y + height;
bmax.Z = pos.Z + radius; bmax.Z = pos.Z + radius;
LFloat r2 = RcMath.Sqr(radius / cs + (LFloat)0.5f); LFloat r2 = RcMath.Sqr(radius / cs + LFloat.L0D5);
int w = layer.header.width; int w = layer.header.width;
int h = layer.header.height; int h = layer.header.height;
LFloat ics = (LFloat)1.0f / cs; LFloat ics = LFloat.L1 / cs;
LFloat ich = (LFloat)1.0f / ch; LFloat ich = LFloat.L1 / ch;
LFloat px = (pos.X - orig.X) * ics; LFloat px = (pos.X - orig.X) * ics;
LFloat pz = (pos.Z - orig.Z) * ics; LFloat pz = (pos.Z - orig.Z) * ics;
@@ -1851,8 +1851,8 @@ namespace DotRecast.Detour.TileCache
{ {
for (int x = minx; x <= maxx; ++x) for (int x = minx; x <= maxx; ++x)
{ {
LFloat dx = x + (LFloat)0.5f - px; LFloat dx = x + LFloat.L0D5 - px;
LFloat dz = z + (LFloat)0.5f - pz; LFloat dz = z + LFloat.L0D5 - pz;
if (dx * dx + dz * dz > r2) if (dx * dx + dz * dz > r2)
continue; continue;
int y = layer.heights[x + z * w]; int y = layer.heights[x + z * w];
@@ -1867,8 +1867,8 @@ namespace DotRecast.Detour.TileCache
{ {
int w = layer.header.width; int w = layer.header.width;
int h = layer.header.height; int h = layer.header.height;
LFloat ics = (LFloat)1.0f / cs; LFloat ics = LFloat.L1 / cs;
LFloat ich = (LFloat)1.0f / ch; LFloat ich = LFloat.L1 / ch;
int minx = (int)LMath.Floor((bmin.X - orig.X) * ics); int minx = (int)LMath.Floor((bmin.X - orig.X) * ics);
int miny = (int)LMath.Floor((bmin.Y - orig.Y) * ich); int miny = (int)LMath.Floor((bmin.Y - orig.Y) * ich);
@@ -1996,13 +1996,13 @@ namespace DotRecast.Detour.TileCache
{ {
int w = layer.header.width; int w = layer.header.width;
int h = layer.header.height; int h = layer.header.height;
LFloat ics = (LFloat)1.0f / cs; LFloat ics = LFloat.L1 / cs;
LFloat ich = (LFloat)1.0f / ch; LFloat ich = LFloat.L1 / ch;
LFloat cx = (center.X - orig.X) * ics; LFloat cx = (center.X - orig.X) * ics;
LFloat cz = (center.Z - orig.Z) * ics; LFloat cz = (center.Z - orig.Z) * ics;
LFloat maxr = (LFloat)1.41f * LMath.Max(extents.X, extents.Z); LFloat maxr = new LFloat("",1410) * LMath.Max(extents.X, extents.Z);
int minx = (int)LMath.Floor(cx - maxr * ics); int minx = (int)LMath.Floor(cx - maxr * ics);
int maxx = (int)LMath.Floor(cx + maxr * ics); int maxx = (int)LMath.Floor(cx + maxr * ics);
int minz = (int)LMath.Floor(cz - maxr * ics); int minz = (int)LMath.Floor(cz - maxr * ics);
@@ -2028,14 +2028,14 @@ namespace DotRecast.Detour.TileCache
if (maxz >= h) if (maxz >= h)
maxz = h - 1; maxz = h - 1;
LFloat xhalf = extents.X * ics + (LFloat)0.5f; LFloat xhalf = extents.X * ics + LFloat.L0D5;
LFloat zhalf = extents.Z * ics + (LFloat)0.5f; LFloat zhalf = extents.Z * ics + LFloat.L0D5;
for (int z = minz; z <= maxz; ++z) for (int z = minz; z <= maxz; ++z)
{ {
for (int x = minx; x <= maxx; ++x) for (int x = minx; x <= maxx; ++x)
{ {
LFloat x2 = (LFloat)2.0f * (x - cx); LFloat x2 = LFloat.L2 * (x - cx);
LFloat z2 = (LFloat)2.0f * (z - cz); LFloat z2 = LFloat.L2 * (z - cz);
LFloat xrot = rotAux[1] * x2 + rotAux[0] * z2; LFloat xrot = rotAux[1] * x2 + rotAux[0] * z2;
if (xrot > xhalf || xrot < -xhalf) if (xrot > xhalf || xrot < -xhalf)
continue; continue;
@@ -34,7 +34,7 @@ namespace DotRecast.Detour.TileCache
public LFloat radius, height; public LFloat radius, height;
public RcVec3f center = new RcVec3f(); public RcVec3f center = new RcVec3f();
public RcVec3f extents = new RcVec3f(); public RcVec3f extents = new RcVec3f();
public readonly LFloat[] rotAux = new LFloat[2]; // { Cos(0.5f*angle)*Sin(-0.5f*angle); Cos(0.5f*angle)*Cos(0.5f*angle) - 0.5 } public readonly LFloat[] rotAux = new LFloat[2]; // { Cos(LFloat.L0D5*angle)*Sin(-LFloat.L0D5*angle); Cos(LFloat.L0D5*angle)*Cos(LFloat.L0D5*angle) - 0.5 }
public List<long> touched = new List<long>(); public List<long> touched = new List<long>();
public readonly List<long> pending = new List<long>(); public readonly List<long> pending = new List<long>();
@@ -29,7 +29,7 @@ namespace DotRecast.Detour
*/ */
public static class DtConvexConvexIntersections public static class DtConvexConvexIntersections
{ {
private static LFloat EPSILON = (LFloat)0.0001f; private static LFloat EPSILON = LFloat.EPS_1MS;
public static LFloat[] Intersect(LFloat[] p, LFloat[] q) public static LFloat[] Intersect(LFloat[] p, LFloat[] q)
{ {
@@ -68,10 +68,10 @@ namespace DotRecast.Detour
LFloat bHA = DtUtils.TriArea2D(a1, a, b); LFloat bHA = DtUtils.TriArea2D(a1, a, b);
if (LMath.Abs(cross) < EPSILON) if (LMath.Abs(cross) < EPSILON)
{ {
cross = (LFloat)0f; cross = LFloat.L0;
} }
bool parallel = cross == 0f; bool parallel = cross == LFloat.L0;
DtConvexConvexIntersection code = parallel ? ParallelInt(a1, a, b1, b, ref ip, ref iq) : SegSegInt(a1, a, b1, b, ref ip, ref iq); DtConvexConvexIntersection code = parallel ? ParallelInt(a1, a, b1, b, ref ip, ref iq) : SegSegInt(a1, a, b1, b, ref ip, ref iq);
if (code == DtConvexConvexIntersection.Single) if (code == DtConvexConvexIntersection.Single)
@@ -97,7 +97,7 @@ namespace DotRecast.Detour
} }
/* Special case: A & B parallel and separated. */ /* Special case: A & B parallel and separated. */
if (parallel && aHB < 0f && bHA < 0f) if (parallel && aHB < LFloat.L0 && bHA < LFloat.L0)
{ {
return null; return null;
} }
@@ -217,7 +217,7 @@ namespace DotRecast.Detour
{ {
if (DtUtils.IntersectSegSeg2D(a, b, c, d, out var s, out var t)) if (DtUtils.IntersectSegSeg2D(a, b, c, d, out var s, out var t))
{ {
if (s >= 0.0f && s <= 1.0f && t >= 0.0f && t <= 1.0f) if (s >= LFloat.L0 && s <= LFloat.L1 && t >= LFloat.L0 && t <= LFloat.L1)
{ {
p.X = a.X + (b.X - a.X) * s; p.X = a.X + (b.X - a.X) * s;
p.Y = a.Y + (b.Y - a.Y) * s; p.Y = a.Y + (b.Y - a.Y) * s;
@@ -25,7 +25,7 @@ namespace DotRecast.Detour
{ {
public class DtDefaultQueryHeuristic : IDtQueryHeuristic public class DtDefaultQueryHeuristic : IDtQueryHeuristic
{ {
public static LFloat H_SCALE = (LFloat)0.999f; // Search heuristic scale. public static LFloat H_SCALE = new LFloat("",999); // Search heuristic scale.
public static readonly DtDefaultQueryHeuristic Default = new DtDefaultQueryHeuristic(H_SCALE); public static readonly DtDefaultQueryHeuristic Default = new DtDefaultQueryHeuristic(H_SCALE);
private readonly LFloat scale; private readonly LFloat scale;
@@ -7,7 +7,7 @@ namespace DotRecast.Detour
public static readonly DtFindPathOption NoOption = new DtFindPathOption(DtDefaultQueryHeuristic.Default, 0, 0); public static readonly DtFindPathOption NoOption = new DtFindPathOption(DtDefaultQueryHeuristic.Default, 0, 0);
public static readonly DtFindPathOption AnyAngle = new DtFindPathOption(DtDefaultQueryHeuristic.Default, DtFindPathOptions.DT_FINDPATH_ANY_ANGLE, LFloat.MaxValue); public static readonly DtFindPathOption AnyAngle = new DtFindPathOption(DtDefaultQueryHeuristic.Default, DtFindPathOptions.DT_FINDPATH_ANY_ANGLE, LFloat.MaxValue);
public static readonly DtFindPathOption ZeroScale = new DtFindPathOption(new DtDefaultQueryHeuristic((LFloat)0.0f), 0, 0); public static readonly DtFindPathOption ZeroScale = new DtFindPathOption(new DtDefaultQueryHeuristic(LFloat.L0), 0, 0);
public readonly IDtQueryHeuristic heuristic; public readonly IDtQueryHeuristic heuristic;
public readonly int options; public readonly int options;
@@ -67,7 +67,7 @@ namespace DotRecast.Detour
/// Limit raycasting during any angle pahfinding /// Limit raycasting during any angle pahfinding
/// The limit is given as a multiple of the character radius /// The limit is given as a multiple of the character radius
public static LFloat DT_RAY_CAST_LIMIT_PROPORTIONS = (LFloat)50.0f; public static LFloat DT_RAY_CAST_LIMIT_PROPORTIONS = LFloat.L50;
private readonly DtNavMeshParams m_params; // < Current initialization params. TODO: do not store this info twice. private readonly DtNavMeshParams m_params; // < Current initialization params. TODO: do not store this info twice.
private readonly RcVec3f m_orig; // < Origin of the tile (0,0) private readonly RcVec3f m_orig; // < Origin of the tile (0,0)
@@ -823,8 +823,8 @@ namespace DotRecast.Detour
tmax = temp; tmax = temp;
} }
link.bmin = (int)LMath.Round(LMath.Clamp(tmin, (LFloat)0.0f, (LFloat)1.0f) * (LFloat)255.0f); link.bmin = (int)LMath.Round(LMath.Clamp(tmin, LFloat.L0, LFloat.L1) * LFloat.L255);
link.bmax = (int)LMath.Round(LMath.Clamp(tmax, (LFloat)0.0f, (LFloat)1.0f) * (LFloat)255.0f); link.bmax = (int)LMath.Round(LMath.Clamp(tmax, LFloat.L0, LFloat.L1) * LFloat.L255);
} }
else if (dir == 2 || dir == 6) else if (dir == 2 || dir == 6)
{ {
@@ -839,8 +839,8 @@ namespace DotRecast.Detour
tmax = temp; tmax = temp;
} }
link.bmin = (int)LMath.Round(LMath.Clamp(tmin, (LFloat)0.0f, (LFloat)1.0f) * (LFloat)255.0f); link.bmin = (int)LMath.Round(LMath.Clamp(tmin, LFloat.L0, LFloat.L1) * LFloat.L255);
link.bmax = (int)LMath.Round(LMath.Clamp(tmax, (LFloat)0.0f, (LFloat)1.0f) * (LFloat)255.0f); link.bmax = (int)LMath.Round(LMath.Clamp(tmax, LFloat.L0, LFloat.L1) * LFloat.L255);
} }
} }
} }
@@ -968,7 +968,7 @@ namespace DotRecast.Detour
int vd = poly.verts[(j + 1) % nv] * 3; int vd = poly.verts[(j + 1) % nv] * 3;
LFloat bpos = GetSlabCoord(tile.data.verts, vc, side); LFloat bpos = GetSlabCoord(tile.data.verts, vc, side);
// Segments are not close enough. // Segments are not close enough.
if (LMath.Abs(apos - bpos) > 0.01f) if (LMath.Abs(apos - bpos) > new LFloat("",10))
{ {
continue; continue;
} }
@@ -976,7 +976,7 @@ namespace DotRecast.Detour
// Check if the segments touch. // Check if the segments touch.
CalcSlabEndPoints(tile.data.verts, vc, vd, ref bmin, ref bmax, side); CalcSlabEndPoints(tile.data.verts, vc, vd, ref bmin, ref bmax, side);
if (!OverlapSlabs(amin, amax, bmin, bmax, (LFloat)0.01f, tile.data.header.walkableClimb)) if (!OverlapSlabs(amin, amax, bmin, bmax, (new LFloat("",10)), tile.data.header.walkableClimb))
{ {
continue; continue;
} }
@@ -1774,7 +1774,7 @@ namespace DotRecast.Detour
center.Z += tile.data.verts[v + 2]; center.Z += tile.data.verts[v + 2];
} }
LFloat s = (LFloat)1.0f / poly.vertCount; LFloat s = LFloat.L1 / poly.vertCount;
center.X *= s; center.X *= s;
center.Y *= s; center.Y *= s;
center.Z *= s; center.Z *= s;
@@ -439,7 +439,7 @@ namespace DotRecast.Detour
header.detailMeshCount = option.polyCount; header.detailMeshCount = option.polyCount;
header.detailVertCount = uniqueDetailVertCount; header.detailVertCount = uniqueDetailVertCount;
header.detailTriCount = detailTriCount; header.detailTriCount = detailTriCount;
header.bvQuantFactor = (LFloat)1.0f / option.cs; header.bvQuantFactor = LFloat.L1 / option.cs;
header.offMeshBase = option.polyCount; header.offMeshBase = option.polyCount;
header.walkableHeight = option.walkableHeight; header.walkableHeight = option.walkableHeight;
header.walkableRadius = option.walkableRadius; header.walkableRadius = option.walkableRadius;
@@ -66,7 +66,7 @@ namespace DotRecast.Detour
// Randomly pick one tile. Assume that all tiles cover roughly the same area. // Randomly pick one tile. Assume that all tiles cover roughly the same area.
DtMeshTile tile = null; DtMeshTile tile = null;
LFloat tsum = (LFloat)0.0f; LFloat tsum = LFloat.L0;
for (int i = 0; i < m_nav.GetMaxTiles(); i++) for (int i = 0; i < m_nav.GetMaxTiles(); i++)
{ {
DtMeshTile mt = m_nav.GetTile(i); DtMeshTile mt = m_nav.GetTile(i);
@@ -76,7 +76,7 @@ namespace DotRecast.Detour
} }
// Choose random tile using reservoir sampling. // Choose random tile using reservoir sampling.
LFloat area = (LFloat)1.0f; // Could be tile area too. LFloat area = LFloat.L1; // Could be tile area too.
tsum += area; tsum += area;
LFloat u = frand.Next(); LFloat u = frand.Next();
if (u * tsum <= area) if (u * tsum <= area)
@@ -95,7 +95,7 @@ namespace DotRecast.Detour
long polyRef = 0; long polyRef = 0;
long @base = m_nav.GetPolyRefBase(tile); long @base = m_nav.GetPolyRefBase(tile);
LFloat areaSum = (LFloat)0.0f; LFloat areaSum = LFloat.L0;
for (int i = 0; i < tile.data.header.polyCount; ++i) for (int i = 0; i < tile.data.header.polyCount; ++i)
{ {
DtPoly p = tile.data.polys[i]; DtPoly p = tile.data.polys[i];
@@ -113,7 +113,7 @@ namespace DotRecast.Detour
} }
// Calc area of the polygon. // Calc area of the polygon.
LFloat polyArea = (LFloat)0.0f; LFloat polyArea = LFloat.L0;
for (int j = 2; j < p.vertCount; ++j) for (int j = 2; j < p.vertCount; ++j)
{ {
int va = p.verts[0] * 3; int va = p.verts[0] * 3;
@@ -243,7 +243,7 @@ namespace DotRecast.Detour
DtStatus status = DtStatus.DT_SUCCESS; DtStatus status = DtStatus.DT_SUCCESS;
LFloat radiusSqr = maxRadius * maxRadius; LFloat radiusSqr = maxRadius * maxRadius;
LFloat areaSum = (LFloat)0.0f; LFloat areaSum = LFloat.L0;
DtPoly randomPoly = null; DtPoly randomPoly = null;
long randomPolyRef = 0; long randomPolyRef = 0;
@@ -263,7 +263,7 @@ namespace DotRecast.Detour
if (bestPoly.GetPolyType() == DtPolyTypes.DT_POLYTYPE_GROUND) if (bestPoly.GetPolyType() == DtPolyTypes.DT_POLYTYPE_GROUND)
{ {
// Calc area of the polygon. // Calc area of the polygon.
LFloat polyArea = (LFloat)0.0f; LFloat polyArea = LFloat.L0;
LFloat[] polyVerts = new LFloat[bestPoly.vertCount * 3]; LFloat[] polyVerts = new LFloat[bestPoly.vertCount * 3];
for (int j = 0; j < bestPoly.vertCount; ++j) for (int j = 0; j < bestPoly.vertCount; ++j)
{ {
@@ -350,7 +350,7 @@ namespace DotRecast.Detour
// Cost // Cost
if (neighbourNode.flags == 0) if (neighbourNode.flags == 0)
{ {
neighbourNode.pos = RcVec3f.Lerp(va, vb, (LFloat)0.5f); neighbourNode.pos = RcVec3f.Lerp(va, vb, LFloat.L0D5);
} }
LFloat total = bestNode.total + RcVec3f.Distance(bestNode.pos, neighbourNode.pos); LFloat total = bestNode.total + RcVec3f.Distance(bestNode.pos, neighbourNode.pos);
@@ -770,7 +770,7 @@ namespace DotRecast.Detour
LFloat raycastLimitSqr = RcMath.Sqr(raycastLimit); LFloat raycastLimitSqr = RcMath.Sqr(raycastLimit);
// trade quality with performance? // trade quality with performance?
if ((options & DtFindPathOptions.DT_FINDPATH_ANY_ANGLE) != 0 && raycastLimit < 0f) if ((options & DtFindPathOptions.DT_FINDPATH_ANY_ANGLE) != 0 && raycastLimit < LFloat.L0)
{ {
// limiting to several times the character radius yields nice results. It is not sensitive // limiting to several times the character radius yields nice results. It is not sensitive
// so it is enough to compute it from the first tile. // so it is enough to compute it from the first tile.
@@ -904,7 +904,7 @@ namespace DotRecast.Detour
DtRaycastOptions.DT_RAYCAST_USE_COSTS, ref rayHit, grandpaRef); DtRaycastOptions.DT_RAYCAST_USE_COSTS, ref rayHit, grandpaRef);
if (rayStatus.Succeeded()) if (rayStatus.Succeeded())
{ {
foundShortCut = rayHit.t >= 1.0f; foundShortCut = rayHit.t >= LFloat.L1;
if (foundShortCut) if (foundShortCut)
{ {
shortcut = new List<long>(rayHit.path); shortcut = new List<long>(rayHit.path);
@@ -1012,7 +1012,7 @@ namespace DotRecast.Detour
*/ */
public DtStatus InitSlicedFindPath(long startRef, long endRef, RcVec3f startPos, RcVec3f endPos, IDtQueryFilter filter, int options) public DtStatus InitSlicedFindPath(long startRef, long endRef, RcVec3f startPos, RcVec3f endPos, IDtQueryFilter filter, int options)
{ {
return InitSlicedFindPath(startRef, endRef, startPos, endPos, filter, options, DtDefaultQueryHeuristic.Default, -(LFloat)1.0f); return InitSlicedFindPath(startRef, endRef, startPos, endPos, filter, options, DtDefaultQueryHeuristic.Default, -LFloat.L1);
} }
public DtStatus InitSlicedFindPath(long startRef, long endRef, RcVec3f startPos, RcVec3f endPos, IDtQueryFilter filter, int options, LFloat raycastLimit) public DtStatus InitSlicedFindPath(long startRef, long endRef, RcVec3f startPos, RcVec3f endPos, IDtQueryFilter filter, int options, LFloat raycastLimit)
@@ -1041,7 +1041,7 @@ namespace DotRecast.Detour
} }
// trade quality with performance? // trade quality with performance?
if ((options & DtFindPathOptions.DT_FINDPATH_ANY_ANGLE) != 0 && raycastLimit < 0f) if ((options & DtFindPathOptions.DT_FINDPATH_ANY_ANGLE) != 0 && raycastLimit < LFloat.L0)
{ {
// limiting to several times the character radius yields nice results. It is not sensitive // limiting to several times the character radius yields nice results. It is not sensitive
// so it is enough to compute it from the first tile. // so it is enough to compute it from the first tile.
@@ -1228,7 +1228,7 @@ namespace DotRecast.Detour
DtRaycastOptions.DT_RAYCAST_USE_COSTS, ref rayHit, grandpaRef); DtRaycastOptions.DT_RAYCAST_USE_COSTS, ref rayHit, grandpaRef);
if (status.Succeeded()) if (status.Succeeded())
{ {
foundShortCut = rayHit.t >= 1.0f; foundShortCut = rayHit.t >= LFloat.L1;
if (foundShortCut) if (foundShortCut)
{ {
shortcut = new List<long>(rayHit.path); shortcut = new List<long>(rayHit.path);
@@ -1616,7 +1616,7 @@ namespace DotRecast.Detour
if (i == 0) if (i == 0)
{ {
var distSqr = DtUtils.DistancePtSegSqr2D(portalApex, left, right, out var t); var distSqr = DtUtils.DistancePtSegSqr2D(portalApex, left, right, out var t);
if (distSqr < RcMath.Sqr((LFloat)0.001f)) if (distSqr < RcMath.Sqr(LFloat.EPS_1MS))
{ {
continue; continue;
} }
@@ -1631,9 +1631,9 @@ namespace DotRecast.Detour
} }
// Right vertex. // Right vertex.
if (DtUtils.TriArea2D(portalApex, portalRight, right) <= 0.0f) if (DtUtils.TriArea2D(portalApex, portalRight, right) <= (LFloat.L0))
{ {
if (DtUtils.VEqual(portalApex, portalRight) || DtUtils.TriArea2D(portalApex, portalLeft, right) > 0.0f) if (DtUtils.VEqual(portalApex, portalRight) || DtUtils.TriArea2D(portalApex, portalLeft, right) > (LFloat.L0))
{ {
portalRight = right; portalRight = right;
rightPolyRef = (i + 1 < pathSize) ? path[i + 1] : 0; rightPolyRef = (i + 1 < pathSize) ? path[i + 1] : 0;
@@ -1687,9 +1687,9 @@ namespace DotRecast.Detour
} }
// Left vertex. // Left vertex.
if (DtUtils.TriArea2D(portalApex, portalLeft, left) >= 0.0f) if (DtUtils.TriArea2D(portalApex, portalLeft, left) >= (LFloat.L0))
{ {
if (DtUtils.VEqual(portalApex, portalLeft) || DtUtils.TriArea2D(portalApex, portalRight, left) < 0.0f) if (DtUtils.VEqual(portalApex, portalLeft) || DtUtils.TriArea2D(portalApex, portalRight, left) < (LFloat.L0))
{ {
portalLeft = left; portalLeft = left;
leftPolyRef = (i + 1 < pathSize) ? path[i + 1] : 0; leftPolyRef = (i + 1 < pathSize) ? path[i + 1] : 0;
@@ -1823,8 +1823,8 @@ namespace DotRecast.Detour
bestPos = startPos; bestPos = startPos;
// Search constraints // Search constraints
var searchPos = RcVec3f.Lerp(startPos, endPos, (LFloat)0.5f); var searchPos = RcVec3f.Lerp(startPos, endPos, LFloat.L0D5);
LFloat searchRadSqr = RcMath.Sqr(RcVec3f.Distance(startPos, endPos) / (LFloat)2.0f + (LFloat)0.001f); LFloat searchRadSqr = RcMath.Sqr(RcVec3f.Distance(startPos, endPos) / LFloat.L2 + LFloat.EPS_1MS);
Span<LFloat> verts = stackalloc LFloat[m_nav.GetMaxVertsPerPoly() * 3]; Span<LFloat> verts = stackalloc LFloat[m_nav.GetMaxVertsPerPoly() * 3];
@@ -2089,7 +2089,7 @@ namespace DotRecast.Detour
// Unpack portal limits. // Unpack portal limits.
if (link.bmin != 0 || link.bmax != 255) if (link.bmin != 0 || link.bmax != 255)
{ {
LFloat s = (LFloat)1.0f / (LFloat)255.0f; LFloat s = LFloat.L1 / LFloat.L255;
LFloat tmin = link.bmin * s; LFloat tmin = link.bmin * s;
LFloat tmax = link.bmax * s; LFloat tmax = link.bmax * s;
left = RcVecUtils.Lerp(fromTile.data.verts, v0 * 3, v1 * 3, tmin); left = RcVecUtils.Lerp(fromTile.data.verts, v0 * 3, v1 * 3, tmin);
@@ -2109,9 +2109,9 @@ namespace DotRecast.Detour
return DtStatus.DT_FAILURE | DtStatus.DT_INVALID_PARAM; return DtStatus.DT_FAILURE | DtStatus.DT_INVALID_PARAM;
} }
mid.X = (left.X + right.X) * (LFloat)0.5f; mid.X = (left.X + right.X) * LFloat.L0D5;
mid.Y = (left.Y + right.Y) * (LFloat)0.5f; mid.Y = (left.Y + right.Y) * LFloat.L0D5;
mid.Z = (left.Z + right.Z) * (LFloat)0.5f; mid.Z = (left.Z + right.Z) * LFloat.L0D5;
return DtStatus.DT_SUCCESS; return DtStatus.DT_SUCCESS;
} }
@@ -2126,10 +2126,10 @@ namespace DotRecast.Detour
return DtStatus.DT_FAILURE; return DtStatus.DT_FAILURE;
} }
LFloat t = (LFloat)0.5f; LFloat t = LFloat.L0D5;
if (DtUtils.IntersectSegSeg2D(fromPos, toPos, left, right, out var _, out var t2)) if (DtUtils.IntersectSegSeg2D(fromPos, toPos, left, right, out var _, out var t2))
{ {
t = LMath.Clamp(t2, (LFloat)0.1f, (LFloat)0.9f); t = LMath.Clamp(t2, LFloat.L0D1, LFloat.L0D9);
} }
pt = RcVec3f.Lerp(left, right, t); pt = RcVec3f.Lerp(left, right, t);
@@ -2378,7 +2378,7 @@ namespace DotRecast.Detour
if (link.side == 0 || link.side == 4) if (link.side == 0 || link.side == 4)
{ {
// Calculate link size. // Calculate link size.
LFloat s = (LFloat)1.0f / (LFloat)255.0f; LFloat s = LFloat.L1 / LFloat.L255;
LFloat lmin = tile.data.verts[left + 2] LFloat lmin = tile.data.verts[left + 2]
+ (tile.data.verts[right + 2] - tile.data.verts[left + 2]) * (link.bmin * s); + (tile.data.verts[right + 2] - tile.data.verts[left + 2]) * (link.bmin * s);
LFloat lmax = tile.data.verts[left + 2] LFloat lmax = tile.data.verts[left + 2]
@@ -2399,7 +2399,7 @@ namespace DotRecast.Detour
else if (link.side == 2 || link.side == 6) else if (link.side == 2 || link.side == 6)
{ {
// Calculate link size. // Calculate link size.
LFloat s = (LFloat)1.0f / (LFloat)255.0f; LFloat s = LFloat.L1 / LFloat.L255;
LFloat lmin = tile.data.verts[left] LFloat lmin = tile.data.verts[left]
+ (tile.data.verts[right] - tile.data.verts[left]) * (link.bmin * s); + (tile.data.verts[right] - tile.data.verts[left]) * (link.bmin * s);
LFloat lmax = tile.data.verts[left] LFloat lmax = tile.data.verts[left]
@@ -2612,7 +2612,7 @@ namespace DotRecast.Detour
// Cost // Cost
if (neighbourNode.flags == 0) if (neighbourNode.flags == 0)
{ {
neighbourNode.pos = RcVec3f.Lerp(va, vb, (LFloat)0.5f); neighbourNode.pos = RcVec3f.Lerp(va, vb, LFloat.L0D5);
} }
LFloat cost = filter.GetCost(bestNode.pos, neighbourNode.pos, parentRef, parentTile, parentPoly, bestRef, LFloat cost = filter.GetCost(bestNode.pos, neighbourNode.pos, parentRef, parentTile, parentPoly, bestRef,
@@ -2702,7 +2702,7 @@ namespace DotRecast.Detour
centerPos += verts[i]; centerPos += verts[i];
} }
LFloat scale = (LFloat)1.0f / nverts; LFloat scale = LFloat.L1 / nverts;
centerPos.X *= scale; centerPos.X *= scale;
centerPos.Y *= scale; centerPos.Y *= scale;
centerPos.Z *= scale; centerPos.Z *= scale;
@@ -2779,7 +2779,7 @@ namespace DotRecast.Detour
continue; continue;
} }
if (tmin > 1.0f || tmax < 0.0f) if (tmin > LFloat.L1 || tmax < (LFloat.L0))
{ {
continue; continue;
} }
@@ -2794,7 +2794,7 @@ namespace DotRecast.Detour
// Cost // Cost
if (neighbourNode.flags == 0) if (neighbourNode.flags == 0)
{ {
neighbourNode.pos = RcVec3f.Lerp(va, vb, (LFloat)0.5f); neighbourNode.pos = RcVec3f.Lerp(va, vb, LFloat.L0D5);
} }
LFloat cost = filter.GetCost(bestNode.pos, neighbourNode.pos, parentRef, parentTile, parentPoly, bestRef, LFloat cost = filter.GetCost(bestNode.pos, neighbourNode.pos, parentRef, parentTile, parentPoly, bestRef,
@@ -3137,8 +3137,8 @@ namespace DotRecast.Detour
// Portal segment. // Portal segment.
if (storePortals && ints[k].refs != 0) if (storePortals && ints[k].refs != 0)
{ {
LFloat tmin = ints[k].tmin / (LFloat)255.0f; LFloat tmin = ints[k].tmin / LFloat.L255;
LFloat tmax = ints[k].tmax / (LFloat)255.0f; LFloat tmax = ints[k].tmax / LFloat.L255;
var seg = new RcSegmentVert(); var seg = new RcSegmentVert();
seg.vmin = RcVecUtils.Lerp(tile.data.verts, vj, vi, tmin); seg.vmin = RcVecUtils.Lerp(tile.data.verts, vj, vi, tmin);
seg.vmax = RcVecUtils.Lerp(tile.data.verts, vj, vi, tmax); seg.vmax = RcVecUtils.Lerp(tile.data.verts, vj, vi, tmax);
@@ -3151,8 +3151,8 @@ namespace DotRecast.Detour
int imax = ints[k].tmin; int imax = ints[k].tmin;
if (imin != imax) if (imin != imax)
{ {
LFloat tmin = imin / (LFloat)255.0f; LFloat tmin = imin / LFloat.L255;
LFloat tmax = imax / (LFloat)255.0f; LFloat tmax = imax / LFloat.L255;
var seg = new RcSegmentVert(); var seg = new RcSegmentVert();
seg.vmin = RcVecUtils.Lerp(tile.data.verts, vj, vi, tmin); seg.vmin = RcVecUtils.Lerp(tile.data.verts, vj, vi, tmin);
seg.vmax = RcVecUtils.Lerp(tile.data.verts, vj, vi, tmax); seg.vmax = RcVecUtils.Lerp(tile.data.verts, vj, vi, tmax);
@@ -30,7 +30,7 @@ namespace DotRecast.Detour
{ {
public static bool Raycast(DtNavMesh mesh, RcVec3f src, RcVec3f dst, out LFloat hitTime) public static bool Raycast(DtNavMesh mesh, RcVec3f src, RcVec3f dst, out LFloat hitTime)
{ {
hitTime = (LFloat)0.0f; hitTime = LFloat.L0;
for (int t = 0; t < mesh.GetMaxTiles(); ++t) for (int t = 0; t < mesh.GetMaxTiles(); ++t)
{ {
DtMeshTile tile = mesh.GetTile(t); DtMeshTile tile = mesh.GetTile(t);
@@ -48,7 +48,7 @@ namespace DotRecast.Detour
private static bool Raycast(DtMeshTile tile, RcVec3f sp, RcVec3f sq, out LFloat hitTime) private static bool Raycast(DtMeshTile tile, RcVec3f sp, RcVec3f sq, out LFloat hitTime)
{ {
hitTime = (LFloat)0.0f; hitTime = LFloat.L0;
for (int i = 0; i < tile.data.header.polyCount; ++i) for (int i = 0; i < tile.data.header.polyCount; ++i)
{ {
DtPoly p = tile.data.polys[i]; DtPoly p = tile.data.polys[i];
@@ -52,7 +52,7 @@ namespace DotRecast.Detour
{ {
// Stop at Off-Mesh link or when point is further than slop away. // Stop at Off-Mesh link or when point is further than slop away.
if (((straightPath[ns].flags & DtStraightPathFlags.DT_STRAIGHTPATH_OFFMESH_CONNECTION) != 0) if (((straightPath[ns].flags & DtStraightPathFlags.DT_STRAIGHTPATH_OFFMESH_CONNECTION) != 0)
|| !InRange(straightPath[ns].pos, startPos, minTargetDist, (LFloat)1000.0f)) || !InRange(straightPath[ns].pos, startPos, minTargetDist, LFloat.L1000))
break; break;
ns++; ns++;
} }
@@ -61,7 +61,7 @@ namespace DotRecast.Detour
m_excludeFlags = 0; m_excludeFlags = 0;
for (int i = 0; i < DtNavMesh.DT_MAX_AREAS; ++i) for (int i = 0; i < DtNavMesh.DT_MAX_AREAS; ++i)
{ {
m_areaCost[i] = (LFloat)1.0f; m_areaCost[i] = LFloat.L1;
} }
} }
@@ -76,7 +76,7 @@ namespace DotRecast.Detour
for (int i = areaCost.Length; i < DtNavMesh.DT_MAX_AREAS; ++i) for (int i = areaCost.Length; i < DtNavMesh.DT_MAX_AREAS; ++i)
{ {
m_areaCost[i] = (LFloat)1.0f; m_areaCost[i] = LFloat.L1;
} }
} }
@@ -7,7 +7,7 @@ namespace DotRecast.Detour
{ {
public static class DtUtils public static class DtUtils
{ {
private static readonly LFloat EQUAL_THRESHOLD = (LFloat)0.0001f; private static readonly LFloat EQUAL_THRESHOLD = LFloat.EPS_1MS;
public static int NextPow2(int v) public static int NextPow2(int v)
{ {
@@ -169,17 +169,17 @@ namespace DotRecast.Detour
public static RcVec3f RandomPointInConvexPoly(Span<LFloat> pts, int npts, Span<LFloat> areas, LFloat s, LFloat t) public static RcVec3f RandomPointInConvexPoly(Span<LFloat> pts, int npts, Span<LFloat> areas, LFloat s, LFloat t)
{ {
// Calc triangle araes // Calc triangle araes
LFloat areasum = (LFloat)0.0f; LFloat areasum = LFloat.L0;
for (int i = 2; i < npts; i++) for (int i = 2; i < npts; i++)
{ {
areas[i] = TriArea2D(pts, 0, (i - 1) * 3, i * 3); areas[i] = TriArea2D(pts, 0, (i - 1) * 3, i * 3);
areasum += LMath.Max((LFloat)0.001f, areas[i]); areasum += LMath.Max(LFloat.EPS_1MS, areas[i]);
} }
// Find sub triangle weighted by area. // Find sub triangle weighted by area.
LFloat thr = s * areasum; LFloat thr = s * areasum;
LFloat acc = (LFloat)0.0f; LFloat acc = LFloat.L0;
LFloat u = (LFloat)1.0f; LFloat u = LFloat.L1;
int tri = npts - 1; int tri = npts - 1;
for (int i = 2; i < npts; i++) for (int i = 2; i < npts; i++)
{ {
@@ -238,7 +238,7 @@ namespace DotRecast.Detour
} }
// If point lies inside the triangle, return interpolated ycoord. // If point lies inside the triangle, return interpolated ycoord.
if (u >= 0.0f && v >= 0.0f && (u + v) <= denom) if (u >= LFloat.L0 && v >= LFloat.L0 && (u + v) <= denom)
{ {
h = a.Y + (v0.Y * u + v1.Y * v) / denom; h = a.Y + (v0.Y * u + v1.Y * v) / denom;
return true; return true;
@@ -347,7 +347,7 @@ namespace DotRecast.Detour
out LFloat tmin, out LFloat tmax, out LFloat tmin, out LFloat tmax,
out int segMin, out int segMax) out int segMin, out int segMax)
{ {
LFloat EPS = (LFloat)0.0001f; LFloat EPS = LFloat.EPS_1MS;
tmin = 0; tmin = 0;
tmax = 1; tmax = 1;
@@ -100,7 +100,7 @@ namespace DotRecast.Recast.Toolset.Geom
LFloat d = LMath.Sqrt(normals[i] * normals[i] + normals[i + 1] * normals[i + 1] + normals[i + 2] * normals[i + 2]); LFloat d = LMath.Sqrt(normals[i] * normals[i] + normals[i + 1] * normals[i + 1] + normals[i + 2] * normals[i + 2]);
if (d > 0) if (d > 0)
{ {
d = (LFloat)1.0f / d; d = LFloat.L1 / d;
normals[i] *= d; normals[i] *= d;
normals[i + 1] *= d; normals[i + 1] *= d;
normals[i + 2] *= d; normals[i + 2] *= d;
@@ -136,7 +136,7 @@ namespace DotRecast.Recast.Toolset.Geom
public bool RaycastMesh(RcVec3f src, RcVec3f dst, out LFloat tmin) public bool RaycastMesh(RcVec3f src, RcVec3f dst, out LFloat tmin)
{ {
tmin = (LFloat)1.0f; tmin = LFloat.L1;
// Prune hit ray. // Prune hit ray.
if (!RcIntersections.IsectSegAABB(src, dst, bmin, bmax, out var btmin, out var btmax)) if (!RcIntersections.IsectSegAABB(src, dst, bmin, bmax, out var btmin, out var btmax))
@@ -157,7 +157,7 @@ namespace DotRecast.Recast.Toolset.Geom
return false; return false;
} }
tmin = (LFloat)1.0f; tmin = LFloat.L1;
bool hit = false; bool hit = false;
foreach (RcChunkyTriMeshNode chunk in chunks) foreach (RcChunkyTriMeshNode chunk in chunks)
{ {
@@ -14,14 +14,14 @@ namespace DotRecast.Recast.Toolset.Gizmos
public static readonly RcVec3f[] VERTS = public static readonly RcVec3f[] VERTS =
{ {
new RcVec3f(-(LFloat)1f, -(LFloat)1f, -(LFloat)1f), new RcVec3f(-LFloat.L1, -LFloat.L1, -LFloat.L1),
new RcVec3f((LFloat)1f, -(LFloat)1f, -(LFloat)1f), new RcVec3f(LFloat.L1, -LFloat.L1, -LFloat.L1),
new RcVec3f((LFloat)1f, -(LFloat)1f, (LFloat)1f), new RcVec3f(LFloat.L1, -LFloat.L1, LFloat.L1),
new RcVec3f(-(LFloat)1f, -(LFloat)1f, (LFloat)1f), new RcVec3f(-LFloat.L1, -LFloat.L1, LFloat.L1),
new RcVec3f(-(LFloat)1f, (LFloat)1f, -(LFloat)1f), new RcVec3f(-LFloat.L1, LFloat.L1, -LFloat.L1),
new RcVec3f((LFloat)1f, (LFloat)1f, -(LFloat)1f), new RcVec3f(LFloat.L1, LFloat.L1, -LFloat.L1),
new RcVec3f((LFloat)1f, (LFloat)1f, (LFloat)1f), new RcVec3f(LFloat.L1, LFloat.L1, LFloat.L1),
new RcVec3f(-(LFloat)1f, (LFloat)1f, (LFloat)1f), new RcVec3f(-LFloat.L1, LFloat.L1, LFloat.L1),
}; };
public readonly LFloat[] vertices = new LFloat[8 * 3]; public readonly LFloat[] vertices = new LFloat[8 * 3];
@@ -39,9 +39,9 @@ namespace DotRecast.Recast.Toolset.Gizmos
this.halfEdges = halfEdges; this.halfEdges = halfEdges;
for (int i = 0; i < 8; ++i) for (int i = 0; i < 8; ++i)
{ {
LFloat s0 = (i & 1) != 0 ? (LFloat)1f : -(LFloat)1f; LFloat s0 = (i & 1) != 0 ? LFloat.L1 : -LFloat.L1;
LFloat s1 = (i & 2) != 0 ? (LFloat)1f : -(LFloat)1f; LFloat s1 = (i & 2) != 0 ? LFloat.L1 : -LFloat.L1;
LFloat s2 = (i & 4) != 0 ? (LFloat)1f : -(LFloat)1f; LFloat s2 = (i & 4) != 0 ? LFloat.L1 : -LFloat.L1;
vertices[i * 3 + 0] = center.X + s0 * halfEdges[0].X + s1 * halfEdges[1].X + s2 * halfEdges[2].X; vertices[i * 3 + 0] = center.X + s0 * halfEdges[0].X + s1 * halfEdges[1].X + s2 * halfEdges[2].X;
vertices[i * 3 + 1] = center.Y + s0 * halfEdges[0].Y + s1 * halfEdges[1].Y + s2 * halfEdges[2].Y; vertices[i * 3 + 1] = center.Y + s0 * halfEdges[0].Y + s1 * halfEdges[1].Y + s2 * halfEdges[2].Y;
vertices[i * 3 + 2] = center.Z + s0 * halfEdges[0].Z + s1 * halfEdges[1].Z + s2 * halfEdges[2].Z; vertices[i * 3 + 2] = center.Z + s0 * halfEdges[0].Z + s1 * halfEdges[1].Z + s2 * halfEdges[2].Z;
@@ -16,8 +16,8 @@ namespace DotRecast.Recast.Toolset.Gizmos
{ {
center = new LFloat[] center = new LFloat[]
{ {
(LFloat)0.5f * (start.X + end.X), (LFloat)0.5f * (start.Y + end.Y), LFloat.L0D5 * (start.X + end.X), LFloat.L0D5 * (start.Y + end.Y),
(LFloat)0.5f * (start.Z + end.Z) LFloat.L0D5 * (start.Z + end.Z)
}; };
RcVec3f axis = new RcVec3f(end.X - start.X, end.Y - start.Y, end.Z - start.Z); RcVec3f axis = new RcVec3f(end.X - start.X, end.Y - start.Y, end.Z - start.Z);
RcVec3f[] normals = new RcVec3f[3]; RcVec3f[] normals = new RcVec3f[3];
@@ -32,7 +32,7 @@ namespace DotRecast.Recast.Toolset.Gizmos
var trY = new RcVec3f(normals[0].Y, normals[1].Y, normals[2].Y); var trY = new RcVec3f(normals[0].Y, normals[1].Y, normals[2].Y);
var trZ = new RcVec3f(normals[0].Z, normals[1].Z, normals[2].Z); var trZ = new RcVec3f(normals[0].Z, normals[1].Z, normals[2].Z);
LFloat[] spVertices = GenerateSphericalVertices(); LFloat[] spVertices = GenerateSphericalVertices();
LFloat halfLength = (LFloat)0.5f * axis.Length(); LFloat halfLength = LFloat.L0D5 * axis.Length();
vertices = new LFloat[spVertices.Length]; vertices = new LFloat[spVertices.Length];
gradient = new LFloat[spVertices.Length / 3]; gradient = new LFloat[spVertices.Length / 3];
RcVec3f v = new RcVec3f(); RcVec3f v = new RcVec3f();
@@ -49,14 +49,14 @@ namespace DotRecast.Recast.Toolset.Gizmos
v.Y = vertices[i + 1] - center[1]; v.Y = vertices[i + 1] - center[1];
v.Z = vertices[i + 2] - center[2]; v.Z = vertices[i + 2] - center[2];
v = RcVec3f.Normalize(v); v = RcVec3f.Normalize(v);
gradient[i / 3] = LMath.Clamp((LFloat)0.57735026f * (v.X + v.Y + v.Z), -(LFloat)1, (LFloat)1); gradient[i / 3] = LMath.Clamp(new LFloat("",577) * (v.X + v.Y + v.Z), -LFloat.L1, LFloat.L1);
} }
} }
private RcVec3f GetSideVector(RcVec3f axis) private RcVec3f GetSideVector(RcVec3f axis)
{ {
var side = new RcVec3f(1, 0, 0); var side = new RcVec3f(1, 0, 0);
if (axis.X > 0.8) if (axis.X > LFloat.L0D8)
{ {
side = new RcVec3f(0, 0, 1); side = new RcVec3f(0, 0, 1);
} }
@@ -16,8 +16,8 @@ namespace DotRecast.Recast.Toolset.Gizmos
public RcCylinderGizmo(RcVec3f start, RcVec3f end, LFloat radius) public RcCylinderGizmo(RcVec3f start, RcVec3f end, LFloat radius)
{ {
center = new RcVec3f( center = new RcVec3f(
(LFloat)0.5f * (start.X + end.X), (LFloat)0.5f * (start.Y + end.Y), LFloat.L0D5 * (start.X + end.X), LFloat.L0D5 * (start.Y + end.Y),
(LFloat)0.5f * (start.Z + end.Z) LFloat.L0D5 * (start.Z + end.Z)
); );
RcVec3f axis = new RcVec3f(end.X - start.X, end.Y - start.Y, end.Z - start.Z); RcVec3f axis = new RcVec3f(end.X - start.X, end.Y - start.Y, end.Z - start.Z);
RcVec3f[] normals = new RcVec3f[3]; RcVec3f[] normals = new RcVec3f[3];
@@ -32,7 +32,7 @@ namespace DotRecast.Recast.Toolset.Gizmos
RcVec3f trY = new RcVec3f(normals[0].Y, normals[1].Y, normals[2].Y); RcVec3f trY = new RcVec3f(normals[0].Y, normals[1].Y, normals[2].Y);
RcVec3f trZ = new RcVec3f(normals[0].Z, normals[1].Z, normals[2].Z); RcVec3f trZ = new RcVec3f(normals[0].Z, normals[1].Z, normals[2].Z);
vertices = GenerateCylindricalVertices(); vertices = GenerateCylindricalVertices();
LFloat halfLength = (LFloat)0.5f * axis.Length(); LFloat halfLength = LFloat.L0D5 * axis.Length();
gradient = new LFloat[vertices.Length / 3]; gradient = new LFloat[vertices.Length / 3];
RcVec3f v = new RcVec3f(); RcVec3f v = new RcVec3f();
for (int i = 0; i < vertices.Length; i += 3) for (int i = 0; i < vertices.Length; i += 3)
@@ -54,7 +54,7 @@ namespace DotRecast.Recast.Toolset.Gizmos
v.Y = vertices[i + 1] - center.Y; v.Y = vertices[i + 1] - center.Y;
v.Z = vertices[i + 2] - center.Z; v.Z = vertices[i + 2] - center.Z;
v = RcVec3f.Normalize(v); v = RcVec3f.Normalize(v);
gradient[i / 3] = LMath.Clamp((LFloat)0.57735026f * (v.X + v.Y + v.Z), -(LFloat)1, (LFloat)1); gradient[i / 3] = LMath.Clamp(new LFloat("",577) * (v.X + v.Y + v.Z), -LFloat.L1, LFloat.L1);
} }
} }
} }
@@ -62,7 +62,7 @@ namespace DotRecast.Recast.Toolset.Gizmos
private RcVec3f GetSideVector(RcVec3f axis) private RcVec3f GetSideVector(RcVec3f axis)
{ {
RcVec3f side = new RcVec3f(1, 0, 0); RcVec3f side = new RcVec3f(1, 0, 0);
if (axis.X > 0.8) if (axis.X > LFloat.L0D8)
{ {
side = new RcVec3f(0, 0, 1); side = new RcVec3f(0, 0, 1);
} }
@@ -52,7 +52,7 @@ namespace DotRecast.Recast.Toolset.Gizmos
int vi = 0; int vi = 0;
for (int r = 0; r < 4; r++) for (int r = 0; r < 4; r++)
{ {
vi = GenerateRingVertices(segments, vertices, vi, LMath.PI * (LFloat)0.5f); vi = GenerateRingVertices(segments, vertices, vi, LMath.PI * LFloat.L0D5);
} }
return vertices; return vertices;
@@ -67,9 +67,9 @@ namespace DotRecast.Recast.Toolset.Gizmos
LFloat phi = 2 * LMath.PI * p / segments; LFloat phi = 2 * LMath.PI * p / segments;
LFloat cosPhi = LMath.Cos(phi); LFloat cosPhi = LMath.Cos(phi);
LFloat sinPhi = LMath.Sin(phi); LFloat sinPhi = LMath.Sin(phi);
vertices[vi++] = (LFloat)(sinTheta * cosPhi); vertices[vi++] = (sinTheta * cosPhi);
vertices[vi++] = (LFloat)cosTheta; vertices[vi++] = cosTheta;
vertices[vi++] = (LFloat)(sinTheta * sinPhi); vertices[vi++] = (sinTheta * sinPhi);
} }
return vi; return vi;
@@ -4,16 +4,16 @@ namespace DotRecast.Recast.Toolset
{ {
public class RcNavMeshBuildSettings public class RcNavMeshBuildSettings
{ {
public LFloat cellSize = (LFloat)0.3f; public LFloat cellSize = LFloat.L0D3;
public LFloat cellHeight = (LFloat)0.2f; public LFloat cellHeight = LFloat.L0D2;
public LFloat agentHeight = (LFloat)2.0f; public LFloat agentHeight = LFloat.L2;
public LFloat agentRadius = (LFloat)0.6f; public LFloat agentRadius = LFloat.L0D6;
public LFloat agentMaxClimb = (LFloat)0.9f; public LFloat agentMaxClimb = LFloat.L0D9;
public LFloat agentMaxSlope = (LFloat)45f; public LFloat agentMaxSlope = new LFloat("",45000);
public LFloat agentMaxAcceleration = (LFloat)8.0f; public LFloat agentMaxAcceleration = LFloat.L8;
public LFloat agentMaxSpeed = (LFloat)3.5f; public LFloat agentMaxSpeed = new LFloat("",3500);
public int minRegionSize = 8; public int minRegionSize = 8;
public int mergedRegionSize = 20; public int mergedRegionSize = 20;
@@ -24,12 +24,12 @@ namespace DotRecast.Recast.Toolset
public bool filterLedgeSpans = true; public bool filterLedgeSpans = true;
public bool filterWalkableLowHeightSpans = true; public bool filterWalkableLowHeightSpans = true;
public LFloat edgeMaxLen = (LFloat)12f; public LFloat edgeMaxLen = (new LFloat("",12000));
public LFloat edgeMaxError = (LFloat)1.3f; public LFloat edgeMaxError = (new LFloat("",1300));
public int vertsPerPoly = 6; public int vertsPerPoly = 6;
public LFloat detailSampleDist = (LFloat)6f; public LFloat detailSampleDist = LFloat.L6;
public LFloat detailSampleMaxError = (LFloat)1f; public LFloat detailSampleMaxError = LFloat.L1;
public bool tiled = false; public bool tiled = false;
public int tileSize = 32; public int tileSize = 32;
@@ -46,7 +46,7 @@ namespace DotRecast.Recast.Toolset.Tools
// Create // Create
// If clicked on that last pt, create the shape. // If clicked on that last pt, create the shape.
if (_pts.Count > 0 && RcVec3f.DistanceSquared(p, _pts[_pts.Count - 1]) < 0.2f * 0.2f) if (_pts.Count > 0 && RcVec3f.DistanceSquared(p, _pts[_pts.Count - 1]) < LFloat.L0D2 * LFloat.L0D2)
{ {
pts = new List<RcVec3f>(_pts); pts = new List<RcVec3f>(_pts);
hull = new List<int>(_hull); hull = new List<int>(_hull);
@@ -107,7 +107,7 @@ namespace DotRecast.Recast.Toolset.Tools
// Create // Create
// If clicked on that last pt, create the shape. // If clicked on that last pt, create the shape.
if (_pts.Count > 0 && RcVec3f.DistanceSquared(p, _pts[^1]) < 0.2f * 0.2f) if (_pts.Count > 0 && RcVec3f.DistanceSquared(p, _pts[^1]) < LFloat.L0D2 * LFloat.L0D2)
{ {
// //
if (_hull.Count > 2) if (_hull.Count > 2)
@@ -160,7 +160,7 @@ namespace DotRecast.Recast.Toolset.Tools
minh -= boxDescent; minh -= boxDescent;
maxh = minh + boxHeight; maxh = minh + boxHeight;
if (polyOffset > 0.01f) if (polyOffset > new LFloat("",10))
{ {
LFloat[] offset = new LFloat[verts.Length * 2]; LFloat[] offset = new LFloat[verts.Length * 2];
int noffset = RcAreas.OffsetPoly(verts, hull.Count, polyOffset, offset, offset.Length); int noffset = RcAreas.OffsetPoly(verts, hull.Count, polyOffset, offset, offset.Length);
@@ -78,8 +78,8 @@ namespace DotRecast.Recast.Toolset.Tools
ap.height = agentHeight; ap.height = agentHeight;
ap.maxAcceleration = agentMaxAcceleration; ap.maxAcceleration = agentMaxAcceleration;
ap.maxSpeed = agentMaxSpeed; ap.maxSpeed = agentMaxSpeed;
ap.collisionQueryRange = ap.radius * (LFloat)12.0f; ap.collisionQueryRange = ap.radius * new LFloat("",12000);
ap.pathOptimizationRange = ap.radius * (LFloat)30.0f; ap.pathOptimizationRange = ap.radius * new LFloat("",30000);
ap.updateFlags = _agCfg.GetUpdateFlags(); ap.updateFlags = _agCfg.GetUpdateFlags();
ap.obstacleAvoidanceType = _agCfg.obstacleAvoidanceType; ap.obstacleAvoidanceType = _agCfg.obstacleAvoidanceType;
ap.separationWeight = _agCfg.separationWeight; ap.separationWeight = _agCfg.separationWeight;
@@ -141,30 +141,30 @@ namespace DotRecast.Recast.Toolset.Tools
_crowd = new DtCrowd(_crowdCfg, _navMesh, __ => new DtQueryDefaultFilter( _crowd = new DtCrowd(_crowdCfg, _navMesh, __ => new DtQueryDefaultFilter(
SampleAreaModifications.SAMPLE_POLYFLAGS_ALL, SampleAreaModifications.SAMPLE_POLYFLAGS_ALL,
SampleAreaModifications.SAMPLE_POLYFLAGS_DISABLED, SampleAreaModifications.SAMPLE_POLYFLAGS_DISABLED,
new LFloat[] { (LFloat)1f, (LFloat)10f, (LFloat)1f, (LFloat)1f, (LFloat)2f, (LFloat)1.5f }) new LFloat[] { LFloat.L1, LFloat.L10, LFloat.L1, LFloat.L1, LFloat.L2, new LFloat("",1500) })
); );
DtObstacleAvoidanceParams option = new DtObstacleAvoidanceParams(_crowd.GetObstacleAvoidanceParams(0)); DtObstacleAvoidanceParams option = new DtObstacleAvoidanceParams(_crowd.GetObstacleAvoidanceParams(0));
// Low (11) // Low (11)
option.velBias = (LFloat)0.5f; option.velBias = LFloat.L0D5;
option.adaptiveDivs = 5; option.adaptiveDivs = 5;
option.adaptiveRings = 2; option.adaptiveRings = 2;
option.adaptiveDepth = 1; option.adaptiveDepth = 1;
_crowd.SetObstacleAvoidanceParams(0, option); _crowd.SetObstacleAvoidanceParams(0, option);
// Medium (22) // Medium (22)
option.velBias = (LFloat)0.5f; option.velBias = LFloat.L0D5;
option.adaptiveDivs = 5; option.adaptiveDivs = 5;
option.adaptiveRings = 2; option.adaptiveRings = 2;
option.adaptiveDepth = 2; option.adaptiveDepth = 2;
_crowd.SetObstacleAvoidanceParams(1, option); _crowd.SetObstacleAvoidanceParams(1, option);
// Good (45) // Good (45)
option.velBias = (LFloat)0.5f; option.velBias = LFloat.L0D5;
option.adaptiveDivs = 7; option.adaptiveDivs = 7;
option.adaptiveRings = 2; option.adaptiveRings = 2;
option.adaptiveDepth = 3; option.adaptiveDepth = 3;
_crowd.SetObstacleAvoidanceParams(2, option); _crowd.SetObstacleAvoidanceParams(2, option);
// High (66) // High (66)
option.velBias = (LFloat)0.5f; option.velBias = LFloat.L0D5;
option.adaptiveDivs = 7; option.adaptiveDivs = 7;
option.adaptiveRings = 3; option.adaptiveRings = 3;
option.adaptiveDepth = 3; option.adaptiveDepth = 3;
@@ -193,11 +193,11 @@ namespace DotRecast.Recast.Toolset.Tools
{ {
LFloat tr = _rand.Next(); LFloat tr = _rand.Next();
RcCrowdAgentType type = RcCrowdAgentType.MOB; RcCrowdAgentType type = RcCrowdAgentType.MOB;
LFloat mobsPcnt = _cfg.percentMobs / (LFloat)100f; LFloat mobsPcnt = _cfg.percentMobs / LFloat.L100;
if (tr > mobsPcnt) if (tr > mobsPcnt)
{ {
tr = _rand.Next(); tr = _rand.Next();
LFloat travellerPcnt = _cfg.percentTravellers / (LFloat)100f; LFloat travellerPcnt = _cfg.percentTravellers / LFloat.L100;
if (tr > travellerPcnt) if (tr > travellerPcnt)
{ {
type = RcCrowdAgentType.VILLAGER; type = RcCrowdAgentType.VILLAGER;
@@ -283,7 +283,7 @@ namespace DotRecast.Recast.Toolset.Tools
var status = navquery.FindNearestPoly(ag.npos, _crowd.GetQueryExtents(), filter, out var nearestRef, out var nearestPt, out var _); var status = navquery.FindNearestPoly(ag.npos, _crowd.GetQueryExtents(), filter, out var nearestRef, out var nearestPt, out var _);
if (status.Succeeded()) if (status.Succeeded())
{ {
status = navquery.FindRandomPointAroundCircle(nearestRef, crowAgentData.home, _cfg.zoneRadius * (LFloat)2f, filter, _rand, status = navquery.FindRandomPointAroundCircle(nearestRef, crowAgentData.home, _cfg.zoneRadius * LFloat.L2, filter, _rand,
out var randomRef, out var randomPt); out var randomRef, out var randomPt);
if (status.Succeeded()) if (status.Succeeded())
{ {
@@ -298,7 +298,7 @@ namespace DotRecast.Recast.Toolset.Tools
var status = navquery.FindNearestPoly(ag.npos, _crowd.GetQueryExtents(), filter, out var nearestRef, out var nearestPt, out var _); var status = navquery.FindNearestPoly(ag.npos, _crowd.GetQueryExtents(), filter, out var nearestRef, out var nearestPt, out var _);
if (status.Succeeded()) if (status.Succeeded())
{ {
status = navquery.FindRandomPointAroundCircle(nearestRef, crowAgentData.home, _cfg.zoneRadius * (LFloat)0.2f, filter, _rand, status = navquery.FindRandomPointAroundCircle(nearestRef, crowAgentData.home, _cfg.zoneRadius * LFloat.L0D2, filter, _rand,
out var randomRef, out var randomPt); out var randomRef, out var randomPt);
if (status.Succeeded()) if (status.Succeeded())
{ {
@@ -339,7 +339,7 @@ namespace DotRecast.Recast.Toolset.Tools
LFloat dx = ag.targetPos.X - ag.npos.X; LFloat dx = ag.targetPos.X - ag.npos.X;
LFloat dy = ag.targetPos.Y - ag.npos.Y; LFloat dy = ag.targetPos.Y - ag.npos.Y;
LFloat dz = ag.targetPos.Z - ag.npos.Z; LFloat dz = ag.targetPos.Z - ag.npos.Z;
return dx * dx + dy * dy + dz * dz < 0.3f; return dx * dx + dy * dy + dz * dz < LFloat.L0D3;
} }
return false; return false;
@@ -9,9 +9,9 @@ namespace DotRecast.Recast.Toolset.Tools
public int agents = 1000; public int agents = 1000;
public int randomSeed = 270; public int randomSeed = 270;
public int numberOfZones = 4; public int numberOfZones = 4;
public LFloat zoneRadius = (LFloat)20f; public LFloat zoneRadius = LFloat.L20;
public LFloat percentMobs = (LFloat)80f; public LFloat percentMobs = LFloat.L80;
public LFloat percentTravellers = (LFloat)15f; public LFloat percentTravellers = new("",15000);
public int pathQueueSize = 32; public int pathQueueSize = 32;
public int maxIterations = 300; public int maxIterations = 300;
} }
@@ -64,7 +64,7 @@ namespace DotRecast.Recast.Toolset.Tools
crowd = new DtCrowd(config, navMesh, __ => new DtQueryDefaultFilter( crowd = new DtCrowd(config, navMesh, __ => new DtQueryDefaultFilter(
SampleAreaModifications.SAMPLE_POLYFLAGS_ALL, SampleAreaModifications.SAMPLE_POLYFLAGS_ALL,
SampleAreaModifications.SAMPLE_POLYFLAGS_DISABLED, SampleAreaModifications.SAMPLE_POLYFLAGS_DISABLED,
new LFloat[] { (LFloat)1f, (LFloat)10f, (LFloat)1f, (LFloat)1f, (LFloat)2f, (LFloat)1.5f }) new LFloat[] { LFloat.L1, LFloat.L10, LFloat.L1, LFloat.L1, LFloat.L2, new LFloat("",1500) })
); );
// Setup local avoidance option to different qualities. // Setup local avoidance option to different qualities.
@@ -72,28 +72,28 @@ namespace DotRecast.Recast.Toolset.Tools
DtObstacleAvoidanceParams option = new DtObstacleAvoidanceParams(crowd.GetObstacleAvoidanceParams(0)); DtObstacleAvoidanceParams option = new DtObstacleAvoidanceParams(crowd.GetObstacleAvoidanceParams(0));
// Low (11) // Low (11)
option.velBias = (LFloat)0.5f; option.velBias = LFloat.L0D5;
option.adaptiveDivs = 5; option.adaptiveDivs = 5;
option.adaptiveRings = 2; option.adaptiveRings = 2;
option.adaptiveDepth = 1; option.adaptiveDepth = 1;
crowd.SetObstacleAvoidanceParams(0, option); crowd.SetObstacleAvoidanceParams(0, option);
// Medium (22) // Medium (22)
option.velBias = (LFloat)0.5f; option.velBias = LFloat.L0D5;
option.adaptiveDivs = 5; option.adaptiveDivs = 5;
option.adaptiveRings = 2; option.adaptiveRings = 2;
option.adaptiveDepth = 2; option.adaptiveDepth = 2;
crowd.SetObstacleAvoidanceParams(1, option); crowd.SetObstacleAvoidanceParams(1, option);
// Good (45) // Good (45)
option.velBias = (LFloat)0.5f; option.velBias = LFloat.L0D5;
option.adaptiveDivs = 7; option.adaptiveDivs = 7;
option.adaptiveRings = 2; option.adaptiveRings = 2;
option.adaptiveDepth = 3; option.adaptiveDepth = 3;
crowd.SetObstacleAvoidanceParams(2, option); crowd.SetObstacleAvoidanceParams(2, option);
// High (66) // High (66)
option.velBias = (LFloat)0.5f; option.velBias = LFloat.L0D5;
option.adaptiveDivs = 7; option.adaptiveDivs = 7;
option.adaptiveRings = 3; option.adaptiveRings = 3;
option.adaptiveDepth = 3; option.adaptiveDepth = 3;
@@ -205,8 +205,8 @@ namespace DotRecast.Recast.Toolset.Tools
ap.height = agentHeight; ap.height = agentHeight;
ap.maxAcceleration = agentMaxAcceleration; ap.maxAcceleration = agentMaxAcceleration;
ap.maxSpeed = agentMaxSpeed; ap.maxSpeed = agentMaxSpeed;
ap.collisionQueryRange = ap.radius * (LFloat)12.0f; ap.collisionQueryRange = ap.radius * new LFloat("",12000);
ap.pathOptimizationRange = ap.radius * (LFloat)30.0f; ap.pathOptimizationRange = ap.radius * new LFloat("",30000);
ap.updateFlags = _agCfg.GetUpdateFlags(); ap.updateFlags = _agCfg.GetUpdateFlags();
ap.obstacleAvoidanceType = _agCfg.obstacleAvoidanceType; ap.obstacleAvoidanceType = _agCfg.obstacleAvoidanceType;
ap.separationWeight = _agCfg.separationWeight; ap.separationWeight = _agCfg.separationWeight;
@@ -296,7 +296,7 @@ namespace DotRecast.Recast.Toolset.Tools
private RcVec3f CalcVel(RcVec3f pos, RcVec3f tgt, LFloat speed) private RcVec3f CalcVel(RcVec3f pos, RcVec3f tgt, LFloat speed)
{ {
RcVec3f vel = RcVec3f.Subtract(tgt, pos); RcVec3f vel = RcVec3f.Subtract(tgt, pos);
vel.Y = (LFloat)0.0f; vel.Y = LFloat.L0;
vel = RcVec3f.Normalize(vel); vel = RcVec3f.Normalize(vel);
return vel.Scale(speed); return vel.Scale(speed);
} }
@@ -62,30 +62,30 @@ namespace DotRecast.Recast.Toolset.Tools
private bool Hit(RcVec3f point, RcVec3f dir, LFloat[] bounds) private bool Hit(RcVec3f point, RcVec3f dir, LFloat[] bounds)
{ {
LFloat cx = (LFloat)0.5f * (bounds[0] + bounds[3]); LFloat cx = LFloat.L0D5 * (bounds[0] + bounds[3]);
LFloat cy = (LFloat)0.5f * (bounds[1] + bounds[4]); LFloat cy = LFloat.L0D5 * (bounds[1] + bounds[4]);
LFloat cz = (LFloat)0.5f * (bounds[2] + bounds[5]); LFloat cz = LFloat.L0D5 * (bounds[2] + bounds[5]);
LFloat dx = (LFloat)0.5f * (bounds[3] - bounds[0]); LFloat dx = LFloat.L0D5 * (bounds[3] - bounds[0]);
LFloat dy = (LFloat)0.5f * (bounds[4] - bounds[1]); LFloat dy = LFloat.L0D5 * (bounds[4] - bounds[1]);
LFloat dz = (LFloat)0.5f * (bounds[5] - bounds[2]); LFloat dz = LFloat.L0D5 * (bounds[5] - bounds[2]);
LFloat rSqr = dx * dx + dy * dy + dz * dz; LFloat rSqr = dx * dx + dy * dy + dz * dz;
LFloat mx = point.X - cx; LFloat mx = point.X - cx;
LFloat my = point.Y - cy; LFloat my = point.Y - cy;
LFloat mz = point.Z - cz; LFloat mz = point.Z - cz;
LFloat c = mx * mx + my * my + mz * mz - rSqr; LFloat c = mx * mx + my * my + mz * mz - rSqr;
if (c <= 0.0f) if (c <= LFloat.L0)
{ {
return true; return true;
} }
LFloat b = mx * dir.X + my * dir.Y + mz * dir.Z; LFloat b = mx * dir.X + my * dir.Y + mz * dir.Z;
if (b > 0.0f) if (b > LFloat.L0)
{ {
return false; return false;
} }
LFloat disc = b * b - c; LFloat disc = b * b - c;
return disc >= 0.0f; return disc >= (LFloat.L0);
} }
@@ -168,7 +168,7 @@ namespace DotRecast.Recast.Toolset.Tools
public RcGizmo SphereCollider(RcVec3f p, LFloat walkableClimb) public RcGizmo SphereCollider(RcVec3f p, LFloat walkableClimb)
{ {
LFloat radius = 1 + (LFloat)random.NextDouble() * 10; LFloat radius = 1 + random.NextDouble() * 10;
var collider = new DtSphereCollider(p, radius, SampleAreaModifications.SAMPLE_POLYAREA_TYPE_WATER, walkableClimb); var collider = new DtSphereCollider(p, radius, SampleAreaModifications.SAMPLE_POLYAREA_TYPE_WATER, walkableClimb);
var gizmo = RcGizmoFactory.Sphere(p, radius); var gizmo = RcGizmoFactory.Sphere(p, radius);
@@ -177,15 +177,15 @@ namespace DotRecast.Recast.Toolset.Tools
public RcGizmo CapsuleCollider(RcVec3f p, LFloat walkableClimb) public RcGizmo CapsuleCollider(RcVec3f p, LFloat walkableClimb)
{ {
LFloat radius = (LFloat)0.4f + random.NextDouble() * (LFloat)4f; LFloat radius = LFloat.L0D4 + random.NextDouble() * LFloat.L4;
RcVec3f a = new RcVec3f( RcVec3f a = new RcVec3f(
((LFloat)1f - (LFloat)2f * random.NextDouble()), (LFloat.L1 - LFloat.L2 * random.NextDouble()),
(LFloat)0.01f + random.NextDouble(), (new LFloat("",10)) + random.NextDouble(),
((LFloat)1f - 2 * random.NextDouble()) (LFloat.L1 - 2 * random.NextDouble())
); );
a = RcVec3f.Normalize(a); a = RcVec3f.Normalize(a);
LFloat len = (LFloat)1f + random.NextDouble() * (LFloat)20f; LFloat len = LFloat.L1 + random.NextDouble() * LFloat.L20;
a.X *= len; a.X *= len;
a.Y *= len; a.Y *= len;
a.Z *= len; a.Z *= len;
@@ -199,12 +199,12 @@ namespace DotRecast.Recast.Toolset.Tools
public RcGizmo BoxCollider(RcVec3f p, LFloat walkableClimb) public RcGizmo BoxCollider(RcVec3f p, LFloat walkableClimb)
{ {
RcVec3f extent = new RcVec3f( RcVec3f extent = new RcVec3f(
(LFloat)0.5f + random.NextDouble() * (LFloat)6f, LFloat.L0D5 + random.NextDouble() * LFloat.L6,
(LFloat)0.5f + random.NextDouble() * (LFloat)6f, LFloat.L0D5 + random.NextDouble() * LFloat.L6,
(LFloat)0.5f + random.NextDouble() * (LFloat)6f LFloat.L0D5 + random.NextDouble() * LFloat.L6
); );
RcVec3f forward = new RcVec3f(((LFloat)1f - 2 * (LFloat)random.NextDouble()), 0, ((LFloat)1f - 2 * (LFloat)random.NextDouble())); RcVec3f forward = new RcVec3f((LFloat.L1 - 2 * random.NextDouble()), 0, (LFloat.L1 - 2 * random.NextDouble()));
RcVec3f up = new RcVec3f(((LFloat)1f - 2 * (LFloat)random.NextDouble()), (LFloat)0.01f + (LFloat)random.NextDouble(), ((LFloat)1f - 2 * (LFloat)random.NextDouble())); RcVec3f up = new RcVec3f((LFloat.L1 - 2 * random.NextDouble()), (new LFloat("",10)) + random.NextDouble(), (LFloat.L1 - 2 * random.NextDouble()));
RcVec3f[] halfEdges = Detour.Dynamic.Colliders.DtBoxCollider.GetHalfEdges(up, forward, extent); RcVec3f[] halfEdges = Detour.Dynamic.Colliders.DtBoxCollider.GetHalfEdges(up, forward, extent);
var collider = new DtBoxCollider(p, halfEdges, SampleAreaModifications.SAMPLE_POLYAREA_TYPE_WATER, walkableClimb); var collider = new DtBoxCollider(p, halfEdges, SampleAreaModifications.SAMPLE_POLYAREA_TYPE_WATER, walkableClimb);
var gizmo = RcGizmoFactory.Box(p, halfEdges); var gizmo = RcGizmoFactory.Box(p, halfEdges);
@@ -213,10 +213,10 @@ namespace DotRecast.Recast.Toolset.Tools
public RcGizmo CylinderCollider(RcVec3f p, LFloat walkableClimb) public RcGizmo CylinderCollider(RcVec3f p, LFloat walkableClimb)
{ {
LFloat radius = (LFloat)0.7f + (LFloat)random.NextDouble() * (LFloat)4f; LFloat radius = LFloat.L0D7 + random.NextDouble() * LFloat.L4;
RcVec3f a = new RcVec3f((LFloat)1f - 2 * (LFloat)random.NextDouble(), (LFloat)0.01f + (LFloat)random.NextDouble(), (LFloat)1f - 2 * (LFloat)random.NextDouble()); RcVec3f a = new RcVec3f(LFloat.L1 - 2 * random.NextDouble(), (new LFloat("",10)) + random.NextDouble(), LFloat.L1 - 2 * random.NextDouble());
a = RcVec3f.Normalize(a); a = RcVec3f.Normalize(a);
LFloat len = (LFloat)2f + (LFloat)random.NextDouble() * (LFloat)20f; LFloat len = LFloat.L2 + random.NextDouble() * LFloat.L20;
a.X *= len; a.X *= len;
a.Y *= len; a.Y *= len;
a.Z *= len; a.Z *= len;
@@ -233,14 +233,14 @@ namespace DotRecast.Recast.Toolset.Tools
RcVec3f baseExtent = new RcVec3f(5, 3, 8); RcVec3f baseExtent = new RcVec3f(5, 3, 8);
RcVec3f baseCenter = new RcVec3f(p.X, p.Y + 3, p.Z); RcVec3f baseCenter = new RcVec3f(p.X, p.Y + 3, p.Z);
RcVec3f baseUp = new RcVec3f(0, 1, 0); RcVec3f baseUp = new RcVec3f(0, 1, 0);
RcVec3f forward = new RcVec3f(((LFloat)1f - 2 * random.NextDouble()), 0, ((LFloat)1f - 2 * random.NextDouble())); RcVec3f forward = new RcVec3f((LFloat.L1 - 2 * random.NextDouble()), 0, (LFloat.L1 - 2 * random.NextDouble()));
forward = RcVec3f.Normalize(forward); forward = RcVec3f.Normalize(forward);
RcVec3f side = RcVec3f.Cross(forward, baseUp); RcVec3f side = RcVec3f.Cross(forward, baseUp);
DtBoxCollider @base = new DtBoxCollider(baseCenter, Detour.Dynamic.Colliders.DtBoxCollider.GetHalfEdges(baseUp, forward, baseExtent), DtBoxCollider @base = new DtBoxCollider(baseCenter, Detour.Dynamic.Colliders.DtBoxCollider.GetHalfEdges(baseUp, forward, baseExtent),
SampleAreaModifications.SAMPLE_POLYAREA_TYPE_ROAD, walkableClimb); SampleAreaModifications.SAMPLE_POLYAREA_TYPE_ROAD, walkableClimb);
var roofUp = RcVec3f.Zero; var roofUp = RcVec3f.Zero;
RcVec3f roofExtent = new RcVec3f((LFloat)4.5f, (LFloat)4.5f, (LFloat)8f); RcVec3f roofExtent = new RcVec3f((new LFloat("",4500)), (new LFloat("",4500)), LFloat.L8);
var rx = RcMatrix4x4f.CreateFromRotate(45, forward.X, forward.Y, forward.Z); var rx = RcMatrix4x4f.CreateFromRotate(45, forward.X, forward.Y, forward.Z);
roofUp = MulMatrixVector(ref roofUp, rx, baseUp); roofUp = MulMatrixVector(ref roofUp, rx, baseUp);
RcVec3f roofCenter = new RcVec3f(p.X, p.Y + 6, p.Z); RcVec3f roofCenter = new RcVec3f(p.X, p.Y + 6, p.Z);
@@ -252,19 +252,19 @@ namespace DotRecast.Recast.Toolset.Tools
baseCenter.Z - forward.Z * 15 + side.Z * 6 baseCenter.Z - forward.Z * 15 + side.Z * 6
); );
RcVec3f trunkEnd = new RcVec3f(trunkStart.X, trunkStart.Y + 10, trunkStart.Z); RcVec3f trunkEnd = new RcVec3f(trunkStart.X, trunkStart.Y + 10, trunkStart.Z);
DtCapsuleCollider trunk = new DtCapsuleCollider(trunkStart, trunkEnd, (LFloat)0.5f, SampleAreaModifications.SAMPLE_POLYAREA_TYPE_ROAD, DtCapsuleCollider trunk = new DtCapsuleCollider(trunkStart, trunkEnd, LFloat.L0D5, SampleAreaModifications.SAMPLE_POLYAREA_TYPE_ROAD,
walkableClimb); walkableClimb);
RcVec3f crownCenter = new RcVec3f( RcVec3f crownCenter = new RcVec3f(
baseCenter.X - forward.X * 15 + side.X * 6, p.Y + 10, baseCenter.X - forward.X * 15 + side.X * 6, p.Y + 10,
baseCenter.Z - forward.Z * 15 + side.Z * 6 baseCenter.Z - forward.Z * 15 + side.Z * 6
); );
DtSphereCollider crown = new DtSphereCollider(crownCenter, (LFloat)4f, SampleAreaModifications.SAMPLE_POLYAREA_TYPE_GRASS, DtSphereCollider crown = new DtSphereCollider(crownCenter, LFloat.L4, SampleAreaModifications.SAMPLE_POLYAREA_TYPE_GRASS,
walkableClimb); walkableClimb);
DtCompositeCollider collider = new DtCompositeCollider(@base, roof, trunk, crown); DtCompositeCollider collider = new DtCompositeCollider(@base, roof, trunk, crown);
IRcGizmoMeshFilter baseGizmo = RcGizmoFactory.Box(baseCenter, Detour.Dynamic.Colliders.DtBoxCollider.GetHalfEdges(baseUp, forward, baseExtent)); IRcGizmoMeshFilter baseGizmo = RcGizmoFactory.Box(baseCenter, Detour.Dynamic.Colliders.DtBoxCollider.GetHalfEdges(baseUp, forward, baseExtent));
IRcGizmoMeshFilter roofGizmo = RcGizmoFactory.Box(roofCenter, Detour.Dynamic.Colliders.DtBoxCollider.GetHalfEdges(roofUp, forward, roofExtent)); IRcGizmoMeshFilter roofGizmo = RcGizmoFactory.Box(roofCenter, Detour.Dynamic.Colliders.DtBoxCollider.GetHalfEdges(roofUp, forward, roofExtent));
IRcGizmoMeshFilter trunkGizmo = RcGizmoFactory.Capsule(trunkStart, trunkEnd, (LFloat)0.5f); IRcGizmoMeshFilter trunkGizmo = RcGizmoFactory.Capsule(trunkStart, trunkEnd, LFloat.L0D5);
IRcGizmoMeshFilter crownGizmo = RcGizmoFactory.Sphere(crownCenter, (LFloat)4f); IRcGizmoMeshFilter crownGizmo = RcGizmoFactory.Sphere(crownCenter, LFloat.L4);
IRcGizmoMeshFilter gizmo = RcGizmoFactory.Composite(baseGizmo, roofGizmo, trunkGizmo, crownGizmo); IRcGizmoMeshFilter gizmo = RcGizmoFactory.Composite(baseGizmo, roofGizmo, trunkGizmo, crownGizmo);
return new RcGizmo(collider, gizmo); return new RcGizmo(collider, gizmo);
} }
@@ -300,8 +300,8 @@ namespace DotRecast.Recast.Toolset.Tools
private LFloat[] TransformVertices(RcVec3f p, DemoInputGeomProvider geom, LFloat ax) private LFloat[] TransformVertices(RcVec3f p, DemoInputGeomProvider geom, LFloat ax)
{ {
var rx = RcMatrix4x4f.CreateFromRotate((LFloat)random.NextDouble() * ax, 1, 0, 0); var rx = RcMatrix4x4f.CreateFromRotate(random.NextDouble() * ax, 1, 0, 0);
var ry = RcMatrix4x4f.CreateFromRotate((LFloat)random.NextDouble() * 360, 0, 1, 0); var ry = RcMatrix4x4f.CreateFromRotate(random.NextDouble() * 360, 0, 1, 0);
var m = RcMatrix4x4f.Mul(ref rx, ref ry); var m = RcMatrix4x4f.Mul(ref rx, ref ry);
LFloat[] verts = new LFloat[geom.vertices.Length]; LFloat[] verts = new LFloat[geom.vertices.Length];
RcVec3f v = new RcVec3f(); RcVec3f v = new RcVec3f();
@@ -313,7 +313,7 @@ namespace DotRecast.Recast.Toolset.Tools
v.Z = geom.vertices[i + 2]; v.Z = geom.vertices[i + 2];
MulMatrixVector(ref vr, m, v); MulMatrixVector(ref vr, m, v);
vr.X += p.X; vr.X += p.X;
vr.Y += p.Y - (LFloat)0.1f; vr.Y += p.Y - LFloat.L0D1;
vr.Z += p.Z; vr.Z += p.Z;
verts[i] = vr.X; verts[i] = vr.X;
verts[i + 1] = vr.Y; verts[i + 1] = vr.Y;
@@ -351,8 +351,8 @@ namespace DotRecast.Recast.Toolset.Tools
public bool Raycast(RcVec3f spos, RcVec3f epos, out LFloat hitPos, out RcVec3f raycastHitPos) public bool Raycast(RcVec3f spos, RcVec3f epos, out LFloat hitPos, out RcVec3f raycastHitPos)
{ {
RcVec3f sp = new RcVec3f(spos.X, spos.Y + (LFloat)1.3f, spos.Z); RcVec3f sp = new RcVec3f(spos.X, spos.Y + (new LFloat("",1300)), spos.Z);
RcVec3f ep = new RcVec3f(epos.X, epos.Y + (LFloat)1.3f, epos.Z); RcVec3f ep = new RcVec3f(epos.X, epos.Y + (new LFloat("",1300)), epos.Z);
bool hasHit = dynaMesh.VoxelQuery().Raycast(sp, ep, out hitPos); bool hasHit = dynaMesh.VoxelQuery().Raycast(sp, ep, out hitPos);
raycastHitPos = hasHit raycastHitPos = hasHit
@@ -72,7 +72,7 @@ namespace DotRecast.Recast.Toolset.Tools
agentHeight, agentHeight,
agentClimb, agentClimb,
cfg.groundTolerance, cfg.groundTolerance,
-agentRadius * (LFloat)0.2f, -agentRadius * LFloat.L0D2,
cellSize + 2 * agentRadius + cfg.climbDownDistance, cellSize + 2 * agentRadius + cfg.climbDownDistance,
-cfg.climbDownMaxHeight, -cfg.climbDownMaxHeight,
-cfg.climbDownMinHeight, -cfg.climbDownMinHeight,
@@ -90,7 +90,7 @@ namespace DotRecast.Recast.Toolset.Tools
agentHeight, agentHeight,
agentClimb, agentClimb,
cfg.groundTolerance, cfg.groundTolerance,
-agentRadius * (LFloat)0.2f, -agentRadius * LFloat.L0D2,
cfg.edgeJumpEndDistance, cfg.edgeJumpEndDistance,
-cfg.edgeJumpDownMaxHeight, -cfg.edgeJumpDownMaxHeight,
cfg.edgeJumpUpMaxHeight, cfg.edgeJumpUpMaxHeight,
@@ -26,13 +26,13 @@ namespace DotRecast.Recast.Toolset.Tools
public int buildTypes = JumpLinkType.EDGE_CLIMB_DOWN.Bit | JumpLinkType.EDGE_JUMP.Bit; public int buildTypes = JumpLinkType.EDGE_CLIMB_DOWN.Bit | JumpLinkType.EDGE_JUMP.Bit;
public bool buildOffMeshConnections = false; public bool buildOffMeshConnections = false;
public LFloat groundTolerance = (LFloat)0.3f; public LFloat groundTolerance = LFloat.L0D3;
public LFloat climbDownDistance = (LFloat)0.4f; public LFloat climbDownDistance = LFloat.L0D4;
public LFloat climbDownMaxHeight = (LFloat)3.2f; public LFloat climbDownMaxHeight = new("",3200);
public LFloat climbDownMinHeight = (LFloat)1.5f; public LFloat climbDownMinHeight = new("",1500);
public LFloat edgeJumpEndDistance = (LFloat)2f; public LFloat edgeJumpEndDistance = LFloat.L2;
public LFloat edgeJumpHeight = (LFloat)0.4f; public LFloat edgeJumpHeight = LFloat.L0D4;
public LFloat edgeJumpDownMaxHeight = (LFloat)2.5f; public LFloat edgeJumpDownMaxHeight = new("",2500);
public LFloat edgeJumpUpMaxHeight = (LFloat)0.3f; public LFloat edgeJumpUpMaxHeight = LFloat.L0D3;
} }
} }
@@ -111,8 +111,8 @@ namespace DotRecast.Recast.Toolset.Tools
if (null == _tc) if (null == _tc)
return 0; return 0;
p.Y -= (LFloat)0.5f; p.Y -= LFloat.L0D5;
return _tc.AddObstacle(p, (LFloat)1.0f, (LFloat)2.0f); return _tc.AddObstacle(p, LFloat.L1, LFloat.L2);
} }
public DtTileCache GetTileCache() public DtTileCache GetTileCache()
@@ -52,8 +52,8 @@ namespace DotRecast.Recast.Toolset.Tools
navQuery.ClosestPointOnPoly(startRef, startPt, out var iterPos, out var _); navQuery.ClosestPointOnPoly(startRef, startPt, out var iterPos, out var _);
navQuery.ClosestPointOnPoly(pathIterPolys[pathIterPolys.Count - 1], endPt, out var targetPos, out var _); navQuery.ClosestPointOnPoly(pathIterPolys[pathIterPolys.Count - 1], endPt, out var targetPos, out var _);
LFloat STEP_SIZE = (LFloat)0.5f; LFloat STEP_SIZE = LFloat.L0D5;
LFloat SLOP = (LFloat)0.01f; LFloat SLOP = new LFloat("",10);
smoothPath.Clear(); smoothPath.Clear();
smoothPath.Add(iterPos); smoothPath.Add(iterPos);
@@ -110,7 +110,7 @@ namespace DotRecast.Recast.Toolset.Tools
} }
// Handle end of path and off-mesh links when close enough. // Handle end of path and off-mesh links when close enough.
if (endOfPath && DtPathUtils.InRange(iterPos, steerPos, SLOP, (LFloat)1.0f)) if (endOfPath && DtPathUtils.InRange(iterPos, steerPos, SLOP, LFloat.L1))
{ {
// Reached end of path. // Reached end of path.
iterPos = targetPos; iterPos = targetPos;
@@ -121,7 +121,7 @@ namespace DotRecast.Recast.Toolset.Tools
break; break;
} }
else if (offMeshConnection && DtPathUtils.InRange(iterPos, steerPos, SLOP, (LFloat)1.0f)) else if (offMeshConnection && DtPathUtils.InRange(iterPos, steerPos, SLOP, LFloat.L1))
{ {
// Reached off-mesh connection. // Reached off-mesh connection.
RcVec3f startPos = RcVec3f.Zero; RcVec3f startPos = RcVec3f.Zero;
@@ -383,21 +383,21 @@ namespace DotRecast.Recast.Toolset.Tools
return DtStatus.DT_FAILURE; return DtStatus.DT_FAILURE;
} }
LFloat nx = (epos.Z - spos.Z) * (LFloat)0.25f; LFloat nx = (epos.Z - spos.Z) * new LFloat("",250);
LFloat nz = -(epos.X - spos.X) * (LFloat)0.25f; LFloat nz = -(epos.X - spos.X) * new LFloat("",250);
var tempQueryPoly = new RcVec3f[4]; var tempQueryPoly = new RcVec3f[4];
tempQueryPoly[0].X = spos.X + nx * (LFloat)1.2f; tempQueryPoly[0].X = spos.X + nx * (new LFloat("",1200));
tempQueryPoly[0].Y = spos.Y + agentHeight / 2; tempQueryPoly[0].Y = spos.Y + agentHeight / 2;
tempQueryPoly[0].Z = spos.Z + nz * (LFloat)1.2f; tempQueryPoly[0].Z = spos.Z + nz * (new LFloat("",1200));
tempQueryPoly[1].X = spos.X - nx * (LFloat)1.3f; tempQueryPoly[1].X = spos.X - nx * (new LFloat("",1300));
tempQueryPoly[1].Y = spos.Y + agentHeight / 2; tempQueryPoly[1].Y = spos.Y + agentHeight / 2;
tempQueryPoly[1].Z = spos.Z - nz * (LFloat)1.3f; tempQueryPoly[1].Z = spos.Z - nz * (new LFloat("",1300));
tempQueryPoly[2].X = epos.X - nx * (LFloat)0.8f; tempQueryPoly[2].X = epos.X - nx * LFloat.L0D8;
tempQueryPoly[2].Y = epos.Y + agentHeight / 2; tempQueryPoly[2].Y = epos.Y + agentHeight / 2;
tempQueryPoly[2].Z = epos.Z - nz * (LFloat)0.8f; tempQueryPoly[2].Z = epos.Z - nz * LFloat.L0D8;
tempQueryPoly[3].X = epos.X + nx; tempQueryPoly[3].X = epos.X + nx;
tempQueryPoly[3].Y = epos.Y + agentHeight / 2; tempQueryPoly[3].Y = epos.Y + agentHeight / 2;
@@ -80,7 +80,7 @@ namespace DotRecast.Recast.Geom
LFloat d = LMath.Sqrt(normals[i] * normals[i] + normals[i + 1] * normals[i + 1] + normals[i + 2] * normals[i + 2]); LFloat d = LMath.Sqrt(normals[i] * normals[i] + normals[i + 1] * normals[i + 1] + normals[i + 2] * normals[i + 2]);
if (d > 0) if (d > 0)
{ {
d = (LFloat)1.0f / d; d = LFloat.L1 / d;
normals[i] *= d; normals[i] *= d;
normals[i + 1] *= d; normals[i + 1] *= d;
normals[i + 2] *= d; normals[i + 2] *= d;
@@ -116,7 +116,7 @@ namespace DotRecast.Recast.Geom
public bool RaycastMesh(RcVec3f src, RcVec3f dst, out LFloat tmin) public bool RaycastMesh(RcVec3f src, RcVec3f dst, out LFloat tmin)
{ {
tmin = (LFloat)1.0f; tmin = LFloat.L1;
// Prune hit ray. // Prune hit ray.
if (!RcIntersections.IsectSegAABB(src, dst, bmin, bmax, out var btmin, out var btmax)) if (!RcIntersections.IsectSegAABB(src, dst, bmin, bmax, out var btmin, out var btmax))
@@ -137,7 +137,7 @@ namespace DotRecast.Recast.Geom
return false; return false;
} }
tmin = (LFloat)1.0f; tmin = LFloat.L1;
bool hit = false; bool hit = false;
foreach (RcChunkyTriMeshNode chunk in chunks) foreach (RcChunkyTriMeshNode chunk in chunks)
{ {
@@ -273,7 +273,7 @@ namespace DotRecast.Recast.Geom
else else
{ {
// Compute intersection t value of ray with near and far plane of slab // Compute intersection t value of ray with near and far plane of slab
LFloat ood = (LFloat)1.0f / d.Get(i); LFloat ood = LFloat.L1 / d.Get(i);
LFloat t1 = (bmin.Get(i) - p.Get(i)) * ood; LFloat t1 = (bmin.Get(i) - p.Get(i)) * ood;
LFloat t2 = (bmax.Get(i) - p.Get(i)) * ood; LFloat t2 = (bmax.Get(i) - p.Get(i)) * ood;
if (t1 > t2) if (t1 > t2)
@@ -167,7 +167,7 @@ namespace DotRecast.Recast.Geom
LFloat d = LMath.Sqrt(normals[i] * normals[i] + normals[i + 1] * normals[i + 1] + normals[i + 2] * normals[i + 2]); LFloat d = LMath.Sqrt(normals[i] * normals[i] + normals[i + 1] * normals[i + 1] + normals[i + 2] * normals[i + 2]);
if (d > 0) if (d > 0)
{ {
d = (LFloat)1.0f / d; d = LFloat.L1 / d;
normals[i] *= d; normals[i] *= d;
normals[i + 1] *= d; normals[i + 1] *= d;
normals[i + 2] *= d; normals[i + 2] *= d;
@@ -541,9 +541,9 @@ namespace DotRecast.Recast
} }
RcVec3f point = new RcVec3f( RcVec3f point = new RcVec3f(
compactHeightfield.bmin.X + (x + (LFloat)0.5f) * compactHeightfield.cs, compactHeightfield.bmin.X + (x + LFloat.L0D5) * compactHeightfield.cs,
0, 0,
compactHeightfield.bmin.Z + (z + (LFloat)0.5f) * compactHeightfield.cs compactHeightfield.bmin.Z + (z + LFloat.L0D5) * compactHeightfield.cs
); );
if (PointInPoly(verts, point)) if (PointInPoly(verts, point))
@@ -648,8 +648,8 @@ namespace DotRecast.Recast
ref RcCompactCell cell = ref compactHeightfield.cells[x + z * zStride]; ref RcCompactCell cell = ref compactHeightfield.cells[x + z * zStride];
int maxSpanIndex = cell.index + cell.count; int maxSpanIndex = cell.index + cell.count;
LFloat cellX = compactHeightfield.bmin.X + ((LFloat)x + (LFloat)0.5f) * compactHeightfield.cs; LFloat cellX = compactHeightfield.bmin.X + (x.ToLFloat() + LFloat.L0D5) * compactHeightfield.cs;
LFloat cellZ = compactHeightfield.bmin.Z + ((LFloat)z + (LFloat)0.5f) * compactHeightfield.cs; LFloat cellZ = compactHeightfield.bmin.Z + (z.ToLFloat() + LFloat.L0D5) * compactHeightfield.cs;
LFloat deltaX = cellX - position[0]; LFloat deltaX = cellX - position[0];
LFloat deltaZ = cellZ - position[2]; LFloat deltaZ = cellZ - position[2];
@@ -744,7 +744,7 @@ namespace DotRecast.Recast
{ {
// Defines the limit at which a miter becomes a bevel. // Defines the limit at which a miter becomes a bevel.
// Similar in behavior to https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-miterlimit // Similar in behavior to https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-miterlimit
LFloat MITER_LIMIT = (LFloat)1.20f; LFloat MITER_LIMIT = new LFloat("",1200);
int numOutVerts = 0; int numOutVerts = 0;
@@ -784,23 +784,23 @@ namespace DotRecast.Recast
// Average the two segment normals to get the proportional miter offset for B. // Average the two segment normals to get the proportional miter offset for B.
// This isn't normalized because it's defining the distance and direction the corner will need to be // This isn't normalized because it's defining the distance and direction the corner will need to be
// adjusted proportionally to the edge offsets to properly miter the adjoining edges. // adjusted proportionally to the edge offsets to properly miter the adjoining edges.
LFloat cornerMiterX = (prevSegmentNormX + currSegmentNormX) * (LFloat)0.5f; LFloat cornerMiterX = (prevSegmentNormX + currSegmentNormX) * LFloat.L0D5;
LFloat cornerMiterZ = (prevSegmentNormZ + currSegmentNormZ) * (LFloat)0.5f; LFloat cornerMiterZ = (prevSegmentNormZ + currSegmentNormZ) * LFloat.L0D5;
LFloat cornerMiterSqMag = RcMath.Sqr(cornerMiterX) + RcMath.Sqr(cornerMiterZ); LFloat cornerMiterSqMag = RcMath.Sqr(cornerMiterX) + RcMath.Sqr(cornerMiterZ);
// If the magnitude of the segment normal average is less than about .69444, // If the magnitude of the segment normal average is less than about .69444,
// the corner is an acute enough angle that the result should be beveled. // the corner is an acute enough angle that the result should be beveled.
bool bevel = cornerMiterSqMag * MITER_LIMIT * MITER_LIMIT < 1.0f; bool bevel = cornerMiterSqMag * MITER_LIMIT * MITER_LIMIT < LFloat.L1;
// Scale the corner miter so it's proportional to how much the corner should be offset compared to the edges. // Scale the corner miter so it's proportional to how much the corner should be offset compared to the edges.
if (cornerMiterSqMag > RcVecUtils.Epsilon) if (cornerMiterSqMag > RcVecUtils.Epsilon)
{ {
LFloat scale = (LFloat)1.0f / cornerMiterSqMag; LFloat scale = LFloat.L1 / cornerMiterSqMag;
cornerMiterX *= scale; cornerMiterX *= scale;
cornerMiterZ *= scale; cornerMiterZ *= scale;
} }
if (bevel && cross < 0.0f) // If the corner is convex and an acute enough angle, generate a bevel. if (bevel && cross < (LFloat.L0)) // If the corner is convex and an acute enough angle, generate a bevel.
{ {
if (numOutVerts + 2 > maxOutVerts) if (numOutVerts + 2 > maxOutVerts)
{ {
@@ -809,7 +809,7 @@ namespace DotRecast.Recast
// Generate two bevel vertices at a distances from B proportional to the angle between the two segments. // Generate two bevel vertices at a distances from B proportional to the angle between the two segments.
// Move each bevel vertex out proportional to the given offset. // Move each bevel vertex out proportional to the given offset.
LFloat d = ((LFloat)1.0f - (prevSegmentDir.X * currSegmentDir.X + prevSegmentDir.Z * currSegmentDir.Z)) * (LFloat)0.5f; LFloat d = (LFloat.L1 - (prevSegmentDir.X * currSegmentDir.X + prevSegmentDir.Z * currSegmentDir.Z)) * LFloat.L0D5;
outVerts[numOutVerts * 3 + 0] = vertB.X + (-prevSegmentNormX + prevSegmentDir.X * d) * offset; outVerts[numOutVerts * 3 + 0] = vertB.X + (-prevSegmentNormX + prevSegmentDir.X * d) * offset;
outVerts[numOutVerts * 3 + 1] = vertB.Y; outVerts[numOutVerts * 3 + 1] = vertB.Y;
@@ -101,8 +101,8 @@ namespace DotRecast.Recast
public static void CalcGridSize(RcVec3f bmin, RcVec3f bmax, LFloat cs, out int sizeX, out int sizeZ) public static void CalcGridSize(RcVec3f bmin, RcVec3f bmax, LFloat cs, out int sizeX, out int sizeZ)
{ {
sizeX = (int)((bmax.X - bmin.X) / cs + 0.5f); sizeX = (int)((bmax.X - bmin.X) / cs + LFloat.L0D5);
sizeZ = (int)((bmax.Z - bmin.Z) / cs + 0.5f); sizeZ = (int)((bmax.Z - bmin.Z) / cs + LFloat.L0D5);
} }
@@ -123,7 +123,7 @@ namespace DotRecast.Recast
public static int[] MarkWalkableTriangles(RcContext ctx, LFloat walkableSlopeAngle, LFloat[] verts, int[] tris, int nt, RcAreaModification areaMod) public static int[] MarkWalkableTriangles(RcContext ctx, LFloat walkableSlopeAngle, LFloat[] verts, int[] tris, int nt, RcAreaModification areaMod)
{ {
int[] areas = new int[nt]; int[] areas = new int[nt];
LFloat walkableThr = LMath.Cos(walkableSlopeAngle / (LFloat)180.0f * LMath.PI); LFloat walkableThr = LMath.Cos(walkableSlopeAngle / LFloat.L180 * LMath.PI);
RcVec3f norm = new RcVec3f(); RcVec3f norm = new RcVec3f();
for (int i = 0; i < nt; ++i) for (int i = 0; i < nt; ++i)
{ {
@@ -156,7 +156,7 @@ namespace DotRecast.Recast
/// @see rcHeightfield, rcClearUnwalkableTriangles, rcRasterizeTriangles /// @see rcHeightfield, rcClearUnwalkableTriangles, rcRasterizeTriangles
public static void ClearUnwalkableTriangles(RcContext ctx, LFloat walkableSlopeAngle, LFloat[] verts, int nv, int[] tris, int nt, int[] areas) public static void ClearUnwalkableTriangles(RcContext ctx, LFloat walkableSlopeAngle, LFloat[] verts, int nv, int[] tris, int nt, int[] areas)
{ {
LFloat walkableThr = LMath.Cos(walkableSlopeAngle / (LFloat)180.0f * LMath.PI); LFloat walkableThr = LMath.Cos(walkableSlopeAngle / LFloat.L180 * LMath.PI);
RcVec3f norm = new RcVec3f(); RcVec3f norm = new RcVec3f();
@@ -175,7 +175,7 @@ namespace DotRecast.Recast
MaxEdgeLenWorld = edgeMaxLen; MaxEdgeLenWorld = edgeMaxLen;
MaxSimplificationError = edgeMaxError; MaxSimplificationError = edgeMaxError;
MaxVertsPerPoly = vertsPerPoly; MaxVertsPerPoly = vertsPerPoly;
DetailSampleDist = detailSampleDist < 0.9f ? 0 : cellSize * detailSampleDist; DetailSampleDist = detailSampleDist < LFloat.L0D9 ? 0 : cellSize * detailSampleDist;
DetailSampleMaxError = cellHeight * detailSampleMaxError; DetailSampleMaxError = cellHeight * detailSampleMaxError;
WalkableAreaMod = walkableAreaMod; WalkableAreaMod = walkableAreaMod;
FilterLowHangingObstacles = filterLowHangingObstacles; FilterLowHangingObstacles = filterLowHangingObstacles;
@@ -28,7 +28,7 @@ namespace DotRecast.Recast
{ {
public static class RcFilledVolumeRasterization public static class RcFilledVolumeRasterization
{ {
private static LFloat EPSILON = (LFloat)0.0001f; private static LFloat EPSILON = LFloat.EPS_1MS;
private static readonly int[] BOX_EDGES = new[] { 0, 1, 0, 2, 0, 4, 1, 3, 1, 5, 2, 3, 2, 6, 3, 7, 4, 5, 4, 6, 5, 7, 6, 7 }; private static readonly int[] BOX_EDGES = new[] { 0, 1, 0, 2, 0, 4, 1, 3, 1, 5, 2, 3, 2, 6, 3, 7, 4, 5, 4, 6, 5, 7, 6, 7 };
public static void RasterizeSphere(RcHeightfield hf, RcVec3f center, LFloat radius, int area, int flagMergeThr, RcContext ctx) public static void RasterizeSphere(RcHeightfield hf, RcVec3f center, LFloat radius, int area, int flagMergeThr, RcContext ctx)
@@ -92,9 +92,9 @@ namespace DotRecast.Recast
}; };
for (int i = 0; i < 8; ++i) for (int i = 0; i < 8; ++i)
{ {
LFloat s0 = (i & 1) != 0 ? (LFloat)1f : -(LFloat)1f; LFloat s0 = (i & 1) != 0 ? LFloat.L1 : -LFloat.L1;
LFloat s1 = (i & 2) != 0 ? (LFloat)1f : -(LFloat)1f; LFloat s1 = (i & 2) != 0 ? LFloat.L1 : -LFloat.L1;
LFloat s2 = (i & 4) != 0 ? (LFloat)1f : -(LFloat)1f; LFloat s2 = (i & 4) != 0 ? LFloat.L1 : -LFloat.L1;
vertices[i * 3 + 0] = center.X + s0 * halfEdges[0].X + s1 * halfEdges[1].X + s2 * halfEdges[2].X; vertices[i * 3 + 0] = center.X + s0 * halfEdges[0].X + s1 * halfEdges[1].X + s2 * halfEdges[2].X;
vertices[i * 3 + 1] = center.Y + s0 * halfEdges[0].Y + s1 * halfEdges[1].Y + s2 * halfEdges[2].Y; vertices[i * 3 + 1] = center.Y + s0 * halfEdges[0].Y + s1 * halfEdges[1].Y + s2 * halfEdges[2].Y;
vertices[i * 3 + 2] = center.Z + s0 * halfEdges[0].Z + s1 * halfEdges[1].Z + s2 * halfEdges[2].Z; vertices[i * 3 + 2] = center.Z + s0 * halfEdges[0].Z + s1 * halfEdges[1].Z + s2 * halfEdges[2].Z;
@@ -151,14 +151,14 @@ namespace DotRecast.Recast
Plane(planes, i + 1, planes[i], bc, vertices, b); Plane(planes, i + 1, planes[i], bc, vertices, b);
Plane(planes, i + 2, planes[i], ca, vertices, c); Plane(planes, i + 2, planes[i], ca, vertices, c);
LFloat s = (LFloat)1.0f / (vertices[a] * planes[i + 1][0] + vertices[a + 1] * planes[i + 1][1] LFloat s = LFloat.L1 / (vertices[a] * planes[i + 1][0] + vertices[a + 1] * planes[i + 1][1]
+ vertices[a + 2] * planes[i + 1][2] - planes[i + 1][3]); + vertices[a + 2] * planes[i + 1][2] - planes[i + 1][3]);
planes[i + 1][0] *= s; planes[i + 1][0] *= s;
planes[i + 1][1] *= s; planes[i + 1][1] *= s;
planes[i + 1][2] *= s; planes[i + 1][2] *= s;
planes[i + 1][3] *= s; planes[i + 1][3] *= s;
s = (LFloat)1.0f / (vertices[b] * planes[i + 2][0] + vertices[b + 1] * planes[i + 2][1] + vertices[b + 2] * planes[i + 2][2] s = LFloat.L1 / (vertices[b] * planes[i + 2][0] + vertices[b + 1] * planes[i + 2][1] + vertices[b + 2] * planes[i + 2][2]
- planes[i + 2][3]); - planes[i + 2][3]);
planes[i + 2][0] *= s; planes[i + 2][0] *= s;
planes[i + 2][1] *= s; planes[i + 2][1] *= s;
@@ -199,8 +199,8 @@ namespace DotRecast.Recast
return; return;
} }
LFloat ics = (LFloat)1.0f / hf.cs; LFloat ics = LFloat.L1 / hf.cs;
LFloat ich = (LFloat)1.0f / hf.ch; LFloat ich = LFloat.L1 / hf.ch;
int xMin = (int)((bounds[0] - hf.bmin.X) * ics); int xMin = (int)((bounds[0] - hf.bmin.X) * ics);
int zMin = (int)((bounds[2] - hf.bmin.Z) * ics); int zMin = (int)((bounds[2] - hf.bmin.Z) * ics);
int xMax = LMath.Min(hf.width - 1, (int)((bounds[3] - hf.bmin.X) * ics)); int xMax = LMath.Min(hf.width - 1, (int)((bounds[3] - hf.bmin.X) * ics));
@@ -243,13 +243,13 @@ namespace DotRecast.Recast
LFloat b = my; // Dot(m, d) d = (0, 1, 0) LFloat b = my; // Dot(m, d) d = (0, 1, 0)
LFloat c = LenSqr(mx, my, mz) - radiusSqr; LFloat c = LenSqr(mx, my, mz) - radiusSqr;
if (c > 0.0f && b > 0.0f) if (c > (LFloat.L0) && b > (LFloat.L0))
{ {
return null; return null;
} }
LFloat discr = b * b - c; LFloat discr = b * b - c;
if (discr < 0.0f) if (discr < (LFloat.L0))
{ {
return null; return null;
} }
@@ -258,9 +258,9 @@ namespace DotRecast.Recast
LFloat tmin = -b - discrSqrt; LFloat tmin = -b - discrSqrt;
LFloat tmax = -b + discrSqrt; LFloat tmax = -b + discrSqrt;
if (tmin < 0.0f) if (tmin < (LFloat.L0))
{ {
tmin = (LFloat)0.0f; tmin = LFloat.L0;
} }
return new LFloat[] { y + tmin, y + tmax }; return new LFloat[] { y + tmin, y + tmax };
@@ -437,7 +437,7 @@ namespace DotRecast.Recast
if (LMath.Abs(a) < EPSILON) if (LMath.Abs(a) < EPSILON)
{ {
// Segment runs parallel to cylinder axis // Segment runs parallel to cylinder axis
if (c > 0.0f) if (c > (LFloat.L0))
{ {
return null; // a and thus the segment lie outside cylinder return null; // a and thus the segment lie outside cylinder
} }
@@ -450,7 +450,7 @@ namespace DotRecast.Recast
LFloat b = dd * mn - nd * md; LFloat b = dd * mn - nd * md;
LFloat discr = b * b - a * c; LFloat discr = b * b - a * c;
if (discr < 0.0f) if (discr < (LFloat.L0))
{ {
return null; // No real roots; no intersection return null; // No real roots; no intersection
} }
@@ -459,11 +459,11 @@ namespace DotRecast.Recast
LFloat t1 = (-b - discSqrt) / a; LFloat t1 = (-b - discSqrt) / a;
LFloat t2 = (-b + discSqrt) / a; LFloat t2 = (-b + discSqrt) / a;
if (md + t1 * nd < 0.0f) if (md + t1 * nd < (LFloat.L0))
{ {
// Intersection outside cylinder on p side // Intersection outside cylinder on p side
t1 = -md / nd; t1 = -md / nd;
if (k + t1 * (2 * mn + t1 * nn) > 0.0f) if (k + t1 * (2 * mn + t1 * nn) > (LFloat.L0))
{ {
return null; return null;
} }
@@ -472,17 +472,17 @@ namespace DotRecast.Recast
{ {
// Intersection outside cylinder on q side // Intersection outside cylinder on q side
t1 = (dd - md) / nd; t1 = (dd - md) / nd;
if (k + dd - 2 * md + t1 * (2 * (mn - nd) + t1 * nn) > 0.0f) if (k + dd - 2 * md + t1 * (2 * (mn - nd) + t1 * nn) > (LFloat.L0))
{ {
return null; return null;
} }
} }
if (md + t2 * nd < 0.0f) if (md + t2 * nd < (LFloat.L0))
{ {
// Intersection outside cylinder on p side // Intersection outside cylinder on p side
t2 = -md / nd; t2 = -md / nd;
if (k + t2 * (2 * mn + t2 * nn) > 0.0f) if (k + t2 * (2 * mn + t2 * nn) > (LFloat.L0))
{ {
return null; return null;
} }
@@ -491,7 +491,7 @@ namespace DotRecast.Recast
{ {
// Intersection outside cylinder on q side // Intersection outside cylinder on q side
t2 = (dd - md) / nd; t2 = (dd - md) / nd;
if (k + dd - 2 * md + t2 * (2 * (mn - nd) + t2 * nn) > 0.0f) if (k + dd - 2 * md + t2 * (2 * (mn - nd) + t2 * nn) > (LFloat.L0))
{ {
return null; return null;
} }
@@ -705,7 +705,7 @@ namespace DotRecast.Recast
} }
} }
iy = (LFloat)0.0f; iy = LFloat.L0;
return false; return false;
} }
@@ -723,29 +723,29 @@ namespace DotRecast.Recast
} }
} }
iy = (LFloat)0.0f; iy = LFloat.L0;
return false; return false;
} }
private static bool RayTriangleIntersection(RcVec3f point, int plane, LFloat[][] planes, out LFloat y) private static bool RayTriangleIntersection(RcVec3f point, int plane, LFloat[][] planes, out LFloat y)
{ {
y = (LFloat)0.0f; y = LFloat.L0;
LFloat t = (planes[plane][3] - RcVecUtils.Dot(planes[plane], point)) / planes[plane][1]; LFloat t = (planes[plane][3] - RcVecUtils.Dot(planes[plane], point)) / planes[plane][1];
LFloat[] s = { point.X, point.Y + t, point.Z }; LFloat[] s = { point.X, point.Y + t, point.Z };
LFloat u = RcVecUtils.Dot(s, planes[plane + 1]) - planes[plane + 1][3]; LFloat u = RcVecUtils.Dot(s, planes[plane + 1]) - planes[plane + 1][3];
if (u < 0.0f || u > 1.0f) if (u < (LFloat.L0) || u > LFloat.L1)
{ {
return false; return false;
} }
LFloat v = RcVecUtils.Dot(s, planes[plane + 2]) - planes[plane + 2][3]; LFloat v = RcVecUtils.Dot(s, planes[plane + 2]) - planes[plane + 2][3];
if (v < 0.0f) if (v < (LFloat.L0))
{ {
return false; return false;
} }
LFloat w = (LFloat)1f - u - v; LFloat w = LFloat.L1 - u - v;
if (w < 0.0f) if (w < (LFloat.L0))
{ {
return false; return false;
} }
@@ -551,7 +551,7 @@ namespace DotRecast.Recast
// Update height so that it matches on both sides of the portal. // Update height so that it matches on both sides of the portal.
ref RcCompactSpan @as = ref chf.spans[ai]; ref RcCompactSpan @as = ref chf.spans[ai];
if (@as.y > hmin) if (@as.y > hmin)
layer.heights[idx] = LMath.Max(layer.heights[idx], (LFloat)(char)(@as.y - hmin)); layer.heights[idx] = LMath.Max(layer.heights[idx], (@as.y - hmin).ToLFloat());
} }
// Valid connection mask // Valid connection mask
@@ -180,7 +180,7 @@ namespace DotRecast.Recast
} }
c = RcVecUtils.Create(verts, p1); c = RcVecUtils.Create(verts, p1);
r.Exchange((LFloat)0f); r.Exchange(LFloat.L0);
return false; return false;
} }
@@ -197,7 +197,7 @@ namespace DotRecast.Recast
LFloat dot12 = Vdot2(v1, v2); LFloat dot12 = Vdot2(v1, v2);
// Compute barycentric coordinates // Compute barycentric coordinates
LFloat invDenom = (LFloat)1.0f / (dot00 * dot11 - dot01 * dot01); LFloat invDenom = LFloat.L1 / (dot00 * dot11 - dot01 * dot01);
LFloat u = (dot11 * dot02 - dot01 * dot12) * invDenom; LFloat u = (dot11 * dot02 - dot01 * dot12) * invDenom;
LFloat v = (dot00 * dot12 - dot01 * dot02) * invDenom; LFloat v = (dot00 * dot12 - dot01 * dot02) * invDenom;
@@ -346,8 +346,8 @@ namespace DotRecast.Recast
private static int GetHeight(LFloat fx, LFloat fy, LFloat fz, LFloat cs, LFloat ics, LFloat ch, int radius, private static int GetHeight(LFloat fx, LFloat fy, LFloat fz, LFloat cs, LFloat ics, LFloat ch, int radius,
RcHeightPatch hp) RcHeightPatch hp)
{ {
int ix = (int)LMath.Floor(fx * ics + (LFloat)0.01f); int ix = (int)LMath.Floor(fx * ics + (new LFloat("",10)));
int iz = (int)LMath.Floor(fz * ics + (LFloat)0.01f); int iz = (int)LMath.Floor(fz * ics + (new LFloat("",10)));
ix = LMath.Clamp(ix - hp.xmin, 0, hp.width - 1); ix = LMath.Clamp(ix - hp.xmin, 0, hp.width - 1);
iz = LMath.Clamp(iz - hp.ymin, 0, hp.height - 1); iz = LMath.Clamp(iz - hp.ymin, 0, hp.height - 1);
int h = hp.data[ix + iz * hp.width]; int h = hp.data[ix + iz * hp.width];
@@ -474,11 +474,11 @@ namespace DotRecast.Recast
{ {
LFloat a1 = Vcross2(verts, a, b, d); LFloat a1 = Vcross2(verts, a, b, d);
LFloat a2 = Vcross2(verts, a, b, c); LFloat a2 = Vcross2(verts, a, b, c);
if (a1 * a2 < 0.0f) if (a1 * a2 < (LFloat.L0))
{ {
LFloat a3 = Vcross2(verts, c, d, a); LFloat a3 = Vcross2(verts, c, d, a);
LFloat a4 = a3 + a2 - a1; LFloat a4 = a3 + a2 - a1;
if (a3 * a4 < 0.0f) if (a3 * a4 < (LFloat.L0))
{ {
return true; return true;
} }
@@ -535,7 +535,7 @@ namespace DotRecast.Recast
// Find best point on left of edge. // Find best point on left of edge.
int pt = npts; int pt = npts;
RcVec3f c = new RcVec3f(); RcVec3f c = new RcVec3f();
RcAtomicFloat r = new RcAtomicFloat(-(LFloat)1f); RcAtomicFloat r = new RcAtomicFloat(-LFloat.L1);
for (int u = 0; u < npts; ++u) for (int u = 0; u < npts; ++u)
{ {
if (u == s || u == t) if (u == s || u == t)
@@ -554,7 +554,7 @@ namespace DotRecast.Recast
} }
LFloat d = Vdist2(c, pts, u * 3); LFloat d = Vdist2(c, pts, u * 3);
LFloat tol = (LFloat)0.001f; LFloat tol = LFloat.EPS_1MS;
if (d > r.Get() * (1 + tol)) if (d > r.Get() * (1 + tol))
{ {
// Outside current circumcircle, skip. // Outside current circumcircle, skip.
@@ -821,12 +821,12 @@ namespace DotRecast.Recast
private static LFloat GetJitterX(int i) private static LFloat GetJitterX(int i)
{ {
return (((i * 0x8da6b343) & 0xffff) / (LFloat)65535.0f * (LFloat)2.0f) - (LFloat)1.0f; return (((i * 0x8da6b343) & 0xffff) / 65535.ToLFloat() * LFloat.L2) - LFloat.L1;
} }
private static LFloat GetJitterY(int i) private static LFloat GetJitterY(int i)
{ {
return (((i * 0xd8163841) & 0xffff) / (LFloat)65535.0f * (LFloat)2.0f) - (LFloat)1.0f; return (((i * 0xd8163841) & 0xffff) / 65535.ToLFloat() * LFloat.L2) - LFloat.L1;
} }
static int BuildPolyDetail(RcContext ctx, LFloat[] @in, int nin, LFloat sampleDist, LFloat sampleMaxError, static int BuildPolyDetail(RcContext ctx, LFloat[] @in, int nin, LFloat sampleDist, LFloat sampleMaxError,
@@ -849,7 +849,7 @@ namespace DotRecast.Recast
tris.Clear(); tris.Clear();
LFloat cs = chf.cs; LFloat cs = chf.cs;
LFloat ics = (LFloat)1.0f / cs; LFloat ics = LFloat.L1 / cs;
// Calculate minimum extents of the polygon based on input data. // Calculate minimum extents of the polygon based on input data.
LFloat minExtent = PolyMinExtent(verts, nverts); LFloat minExtent = PolyMinExtent(verts, nverts);
@@ -901,7 +901,7 @@ namespace DotRecast.Recast
for (int k = 0; k <= nn; ++k) for (int k = 0; k <= nn; ++k)
{ {
LFloat u = (LFloat)k / (LFloat)nn; LFloat u = k.ToLFloat() / nn.ToLFloat();
int pos = k * 3; int pos = k * 3;
edge[pos + 0] = @in[vj + 0] + dx * u; edge[pos + 0] = @in[vj + 0] + dx * u;
edge[pos + 1] = @in[vj + 1] + dy * u; edge[pos + 1] = @in[vj + 1] + dy * u;
@@ -1017,7 +1017,7 @@ namespace DotRecast.Recast
{ {
RcVec3f pt = new RcVec3f(); RcVec3f pt = new RcVec3f();
pt.X = x * sampleDist; pt.X = x * sampleDist;
pt.Y = (bmax.Y + bmin.Y) * (LFloat)0.5f; pt.Y = (bmax.Y + bmin.Y) * LFloat.L0D5;
pt.Z = z * sampleDist; pt.Z = z * sampleDist;
// Make sure the samples are not too close to the edges. // Make sure the samples are not too close to the edges.
if (DistToPoly(nin, @in, pt) > -sampleDist / 2) if (DistToPoly(nin, @in, pt) > -sampleDist / 2)
@@ -1058,9 +1058,9 @@ namespace DotRecast.Recast
RcVec3f pt = new RcVec3f(); RcVec3f pt = new RcVec3f();
// The sample location is jittered to get rid of some bad triangulations // The sample location is jittered to get rid of some bad triangulations
// which are cause by symmetrical data from the grid structure. // which are cause by symmetrical data from the grid structure.
pt.X = samples[s + 0] * sampleDist + GetJitterX(i) * cs * (LFloat)0.1f; pt.X = samples[s + 0] * sampleDist + GetJitterX(i) * cs * LFloat.L0D1;
pt.Y = samples[s + 1] * chf.ch; pt.Y = samples[s + 1] * chf.ch;
pt.Z = samples[s + 2] * sampleDist + GetJitterY(i) * cs * (LFloat)0.1f; pt.Z = samples[s + 2] * sampleDist + GetJitterY(i) * cs * LFloat.L0D1;
LFloat d = DistToTriMesh(pt, verts, nverts, tris, tris.Count / 4); LFloat d = DistToTriMesh(pt, verts, nverts, tris, tris.Count / 4);
if (d < 0) if (d < 0)
{ {
@@ -1440,7 +1440,7 @@ namespace DotRecast.Recast
LFloat ch = mesh.ch; LFloat ch = mesh.ch;
RcVec3f orig = mesh.bmin; RcVec3f orig = mesh.bmin;
int borderSize = mesh.borderSize; int borderSize = mesh.borderSize;
int heightSearchRadius = (int)LMath.Max((LFloat)1, LMath.Ceiling(mesh.maxEdgeError)); int heightSearchRadius = (int)LMath.Max(LFloat.L1, LMath.Ceiling(mesh.maxEdgeError));
List<int> tris = new List<int>(512); List<int> tris = new List<int>(512);
LFloat[] verts = new LFloat[256 * 3]; LFloat[] verts = new LFloat[256 * 3];
@@ -1261,13 +1261,13 @@ namespace DotRecast.Recast
{ {
RcPolyMesh pmesh = meshes[i]; RcPolyMesh pmesh = meshes[i];
int ox = (int)LMath.Floor((pmesh.bmin.X - mesh.bmin.X) / mesh.cs + (LFloat)0.5f); int ox = (int)LMath.Floor((pmesh.bmin.X - mesh.bmin.X) / mesh.cs + LFloat.L0D5);
int oz = (int)LMath.Floor((pmesh.bmin.Z - mesh.bmin.Z) / mesh.cs + (LFloat)0.5f); int oz = (int)LMath.Floor((pmesh.bmin.Z - mesh.bmin.Z) / mesh.cs + LFloat.L0D5);
bool isMinX = (ox == 0); bool isMinX = (ox == 0);
bool isMinZ = (oz == 0); bool isMinZ = (oz == 0);
bool isMaxX = (LMath.Floor((mesh.bmax.X - pmesh.bmax.X) / mesh.cs + (LFloat)0.5f)) == 0; bool isMaxX = (LMath.Floor((mesh.bmax.X - pmesh.bmax.X) / mesh.cs + LFloat.L0D5)) == 0;
bool isMaxZ = (LMath.Floor((mesh.bmax.Z - pmesh.bmax.Z) / mesh.cs + (LFloat)0.5f)) == 0; bool isMaxZ = (LMath.Floor((mesh.bmax.Z - pmesh.bmax.Z) / mesh.cs + LFloat.L0D5)) == 0;
bool isOnBorder = (isMinX || isMinZ || isMaxX || isMaxZ); bool isOnBorder = (isMinX || isMinZ || isMaxX || isMaxZ);
for (int j = 0; j < pmesh.nverts; ++j) for (int j = 0; j < pmesh.nverts; ++j)
@@ -28,7 +28,7 @@ namespace DotRecast.Recast
{ {
public static bool Raycast(IList<RcBuilderResult> results, RcVec3f src, RcVec3f dst, out LFloat hitTime) public static bool Raycast(IList<RcBuilderResult> results, RcVec3f src, RcVec3f dst, out LFloat hitTime)
{ {
hitTime = (LFloat)0.0f; hitTime = LFloat.L0;
foreach (RcBuilderResult result in results) foreach (RcBuilderResult result in results)
{ {
if (result.MeshDetail != null) if (result.MeshDetail != null)
@@ -402,7 +402,7 @@ namespace DotRecast.Recast
spanMax -= heightfieldBBMin.Y; spanMax -= heightfieldBBMin.Y;
// Skip the span if it is outside the heightfield bbox // Skip the span if it is outside the heightfield bbox
if (spanMax < 0.0f) if (spanMax < (LFloat.L0))
{ {
continue; continue;
} }
@@ -413,7 +413,7 @@ namespace DotRecast.Recast
} }
// Clamp the span to the heightfield bbox. // Clamp the span to the heightfield bbox.
if (spanMin < 0.0f) if (spanMin < (LFloat.L0))
{ {
spanMin = 0; spanMin = 0;
} }
@@ -457,8 +457,8 @@ namespace DotRecast.Recast
using var timer = context.ScopedTimer(RcTimerLabel.RC_TIMER_RASTERIZE_TRIANGLES); using var timer = context.ScopedTimer(RcTimerLabel.RC_TIMER_RASTERIZE_TRIANGLES);
// Rasterize the single triangle. // Rasterize the single triangle.
LFloat inverseCellSize = (LFloat)1.0f / heightfield.cs; LFloat inverseCellSize = LFloat.L1 / heightfield.cs;
LFloat inverseCellHeight = (LFloat)1.0f / heightfield.ch; LFloat inverseCellHeight = LFloat.L1 / heightfield.ch;
RasterizeTri(verts, v0, v1, v2, areaID, heightfield, heightfield.bmin, heightfield.bmax, heightfield.cs, inverseCellSize, RasterizeTri(verts, v0, v1, v2, areaID, heightfield, heightfield.bmin, heightfield.bmax, heightfield.cs, inverseCellSize,
inverseCellHeight, flagMergeThreshold); inverseCellHeight, flagMergeThreshold);
} }
@@ -484,8 +484,8 @@ namespace DotRecast.Recast
{ {
using var timer = context.ScopedTimer(RcTimerLabel.RC_TIMER_RASTERIZE_TRIANGLES); using var timer = context.ScopedTimer(RcTimerLabel.RC_TIMER_RASTERIZE_TRIANGLES);
LFloat inverseCellSize = (LFloat)1.0f / heightfield.cs; LFloat inverseCellSize = LFloat.L1 / heightfield.cs;
LFloat inverseCellHeight = (LFloat)1.0f / heightfield.ch; LFloat inverseCellHeight = LFloat.L1 / heightfield.ch;
for (int triIndex = 0; triIndex < numTris; ++triIndex) for (int triIndex = 0; triIndex < numTris; ++triIndex)
{ {
int v0 = tris[triIndex * 3 + 0]; int v0 = tris[triIndex * 3 + 0];
@@ -516,8 +516,8 @@ namespace DotRecast.Recast
{ {
using var timer = context.ScopedTimer(RcTimerLabel.RC_TIMER_RASTERIZE_TRIANGLES); using var timer = context.ScopedTimer(RcTimerLabel.RC_TIMER_RASTERIZE_TRIANGLES);
LFloat inverseCellSize = (LFloat)1.0f / heightfield.cs; LFloat inverseCellSize = LFloat.L1 / heightfield.cs;
LFloat inverseCellHeight = (LFloat)1.0f / heightfield.ch; LFloat inverseCellHeight = LFloat.L1 / heightfield.ch;
for (int triIndex = 0; triIndex < numTris; ++triIndex) for (int triIndex = 0; triIndex < numTris; ++triIndex)
{ {
int v0 = (triIndex * 3 + 0); int v0 = (triIndex * 3 + 0);
@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 77439ffa9cec4759849d22cb0349256d
timeCreated: 1715343409
@@ -27,9 +27,5 @@ namespace JNGame.Math
return new LFloat(true, (long)(value * LFloat.Precision)); return new LFloat(true, (long)(value * LFloat.Precision));
} }
public static LFloat Abs(this LFloat val)
{
return LMath.Abs(val);
}
} }
} }
@@ -23,8 +23,9 @@ namespace JNGame.Math
/// 定点数精度 /// 定点数精度
/// </summary> /// </summary>
public const long Precision = 1000000L; public const long Precision = 1000000L;
/// <summary> /// <summary>
/// 精度缩小1000 /// 精度缩小10倍
/// </summary> /// </summary>
public const int RateOfOldPrecision = (int)(Precision / 1000L); public const int RateOfOldPrecision = (int)(Precision / 1000L);
/// <summary> /// <summary>
@@ -183,8 +184,43 @@ namespace JNGame.Math
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static LFloat operator *(in LFloat a, in LFloat b) public static LFloat operator *(in LFloat a, in LFloat b)
{ {
long val = a.rawValue * b.rawValue;
return new LFloat(true, val / LFloat.Precision); // ------------------- 这个会越界 -------------------
// // 安全地进行乘法
// long val = a.rawValue * b.rawValue;
// return new LFloat(true, val / Precision);
// ------------------- 这个精度差 -------------------
// long scaleDownFactor = 100;
//
// // 将 a 和 b 的值除以缩放因子,得到缩放后的值
// long scaledA = a.rawValue / scaleDownFactor;
// long scaledB = b.rawValue / scaleDownFactor;
//
// // 计算缩放后值的乘积
// long scaledProduct = scaledA * scaledB;
//
// // 返回计算得到的定点数结果
// return new LFloat(true, scaledProduct / 100);
// ------------------- 这个性能差 -------------------
// 分解 a 和 b 的值为高位和低位
long aHigh = a.rawValue / Precision; // a 的整数部分
long aLow = a.rawValue % Precision; // a 的小数部分
long bHigh = b.rawValue / Precision; // b 的整数部分
long bLow = b.rawValue % Precision; // b 的小数部分
// 计算各部分的乘积,避免直接相乘导致溢出
long highHigh = aHigh * bHigh * Precision; // 整数部分
long lowHigh = aLow * bHigh; // a 的小数部分 × b 的整数部分
long highLow = aHigh * bLow; // a 的整数部分 × b 的小数部分
long lowLow = aLow * bLow / Precision; // 小数部分的乘积再缩放
// 合并所有部分,得到最终结果
long result = highHigh + lowHigh + highLow + lowLow;
// 返回结果
return new LFloat(true, result);
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
@@ -463,7 +499,8 @@ namespace JNGame.Math
#if DEBUG_DUMP #if DEBUG_DUMP
return _val.ToString(); return _val.ToString();
#else #else
var val = (rawValue * LFloat.PrecisionFactor); // var val = (rawValue * LFloat.PrecisionFactor);
var val = (rawValue * 0.000001f);
// 限制4位小数 // 限制4位小数
// val = (int)System.Math.Round((double)val * 10000) / 10000f; // val = (int)System.Math.Round((double)val * 10000) / 10000f;
return val.ToString("f4"); return val.ToString("f4");
@@ -620,7 +657,7 @@ namespace JNGame.Math
/// <summary> /// <summary>
/// 毫秒单位时间 = 0.001f /// 毫秒单位时间 = 0.001f
/// </summary> /// </summary>
public static readonly LFloat EPS_1MS = new LFloat(null, 1L); public static readonly LFloat EPS_1MS = new LFloat("", 1L);
/// <summary> /// <summary>
@@ -628,11 +665,51 @@ namespace JNGame.Math
/// </summary> /// </summary>
public static LFloat L0 => 0.ToLFloat(); public static LFloat L0 => 0.ToLFloat();
/// <summary>
/// 0.1
/// </summary>
public static LFloat L0D1 => new("",100);
/// <summary>
/// 0.2
/// </summary>
public static LFloat L0D2 => new("",200);
/// <summary>
/// 0.3
/// </summary>
public static LFloat L0D3 => new("",300);
/// <summary>
/// 0.4
/// </summary>
public static LFloat L0D4 => new("",400);
/// <summary> /// <summary>
/// 0.5 /// 0.5
/// </summary> /// </summary>
public static LFloat L0D5 => new("",500); public static LFloat L0D5 => new("",500);
/// <summary>
/// 0.6
/// </summary>
public static LFloat L0D6 => new("",600);
/// <summary>
/// 0.7
/// </summary>
public static LFloat L0D7 => new("",700);
/// <summary>
/// 0.8
/// </summary>
public static LFloat L0D8 => new("",800);
/// <summary>
/// 0.9
/// </summary>
public static LFloat L0D9 => new("",900);
/// <summary> /// <summary>
/// 1 /// 1
/// </summary> /// </summary>
@@ -643,11 +720,41 @@ namespace JNGame.Math
/// </summary> /// </summary>
public static readonly LFloat L2 = 2.ToLFloat(); public static readonly LFloat L2 = 2.ToLFloat();
/// <summary>
/// 3
/// </summary>
public static readonly LFloat L3 = 3.ToLFloat();
/// <summary>
/// 4
/// </summary>
public static readonly LFloat L4 = 4.ToLFloat();
/// <summary> /// <summary>
/// 5 /// 5
/// </summary> /// </summary>
public static readonly LFloat L5 = 5.ToLFloat(); public static readonly LFloat L5 = 5.ToLFloat();
/// <summary>
/// 6
/// </summary>
public static readonly LFloat L6 = 6.ToLFloat();
/// <summary>
/// 7
/// </summary>
public static readonly LFloat L7 = 7.ToLFloat();
/// <summary>
/// 8
/// </summary>
public static readonly LFloat L8 = 8.ToLFloat();
/// <summary>
/// 9
/// </summary>
public static readonly LFloat L9 = 9.ToLFloat();
/// <summary> /// <summary>
/// 10 /// 10
/// </summary> /// </summary>
@@ -658,11 +765,31 @@ namespace JNGame.Math
/// </summary> /// </summary>
public static readonly LFloat L20 = 20.ToLFloat(); public static readonly LFloat L20 = 20.ToLFloat();
/// <summary>
/// 50
/// </summary>
public static readonly LFloat L50 = 50.ToLFloat();
/// <summary>
/// 20
/// </summary>
public static readonly LFloat L80 = 80.ToLFloat();
/// <summary> /// <summary>
/// 100 /// 100
/// </summary> /// </summary>
public static readonly LFloat L100 = 100.ToLFloat(); public static readonly LFloat L100 = 100.ToLFloat();
/// <summary>
/// 180
/// </summary>
public static readonly LFloat L180 = 180.ToLFloat();
/// <summary>
/// 255
/// </summary>
public static readonly LFloat L255 = 255.ToLFloat();
/// <summary> /// <summary>
/// 1000 /// 1000
/// </summary> /// </summary>
@@ -47,10 +47,10 @@ namespace JNGame.Math
/// <param name="w"></param> /// <param name="w"></param>
public LQuaternion(bool isRawValue, long x, long y, long z, long w) public LQuaternion(bool isRawValue, long x, long y, long z, long w)
{ {
this.x = (LFloat)0f; this.x = LFloat.L0;
this.y = (LFloat)0f; this.y = LFloat.L0;
this.z = (LFloat)0f; this.z = LFloat.L0;
this.w = (LFloat)0f; this.w = LFloat.L0;
this.x.rawValue = x; this.x.rawValue = x;
this.y.rawValue = y; this.y.rawValue = y;
this.z.rawValue = z; this.z.rawValue = z;
@@ -37,8 +37,8 @@ namespace JNGame.Math
/// <param name="y"></param> /// <param name="y"></param>
public LVector2(bool isUseRawVal, int x, int y) public LVector2(bool isUseRawVal, int x, int y)
{ {
this.x = (LFloat)0f; this.x = LFloat.L0;
this.y = (LFloat)0f; this.y = LFloat.L0;
this.x.rawValue = x; this.x.rawValue = x;
this.y.rawValue = y; this.y.rawValue = y;
} }
@@ -51,8 +51,8 @@ namespace JNGame.Math
/// <param name="y"></param> /// <param name="y"></param>
public LVector2(bool isUseRawVal, long x, long y) public LVector2(bool isUseRawVal, long x, long y)
{ {
this.x = (LFloat)0f; this.x = LFloat.L0;
this.y = (LFloat)0f; this.y = LFloat.L0;
this.x.rawValue = x; this.x.rawValue = x;
this.y.rawValue = y; this.y.rawValue = y;
} }
@@ -64,8 +64,8 @@ namespace JNGame.Math
/// <param name="y"></param> /// <param name="y"></param>
public LVector2(int x, int y) public LVector2(int x, int y)
{ {
this.x = (LFloat)0f; this.x = LFloat.L0;
this.y = (LFloat)0f; this.y = LFloat.L0;
this.x.rawValue = x * LFloat.Precision; this.x.rawValue = x * LFloat.Precision;
this.y.rawValue = y * LFloat.Precision; this.y.rawValue = y * LFloat.Precision;
} }
@@ -77,8 +77,8 @@ namespace JNGame.Math
/// <param name="y"></param> /// <param name="y"></param>
public LVector2(long x, long y) public LVector2(long x, long y)
{ {
this.x = (LFloat)0f; this.x = LFloat.L0;
this.y = (LFloat)0f; this.y = LFloat.L0;
this.x.rawValue = x * LFloat.Precision; this.x.rawValue = x * LFloat.Precision;
this.y.rawValue = y * LFloat.Precision; this.y.rawValue = y * LFloat.Precision;
} }
@@ -90,8 +90,8 @@ namespace JNGame.Math
/// <param name="y"></param> /// <param name="y"></param>
public LVector2(LFloat x, LFloat y) public LVector2(LFloat x, LFloat y)
{ {
this.x = (LFloat)0f; this.x = LFloat.L0;
this.y = (LFloat)0f; this.y = LFloat.L0;
this.x = x; this.x = x;
this.y = y; this.y = y;
} }
@@ -105,8 +105,8 @@ namespace JNGame.Math
/// <param name="y"></param> /// <param name="y"></param>
public LVector2(bool shouldOnlyUseInEditor, float x, float y) public LVector2(bool shouldOnlyUseInEditor, float x, float y)
{ {
this.x = (LFloat)0f; this.x = LFloat.L0;
this.y = (LFloat)0f; this.y = LFloat.L0;
this.x.rawValue = (long)(x * LFloat.Precision); this.x.rawValue = (long)(x * LFloat.Precision);
this.y.rawValue = (long)(y * LFloat.Precision); this.y.rawValue = (long)(y * LFloat.Precision);
} }
@@ -45,9 +45,9 @@ namespace JNGame.Math
/// <param name="z"></param> /// <param name="z"></param>
public LVector3(bool isUseRawVal, int x, int y, int z) public LVector3(bool isUseRawVal, int x, int y, int z)
{ {
this.x = (LFloat)0f; this.x = 0.ToLFloat();
this.y = (LFloat)0f; this.y = 0.ToLFloat();
this.z = (LFloat)0f; this.z = 0.ToLFloat();
this.x.rawValue = x; this.x.rawValue = x;
this.y.rawValue = y; this.y.rawValue = y;
this.z.rawValue = z; this.z.rawValue = z;
@@ -62,9 +62,9 @@ namespace JNGame.Math
/// <param name="z"></param> /// <param name="z"></param>
public LVector3(bool isUseRawVal, long x, long y, long z) public LVector3(bool isUseRawVal, long x, long y, long z)
{ {
this.x = (LFloat)0f; this.x = 0.ToLFloat();
this.y = (LFloat)0f; this.y = 0.ToLFloat();
this.z = (LFloat)0f; this.z = 0.ToLFloat();
this.x.rawValue = x; this.x.rawValue = x;
this.y.rawValue = y; this.y.rawValue = y;
this.z.rawValue = z; this.z.rawValue = z;
@@ -78,9 +78,9 @@ namespace JNGame.Math
/// <param name="z"></param> /// <param name="z"></param>
public LVector3(int x, int y, int z) public LVector3(int x, int y, int z)
{ {
this.x = (LFloat)0f; this.x = 0.ToLFloat();
this.y = (LFloat)0f; this.y = 0.ToLFloat();
this.z = (LFloat)0f; this.z = 0.ToLFloat();
this.x.rawValue = x * LFloat.Precision; this.x.rawValue = x * LFloat.Precision;
this.y.rawValue = y * LFloat.Precision; this.y.rawValue = y * LFloat.Precision;
this.z.rawValue = z * LFloat.Precision; this.z.rawValue = z * LFloat.Precision;
@@ -94,9 +94,9 @@ namespace JNGame.Math
/// <param name="z"></param> /// <param name="z"></param>
public LVector3(long x, long y, long z) public LVector3(long x, long y, long z)
{ {
this.x = (LFloat)0f; this.x = 0.ToLFloat();
this.y = (LFloat)0f; this.y = 0.ToLFloat();
this.z = (LFloat)0f; this.z = 0.ToLFloat();
this.x.rawValue = x * LFloat.Precision; this.x.rawValue = x * LFloat.Precision;
this.y.rawValue = y * LFloat.Precision; this.y.rawValue = y * LFloat.Precision;
this.z.rawValue = z * LFloat.Precision; this.z.rawValue = z * LFloat.Precision;
@@ -138,9 +138,9 @@ namespace JNGame.Math
/// <param name="z"></param> /// <param name="z"></param>
public LVector3(bool shouldOnlyUseInEditor, float x, float y, float z) public LVector3(bool shouldOnlyUseInEditor, float x, float y, float z)
{ {
this.x = (LFloat)0f; this.x = 0.ToLFloat();
this.y = (LFloat)0f; this.y = 0.ToLFloat();
this.z = (LFloat)0f; this.z = 0.ToLFloat();
this.x.rawValue = (int)(x * LFloat.Precision); this.x.rawValue = (int)(x * LFloat.Precision);
this.y.rawValue = (int)(y * LFloat.Precision); this.y.rawValue = (int)(y * LFloat.Precision);
this.z.rawValue = (int)(z * LFloat.Precision); this.z.rawValue = (int)(z * LFloat.Precision);
@@ -220,13 +220,13 @@ namespace JNGame.Math
/// </summary> /// </summary>
public void Normalize() public void Normalize()
{ {
long sqr = RawSqrMagnitude; LFloat sqr = (x * x + y * y + z * z); // 计算平方大小
if (sqr == 0L) { return; } if (sqr == LFloat.L0) { return; } // 检查零向量
LFloat length = LMath.Sqrt(sqr); // 计算长度
long d = LMath.Sqrt(sqr); // 归一化分量
x.rawValue = RawX * LFloat.Precision / d; x.rawValue = (x.rawValue * LFloat.Precision) / length.rawValue;
y.rawValue = RawY * LFloat.Precision / d; y.rawValue = (y.rawValue * LFloat.Precision) / length.rawValue;
z.rawValue = RawZ * LFloat.Precision / d; z.rawValue = (z.rawValue * LFloat.Precision) / length.rawValue;
} }
/// <summary> /// <summary>
@@ -264,16 +264,16 @@ namespace JNGame.Math
} }
} }
/// <summary> // /// <summary>
/// 向量定点数真实值模长平方 // /// 向量定点数真实值模长平方
/// </summary> // /// </summary>
public readonly long RawSqrMagnitude // public readonly long RawSqrMagnitude
{ // {
get // get
{ // {
return RawX * RawX + RawY * RawY + RawZ * RawZ; // return (x * x + y * y + z * z).rawValue;
} // }
} // }
/// <summary> /// <summary>
@@ -816,7 +816,7 @@ namespace JNGame.Math
/// <summary> /// <summary>
/// PI定点数真实值 /// PI定点数真实值
/// </summary> /// </summary>
private const long kRawLPI = 3141593L; //3.1415926 private const long kRawLPI = 3141592L; //3.1415926
/// <summary> /// <summary>
/// 2PI定点数真实值 /// 2PI定点数真实值
/// </summary> /// </summary>
@@ -824,7 +824,7 @@ namespace JNGame.Math
/// <summary> /// <summary>
/// 弧度转角度的算术因子定点数真实值 /// 弧度转角度的算术因子定点数真实值
/// </summary> /// </summary>
private const long kRawLRad2Deg = 57295780L; //57.2957795 private const long kRawLRad2Deg = 57295779L; //57.2957795
/// <summary> /// <summary>
/// 角度转弧度的算术因子定点数真实值 /// 角度转弧度的算术因子定点数真实值
/// </summary> /// </summary>
@@ -1,12 +1,14 @@
//#define DONT_USE_GENERATE_CODE
//#define DONT_USE_GENERATE_CODE
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// This code was generated by Lockstep.CodeGenerator // This code was generated by JNGame.CodeGenerator
// Changes to this file may cause incorrect behavior and will be lost if // Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated. // the code is regenerated.
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
using System;
using JNGame.Math;
namespace JNGame.Math namespace JNGame.Math
{ {
public static class LUTAcos public static class LUTAcos
@@ -1,12 +1,14 @@
//#define DONT_USE_GENERATE_CODE //#define DONT_USE_GENERATE_CODE
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// This code was generated by Lockstep.CodeGenerator // This code was generated by JNGame.CodeGenerator
// Changes to this file may cause incorrect behavior and will be lost if // Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated. // the code is regenerated.
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
using System;
using JNGame.Math;
namespace JNGame.Math namespace JNGame.Math
{ {
public static class LUTAsin public static class LUTAsin
@@ -1,12 +1,15 @@
//#define DONT_USE_GENERATE_CODE
//#define DONT_USE_GENERATE_CODE
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// This code was generated by Lockstep.CodeGenerator // This code was generated by JNGame.CodeGenerator
// Changes to this file may cause incorrect behavior and will be lost if // Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated. // the code is regenerated.
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
using System;
using JNGame.Math;
namespace JNGame.Math namespace JNGame.Math
{ {
public static class LUTAtan2 public static class LUTAtan2
@@ -20,20 +23,20 @@ namespace JNGame.Math
static LUTAtan2() static LUTAtan2()
{ {
_startIdx = new int[MaxQueryIdx +1]{ _startIdx = new int[MaxQueryIdx +1]{
0, 18434, 26564, 30962, 33688, 35535, 36867, 37872, 38656, 39285, 39801, 40231, 40595, 40908, 41179, 41416, 41625, 41811, 41978, 42128, 42264, 42387, 42499, 42602, 42697, 42785, 42866, 42941, 43011, 43076, 43137, 43194, 43248, 43299, 43347, 43392, 43434, 43474, 43512, 43548, 43582, 43615, 43646, 43676, 43704, 43731, 43757, 43782, 43806, 43829, 43851, 43872, 43892, 43912, 43931, 43949, 43966, 43983, 43999, 44015, 44030, 44045, 44059, 44073, 44086, 44099, 44111, 44123, 44135, 44146, 44157, 44168, 44178, 44188, 44198, 44208, 44217, 44226, 44235, 44244, 44252, 44260, 44268, 44276, 44284, 44291, 44298, 44305, 44312, 44319, 44325, 44331, 44337, 44343, 44349, 44355, 44361, 44367, 44372, 44377, 0, 18434, 26564, 30962, 33688, 35535, 36867, 37872, 38656, 39285, 39801, 40231, 40595, 40908, 41179, 41416, 41625, 41811, 41978, 42128, 42264, 42387, 42500, 42603, 42698, 42786, 42867, 42942, 43012, 43077, 43138, 43195, 43249, 43300, 43348, 43393, 43435, 43475, 43513, 43549, 43583, 43616, 43647, 43677, 43705, 43732, 43758, 43783, 43807, 43830, 43852, 43873, 43893, 43913, 43932, 43950, 43967, 43984, 44000, 44016, 44031, 44046, 44060, 44074, 44087, 44100, 44112, 44124, 44136, 44147, 44158, 44169, 44179, 44189, 44199, 44209, 44218, 44227, 44236, 44245, 44253, 44261, 44269, 44277, 44285, 44292, 44299, 44306, 44313, 44320, 44326, 44332, 44338, 44344, 44350, 44356, 44362, 44368, 44373, 44378,
44382, 44387, 44392, 44397, 44402, 44407, 44412, 44416, 44420, 44424, 44428, 44432, 44436, 44440, 44444, 44448, 44452, 44456, 44460, 44464, 44467, 44470, 44473, 44476, 44479, 44482, 44485, 44488, 44491, 44494, 44497, 44500, 44503, 44506, 44509, 44512, 44515, 44518, 44520, 44522, 44524, 44526, 44528, 44530, 44532, 44534, 44536, 44538, 44540, 44542, 44544, 44546, 44548, 44550, 44552, 44554, 44556, 44558, 44560, 44562, 44564, 44566, 44568, 44570, 44572, 44574, 44576, 44578, 44580, 44581, 44582, 44583, 44584, 44585, 44586, 44587, 44588, 44589, 44590, 44591, 44592, 44593, 44594, 44595, 44596, 44597, 44598, 44599, 44600, 44601, 44602, 44603, 44604, 44605, 44606, 44607, 44608, 44609, 44610, 44611, 44383, 44388, 44393, 44398, 44403, 44408, 44413, 44417, 44421, 44425, 44429, 44433, 44437, 44441, 44445, 44449, 44453, 44457, 44461, 44465, 44468, 44471, 44474, 44477, 44480, 44483, 44486, 44489, 44492, 44495, 44498, 44501, 44504, 44507, 44510, 44513, 44516, 44519, 44521, 44523, 44525, 44527, 44529, 44531, 44533, 44535, 44537, 44539, 44541, 44543, 44545, 44547, 44549, 44551, 44553, 44555, 44557, 44559, 44561, 44563, 44565, 44567, 44569, 44571, 44573, 44575, 44577, 44579, 44581, 44582, 44583, 44584, 44585, 44586, 44587, 44588, 44589, 44590, 44591, 44592, 44593, 44594, 44595, 44596, 44597, 44598, 44599, 44600, 44601, 44602, 44603, 44604, 44605, 44606, 44607, 44608, 44609, 44610, 44611, 44612,
44612, 44613, 44614, 44615, 44616, 44617, 44618, 44619, 44620, 44621, 44622, 44623, 44624, 44625, 44626, 44627, 44628, 44629, 44630, 44631, 44632, 44633, 44634, 44635, 44636, 44637, 44638, 44639, 44640, 44641, 44642, 44643, 44644, 44645, 44646, 44647, 44648, 44649, 44650, 44651, 44652, 44653, 44654, 44655, 44656, 44657, 44658, 44659, 44660, 44661, 44662, 44663, 44664, 44665, 44666, 44667, 44668, 44669, 44670, 44671, 44672, 44673, 44674, 44675, 44676, 44677, 44678, 44679, 44680, 44681, 44682, 44683, 44684, 44685, 44686, 44687, 44688, 44689, 44690, 44691, 44692, 44693, 44694, 44695, 44696, 44697, 44698, 44699, 44700, 44701, 44702, 44703, 44704, 44705, 44706, 44707, 44708, 44709, 44710, 44711, 44613, 44614, 44615, 44616, 44617, 44618, 44619, 44620, 44621, 44622, 44623, 44624, 44625, 44626, 44627, 44628, 44629, 44630, 44631, 44632, 44633, 44634, 44635, 44636, 44637, 44638, 44639, 44640, 44641, 44642, 44643, 44644, 44645, 44646, 44647, 44648, 44649, 44650, 44651, 44652, 44653, 44654, 44655, 44656, 44657, 44658, 44659, 44660, 44661, 44662, 44663, 44664, 44665, 44666, 44667, 44668, 44669, 44670, 44671, 44672, 44673, 44674, 44675, 44676, 44677, 44678, 44679, 44680, 44681, 44682, 44683, 44684, 44685, 44686, 44687, 44688, 44689, 44690, 44691, 44692, 44693, 44694, 44695, 44696, 44697, 44698, 44699, 44700, 44701, 44702, 44703, 44704, 44705, 44706, 44707, 44708, 44709, 44710, 44711, 44712,
44712, 44713, 44714, 44715, 44716, 44717, 44718, 44719, 44720, 44721, 44722, 44723, 44724, 44725, 44726, 44727, 44728, 44729, 44730, 44731, 44732, 44733, 44734, 44735, 44736, 44737, 44738, 44739, 44740, 44741, 44742, 44743, 44744, 44745, 44746, 44747, 44748, 44749, 44750, 44751, 44752, 44753, 44754, 44755, 44756, 44757, 44758, 44759, 44760, 44761, 44762, 44763, 44764, 44765, 44766, 44767, 44768, 44769, 44770, 44771, 44772, 44773, 44774, 44775, 44776, 44777, 44778, 44779, 44780, 44781, 44782, 44783, 44784, 44785, 44786, 44787, 44788, 44789, 44790, 44791, 44792, 44793, 44794, 44795, 44796, 44797, 44798, 44799, 44800, 44801, 44802, 44803, 44804, 44805, 44806, 44807, 44808, 44809, 44810, 44811, 44713, 44714, 44715, 44716, 44717, 44718, 44719, 44720, 44721, 44722, 44723, 44724, 44725, 44726, 44727, 44728, 44729, 44730, 44731, 44732, 44733, 44734, 44735, 44736, 44737, 44738, 44739, 44740, 44741, 44742, 44743, 44744, 44745, 44746, 44747, 44748, 44749, 44750, 44751, 44752, 44753, 44754, 44755, 44756, 44757, 44758, 44759, 44760, 44761, 44762, 44763, 44764, 44765, 44766, 44767, 44768, 44769, 44770, 44771, 44772, 44773, 44774, 44775, 44776, 44777, 44778, 44779, 44780, 44781, 44782, 44783, 44784, 44785, 44786, 44787, 44788, 44789, 44790, 44791, 44792, 44793, 44794, 44795, 44796, 44797, 44798, 44799, 44800, 44801, 44802, 44803, 44804, 44805, 44806, 44807, 44808, 44809, 44810, 44811, 44812,
44812, 44813, 44814, 44815, 44816, 44817, 44818, 44819, 44820, 44821, 44822, 44823, 44824, 44825, 44826, 44827, 44828, 44829, 44830, 44831, 44832, 44833, 44834, 44835, 44836, 44837, 44838, 44839, 44840, 44841, 44842, 44843, 44844, 44845, 44846, 44847, 44848, 44849, 44850, 44851, 44852, 44853, 44854, 44855, 44856, 44857, 44858, 44859, 44860, 44861, 44862, 44863, 44864, 44865, 44866, 44867, 44868, 44869, 44870, 44871, 44872, 44873, 44874, 44875, 44876, 44877, 44878, 44879, 44880, 44881, 44882, 44883, 44884, 44885, 44886, 44887, 44888, 44889, 44890, 44891, 44892, 44893, 44894, 44895, 44896, 44897, 44898, 44899, 44900, 44901, 44902, 44903, 44904, 44905, 44906, 44907, 44908, 44909, 44910, 44911, 44813, 44814, 44815, 44816, 44817, 44818, 44819, 44820, 44821, 44822, 44823, 44824, 44825, 44826, 44827, 44828, 44829, 44830, 44831, 44832, 44833, 44834, 44835, 44836, 44837, 44838, 44839, 44840, 44841, 44842, 44843, 44844, 44845, 44846, 44847, 44848, 44849, 44850, 44851, 44852, 44853, 44854, 44855, 44856, 44857, 44858, 44859, 44860, 44861, 44862, 44863, 44864, 44865, 44866, 44867, 44868, 44869, 44870, 44871, 44872, 44873, 44874, 44875, 44876, 44877, 44878, 44879, 44880, 44881, 44882, 44883, 44884, 44885, 44886, 44887, 44888, 44889, 44890, 44891, 44892, 44893, 44894, 44895, 44896, 44897, 44898, 44899, 44900, 44901, 44902, 44903, 44904, 44905, 44906, 44907, 44908, 44909, 44910, 44911, 44912,
44912, 44913, 44914, 44915, 44916, 44917, 44918, 44919, 44920, 44921, 44922, 44923, 44924, 44925, 44926, 44927, 44928, 44929, 44930, 44931, 44932, 44933, 44934, 44935, 44936, 44937, 44938, 44939, 44940, 44941, 44942, 44943, 44944, 44945, 44946, 44947, 44948, 44949, 44950, 44951, 44952, 44953, 44954, 44955, 44956, 44957, 44958, 44959, 44960, 44961, 44962, 44963, 44964, 44965, 44966, 44967, 44968, 44969, 44970, 44971, 44972, 44973, 44974, 44975, 44976, 44977, 44978, 44979, 44980, 44981, 44982, 44983, 44984, 44985, 44986, 44987, 44988, 44989, 44990, 44991, 44992, 44993, 44994, 44995, 44996, 44997, 44998, 44999, 45000, 45001, 45002, 45003, 45004, 45005, 45006, 45007, 45008, 45009, 45010, 45011, 44913, 44914, 44915, 44916, 44917, 44918, 44919, 44920, 44921, 44922, 44923, 44924, 44925, 44926, 44927, 44928, 44929, 44930, 44931, 44932, 44933, 44934, 44935, 44936, 44937, 44938, 44939, 44940, 44941, 44942, 44943, 44944, 44945, 44946, 44947, 44948, 44949, 44950, 44951, 44952, 44953, 44954, 44955, 44956, 44957, 44958, 44959, 44960, 44961, 44962, 44963, 44964, 44965, 44966, 44967, 44968, 44969, 44970, 44971, 44972, 44973, 44974, 44975, 44976, 44977, 44978, 44979, 44980, 44981, 44982, 44983, 44984, 44985, 44986, 44987, 44988, 44989, 44990, 44991, 44992, 44993, 44994, 44995, 44996, 44997, 44998, 44999, 45000, 45001, 45002, 45003, 45004, 45005, 45006, 45007, 45008, 45009, 45010, 45011, 45012,
45012, 45013, 45014, 45015, 45016, 45017, 45018, 45019, 45020, 45021, 45022, 45023, 45024, 45025, 45026, 45027, 45028, 45029, 45030, 45031, 45032, 45033, 45034, 45035, 45036, 45037, 45038, 45039, 45040, 45041, 45042, 45043, 45044, 45045, 45046, 45047, 45048, 45049, 45050, 45051, 45052, 45053, 45054, 45055, 45056, 45057, 45058, 45059, 45060, 45061, 45062, 45063, 45064, 45065, 45066, 45067, 45068, 45069, 45070, 45071, 45072, 45073, 45074, 45075, 45076, 45077, 45078, 45079, 45080, 45081, 45082, 45083, 45084, 45085, 45086, 45087, 45088, 45089, 45090, 45091, 45092, 45093, 45094, 45095, 45096, 45097, 45098, 45099, 45100, 45101, 45102, 45103, 45104, 45105, 45106, 45107, 45108, 45109, 45110, 45111, 45013, 45014, 45015, 45016, 45017, 45018, 45019, 45020, 45021, 45022, 45023, 45024, 45025, 45026, 45027, 45028, 45029, 45030, 45031, 45032, 45033, 45034, 45035, 45036, 45037, 45038, 45039, 45040, 45041, 45042, 45043, 45044, 45045, 45046, 45047, 45048, 45049, 45050, 45051, 45052, 45053, 45054, 45055, 45056, 45057, 45058, 45059, 45060, 45061, 45062, 45063, 45064, 45065, 45066, 45067, 45068, 45069, 45070, 45071, 45072, 45073, 45074, 45075, 45076, 45077, 45078, 45079, 45080, 45081, 45082, 45083, 45084, 45085, 45086, 45087, 45088, 45089, 45090, 45091, 45092, 45093, 45094, 45095, 45096, 45097, 45098, 45099, 45100, 45101, 45102, 45103, 45104, 45105, 45106, 45107, 45108, 45109, 45110, 45111, 45112,
45112, 45113, 45114, 45115, 45116, 45117, 45118, 45119, 45120, 45121, 45122, 45123, 45124, 45125, 45126, 45127, 45128, 45129, 45130, 45131, 45132, 45133, 45134, 45135, 45136, 45137, 45138, 45139, 45140, 45141, 45142, 45143, 45144, 45145, 45146, 45147, 45148, 45149, 45150, 45151, 45152, 45153, 45154, 45155, 45156, 45157, 45158, 45159, 45160, 45161, 45162, 45163, 45164, 45165, 45166, 45167, 45168, 45169, 45170, 45171, 45172, 45173, 45174, 45175, 45176, 45177, 45178, 45179, 45180, 45181, 45182, 45183, 45184, 45185, 45186, 45187, 45188, 45189, 45190, 45191, 45192, 45193, 45194, 45195, 45196, 45197, 45198, 45199, 45200, 45201, 45202, 45203, 45204, 45205, 45206, 45207, 45208, 45209, 45210, 45211, 45113, 45114, 45115, 45116, 45117, 45118, 45119, 45120, 45121, 45122, 45123, 45124, 45125, 45126, 45127, 45128, 45129, 45130, 45131, 45132, 45133, 45134, 45135, 45136, 45137, 45138, 45139, 45140, 45141, 45142, 45143, 45144, 45145, 45146, 45147, 45148, 45149, 45150, 45151, 45152, 45153, 45154, 45155, 45156, 45157, 45158, 45159, 45160, 45161, 45162, 45163, 45164, 45165, 45166, 45167, 45168, 45169, 45170, 45171, 45172, 45173, 45174, 45175, 45176, 45177, 45178, 45179, 45180, 45181, 45182, 45183, 45184, 45185, 45186, 45187, 45188, 45189, 45190, 45191, 45192, 45193, 45194, 45195, 45196, 45197, 45198, 45199, 45200, 45201, 45202, 45203, 45204, 45205, 45206, 45207, 45208, 45209, 45210, 45211, 45212,
45212, 45213, 45214, 45215, 45216, 45217, 45218, 45219, 45220, 45221, 45222, 45223, 45224, 45225, 45226, 45227, 45228, 45229, 45230, 45231, 45232, 45233, 45234, 45235, 45236, 45237, 45238, 45239, 45240, 45241, 45242, 45243, 45244, 45245, 45246, 45247, 45248, 45249, 45250, 45251, 45252, 45253, 45254, 45255, 45256, 45257, 45258, 45259, 45260, 45261, 45262, 45263, 45264, 45265, 45266, 45267, 45268, 45269, 45270, 45271, 45272, 45273, 45274, 45275, 45276, 45277, 45278, 45279, 45280, 45281, 45282, 45283, 45284, 45285, 45286, 45287, 45288, 45289, 45290, 45291, 45292, 45293, 45294, 45295, 45296, 45297, 45298, 45299, 45300, 45301, 45302, 45303, 45304, 45305, 45306, 45307, 45308, 45309, 45310, 45311, 45213, 45214, 45215, 45216, 45217, 45218, 45219, 45220, 45221, 45222, 45223, 45224, 45225, 45226, 45227, 45228, 45229, 45230, 45231, 45232, 45233, 45234, 45235, 45236, 45237, 45238, 45239, 45240, 45241, 45242, 45243, 45244, 45245, 45246, 45247, 45248, 45249, 45250, 45251, 45252, 45253, 45254, 45255, 45256, 45257, 45258, 45259, 45260, 45261, 45262, 45263, 45264, 45265, 45266, 45267, 45268, 45269, 45270, 45271, 45272, 45273, 45274, 45275, 45276, 45277, 45278, 45279, 45280, 45281, 45282, 45283, 45284, 45285, 45286, 45287, 45288, 45289, 45290, 45291, 45292, 45293, 45294, 45295, 45296, 45297, 45298, 45299, 45300, 45301, 45302, 45303, 45304, 45305, 45306, 45307, 45308, 45309, 45310, 45311, 45312,
45312, 45313, 45314, 45315, 45316, 45317, 45318, 45319, 45320, 45321, 45322, 45323, 45324, 45325, 45326, 45327, 45328, 45329, 45330, 45331, 45332, 45333, 45334, 45335, 45336, 45337, 45338, 45339, 45340, 45341, 45342, 45343, 45344, 45345, 45346, 45347, 45348, 45349, 45350, 45351, 45352, 45353, 45354, 45355, 45356, 45357, 45358, 45359, 45360, 45361, 45362, 45363, 45364, 45365, 45366, 45367, 45368, 45369, 45370, 45371, 45372, 45373, 45374, 45375, 45376, 45377, 45378, 45379, 45380, 45381, 45382, 45383, 45384, 45385, 45386, 45387, 45388, 45389, 45390, 45391, 45392, 45393, 45394, 45395, 45396, 45397, 45398, 45399, 45400, 45401, 45402, 45403, 45404, 45405, 45406, 45407, 45408, 45409, 45410, 45411, 45313, 45314, 45315, 45316, 45317, 45318, 45319, 45320, 45321, 45322, 45323, 45324, 45325, 45326, 45327, 45328, 45329, 45330, 45331, 45332, 45333, 45334, 45335, 45336, 45337, 45338, 45339, 45340, 45341, 45342, 45343, 45344, 45345, 45346, 45347, 45348, 45349, 45350, 45351, 45352, 45353, 45354, 45355, 45356, 45357, 45358, 45359, 45360, 45361, 45362, 45363, 45364, 45365, 45366, 45367, 45368, 45369, 45370, 45371, 45372, 45373, 45374, 45375, 45376, 45377, 45378, 45379, 45380, 45381, 45382, 45383, 45384, 45385, 45386, 45387, 45388, 45389, 45390, 45391, 45392, 45393, 45394, 45395, 45396, 45397, 45398, 45399, 45400, 45401, 45402, 45403, 45404, 45405, 45406, 45407, 45408, 45409, 45410, 45411, 45412,
45413 45414
}; };
_arySize = new int[MaxQueryIdx +1]{ _arySize = new int[MaxQueryIdx +1]{
18434, 8130, 4398, 2726, 1847, 1332, 1005, 784, 629, 516, 430, 364, 313, 271, 237, 209, 186, 167, 150, 136, 123, 112, 103, 95, 88, 81, 75, 70, 65, 61, 57, 54, 51, 48, 45, 42, 40, 38, 36, 34, 33, 31, 30, 28, 27, 26, 25, 24, 23, 22, 21, 20, 20, 19, 18, 17, 17, 16, 16, 15, 15, 14, 14, 13, 13, 12, 12, 12, 11, 11, 11, 10, 10, 10, 10, 9, 9, 9, 9, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 18434, 8130, 4398, 2726, 1847, 1332, 1005, 784, 629, 516, 430, 364, 313, 271, 237, 209, 186, 167, 150, 136, 123, 113, 103, 95, 88, 81, 75, 70, 65, 61, 57, 54, 51, 48, 45, 42, 40, 38, 36, 34, 33, 31, 30, 28, 27, 26, 25, 24, 23, 22, 21, 20, 20, 19, 18, 17, 17, 16, 16, 15, 15, 14, 14, 13, 13, 12, 12, 12, 11, 11, 11, 10, 10, 10, 10, 9, 9, 9, 9, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5,
5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -469,38 +472,38 @@ namespace JNGame.Math
1518615, 1518633, 1518651, 1518669, 1518687, 1518705, 1518723, 1518741, 1518759, 1518778, 1518796, 1518814, 1518832, 1518850, 1518867, 1518885, 1518903, 1518921, 1518939, 1518957, 1518975, 1518993, 1519011, 1519029, 1519047, 1519064, 1519082, 1519100, 1519118, 1519136, 1519153, 1519171, 1519189, 1519207, 1519224, 1519242, 1519260, 1519277, 1519295, 1519313, 1519330, 1519348, 1519366, 1519383, 1519401, 1519418, 1519436, 1519454, 1519471, 1519489, 1519506, 1519524, 1519541, 1519559, 1519576, 1519594, 1519611, 1519629, 1519646, 1519663, 1519681, 1519698, 1519716, 1519733, 1519750, 1519768, 1519785, 1519802, 1519820, 1519837, 1519854, 1519871, 1519889, 1519906, 1519923, 1519940, 1519958, 1519975, 1519992, 1520009, 1520027, 1520044, 1520061, 1520078, 1520095, 1520112, 1520129, 1520146, 1520164, 1520181, 1520198, 1520215, 1520232, 1520249, 1520266, 1520283, 1520300, 1520317, 1520334, 1520351, 1518615, 1518633, 1518651, 1518669, 1518687, 1518705, 1518723, 1518741, 1518759, 1518778, 1518796, 1518814, 1518832, 1518850, 1518867, 1518885, 1518903, 1518921, 1518939, 1518957, 1518975, 1518993, 1519011, 1519029, 1519047, 1519064, 1519082, 1519100, 1519118, 1519136, 1519153, 1519171, 1519189, 1519207, 1519224, 1519242, 1519260, 1519277, 1519295, 1519313, 1519330, 1519348, 1519366, 1519383, 1519401, 1519418, 1519436, 1519454, 1519471, 1519489, 1519506, 1519524, 1519541, 1519559, 1519576, 1519594, 1519611, 1519629, 1519646, 1519663, 1519681, 1519698, 1519716, 1519733, 1519750, 1519768, 1519785, 1519802, 1519820, 1519837, 1519854, 1519871, 1519889, 1519906, 1519923, 1519940, 1519958, 1519975, 1519992, 1520009, 1520027, 1520044, 1520061, 1520078, 1520095, 1520112, 1520129, 1520146, 1520164, 1520181, 1520198, 1520215, 1520232, 1520249, 1520266, 1520283, 1520300, 1520317, 1520334, 1520351,
1520368, 1520385, 1520401, 1520418, 1520435, 1520452, 1520469, 1520486, 1520503, 1520520, 1520536, 1520553, 1520570, 1520587, 1520604, 1520620, 1520637, 1520654, 1520671, 1520687, 1520704, 1520721, 1520738, 1520754, 1520771, 1520787, 1520804, 1520821, 1520837, 1520856, 1520874, 1520892, 1520911, 1520929, 1520947, 1520965, 1520984, 1521002, 1521020, 1521038, 1521057, 1521075, 1521093, 1521111, 1521129, 1521147, 1521165, 1521183, 1521201, 1521220, 1521238, 1521256, 1521274, 1521292, 1521310, 1521328, 1521346, 1521364, 1521382, 1521399, 1521417, 1521435, 1521453, 1521471, 1521489, 1521507, 1521525, 1521543, 1521560, 1521578, 1521596, 1521614, 1521631, 1521649, 1521667, 1521685, 1521702, 1521720, 1521738, 1521755, 1521773, 1521791, 1521808, 1521826, 1521844, 1521861, 1521879, 1521896, 1521914, 1521932, 1521949, 1521967, 1521984, 1522002, 1522019, 1522037, 1522054, 1522071, 1522089, 1522106, 1520368, 1520385, 1520401, 1520418, 1520435, 1520452, 1520469, 1520486, 1520503, 1520520, 1520536, 1520553, 1520570, 1520587, 1520604, 1520620, 1520637, 1520654, 1520671, 1520687, 1520704, 1520721, 1520738, 1520754, 1520771, 1520787, 1520804, 1520821, 1520837, 1520856, 1520874, 1520892, 1520911, 1520929, 1520947, 1520965, 1520984, 1521002, 1521020, 1521038, 1521057, 1521075, 1521093, 1521111, 1521129, 1521147, 1521165, 1521183, 1521201, 1521220, 1521238, 1521256, 1521274, 1521292, 1521310, 1521328, 1521346, 1521364, 1521382, 1521399, 1521417, 1521435, 1521453, 1521471, 1521489, 1521507, 1521525, 1521543, 1521560, 1521578, 1521596, 1521614, 1521631, 1521649, 1521667, 1521685, 1521702, 1521720, 1521738, 1521755, 1521773, 1521791, 1521808, 1521826, 1521844, 1521861, 1521879, 1521896, 1521914, 1521932, 1521949, 1521967, 1521984, 1522002, 1522019, 1522037, 1522054, 1522071, 1522089, 1522106,
1522124, 1522141, 1522158, 1522176, 1522193, 1522211, 1522228, 1522245, 1522263, 1522280, 1522297, 1522314, 1522332, 1522349, 1522366, 1522383, 1522401, 1522418, 1522435, 1522452, 1522469, 1522486, 1522504, 1522521, 1522538, 1522555, 1522572, 1522589, 1522606, 1522623, 1522640, 1522657, 1522674, 1522691, 1522708, 1522725, 1522742, 1522759, 1522776, 1522793, 1522810, 1522827, 1522844, 1522861, 1522878, 1522894, 1522911, 1522928, 1522945, 1522962, 1522979, 1522995, 1523012, 1523029, 1523046, 1523063, 1523079, 1523096, 1523113, 1523129, 1523146, 1523163, 1523179, 1523196, 1523213, 1523231, 1523249, 1523268, 1523286, 1523305, 1523323, 1523341, 1523359, 1523378, 1523396, 1523414, 1523432, 1523451, 1523469, 1523487, 1523505, 1523523, 1523542, 1523560, 1523578, 1523596, 1523614, 1523632, 1523650, 1523668, 1523686, 1523704, 1523722, 1523740, 1523758, 1523776, 1523794, 1523812, 1523830, 1523848, 1522124, 1522141, 1522158, 1522176, 1522193, 1522211, 1522228, 1522245, 1522263, 1522280, 1522297, 1522314, 1522332, 1522349, 1522366, 1522383, 1522401, 1522418, 1522435, 1522452, 1522469, 1522486, 1522504, 1522521, 1522538, 1522555, 1522572, 1522589, 1522606, 1522623, 1522640, 1522657, 1522674, 1522691, 1522708, 1522725, 1522742, 1522759, 1522776, 1522793, 1522810, 1522827, 1522844, 1522861, 1522878, 1522894, 1522911, 1522928, 1522945, 1522962, 1522979, 1522995, 1523012, 1523029, 1523046, 1523063, 1523079, 1523096, 1523113, 1523129, 1523146, 1523163, 1523179, 1523196, 1523213, 1523231, 1523249, 1523268, 1523286, 1523305, 1523323, 1523341, 1523359, 1523378, 1523396, 1523414, 1523432, 1523451, 1523469, 1523487, 1523505, 1523523, 1523542, 1523560, 1523578, 1523596, 1523614, 1523632, 1523650, 1523668, 1523686, 1523704, 1523722, 1523740, 1523758, 1523776, 1523794, 1523812, 1523830, 1523848,
1523866, 1523884, 1523902, 1523919, 1523937, 1523955, 1523973, 1523991, 1524008, 1524026, 1524044, 1524062, 1524080, 1524097, 1524115, 1524133, 1524150, 1524168, 1524186, 1524203, 1524221, 1524239, 1524256, 1524274, 1524291, 1524309, 1524326, 1524344, 1524362, 1524379, 1524397, 1524414, 1524431, 1524449, 1524466, 1524484, 1524501, 1524519, 1524536, 1524553, 1524571, 1524588, 1524605, 1524623, 1524640, 1524657, 1524675, 1524692, 1524709, 1524726, 1524744, 1524761, 1524778, 1524795, 1524813, 1524830, 1524847, 1524864, 1524881, 1524898, 1524915, 1524932, 1524950, 1524967, 1524984, 1525001, 1525018, 1525035, 1525052, 1525069, 1525086, 1525103, 1525120, 1525137, 1525154, 1525171, 1525187, 1525204, 1525221, 1525238, 1525255, 1525272, 1525289, 1525305, 1525322, 1525339, 1525356, 1525373, 1525391, 1525409, 1525428, 1525446, 1525464, 1525483, 1525501, 1525519, 1525538, 1525556, 1525574, 1525592, 1523866, 1523884, 1523902, 1523919, 1523937, 1523955, 1523973, 1523991, 1524008, 1524026, 1524044, 1524062, 1524080, 1524097, 1524115, 1524133, 1524150, 1524168, 1524186, 1524203, 1524221, 1524239, 1524256, 1524274, 1524291, 1524309, 1524326, 1524344, 1524362, 1524379, 1524397, 1524414, 1524431, 1524449, 1524466, 1524484, 1524501, 1524519, 1524536, 1524553, 1524571, 1524588, 1524605, 1524623, 1524640, 1524657, 1524675, 1524692, 1524709, 1524726, 1524744, 1524761, 1524778, 1524795, 1524813, 1524830, 1524847, 1524864, 1524881, 1524898, 1524915, 1524932, 1524950, 1524967, 1524984, 1525001, 1525018, 1525035, 1525052, 1525069, 1525086, 1525103, 1525120, 1525137, 1525154, 1525171, 1525187, 1525204, 1525221, 1525238, 1525255, 1525272, 1525289, 1525305, 1525322, 1525339, 1525356, 1525373, 1525391, 1525409, 1525427, 1525445, 1525464, 1525482, 1525500, 1525518, 1525536, 1525554, 1525572, 1525591,
1525611, 1525629, 1525647, 1525665, 1525683, 1525701, 1525720, 1525738, 1525756, 1525774, 1525792, 1525810, 1525828, 1525846, 1525864, 1525882, 1525900, 1525918, 1525936, 1525954, 1525972, 1525990, 1526008, 1526026, 1526044, 1526062, 1526079, 1526097, 1526115, 1526133, 1526151, 1526168, 1526186, 1526204, 1526222, 1526239, 1526257, 1526275, 1526292, 1526310, 1526328, 1526345, 1526363, 1526381, 1526398, 1526416, 1526433, 1526451, 1526468, 1526486, 1526504, 1526521, 1526538, 1526556, 1526573, 1526591, 1526608, 1526626, 1526643, 1526660, 1526678, 1526695, 1526713, 1526730, 1526747, 1526764, 1526782, 1526799, 1526816, 1526834, 1526851, 1526868, 1526885, 1526902, 1526920, 1526937, 1526954, 1526971, 1526988, 1527005, 1527022, 1527040, 1527057, 1527074, 1527091, 1527108, 1527125, 1527142, 1527159, 1527176, 1527193, 1527210, 1527227, 1527244, 1527261, 1527277, 1527294, 1527311, 1527328, 1527345, 1525609, 1525627, 1525645, 1525663, 1525681, 1525699, 1525717, 1525735, 1525753, 1525770, 1525788, 1525806, 1525824, 1525842, 1525860, 1525878, 1525896, 1525913, 1525931, 1525949, 1525967, 1525985, 1526002, 1526020, 1526038, 1526056, 1526073, 1526091, 1526108, 1526126, 1526144, 1526161, 1526179, 1526197, 1526214, 1526232, 1526249, 1526267, 1526284, 1526302, 1526319, 1526337, 1526354, 1526372, 1526389, 1526407, 1526424, 1526442, 1526459, 1526476, 1526494, 1526511, 1526528, 1526546, 1526563, 1526580, 1526598, 1526615, 1526632, 1526649, 1526667, 1526684, 1526701, 1526718, 1526735, 1526753, 1526770, 1526787, 1526804, 1526821, 1526838, 1526855, 1526872, 1526889, 1526906, 1526923, 1526940, 1526957, 1526974, 1526991, 1527008, 1527025, 1527042, 1527059, 1527076, 1527093, 1527110, 1527127, 1527144, 1527161, 1527177, 1527194, 1527211, 1527228, 1527245, 1527261, 1527278, 1527295, 1527312, 1527328,
1527363, 1527382, 1527400, 1527418, 1527436, 1527455, 1527473, 1527491, 1527509, 1527527, 1527546, 1527564, 1527582, 1527600, 1527618, 1527636, 1527654, 1527672, 1527690, 1527708, 1527726, 1527744, 1527762, 1527780, 1527798, 1527816, 1527834, 1527852, 1527870, 1527888, 1527905, 1527923, 1527941, 1527959, 1527977, 1527994, 1528012, 1528030, 1528048, 1528066, 1528083, 1528101, 1528119, 1528136, 1528154, 1528172, 1528189, 1528207, 1528224, 1528242, 1528259, 1528277, 1528295, 1528312, 1528330, 1528347, 1528365, 1528382, 1528399, 1528417, 1528434, 1528452, 1528469, 1528486, 1528504, 1528521, 1528539, 1528556, 1528573, 1528591, 1528608, 1528625, 1528642, 1528660, 1528677, 1528694, 1528711, 1528728, 1528746, 1528763, 1528780, 1528797, 1528814, 1528831, 1528848, 1528865, 1528882, 1528899, 1528916, 1528933, 1528950, 1528967, 1528984, 1529001, 1529018, 1529035, 1529052, 1529069, 1529086, 1529103, 1527345, 1527363, 1527382, 1527400, 1527418, 1527436, 1527455, 1527473, 1527491, 1527509, 1527527, 1527546, 1527564, 1527582, 1527600, 1527618, 1527636, 1527654, 1527672, 1527690, 1527708, 1527726, 1527744, 1527762, 1527780, 1527798, 1527816, 1527834, 1527852, 1527870, 1527888, 1527905, 1527923, 1527941, 1527959, 1527977, 1527994, 1528012, 1528030, 1528048, 1528066, 1528083, 1528101, 1528119, 1528136, 1528154, 1528172, 1528189, 1528207, 1528224, 1528242, 1528259, 1528277, 1528295, 1528312, 1528330, 1528347, 1528365, 1528382, 1528399, 1528417, 1528434, 1528452, 1528469, 1528486, 1528504, 1528521, 1528539, 1528556, 1528573, 1528591, 1528608, 1528625, 1528642, 1528660, 1528677, 1528694, 1528711, 1528728, 1528746, 1528763, 1528780, 1528797, 1528814, 1528831, 1528848, 1528865, 1528882, 1528899, 1528916, 1528933, 1528950, 1528967, 1528984, 1529001, 1529018, 1529035, 1529052, 1529069, 1529086,
1529120, 1529136, 1529153, 1529171, 1529190, 1529208, 1529226, 1529244, 1529262, 1529281, 1529299, 1529317, 1529335, 1529353, 1529371, 1529389, 1529407, 1529425, 1529443, 1529461, 1529479, 1529497, 1529515, 1529533, 1529551, 1529569, 1529587, 1529604, 1529622, 1529640, 1529658, 1529676, 1529693, 1529711, 1529729, 1529747, 1529764, 1529782, 1529800, 1529817, 1529835, 1529853, 1529870, 1529888, 1529906, 1529923, 1529941, 1529958, 1529976, 1529993, 1530011, 1530028, 1530046, 1530063, 1530081, 1530098, 1530116, 1530133, 1530150, 1530168, 1530185, 1530202, 1530220, 1530237, 1530254, 1530272, 1530289, 1530306, 1530323, 1530341, 1530358, 1530375, 1530392, 1530409, 1530427, 1530444, 1530461, 1530478, 1530495, 1530512, 1530529, 1530546, 1530563, 1530580, 1530597, 1530614, 1530631, 1530648, 1530665, 1530682, 1530699, 1530716, 1530733, 1530750, 1530767, 1530784, 1530800, 1530817, 1530835, 1530853, 1529103, 1529120, 1529136, 1529153, 1529171, 1529190, 1529208, 1529226, 1529244, 1529262, 1529281, 1529299, 1529317, 1529335, 1529353, 1529371, 1529389, 1529407, 1529425, 1529443, 1529461, 1529479, 1529497, 1529515, 1529533, 1529551, 1529569, 1529587, 1529604, 1529622, 1529640, 1529658, 1529676, 1529693, 1529711, 1529729, 1529747, 1529764, 1529782, 1529800, 1529817, 1529835, 1529853, 1529870, 1529888, 1529906, 1529923, 1529941, 1529958, 1529976, 1529993, 1530011, 1530028, 1530046, 1530063, 1530081, 1530098, 1530116, 1530133, 1530150, 1530168, 1530185, 1530202, 1530220, 1530237, 1530254, 1530272, 1530289, 1530306, 1530323, 1530341, 1530358, 1530375, 1530392, 1530409, 1530427, 1530444, 1530461, 1530478, 1530495, 1530512, 1530529, 1530546, 1530563, 1530580, 1530597, 1530614, 1530631, 1530648, 1530665, 1530682, 1530699, 1530716, 1530733, 1530750, 1530767, 1530784, 1530800, 1530817, 1530835,
1530871, 1530890, 1530908, 1530926, 1530944, 1530962, 1530980, 1530998, 1531016, 1531034, 1531052, 1531070, 1531088, 1531105, 1531123, 1531141, 1531159, 1531177, 1531195, 1531213, 1531230, 1531248, 1531266, 1531284, 1531301, 1531319, 1531337, 1531354, 1531372, 1531390, 1531407, 1531425, 1531442, 1531460, 1531478, 1531495, 1531513, 1531530, 1531548, 1531565, 1531583, 1531600, 1531618, 1531635, 1531653, 1531670, 1531687, 1531705, 1531722, 1531739, 1531757, 1531774, 1531791, 1531808, 1531826, 1531843, 1531860, 1531877, 1531895, 1531912, 1531929, 1531946, 1531963, 1531980, 1531998, 1532015, 1532032, 1532049, 1532066, 1532083, 1532100, 1532117, 1532134, 1532151, 1532168, 1532185, 1532202, 1532218, 1532235, 1532252, 1532269, 1532286, 1532303, 1532320, 1532336, 1532353, 1532371, 1532390, 1532408, 1532426, 1532444, 1532462, 1532480, 1532499, 1532517, 1532535, 1532553, 1532571, 1532589, 1532607, 1530853, 1530871, 1530890, 1530908, 1530926, 1530944, 1530962, 1530980, 1530998, 1531016, 1531034, 1531052, 1531070, 1531088, 1531105, 1531123, 1531141, 1531159, 1531177, 1531195, 1531213, 1531230, 1531248, 1531266, 1531284, 1531301, 1531319, 1531337, 1531354, 1531372, 1531390, 1531407, 1531425, 1531442, 1531460, 1531478, 1531495, 1531513, 1531530, 1531548, 1531565, 1531583, 1531600, 1531618, 1531635, 1531653, 1531670, 1531687, 1531705, 1531722, 1531739, 1531757, 1531774, 1531791, 1531808, 1531826, 1531843, 1531860, 1531877, 1531895, 1531912, 1531929, 1531946, 1531963, 1531980, 1531998, 1532015, 1532032, 1532049, 1532066, 1532083, 1532100, 1532117, 1532134, 1532151, 1532168, 1532185, 1532202, 1532218, 1532235, 1532252, 1532269, 1532286, 1532303, 1532320, 1532336, 1532353, 1532371, 1532390, 1532408, 1532426, 1532444, 1532462, 1532480, 1532499, 1532517, 1532535, 1532553, 1532571, 1532589,
1532625, 1532643, 1532661, 1532679, 1532697, 1532715, 1532732, 1532750, 1532768, 1532786, 1532804, 1532822, 1532839, 1532857, 1532875, 1532893, 1532910, 1532928, 1532946, 1532963, 1532981, 1532999, 1533016, 1533034, 1533051, 1533069, 1533087, 1533104, 1533122, 1533139, 1533157, 1533174, 1533192, 1533209, 1533226, 1533244, 1533261, 1533279, 1533296, 1533313, 1533331, 1533348, 1533365, 1533383, 1533400, 1533417, 1533434, 1533452, 1533469, 1533486, 1533503, 1533520, 1533537, 1533555, 1533572, 1533589, 1533606, 1533623, 1533640, 1533657, 1533674, 1533691, 1533708, 1533725, 1533742, 1533759, 1533776, 1533794, 1533812, 1533830, 1533849, 1533867, 1533885, 1533903, 1533921, 1533939, 1533957, 1533976, 1533994, 1534012, 1534030, 1534048, 1534066, 1534084, 1534102, 1534119, 1534137, 1534155, 1534173, 1534191, 1534209, 1534227, 1534245, 1534262, 1534280, 1534298, 1534316, 1534333, 1534351, 1534369, 1532607, 1532625, 1532643, 1532661, 1532679, 1532697, 1532715, 1532732, 1532750, 1532768, 1532786, 1532804, 1532822, 1532839, 1532857, 1532875, 1532893, 1532910, 1532928, 1532946, 1532963, 1532981, 1532999, 1533016, 1533034, 1533051, 1533069, 1533087, 1533104, 1533122, 1533139, 1533157, 1533174, 1533192, 1533209, 1533226, 1533244, 1533261, 1533279, 1533296, 1533313, 1533331, 1533348, 1533365, 1533383, 1533400, 1533417, 1533434, 1533452, 1533469, 1533486, 1533503, 1533520, 1533537, 1533555, 1533572, 1533589, 1533606, 1533623, 1533640, 1533657, 1533674, 1533691, 1533708, 1533725, 1533742, 1533759, 1533776, 1533794, 1533812, 1533830, 1533849, 1533867, 1533885, 1533903, 1533921, 1533939, 1533957, 1533976, 1533994, 1534012, 1534030, 1534048, 1534066, 1534084, 1534102, 1534119, 1534137, 1534155, 1534173, 1534191, 1534209, 1534227, 1534245, 1534262, 1534280, 1534298, 1534316, 1534333, 1534351,
1534386, 1534404, 1534422, 1534439, 1534457, 1534475, 1534492, 1534510, 1534527, 1534545, 1534562, 1534580, 1534597, 1534615, 1534632, 1534650, 1534667, 1534684, 1534702, 1534719, 1534736, 1534754, 1534771, 1534788, 1534806, 1534823, 1534840, 1534857, 1534875, 1534892, 1534909, 1534926, 1534943, 1534960, 1534977, 1534994, 1535012, 1535029, 1535046, 1535063, 1535080, 1535097, 1535115, 1535133, 1535151, 1535169, 1535187, 1535206, 1535224, 1535242, 1535260, 1535278, 1535296, 1535314, 1535332, 1535350, 1535368, 1535386, 1535403, 1535421, 1535439, 1535457, 1535475, 1535493, 1535510, 1535528, 1535546, 1535564, 1535581, 1535599, 1535617, 1535634, 1535652, 1535670, 1535687, 1535705, 1535722, 1535740, 1535758, 1535775, 1535793, 1535810, 1535828, 1535845, 1535862, 1535880, 1535897, 1535915, 1535932, 1535949, 1535967, 1535984, 1536001, 1536019, 1536036, 1536053, 1536070, 1536087, 1536105, 1536122, 1534369, 1534386, 1534404, 1534422, 1534439, 1534457, 1534475, 1534492, 1534510, 1534527, 1534545, 1534562, 1534580, 1534597, 1534615, 1534632, 1534650, 1534667, 1534684, 1534702, 1534719, 1534736, 1534754, 1534771, 1534788, 1534806, 1534823, 1534840, 1534857, 1534875, 1534892, 1534909, 1534926, 1534943, 1534960, 1534977, 1534994, 1535012, 1535029, 1535046, 1535063, 1535080, 1535097, 1535115, 1535133, 1535151, 1535169, 1535187, 1535206, 1535224, 1535242, 1535260, 1535278, 1535296, 1535314, 1535332, 1535350, 1535368, 1535386, 1535403, 1535421, 1535439, 1535457, 1535475, 1535493, 1535510, 1535528, 1535546, 1535564, 1535581, 1535599, 1535617, 1535634, 1535652, 1535670, 1535687, 1535705, 1535722, 1535740, 1535758, 1535775, 1535793, 1535810, 1535828, 1535845, 1535862, 1535880, 1535897, 1535915, 1535932, 1535949, 1535967, 1535984, 1536001, 1536019, 1536036, 1536053, 1536070, 1536087, 1536105,
1536139, 1536156, 1536173, 1536190, 1536208, 1536225, 1536242, 1536259, 1536276, 1536293, 1536310, 1536327, 1536345, 1536363, 1536381, 1536400, 1536418, 1536436, 1536454, 1536472, 1536490, 1536509, 1536527, 1536545, 1536563, 1536581, 1536599, 1536617, 1536635, 1536653, 1536670, 1536688, 1536706, 1536724, 1536742, 1536760, 1536778, 1536795, 1536813, 1536831, 1536849, 1536866, 1536884, 1536902, 1536919, 1536937, 1536955, 1536972, 1536990, 1537007, 1537025, 1537042, 1537060, 1537077, 1537095, 1537112, 1537130, 1537147, 1537165, 1537182, 1537199, 1537217, 1537234, 1537251, 1537269, 1537286, 1537303, 1537320, 1537338, 1537355, 1537372, 1537389, 1537406, 1537423, 1537441, 1537458, 1537475, 1537493, 1537511, 1537529, 1537547, 1537566, 1537584, 1537602, 1537620, 1537638, 1537656, 1537674, 1537692, 1537710, 1537728, 1537746, 1537763, 1537781, 1537799, 1537817, 1537835, 1537853, 1537870, 1537888, 1536122, 1536139, 1536156, 1536173, 1536190, 1536208, 1536225, 1536242, 1536259, 1536276, 1536293, 1536310, 1536327, 1536345, 1536363, 1536381, 1536400, 1536418, 1536436, 1536454, 1536472, 1536490, 1536509, 1536527, 1536545, 1536563, 1536581, 1536599, 1536617, 1536635, 1536653, 1536670, 1536688, 1536706, 1536724, 1536742, 1536760, 1536778, 1536795, 1536813, 1536831, 1536849, 1536866, 1536884, 1536902, 1536919, 1536937, 1536955, 1536972, 1536990, 1537007, 1537025, 1537042, 1537060, 1537077, 1537095, 1537112, 1537130, 1537147, 1537165, 1537182, 1537199, 1537217, 1537234, 1537251, 1537269, 1537286, 1537303, 1537320, 1537338, 1537355, 1537372, 1537389, 1537406, 1537423, 1537441, 1537458, 1537475, 1537493, 1537511, 1537529, 1537547, 1537566, 1537584, 1537602, 1537620, 1537638, 1537656, 1537674, 1537692, 1537710, 1537728, 1537746, 1537763, 1537781, 1537799, 1537817, 1537835, 1537853, 1537870,
1537906, 1537924, 1537941, 1537959, 1537977, 1537994, 1538012, 1538030, 1538047, 1538065, 1538082, 1538100, 1538117, 1538135, 1538152, 1538170, 1538187, 1538205, 1538222, 1538239, 1538257, 1538274, 1538291, 1538309, 1538326, 1538343, 1538360, 1538378, 1538395, 1538412, 1538429, 1538446, 1538464, 1538481, 1538498, 1538515, 1538532, 1538549, 1538567, 1538585, 1538604, 1538622, 1538640, 1538658, 1538676, 1538694, 1538712, 1538730, 1538748, 1538766, 1538784, 1538802, 1538820, 1538838, 1538856, 1538874, 1538892, 1538910, 1538927, 1538945, 1538963, 1538981, 1538998, 1539016, 1539034, 1539052, 1539069, 1539087, 1539105, 1539122, 1539140, 1539157, 1539175, 1539192, 1539210, 1539227, 1539245, 1539262, 1539280, 1539297, 1539314, 1539332, 1539349, 1539367, 1539384, 1539401, 1539418, 1539436, 1539453, 1539470, 1539487, 1539505, 1539522, 1539539, 1539556, 1539574, 1539592, 1539610, 1539628, 1539646, 1537888, 1537906, 1537924, 1537941, 1537959, 1537977, 1537994, 1538012, 1538030, 1538047, 1538065, 1538082, 1538100, 1538117, 1538135, 1538152, 1538170, 1538187, 1538205, 1538222, 1538239, 1538257, 1538274, 1538291, 1538309, 1538326, 1538343, 1538360, 1538378, 1538395, 1538412, 1538429, 1538446, 1538464, 1538481, 1538498, 1538515, 1538532, 1538549, 1538567, 1538585, 1538604, 1538622, 1538640, 1538658, 1538676, 1538694, 1538712, 1538730, 1538748, 1538766, 1538784, 1538802, 1538820, 1538838, 1538856, 1538874, 1538892, 1538910, 1538927, 1538945, 1538963, 1538981, 1538998, 1539016, 1539034, 1539052, 1539069, 1539087, 1539105, 1539122, 1539140, 1539157, 1539175, 1539192, 1539210, 1539227, 1539245, 1539262, 1539280, 1539297, 1539314, 1539332, 1539349, 1539367, 1539384, 1539401, 1539418, 1539436, 1539453, 1539470, 1539487, 1539505, 1539522, 1539539, 1539556, 1539574, 1539592, 1539610, 1539628,
1539664, 1539682, 1539700, 1539718, 1539736, 1539754, 1539771, 1539789, 1539807, 1539825, 1539842, 1539860, 1539878, 1539896, 1539913, 1539931, 1539948, 1539966, 1539984, 1540001, 1540019, 1540036, 1540054, 1540071, 1540089, 1540106, 1540124, 1540141, 1540158, 1540176, 1540193, 1540210, 1540228, 1540245, 1540262, 1540280, 1540297, 1540314, 1540331, 1540348, 1540366, 1540383, 1540400, 1540417, 1540434, 1540451, 1540468, 1540485, 1540502, 1540520, 1540538, 1540556, 1540574, 1540592, 1540610, 1540627, 1540645, 1540663, 1540681, 1540699, 1540716, 1540734, 1540752, 1540770, 1540787, 1540805, 1540822, 1540840, 1540858, 1540875, 1540893, 1540910, 1540928, 1540945, 1540963, 1540980, 1540997, 1541015, 1541032, 1541050, 1541067, 1541084, 1541102, 1541119, 1541136, 1541153, 1541171, 1541188, 1541205, 1541222, 1541239, 1541256, 1541273, 1541290, 1541308, 1541325, 1541342, 1541359, 1541376, 1541393, 1539646, 1539664, 1539682, 1539700, 1539718, 1539736, 1539754, 1539771, 1539789, 1539807, 1539825, 1539842, 1539860, 1539878, 1539896, 1539913, 1539931, 1539948, 1539966, 1539984, 1540001, 1540019, 1540036, 1540054, 1540071, 1540089, 1540106, 1540124, 1540141, 1540158, 1540176, 1540193, 1540210, 1540228, 1540245, 1540262, 1540280, 1540297, 1540314, 1540331, 1540348, 1540366, 1540383, 1540400, 1540417, 1540434, 1540451, 1540468, 1540485, 1540502, 1540520, 1540538, 1540556, 1540574, 1540592, 1540610, 1540627, 1540645, 1540663, 1540681, 1540699, 1540716, 1540734, 1540752, 1540770, 1540787, 1540805, 1540822, 1540840, 1540858, 1540875, 1540893, 1540910, 1540928, 1540945, 1540963, 1540980, 1540997, 1541015, 1541032, 1541050, 1541067, 1541084, 1541102, 1541119, 1541136, 1541153, 1541171, 1541188, 1541205, 1541222, 1541239, 1541256, 1541273, 1541290, 1541308, 1541325, 1541342, 1541359, 1541376,
1541411, 1541429, 1541446, 1541464, 1541482, 1541500, 1541518, 1541536, 1541554, 1541571, 1541589, 1541607, 1541625, 1541643, 1541660, 1541678, 1541695, 1541713, 1541731, 1541748, 1541766, 1541783, 1541801, 1541818, 1541836, 1541853, 1541871, 1541888, 1541906, 1541923, 1541940, 1541958, 1541975, 1541992, 1542010, 1542027, 1542044, 1542061, 1542078, 1542096, 1542113, 1542130, 1542147, 1542164, 1542181, 1542198, 1542215, 1542232, 1542250, 1542268, 1542286, 1542304, 1542322, 1542340, 1542358, 1542376, 1542394, 1542412, 1542430, 1542448, 1542466, 1542484, 1542502, 1542519, 1542537, 1542555, 1542572, 1542590, 1542608, 1542625, 1542643, 1542661, 1542678, 1542696, 1542713, 1542731, 1542748, 1542766, 1542783, 1542801, 1542818, 1542835, 1542853, 1542870, 1542887, 1542905, 1542922, 1542939, 1542956, 1542974, 1542991, 1543008, 1543025, 1543044, 1543062, 1543080, 1543098, 1543117, 1543135, 1543153, 1541393, 1541411, 1541429, 1541446, 1541464, 1541482, 1541500, 1541518, 1541536, 1541554, 1541571, 1541589, 1541607, 1541625, 1541643, 1541660, 1541678, 1541695, 1541713, 1541731, 1541748, 1541766, 1541783, 1541801, 1541818, 1541836, 1541853, 1541871, 1541888, 1541906, 1541923, 1541940, 1541958, 1541975, 1541992, 1542010, 1542027, 1542044, 1542061, 1542078, 1542096, 1542113, 1542130, 1542147, 1542164, 1542181, 1542198, 1542215, 1542232, 1542250, 1542268, 1542286, 1542304, 1542322, 1542340, 1542358, 1542376, 1542394, 1542412, 1542430, 1542448, 1542466, 1542484, 1542502, 1542519, 1542537, 1542555, 1542572, 1542590, 1542608, 1542625, 1542643, 1542661, 1542678, 1542696, 1542713, 1542731, 1542748, 1542766, 1542783, 1542801, 1542818, 1542835, 1542853, 1542870, 1542887, 1542905, 1542922, 1542939, 1542956, 1542974, 1542991, 1543008, 1543025, 1543044, 1543062, 1543080, 1543098, 1543117, 1543135,
1543171, 1543189, 1543208, 1543226, 1543244, 1543262, 1543280, 1543298, 1543316, 1543334, 1543352, 1543370, 1543388, 1543405, 1543423, 1543441, 1543459, 1543477, 1543494, 1543512, 1543530, 1543547, 1543565, 1543583, 1543600, 1543618, 1543636, 1543653, 1543671, 1543688, 1543706, 1543723, 1543741, 1543758, 1543775, 1543794, 1543812, 1543830, 1543848, 1543866, 1543884, 1543902, 1543921, 1543939, 1543957, 1543975, 1543993, 1544010, 1544028, 1544046, 1544064, 1544082, 1544100, 1544118, 1544135, 1544153, 1544171, 1544189, 1544206, 1544224, 1544242, 1544259, 1544277, 1544294, 1544312, 1544330, 1544347, 1544364, 1544382, 1544399, 1544417, 1544434, 1544451, 1544469, 1544486, 1544504, 1544523, 1544541, 1544559, 1544577, 1544595, 1544613, 1544631, 1544649, 1544667, 1544685, 1544703, 1544721, 1544739, 1544757, 1544774, 1544792, 1544810, 1544828, 1544845, 1544863, 1544881, 1544898, 1544916, 1544934, 1543153, 1543171, 1543189, 1543208, 1543226, 1543244, 1543262, 1543280, 1543298, 1543316, 1543334, 1543352, 1543370, 1543388, 1543405, 1543423, 1543441, 1543459, 1543477, 1543494, 1543512, 1543530, 1543547, 1543565, 1543583, 1543600, 1543618, 1543636, 1543653, 1543671, 1543688, 1543706, 1543723, 1543741, 1543758, 1543775, 1543794, 1543812, 1543830, 1543848, 1543866, 1543884, 1543902, 1543921, 1543939, 1543957, 1543975, 1543993, 1544010, 1544028, 1544046, 1544064, 1544082, 1544100, 1544118, 1544135, 1544153, 1544171, 1544189, 1544206, 1544224, 1544242, 1544259, 1544277, 1544294, 1544312, 1544330, 1544347, 1544364, 1544382, 1544399, 1544417, 1544434, 1544451, 1544469, 1544486, 1544504, 1544523, 1544541, 1544559, 1544577, 1544595, 1544613, 1544631, 1544649, 1544667, 1544685, 1544703, 1544721, 1544739, 1544757, 1544774, 1544792, 1544810, 1544828, 1544845, 1544863, 1544881, 1544898, 1544916,
1544951, 1544969, 1544986, 1545004, 1545021, 1545039, 1545056, 1545074, 1545091, 1545108, 1545126, 1545143, 1545160, 1545179, 1545197, 1545215, 1545233, 1545251, 1545269, 1545288, 1545306, 1545324, 1545342, 1545360, 1545378, 1545395, 1545413, 1545431, 1545449, 1545467, 1545485, 1545503, 1545520, 1545538, 1545556, 1545573, 1545591, 1545609, 1545626, 1545644, 1545661, 1545679, 1545696, 1545714, 1545731, 1545749, 1545766, 1545784, 1545801, 1545819, 1545838, 1545856, 1545874, 1545893, 1545911, 1545929, 1545947, 1545965, 1545983, 1546002, 1546020, 1546038, 1546056, 1546074, 1546092, 1546110, 1546127, 1546145, 1546163, 1546181, 1546199, 1546217, 1546234, 1546252, 1546270, 1546287, 1546305, 1546323, 1546340, 1546358, 1546375, 1546393, 1546410, 1546428, 1546446, 1546464, 1546482, 1546500, 1546518, 1546536, 1546554, 1546571, 1546589, 1546607, 1546625, 1546642, 1546660, 1546678, 1546695, 1546713, 1544934, 1544951, 1544969, 1544986, 1545004, 1545021, 1545039, 1545056, 1545074, 1545091, 1545108, 1545126, 1545143, 1545160, 1545179, 1545197, 1545215, 1545233, 1545251, 1545269, 1545288, 1545306, 1545324, 1545342, 1545360, 1545378, 1545395, 1545413, 1545431, 1545449, 1545467, 1545485, 1545503, 1545520, 1545538, 1545556, 1545573, 1545591, 1545609, 1545626, 1545644, 1545661, 1545679, 1545696, 1545714, 1545731, 1545749, 1545766, 1545784, 1545801, 1545819, 1545838, 1545856, 1545874, 1545893, 1545911, 1545929, 1545947, 1545965, 1545983, 1546002, 1546020, 1546038, 1546056, 1546074, 1546092, 1546110, 1546127, 1546145, 1546163, 1546181, 1546199, 1546217, 1546234, 1546252, 1546270, 1546287, 1546305, 1546323, 1546340, 1546358, 1546375, 1546393, 1546410, 1546428, 1546446, 1546464, 1546482, 1546500, 1546518, 1546536, 1546554, 1546571, 1546589, 1546607, 1546625, 1546642, 1546660, 1546678, 1546695,
1546730, 1546748, 1546766, 1546783, 1546800, 1546818, 1546835, 1546853, 1546870, 1546887, 1546905, 1546922, 1546939, 1546956, 1546974, 1546991, 1547009, 1547027, 1547045, 1547064, 1547082, 1547100, 1547118, 1547136, 1547154, 1547172, 1547190, 1547208, 1547226, 1547244, 1547262, 1547280, 1547297, 1547315, 1547333, 1547351, 1547369, 1547386, 1547404, 1547422, 1547439, 1547457, 1547474, 1547492, 1547509, 1547527, 1547544, 1547562, 1547580, 1547598, 1547616, 1547634, 1547652, 1547670, 1547688, 1547705, 1547723, 1547741, 1547758, 1547776, 1547794, 1547811, 1547829, 1547847, 1547864, 1547882, 1547899, 1547917, 1547934, 1547951, 1547969, 1547986, 1548003, 1548021, 1548038, 1548055, 1548072, 1548091, 1548109, 1548128, 1548146, 1548164, 1548183, 1548201, 1548219, 1548237, 1548255, 1548274, 1548292, 1548310, 1548328, 1548346, 1548364, 1548382, 1548400, 1548417, 1548435, 1548453, 1548471, 1548489, 1546713, 1546730, 1546748, 1546766, 1546783, 1546800, 1546818, 1546835, 1546853, 1546870, 1546887, 1546905, 1546922, 1546939, 1546956, 1546974, 1546991, 1547009, 1547027, 1547045, 1547064, 1547082, 1547100, 1547118, 1547136, 1547154, 1547172, 1547190, 1547208, 1547226, 1547244, 1547262, 1547280, 1547297, 1547315, 1547333, 1547351, 1547369, 1547386, 1547404, 1547422, 1547439, 1547457, 1547474, 1547492, 1547509, 1547527, 1547544, 1547562, 1547580, 1547598, 1547616, 1547634, 1547652, 1547670, 1547688, 1547705, 1547723, 1547741, 1547758, 1547776, 1547794, 1547811, 1547829, 1547847, 1547864, 1547882, 1547899, 1547917, 1547934, 1547951, 1547969, 1547986, 1548003, 1548021, 1548038, 1548055, 1548072, 1548091, 1548109, 1548128, 1548146, 1548164, 1548183, 1548201, 1548219, 1548237, 1548255, 1548274, 1548292, 1548310, 1548328, 1548346, 1548364, 1548382, 1548400, 1548417, 1548435, 1548453, 1548471,
1548506, 1548524, 1548542, 1548560, 1548577, 1548596, 1548614, 1548632, 1548650, 1548668, 1548686, 1548704, 1548723, 1548741, 1548759, 1548777, 1548794, 1548812, 1548830, 1548848, 1548866, 1548884, 1548902, 1548919, 1548937, 1548955, 1548972, 1548990, 1549008, 1549025, 1549043, 1549060, 1549078, 1549096, 1549114, 1549133, 1549151, 1549169, 1549187, 1549204, 1549222, 1549240, 1549258, 1549276, 1549294, 1549311, 1549329, 1549347, 1549365, 1549382, 1549400, 1549417, 1549435, 1549453, 1549470, 1549488, 1549505, 1549522, 1549540, 1549559, 1549577, 1549595, 1549612, 1549630, 1549648, 1549666, 1549684, 1549702, 1549720, 1549737, 1549755, 1549773, 1549790, 1549808, 1549826, 1549843, 1549861, 1549878, 1549896, 1549913, 1549931, 1549948, 1549965, 1549984, 1550002, 1550020, 1550038, 1550055, 1550073, 1550091, 1550109, 1550127, 1550145, 1550162, 1550180, 1550198, 1550216, 1550233, 1550251, 1550268, 1548489, 1548506, 1548524, 1548542, 1548560, 1548577, 1548596, 1548614, 1548632, 1548650, 1548668, 1548686, 1548704, 1548723, 1548741, 1548759, 1548777, 1548794, 1548812, 1548830, 1548848, 1548866, 1548884, 1548902, 1548919, 1548937, 1548955, 1548972, 1548990, 1549008, 1549025, 1549043, 1549060, 1549078, 1549096, 1549114, 1549133, 1549151, 1549169, 1549187, 1549204, 1549222, 1549240, 1549258, 1549276, 1549294, 1549311, 1549329, 1549347, 1549365, 1549382, 1549400, 1549417, 1549435, 1549453, 1549470, 1549488, 1549505, 1549522, 1549540, 1549559, 1549577, 1549595, 1549612, 1549630, 1549648, 1549666, 1549684, 1549702, 1549720, 1549737, 1549755, 1549773, 1549790, 1549808, 1549826, 1549843, 1549861, 1549878, 1549896, 1549913, 1549931, 1549948, 1549965, 1549984, 1550002, 1550020, 1550038, 1550055, 1550073, 1550091, 1550109, 1550127, 1550145, 1550162, 1550180, 1550198, 1550216, 1550233, 1550251,
1550286, 1550303, 1550321, 1550338, 1550356, 1550373, 1550390, 1550409, 1550427, 1550445, 1550463, 1550481, 1550499, 1550516, 1550534, 1550552, 1550570, 1550588, 1550605, 1550623, 1550641, 1550658, 1550676, 1550694, 1550711, 1550729, 1550746, 1550764, 1550781, 1550799, 1550817, 1550835, 1550853, 1550871, 1550889, 1550907, 1550925, 1550943, 1550961, 1550979, 1550996, 1551014, 1551032, 1551050, 1551067, 1551085, 1551103, 1551120, 1551138, 1551156, 1551173, 1551190, 1551209, 1551227, 1551245, 1551263, 1551282, 1551300, 1551318, 1551336, 1551354, 1551372, 1551390, 1551408, 1551426, 1551443, 1551461, 1551479, 1551497, 1551514, 1551532, 1551550, 1551567, 1551586, 1551604, 1551623, 1551641, 1551659, 1551678, 1551696, 1551714, 1551732, 1551751, 1551769, 1551787, 1551805, 1551823, 1551841, 1551859, 1551877, 1551895, 1551912, 1551930, 1551948, 1551966, 1551983, 1552001, 1552019, 1552036, 1552054, 1550268, 1550286, 1550303, 1550321, 1550338, 1550356, 1550373, 1550390, 1550409, 1550427, 1550445, 1550463, 1550481, 1550499, 1550516, 1550534, 1550552, 1550570, 1550588, 1550605, 1550623, 1550641, 1550658, 1550676, 1550694, 1550711, 1550729, 1550746, 1550764, 1550781, 1550799, 1550817, 1550835, 1550853, 1550871, 1550889, 1550907, 1550925, 1550943, 1550961, 1550979, 1550996, 1551014, 1551032, 1551050, 1551067, 1551085, 1551103, 1551120, 1551138, 1551156, 1551173, 1551190, 1551209, 1551227, 1551245, 1551263, 1551282, 1551300, 1551318, 1551336, 1551354, 1551372, 1551390, 1551408, 1551426, 1551443, 1551461, 1551479, 1551497, 1551514, 1551532, 1551550, 1551567, 1551586, 1551604, 1551623, 1551641, 1551659, 1551678, 1551696, 1551714, 1551732, 1551751, 1551769, 1551787, 1551805, 1551823, 1551841, 1551859, 1551877, 1551895, 1551912, 1551930, 1551948, 1551966, 1551983, 1552001, 1552019, 1552036,
1552071, 1552089, 1552106, 1552124, 1552141, 1552159, 1552176, 1552193, 1552211, 1552228, 1552245, 1552262, 1552279, 1552297, 1552315, 1552333, 1552351, 1552369, 1552387, 1552405, 1552423, 1552440, 1552458, 1552476, 1552493, 1552511, 1552529, 1552546, 1552564, 1552581, 1552599, 1552616, 1552634, 1552653, 1552671, 1552689, 1552707, 1552726, 1552744, 1552762, 1552780, 1552798, 1552816, 1552834, 1552852, 1552869, 1552887, 1552905, 1552923, 1552941, 1552959, 1552978, 1552997, 1553015, 1553034, 1553052, 1553071, 1553089, 1553108, 1553126, 1553145, 1553163, 1553181, 1553199, 1553218, 1553236, 1553254, 1553272, 1553290, 1553308, 1553326, 1553344, 1553362, 1553380, 1553397, 1553415, 1553433, 1553451, 1553468, 1553486, 1553504, 1553521, 1553539, 1553556, 1553575, 1553593, 1553612, 1553630, 1553649, 1553667, 1553685, 1553704, 1553722, 1553740, 1553758, 1553776, 1553794, 1553812, 1553830, 1553848, 1552054, 1552071, 1552089, 1552106, 1552124, 1552141, 1552159, 1552176, 1552193, 1552211, 1552228, 1552245, 1552262, 1552279, 1552297, 1552315, 1552333, 1552351, 1552369, 1552387, 1552405, 1552423, 1552440, 1552458, 1552476, 1552493, 1552511, 1552529, 1552546, 1552564, 1552581, 1552599, 1552616, 1552634, 1552653, 1552671, 1552689, 1552707, 1552726, 1552744, 1552762, 1552780, 1552798, 1552816, 1552834, 1552852, 1552869, 1552887, 1552905, 1552923, 1552941, 1552959, 1552978, 1552997, 1553015, 1553034, 1553052, 1553071, 1553089, 1553108, 1553126, 1553145, 1553163, 1553181, 1553199, 1553218, 1553236, 1553254, 1553272, 1553290, 1553308, 1553326, 1553344, 1553362, 1553380, 1553397, 1553415, 1553433, 1553451, 1553468, 1553486, 1553504, 1553521, 1553539, 1553556, 1553575, 1553593, 1553612, 1553630, 1553649, 1553667, 1553685, 1553704, 1553722, 1553740, 1553758, 1553776, 1553794, 1553812, 1553830,
1553866, 1553884, 1553902, 1553920, 1553938, 1553955, 1553973, 1553991, 1554008, 1554026, 1554044, 1554061, 1554078, 1554096, 1554113, 1554131, 1554149, 1554168, 1554186, 1554204, 1554223, 1554241, 1554259, 1554278, 1554296, 1554314, 1554332, 1554350, 1554368, 1554386, 1554404, 1554422, 1554440, 1554457, 1554475, 1554493, 1554511, 1554528, 1554546, 1554563, 1554581, 1554599, 1554616, 1554633, 1554651, 1554668, 1554687, 1554705, 1554724, 1554742, 1554761, 1554779, 1554797, 1554816, 1554834, 1554852, 1554870, 1554888, 1554906, 1554924, 1554942, 1554960, 1554978, 1554996, 1555014, 1555031, 1555049, 1555067, 1555084, 1555102, 1555120, 1555137, 1555155, 1555172, 1555191, 1555210, 1555228, 1555247, 1555265, 1555284, 1555302, 1555321, 1555339, 1555358, 1555376, 1555394, 1555412, 1555431, 1555449, 1555467, 1555485, 1555503, 1555521, 1555539, 1555557, 1555575, 1555592, 1555610, 1555628, 1555645, 1553848, 1553866, 1553884, 1553902, 1553920, 1553938, 1553955, 1553973, 1553991, 1554008, 1554026, 1554044, 1554061, 1554078, 1554096, 1554113, 1554131, 1554149, 1554168, 1554186, 1554204, 1554223, 1554241, 1554259, 1554278, 1554296, 1554314, 1554332, 1554350, 1554368, 1554386, 1554404, 1554422, 1554440, 1554457, 1554475, 1554493, 1554511, 1554528, 1554546, 1554563, 1554581, 1554599, 1554616, 1554633, 1554651, 1554668, 1554687, 1554705, 1554724, 1554742, 1554761, 1554779, 1554797, 1554816, 1554834, 1554852, 1554870, 1554888, 1554906, 1554924, 1554942, 1554960, 1554978, 1554996, 1555014, 1555031, 1555049, 1555067, 1555084, 1555102, 1555120, 1555137, 1555155, 1555172, 1555191, 1555210, 1555228, 1555247, 1555265, 1555284, 1555302, 1555321, 1555339, 1555358, 1555376, 1555394, 1555412, 1555431, 1555449, 1555467, 1555485, 1555503, 1555521, 1555539, 1555557, 1555575, 1555592, 1555610, 1555628,
1555665, 1555684, 1555703, 1555722, 1555740, 1555759, 1555778, 1555797, 1555816, 1555834, 1555853, 1555872, 1555890, 1555909, 1555927, 1555945, 1555964, 1555982, 1556000, 1556019, 1556037, 1556055, 1556073, 1556091, 1556109, 1556127, 1556145, 1556163, 1556181, 1556198, 1556216, 1556234, 1556251, 1556269, 1556287, 1556304, 1556323, 1556342, 1556361, 1556380, 1556399, 1556418, 1556437, 1556455, 1556474, 1556493, 1556511, 1556530, 1556548, 1556567, 1556585, 1556603, 1556622, 1556640, 1556658, 1556676, 1556694, 1556712, 1556730, 1556748, 1556766, 1556784, 1556802, 1556820, 1556837, 1556855, 1556873, 1556890, 1556908, 1556927, 1556946, 1556965, 1556985, 1557004, 1557023, 1557042, 1557060, 1557079, 1557098, 1557117, 1557135, 1557154, 1557173, 1557191, 1557210, 1557228, 1557247, 1557265, 1557283, 1557301, 1557319, 1557338, 1557356, 1557374, 1557392, 1557410, 1557428, 1557446, 1557463, 1557481, 1555645, 1555665, 1555684, 1555703, 1555722, 1555740, 1555759, 1555778, 1555797, 1555816, 1555834, 1555853, 1555872, 1555890, 1555909, 1555927, 1555945, 1555964, 1555982, 1556000, 1556019, 1556037, 1556055, 1556073, 1556091, 1556109, 1556127, 1556145, 1556163, 1556181, 1556198, 1556216, 1556234, 1556251, 1556269, 1556287, 1556304, 1556323, 1556342, 1556361, 1556380, 1556399, 1556418, 1556437, 1556455, 1556474, 1556493, 1556511, 1556530, 1556548, 1556567, 1556585, 1556603, 1556622, 1556640, 1556658, 1556676, 1556694, 1556712, 1556730, 1556748, 1556766, 1556784, 1556802, 1556820, 1556837, 1556855, 1556873, 1556890, 1556908, 1556927, 1556946, 1556965, 1556985, 1557004, 1557023, 1557042, 1557060, 1557079, 1557098, 1557117, 1557135, 1557154, 1557173, 1557191, 1557210, 1557228, 1557247, 1557265, 1557283, 1557301, 1557319, 1557338, 1557356, 1557374, 1557392, 1557410, 1557428, 1557446, 1557463,
1557499, 1557516, 1557534, 1557552, 1557569, 1557587, 1557604, 1557621, 1557639, 1557658, 1557677, 1557696, 1557715, 1557734, 1557753, 1557772, 1557791, 1557810, 1557828, 1557847, 1557865, 1557884, 1557903, 1557921, 1557939, 1557958, 1557976, 1557994, 1558012, 1558031, 1558049, 1558067, 1558085, 1558103, 1558120, 1558138, 1558156, 1558174, 1558191, 1558209, 1558227, 1558244, 1558262, 1558279, 1558296, 1558316, 1558335, 1558355, 1558374, 1558393, 1558413, 1558432, 1558451, 1558470, 1558489, 1558508, 1558526, 1558545, 1558564, 1558583, 1558601, 1558620, 1558638, 1558657, 1558675, 1558694, 1558712, 1558730, 1558748, 1558766, 1558784, 1558802, 1558820, 1558838, 1558856, 1558874, 1558892, 1558909, 1558927, 1558945, 1558962, 1558979, 1558997, 1559014, 1559032, 1559051, 1559071, 1559091, 1559110, 1559130, 1559149, 1559168, 1559188, 1559207, 1559226, 1559245, 1559264, 1559283, 1559302, 1559321, 1557481, 1557499, 1557516, 1557534, 1557552, 1557569, 1557587, 1557604, 1557621, 1557639, 1557658, 1557677, 1557696, 1557715, 1557734, 1557753, 1557772, 1557791, 1557810, 1557828, 1557847, 1557865, 1557884, 1557903, 1557921, 1557939, 1557958, 1557976, 1557994, 1558012, 1558031, 1558049, 1558067, 1558085, 1558103, 1558120, 1558138, 1558156, 1558174, 1558191, 1558209, 1558227, 1558244, 1558262, 1558279, 1558296, 1558316, 1558335, 1558355, 1558374, 1558393, 1558413, 1558432, 1558451, 1558470, 1558489, 1558508, 1558526, 1558545, 1558564, 1558583, 1558601, 1558620, 1558638, 1558657, 1558675, 1558694, 1558712, 1558730, 1558748, 1558766, 1558784, 1558802, 1558820, 1558838, 1558856, 1558874, 1558892, 1558909, 1558927, 1558945, 1558962, 1558979, 1558997, 1559014, 1559032, 1559051, 1559071, 1559091, 1559110, 1559130, 1559149, 1559168, 1559188, 1559207, 1559226, 1559245, 1559264, 1559283, 1559302,
1559340, 1559358, 1559377, 1559396, 1559414, 1559433, 1559451, 1559469, 1559488, 1559506, 1559524, 1559542, 1559560, 1559578, 1559596, 1559614, 1559632, 1559650, 1559668, 1559685, 1559706, 1559726, 1559747, 1559767, 1559787, 1559807, 1559827, 1559847, 1559867, 1559887, 1559907, 1559927, 1559946, 1559966, 1559985, 1560005, 1560024, 1560044, 1560063, 1560082, 1560101, 1560120, 1560139, 1560158, 1560177, 1560196, 1560214, 1560233, 1560251, 1560270, 1560288, 1560307, 1560325, 1560343, 1560361, 1560379, 1560398, 1560416, 1560433, 1560451, 1560469, 1560487, 1560505, 1560522, 1560540, 1560557, 1560575, 1560592, 1560613, 1560634, 1560654, 1560675, 1560695, 1560716, 1560736, 1560756, 1560776, 1560796, 1560816, 1560836, 1560856, 1560876, 1560895, 1560915, 1560934, 1560954, 1560973, 1560992, 1561011, 1561030, 1561050, 1561069, 1561087, 1561106, 1561125, 1561144, 1561162, 1561181, 1561199, 1561218, 1559321, 1559340, 1559358, 1559377, 1559396, 1559414, 1559433, 1559451, 1559469, 1559488, 1559506, 1559524, 1559542, 1559560, 1559578, 1559596, 1559614, 1559632, 1559650, 1559668, 1559685, 1559706, 1559726, 1559747, 1559767, 1559787, 1559807, 1559827, 1559847, 1559867, 1559887, 1559907, 1559927, 1559946, 1559966, 1559985, 1560005, 1560024, 1560044, 1560063, 1560082, 1560101, 1560120, 1560139, 1560158, 1560177, 1560196, 1560214, 1560233, 1560251, 1560270, 1560288, 1560307, 1560325, 1560343, 1560361, 1560379, 1560398, 1560416, 1560433, 1560451, 1560469, 1560487, 1560505, 1560522, 1560540, 1560557, 1560575, 1560592, 1560613, 1560634, 1560654, 1560675, 1560695, 1560716, 1560736, 1560756, 1560776, 1560796, 1560816, 1560836, 1560856, 1560876, 1560895, 1560915, 1560934, 1560954, 1560973, 1560992, 1561011, 1561030, 1561050, 1561069, 1561087, 1561106, 1561125, 1561144, 1561162, 1561181, 1561199,
1561236, 1561254, 1561272, 1561290, 1561308, 1561326, 1561344, 1561362, 1561380, 1561398, 1561415, 1561433, 1561450, 1561472, 1561494, 1561515, 1561537, 1561558, 1561579, 1561601, 1561622, 1561643, 1561664, 1561684, 1561705, 1561726, 1561746, 1561767, 1561787, 1561807, 1561827, 1561848, 1561867, 1561887, 1561907, 1561927, 1561946, 1561966, 1561985, 1562005, 1562024, 1562043, 1562062, 1562081, 1562100, 1562119, 1562138, 1562157, 1562175, 1562194, 1562212, 1562231, 1562249, 1562267, 1562285, 1562304, 1562321, 1562339, 1562357, 1562375, 1562393, 1562410, 1562428, 1562445, 1562463, 1562486, 1562509, 1562532, 1562554, 1562577, 1562599, 1562622, 1562644, 1562666, 1562688, 1562710, 1562731, 1562753, 1562775, 1562796, 1562817, 1562838, 1562860, 1562880, 1562901, 1562922, 1562943, 1562963, 1562983, 1563004, 1563024, 1563044, 1563064, 1563084, 1563104, 1563123, 1563143, 1563162, 1563182, 1563201, 1561218, 1561236, 1561254, 1561272, 1561290, 1561308, 1561326, 1561344, 1561362, 1561380, 1561398, 1561415, 1561433, 1561450, 1561472, 1561494, 1561515, 1561537, 1561558, 1561579, 1561601, 1561622, 1561643, 1561664, 1561684, 1561705, 1561726, 1561746, 1561767, 1561787, 1561807, 1561827, 1561848, 1561867, 1561887, 1561907, 1561927, 1561946, 1561966, 1561985, 1562005, 1562024, 1562043, 1562062, 1562081, 1562100, 1562119, 1562138, 1562157, 1562175, 1562194, 1562212, 1562231, 1562249, 1562267, 1562285, 1562304, 1562321, 1562339, 1562357, 1562375, 1562393, 1562410, 1562428, 1562445, 1562463, 1562486, 1562509, 1562532, 1562554, 1562577, 1562599, 1562622, 1562644, 1562666, 1562688, 1562710, 1562731, 1562753, 1562775, 1562796, 1562817, 1562838, 1562860, 1562880, 1562901, 1562922, 1562943, 1562963, 1562983, 1563004, 1563024, 1563044, 1563064, 1563084, 1563104, 1563123, 1563143, 1563162, 1563182,
1563220, 1563239, 1563258, 1563277, 1563296, 1563315, 1563333, 1563352, 1563370, 1563389, 1563407, 1563425, 1563443, 1563461, 1563479, 1563497, 1563514, 1563532, 1563550, 1563576, 1563602, 1563627, 1563653, 1563678, 1563704, 1563729, 1563754, 1563778, 1563803, 1563827, 1563851, 1563876, 1563899, 1563923, 1563947, 1563970, 1563993, 1564016, 1564039, 1564062, 1564085, 1564107, 1564129, 1564151, 1564173, 1564195, 1564217, 1564239, 1564260, 1564281, 1564302, 1564323, 1564344, 1564365, 1564386, 1564406, 1564427, 1564447, 1564467, 1564487, 1564507, 1564526, 1564546, 1564565, 1564585, 1564604, 1564623, 1564642, 1564661, 1564680, 1564698, 1564717, 1564735, 1564754, 1564772, 1564790, 1564808, 1564826, 1564844, 1564861, 1564879, 1564913, 1564948, 1564982, 1565016, 1565049, 1565082, 1565114, 1565146, 1565178, 1565209, 1565240, 1565271, 1565301, 1565331, 1565361, 1565390, 1565420, 1565448, 1565477, 1563201, 1563220, 1563239, 1563258, 1563277, 1563296, 1563315, 1563333, 1563352, 1563370, 1563389, 1563407, 1563425, 1563443, 1563461, 1563479, 1563497, 1563514, 1563532, 1563550, 1563576, 1563602, 1563627, 1563653, 1563678, 1563704, 1563729, 1563754, 1563778, 1563803, 1563827, 1563851, 1563876, 1563899, 1563923, 1563947, 1563970, 1563993, 1564016, 1564039, 1564062, 1564085, 1564107, 1564129, 1564151, 1564173, 1564195, 1564217, 1564239, 1564260, 1564281, 1564302, 1564323, 1564344, 1564365, 1564386, 1564406, 1564427, 1564447, 1564467, 1564487, 1564507, 1564526, 1564546, 1564565, 1564585, 1564604, 1564623, 1564642, 1564661, 1564680, 1564698, 1564717, 1564735, 1564754, 1564772, 1564790, 1564808, 1564826, 1564844, 1564861, 1564879, 1564913, 1564948, 1564982, 1565016, 1565049, 1565082, 1565114, 1565146, 1565178, 1565209, 1565240, 1565271, 1565301, 1565331, 1565361, 1565390, 1565420, 1565448,
1565505, 1565533, 1565560, 1565587, 1565615, 1565641, 1565668, 1565694, 1565720, 1565745, 1565771, 1565796, 1565821, 1565845, 1565870, 1565894, 1565918, 1565942, 1565965, 1565988, 1566011, 1566034, 1566056, 1566079, 1566101, 1566123, 1566145, 1566166, 1566188, 1566209, 1566230, 1566250, 1566271, 1566291, 1566312, 1566332, 1566351, 1566371, 1566391, 1566410, 1566429, 1566448, 1566467, 1566486, 1566504, 1566522, 1566541, 1566559, 1566576, 1566594, 1566612, 1566629, 1566646, 1566664, 1566681, 1566697, 1566714, 1566731, 1566747, 1566764, 1566780, 1566796, 1566812, 1566828, 1566843, 1566859, 1566874, 1566890, 1566905, 1566920, 1566935, 1566950, 1566964, 1566979, 1566994, 1567008, 1567022, 1567036, 1567051, 1567065, 1567078, 1567092, 1567106, 1567119, 1567133, 1567146, 1567160, 1567173, 1567186, 1567199, 1567212, 1567224, 1567237, 1567250, 1567262, 1567275, 1567287, 1567299, 1567312, 1567324, 1565477, 1565505, 1565533, 1565560, 1565587, 1565615, 1565641, 1565668, 1565694, 1565720, 1565745, 1565771, 1565796, 1565821, 1565845, 1565870, 1565894, 1565918, 1565942, 1565965, 1565988, 1566011, 1566034, 1566056, 1566079, 1566101, 1566123, 1566145, 1566166, 1566188, 1566209, 1566230, 1566250, 1566271, 1566291, 1566312, 1566332, 1566351, 1566371, 1566391, 1566410, 1566429, 1566448, 1566467, 1566486, 1566504, 1566522, 1566541, 1566559, 1566576, 1566594, 1566612, 1566629, 1566646, 1566664, 1566681, 1566697, 1566714, 1566731, 1566747, 1566764, 1566780, 1566796, 1566812, 1566828, 1566843, 1566859, 1566874, 1566890, 1566905, 1566920, 1566935, 1566950, 1566964, 1566979, 1566994, 1567008, 1567022, 1567036, 1567051, 1567065, 1567078, 1567092, 1567106, 1567119, 1567133, 1567146, 1567160, 1567173, 1567186, 1567199, 1567212, 1567224, 1567237, 1567250, 1567262, 1567275, 1567287, 1567299, 1567312,
1567336, 1567348, 1567359, 1567371, 1567383, 1567394, 1567406, 1567417, 1567429, 1567440, 1567451, 1567463, 1567474, 1567485, 1567496, 1567506, 1567517, 1567528, 1567538, 1567549, 1567560, 1567570, 1567580, 1567591, 1567601, 1567611, 1567621, 1567631, 1567641, 1567651, 1567661, 1567671, 1567681, 1567690, 1567700, 1567709, 1567719, 1567728, 1567738, 1567747, 1567756, 1567766, 1567775, 1567784, 1567793, 1567802, 1567811, 1567820, 1567829, 1567837, 1567846, 1567855, 1567863, 1567872, 1567880, 1567889, 1567897, 1567906, 1567914, 1567922, 1567931, 1567939, 1567947, 1567955, 1567963, 1567971, 1567979, 1567987, 1567995, 1568003, 1568010, 1568018, 1568026, 1568033, 1568041, 1568049, 1568056, 1568064, 1568071, 1568078, 1568086, 1568093, 1568100, 1568108, 1568115, 1568122, 1568129, 1568136, 1568143, 1568150, 1568157, 1568164, 1568171, 1568178, 1568185, 1568192, 1568198, 1568205, 1568212, 1568219, 1567324, 1567336, 1567348, 1567359, 1567371, 1567383, 1567394, 1567406, 1567417, 1567429, 1567440, 1567451, 1567463, 1567474, 1567485, 1567496, 1567506, 1567517, 1567528, 1567538, 1567549, 1567560, 1567570, 1567580, 1567591, 1567601, 1567611, 1567621, 1567631, 1567641, 1567651, 1567661, 1567671, 1567681, 1567690, 1567700, 1567709, 1567719, 1567728, 1567738, 1567747, 1567756, 1567766, 1567775, 1567784, 1567793, 1567802, 1567811, 1567820, 1567829, 1567837, 1567846, 1567855, 1567863, 1567872, 1567880, 1567889, 1567897, 1567906, 1567914, 1567922, 1567931, 1567939, 1567947, 1567955, 1567963, 1567971, 1567979, 1567987, 1567995, 1568003, 1568010, 1568018, 1568026, 1568033, 1568041, 1568049, 1568056, 1568064, 1568071, 1568078, 1568086, 1568093, 1568100, 1568108, 1568115, 1568122, 1568129, 1568136, 1568143, 1568150, 1568157, 1568164, 1568171, 1568178, 1568185, 1568192, 1568198, 1568205, 1568212,
1568225, 1568232, 1568238, 1568245, 1568251, 1568258, 1568264, 1568271, 1568277, 1568283, 1568290, 1568296, 1568302, 1568308, 1568314, 1568321, 1568327, 1568333, 1568339, 1568345, 1568351, 1568357, 1568363, 1568369, 1568374, 1568380, 1568386, 1568392, 1568398, 1568403, 1568409, 1568415, 1568421, 1568426, 1568432, 1568437, 1568443, 1568448, 1568454, 1568459, 1568465, 1568470, 1568476, 1568481, 1568486, 1568492, 1568497, 1568502, 1568508, 1568513, 1568518, 1568523, 1568528, 1568533, 1568539, 1568544, 1568549, 1568554, 1568559, 1568564, 1568569, 1568574, 1568579, 1568583, 1568588, 1568593, 1568598, 1568603, 1568608, 1568612, 1568617, 1568622, 1568627, 1568631, 1568636, 1568641, 1568645, 1568650, 1568655, 1568659, 1568664, 1568668, 1568673, 1568677, 1568682, 1568686, 1568691, 1568695, 1568699, 1568704, 1568708, 1568712, 1568717, 1568721, 1568725, 1568730, 1568734, 1568738, 1568742, 1568747, 1568219, 1568225, 1568232, 1568238, 1568245, 1568251, 1568258, 1568264, 1568271, 1568277, 1568283, 1568290, 1568296, 1568302, 1568308, 1568314, 1568321, 1568327, 1568333, 1568339, 1568345, 1568351, 1568357, 1568363, 1568369, 1568374, 1568380, 1568386, 1568392, 1568398, 1568403, 1568409, 1568415, 1568421, 1568426, 1568432, 1568437, 1568443, 1568448, 1568454, 1568459, 1568465, 1568470, 1568476, 1568481, 1568486, 1568492, 1568497, 1568502, 1568508, 1568513, 1568518, 1568523, 1568528, 1568533, 1568539, 1568544, 1568549, 1568554, 1568559, 1568564, 1568569, 1568574, 1568579, 1568583, 1568588, 1568593, 1568598, 1568603, 1568608, 1568612, 1568617, 1568622, 1568627, 1568631, 1568636, 1568641, 1568645, 1568650, 1568655, 1568659, 1568664, 1568668, 1568673, 1568677, 1568682, 1568686, 1568691, 1568695, 1568699, 1568704, 1568708, 1568712, 1568717, 1568721, 1568725, 1568730, 1568734, 1568738, 1568742,
1568751, 1568755, 1568759, 1568763, 1568767, 1568772, 1568776, 1568780, 1568784, 1568788, 1568792, 1568796, 1568800, 1568804, 1568808, 1568812, 1568816, 1568819, 1568823, 1568827, 1568831, 1568835, 1568839, 1568843, 1568847, 1568850, 1568854, 1568858, 1568862, 1568865, 1568869, 1568873, 1568876, 1568880, 1568884, 1568887, 1568891, 1568895, 1568898, 1568902, 1568905, 1568909, 1568913, 1568916, 1568920, 1568923, 1568927, 1568930, 1568934, 1568937, 1568940, 1568944, 1568947, 1568951, 1568954, 1568958, 1568961, 1568964, 1568968, 1568971, 1568974, 1568978, 1568981, 1568984, 1568987, 1568991, 1568994, 1568997, 1569000, 1569004, 1569007, 1569010, 1569013, 1569016, 1569020, 1569023, 1569026, 1569029, 1569032, 1569035, 1569038, 1569041, 1569045, 1569048, 1569051, 1569054, 1569057, 1569060, 1569063, 1569066, 1569069, 1569072, 1569075, 1569078, 1569081, 1569084, 1569086, 1569089, 1569092, 1569095, 1568747, 1568751, 1568755, 1568759, 1568763, 1568767, 1568772, 1568776, 1568780, 1568784, 1568788, 1568792, 1568796, 1568800, 1568804, 1568808, 1568812, 1568816, 1568819, 1568823, 1568827, 1568831, 1568835, 1568839, 1568843, 1568847, 1568850, 1568854, 1568858, 1568862, 1568865, 1568869, 1568873, 1568876, 1568880, 1568884, 1568887, 1568891, 1568895, 1568898, 1568902, 1568905, 1568909, 1568913, 1568916, 1568920, 1568923, 1568927, 1568930, 1568934, 1568937, 1568940, 1568944, 1568947, 1568951, 1568954, 1568958, 1568961, 1568964, 1568968, 1568971, 1568974, 1568978, 1568981, 1568984, 1568987, 1568991, 1568994, 1568997, 1569000, 1569004, 1569007, 1569010, 1569013, 1569016, 1569020, 1569023, 1569026, 1569029, 1569032, 1569035, 1569038, 1569041, 1569045, 1569048, 1569051, 1569054, 1569057, 1569060, 1569063, 1569066, 1569069, 1569072, 1569075, 1569078, 1569081, 1569084, 1569086, 1569089, 1569092,
1569098, 1569101, 1569104, 1569107, 1569110, 1569112, 1569115, 1569118, 1569121, 1569124, 1569126, 1569129, 1569132, 1569135, 1569137, 1569140, 1569143, 1569146, 1569148, 1569151, 1569154, 1569157, 1569159, 1569162, 1569164, 1569167, 1569170, 1569172, 1569175, 1569178, 1569180, 1569183, 1569185, 1569188, 1569191, 1569193, 1569196, 1569198, 1569201, 1569203, 1569206, 1569208, 1569211, 1569214, 1569216, 1569218, 1569221, 1569223, 1569226, 1569228, 1569231, 1569233, 1569236, 1569238, 1569241, 1569243, 1569245, 1569248, 1569250, 1569253, 1569255, 1569257, 1569260, 1569262, 1569264, 1569267, 1569269, 1569271, 1569274, 1569276, 1569278, 1569281, 1569283, 1569285, 1569288, 1569290, 1569292, 1569294, 1569297, 1569299, 1569301, 1569303, 1569306, 1569308, 1569310, 1569312, 1569314, 1569316, 1569319, 1569321, 1569323, 1569325, 1569327, 1569330, 1569332, 1569334, 1569336, 1569338, 1569340, 1569342, 1569095, 1569098, 1569101, 1569104, 1569107, 1569110, 1569112, 1569115, 1569118, 1569121, 1569124, 1569126, 1569129, 1569132, 1569135, 1569137, 1569140, 1569143, 1569146, 1569148, 1569151, 1569154, 1569157, 1569159, 1569162, 1569164, 1569167, 1569170, 1569172, 1569175, 1569178, 1569180, 1569183, 1569185, 1569188, 1569191, 1569193, 1569196, 1569198, 1569201, 1569203, 1569206, 1569208, 1569211, 1569214, 1569216, 1569218, 1569221, 1569223, 1569226, 1569228, 1569231, 1569233, 1569236, 1569238, 1569241, 1569243, 1569245, 1569248, 1569250, 1569253, 1569255, 1569257, 1569260, 1569262, 1569264, 1569267, 1569269, 1569271, 1569274, 1569276, 1569278, 1569281, 1569283, 1569285, 1569288, 1569290, 1569292, 1569294, 1569297, 1569299, 1569301, 1569303, 1569306, 1569308, 1569310, 1569312, 1569314, 1569316, 1569319, 1569321, 1569323, 1569325, 1569327, 1569330, 1569332, 1569334, 1569336, 1569338, 1569340,
1569344, 1569347, 1569349, 1569351, 1569353, 1569355, 1569357, 1569359, 1569361, 1569363, 1569365, 1569367, 1569369, 1569371, 1569373, 1569375, 1569377, 1569379, 1569381, 1569383, 1569385, 1569387, 1569389, 1569391, 1569393, 1569395, 1569397, 1569399, 1569401, 1569403, 1569405, 1569407, 1569409, 1569411, 1569413, 1569415, 1569416, 1569418, 1569420, 1569422, 1569424, 1569426, 1569428, 1569430, 1569432, 1569433, 1569435, 1569437, 1569439, 1569441, 1569443, 1569445, 1569446, 1569448, 1569450, 1569452, 1569454, 1569455, 1569457, 1569459, 1569461, 1569463, 1569464, 1569466, 1569468, 1569470, 1569471, 1569473, 1569475, 1569477, 1569478, 1569480, 1569482, 1569483, 1569485, 1569487, 1569489, 1569490, 1569492, 1569494, 1569495, 1569497, 1569499, 1569501, 1569502, 1569504, 1569506, 1569507, 1569509, 1569510, 1569512, 1569514, 1569515, 1569517, 1569519, 1569520, 1569522, 1569524, 1569525, 1569527, 1569342, 1569344, 1569347, 1569349, 1569351, 1569353, 1569355, 1569357, 1569359, 1569361, 1569363, 1569365, 1569367, 1569369, 1569371, 1569373, 1569375, 1569377, 1569379, 1569381, 1569383, 1569385, 1569387, 1569389, 1569391, 1569393, 1569395, 1569397, 1569399, 1569401, 1569403, 1569405, 1569407, 1569409, 1569411, 1569413, 1569415, 1569416, 1569418, 1569420, 1569422, 1569424, 1569426, 1569428, 1569430, 1569432, 1569433, 1569435, 1569437, 1569439, 1569441, 1569443, 1569445, 1569446, 1569448, 1569450, 1569452, 1569454, 1569455, 1569457, 1569459, 1569461, 1569463, 1569464, 1569466, 1569468, 1569470, 1569471, 1569473, 1569475, 1569477, 1569478, 1569480, 1569482, 1569483, 1569485, 1569487, 1569489, 1569490, 1569492, 1569494, 1569495, 1569497, 1569499, 1569501, 1569502, 1569504, 1569506, 1569507, 1569509, 1569510, 1569512, 1569514, 1569515, 1569517, 1569519, 1569520, 1569522, 1569524, 1569525,
1569528, 1569530, 1569532, 1569533, 1569535, 1569536, 1569538, 1569540, 1569541, 1569543, 1569544, 1569546, 1569547, 1569549, 1569550, 1569552, 1569554, 1569555, 1569557, 1569558, 1569560, 1569561, 1569563, 1569564, 1569566, 1569567, 1569569, 1569570, 1569572, 1569573, 1569575, 1569576, 1569578, 1569579, 1569581, 1569582, 1569584, 1569585, 1569587, 1569588, 1569590, 1569591, 1569592, 1569594, 1569595, 1569597, 1569598, 1569600, 1569601, 1569602, 1569604, 1569605, 1569607, 1569608, 1569610, 1569611, 1569612, 1569614, 1569615, 1569617, 1569618, 1569619, 1569621, 1569622, 1569623, 1569625, 1569626, 1569628, 1569629, 1569630, 1569632, 1569633, 1569634, 1569636, 1569637, 1569638, 1569640, 1569641, 1569642, 1569644, 1569645, 1569646, 1569648, 1569649, 1569650, 1569652, 1569653, 1569654, 1569656, 1569657, 1569658, 1569659, 1569661, 1569662, 1569663, 1569665, 1569666, 1569667, 1569668, 1569670, 1569527, 1569528, 1569530, 1569532, 1569533, 1569535, 1569536, 1569538, 1569540, 1569541, 1569543, 1569544, 1569546, 1569547, 1569549, 1569550, 1569552, 1569554, 1569555, 1569557, 1569558, 1569560, 1569561, 1569563, 1569564, 1569566, 1569567, 1569569, 1569570, 1569572, 1569573, 1569575, 1569576, 1569578, 1569579, 1569581, 1569582, 1569584, 1569585, 1569587, 1569588, 1569590, 1569591, 1569592, 1569594, 1569595, 1569597, 1569598, 1569600, 1569601, 1569602, 1569604, 1569605, 1569607, 1569608, 1569610, 1569611, 1569612, 1569614, 1569615, 1569617, 1569618, 1569619, 1569621, 1569622, 1569623, 1569625, 1569626, 1569628, 1569629, 1569630, 1569632, 1569633, 1569634, 1569636, 1569637, 1569638, 1569640, 1569641, 1569642, 1569644, 1569645, 1569646, 1569648, 1569649, 1569650, 1569652, 1569653, 1569654, 1569656, 1569657, 1569658, 1569659, 1569661, 1569662, 1569663, 1569665, 1569666, 1569667, 1569668,
1569671, 1569672, 1569674, 1569675, 1569676, 1569677, 1569679, 1569680, 1569681, 1569682, 1569684, 1569685, 1569686, 1569687, 1569688, 1569690, 1569691, 1569692, 1569693, 1569694, 1569696, 1569697, 1569698, 1569699, 1569701, 1569702, 1569703, 1569704, 1569705, 1569707, 1569708, 1569709, 1569710, 1569711, 1569712, 1569714, 1569715, 1569716, 1569717, 1569718, 1569719, 1569721, 1569722, 1569723, 1569724, 1569725, 1569726, 1569727, 1569729, 1569730, 1569731, 1569732, 1569733, 1569734, 1569735, 1569736, 1569738, 1569739, 1569740, 1569741, 1569742, 1569743, 1569744, 1569745, 1569746, 1569748, 1569749, 1569750, 1569751, 1569752, 1569753, 1569754, 1569755, 1569756, 1569757, 1569759, 1569760, 1569761, 1569762, 1569763, 1569764, 1569765, 1569766, 1569767, 1569768, 1569769, 1569770, 1569771, 1569772, 1569773, 1569774, 1569775, 1569777, 1569777, 1569779, 1569780, 1569781, 1569782, 1569783, 1569784, 1569670, 1569671, 1569672, 1569674, 1569675, 1569676, 1569677, 1569679, 1569680, 1569681, 1569682, 1569684, 1569685, 1569686, 1569687, 1569688, 1569690, 1569691, 1569692, 1569693, 1569694, 1569696, 1569697, 1569698, 1569699, 1569701, 1569702, 1569703, 1569704, 1569705, 1569707, 1569708, 1569709, 1569710, 1569711, 1569712, 1569714, 1569715, 1569716, 1569717, 1569718, 1569719, 1569721, 1569722, 1569723, 1569724, 1569725, 1569726, 1569727, 1569729, 1569730, 1569731, 1569732, 1569733, 1569734, 1569735, 1569736, 1569738, 1569739, 1569740, 1569741, 1569742, 1569743, 1569744, 1569745, 1569746, 1569748, 1569749, 1569750, 1569751, 1569752, 1569753, 1569754, 1569755, 1569756, 1569757, 1569759, 1569760, 1569761, 1569762, 1569763, 1569764, 1569765, 1569766, 1569767, 1569768, 1569769, 1569770, 1569771, 1569772, 1569773, 1569774, 1569775, 1569777, 1569777, 1569779, 1569780, 1569781, 1569782, 1569783,
1569785, 1569786, 1569787, 1569788, 1569789, 1569790, 1569791, 1569792, 1569793, 1569794, 1569795, 1569796, 785398 1569784, 1569785, 1569786, 1569787, 1569788, 1569789, 1569790, 1569791, 1569792, 1569793, 1569794, 1569795, 1569796, 785398
}; };
} }
} }
@@ -1,12 +1,14 @@
//#define DONT_USE_GENERATE_CODE //#define DONT_USE_GENERATE_CODE
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// This code was generated by Lockstep.CodeGenerator // This code was generated by JNGame.CodeGenerator
// Changes to this file may cause incorrect behavior and will be lost if // Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated. // the code is regenerated.
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
using System;
using JNGame.Math;
namespace JNGame.Math namespace JNGame.Math
{ {
public static class LUTCos public static class LUTCos
@@ -1,12 +1,14 @@
//#define DONT_USE_GENERATE_CODE //#define DONT_USE_GENERATE_CODE
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// This code was generated by Lockstep.CodeGenerator // This code was generated by JNGame.CodeGenerator
// Changes to this file may cause incorrect behavior and will be lost if // Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated. // the code is regenerated.
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
using System;
using JNGame.Math;
namespace JNGame.Math namespace JNGame.Math
{ {
public static class LUTSin public static class LUTSin
File diff suppressed because one or more lines are too long
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: e2e8e2468b4384e4694aaf2becdfb0c3
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -38,7 +38,6 @@ RenderSettings:
m_ReflectionIntensity: 1 m_ReflectionIntensity: 1
m_CustomReflection: {fileID: 0} m_CustomReflection: {fileID: 0}
m_Sun: {fileID: 705507994} m_Sun: {fileID: 705507994}
m_IndirectSpecularColor: {r: 0.18028378, g: 0.22571412, b: 0.30692285, a: 1}
m_UseRadianceAmbientProbe: 0 m_UseRadianceAmbientProbe: 0
--- !u!157 &3 --- !u!157 &3
LightmapSettings: LightmapSettings:
@@ -104,7 +103,7 @@ NavMeshSettings:
serializedVersion: 2 serializedVersion: 2
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
m_BuildSettings: m_BuildSettings:
serializedVersion: 2 serializedVersion: 3
agentTypeID: 0 agentTypeID: 0
agentRadius: 0.5 agentRadius: 0.5
agentHeight: 2 agentHeight: 2
@@ -117,7 +116,7 @@ NavMeshSettings:
cellSize: 0.16666667 cellSize: 0.16666667
manualTileSize: 0 manualTileSize: 0
tileSize: 256 tileSize: 256
accuratePlacement: 0 buildHeightMesh: 0
maxJobWorkers: 0 maxJobWorkers: 0
preserveTilesOutsideBounds: 0 preserveTilesOutsideBounds: 0
debug: debug:
@@ -159,7 +158,7 @@ MonoBehaviour:
m_BlockingObjects: 0 m_BlockingObjects: 0
m_BlockingMask: m_BlockingMask:
serializedVersion: 2 serializedVersion: 2
m_Bits: 4294967295 m_Bits: 55
--- !u!114 &61202612 --- !u!114 &61202612
MonoBehaviour: MonoBehaviour:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -202,6 +201,7 @@ Canvas:
m_SortingBucketNormalizedSize: 0 m_SortingBucketNormalizedSize: 0
m_VertexColorAlwaysGammaSpace: 0 m_VertexColorAlwaysGammaSpace: 0
m_AdditionalShaderChannelsFlag: 25 m_AdditionalShaderChannelsFlag: 25
m_UpdateRectTransformForStandalone: 0
m_SortingLayerID: 0 m_SortingLayerID: 0
m_SortingOrder: 0 m_SortingOrder: 0
m_TargetDisplay: 0 m_TargetDisplay: 0
@@ -224,7 +224,6 @@ RectTransform:
- {fileID: 569553488} - {fileID: 569553488}
- {fileID: 1531590483} - {fileID: 1531590483}
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 5
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0} m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0}
@@ -279,7 +278,6 @@ RectTransform:
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 61202614} m_Father: {fileID: 61202614}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 1} m_AnchorMin: {x: 0.5, y: 1}
m_AnchorMax: {x: 0.5, y: 1} m_AnchorMax: {x: 0.5, y: 1}
@@ -375,6 +373,7 @@ MonoBehaviour:
ModeOverride: 0 ModeOverride: 0
LensShift: {x: 0, y: 0} LensShift: {x: 0, y: 0}
GateFit: 2 GateFit: 2
FocusDistance: 10
m_SensorSize: {x: 1, y: 1} m_SensorSize: {x: 1, y: 1}
m_Transitions: m_Transitions:
m_BlendHint: 0 m_BlendHint: 0
@@ -456,6 +455,7 @@ Transform:
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 181717978} m_GameObject: {fileID: 181717978}
serializedVersion: 2
m_LocalRotation: {x: -0.26082727, y: -0.5956457, z: 0.21305256, w: -0.7292352} m_LocalRotation: {x: -0.26082727, y: -0.5956457, z: 0.21305256, w: -0.7292352}
m_LocalPosition: {x: -26.9086, y: 45.025208, z: 20.71292} m_LocalPosition: {x: -26.9086, y: 45.025208, z: 20.71292}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
@@ -465,7 +465,6 @@ Transform:
- {fileID: 489189100} - {fileID: 489189100}
- {fileID: 1154405771} - {fileID: 1154405771}
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: -89.846, z: 0} m_LocalEulerAnglesHint: {x: 0, y: -89.846, z: 0}
--- !u!1 &222420976 --- !u!1 &222420976
GameObject: GameObject:
@@ -498,7 +497,6 @@ RectTransform:
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 61202614} m_Father: {fileID: 61202614}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 1} m_AnchorMin: {x: 0.5, y: 1}
m_AnchorMax: {x: 0.5, y: 1} m_AnchorMax: {x: 0.5, y: 1}
@@ -572,13 +570,13 @@ Transform:
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 289208754} m_GameObject: {fileID: 289208754}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 966399671} m_Father: {fileID: 966399671}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!154 &289208756 --- !u!154 &289208756
TerrainCollider: TerrainCollider:
@@ -588,7 +586,16 @@ TerrainCollider:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 289208754} m_GameObject: {fileID: 289208754}
m_Material: {fileID: 0} m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_ProvidesContacts: 0
m_Enabled: 1 m_Enabled: 1
serializedVersion: 2
m_TerrainData: {fileID: 15600000, guid: b9ffe249355d38f4ea060619fe145b79, type: 2} m_TerrainData: {fileID: 15600000, guid: b9ffe249355d38f4ea060619fe145b79, type: 2}
m_EnableTreeColliders: 1 m_EnableTreeColliders: 1
--- !u!218 &289208757 --- !u!218 &289208757
@@ -609,22 +616,28 @@ Terrain:
m_DetailObjectDensity: 1 m_DetailObjectDensity: 1
m_HeightmapPixelError: 5 m_HeightmapPixelError: 5
m_SplatMapDistance: 1000 m_SplatMapDistance: 1000
m_HeightmapMinimumLODSimplification: 0
m_HeightmapMaximumLOD: 0 m_HeightmapMaximumLOD: 0
m_ShadowCastingMode: 2 m_ShadowCastingMode: 2
m_DrawHeightmap: 1 m_DrawHeightmap: 1
m_DrawInstanced: 0 m_DrawInstanced: 0
m_DrawTreesAndFoliage: 1 m_DrawTreesAndFoliage: 1
m_StaticShadowCaster: 0 m_StaticShadowCaster: 0
m_IgnoreQualitySettings: 0
m_ReflectionProbeUsage: 1 m_ReflectionProbeUsage: 1
m_MaterialTemplate: {fileID: 10652, guid: 0000000000000000f000000000000000, type: 0} m_MaterialTemplate: {fileID: 10652, guid: 0000000000000000f000000000000000, type: 0}
m_BakeLightProbesForTrees: 1 m_BakeLightProbesForTrees: 1
m_PreserveTreePrototypeLayers: 0 m_PreserveTreePrototypeLayers: 0
m_DeringLightProbesForTrees: 1 m_DeringLightProbesForTrees: 1
m_ReceiveGI: 1
m_ScaleInLightmap: 0.0256 m_ScaleInLightmap: 0.0256
m_LightmapParameters: {fileID: 15203, guid: 0000000000000000f000000000000000, type: 0} m_LightmapParameters: {fileID: 15203, guid: 0000000000000000f000000000000000, type: 0}
m_GroupingID: 0 m_GroupingID: 0
m_RenderingLayerMask: 1 m_RenderingLayerMask: 1
m_AllowAutoConnect: 1 m_AllowAutoConnect: 1
m_EnableHeightmapRayTracing: 1
m_EnableTreesAndDetailsRayTracing: 0
m_TreeMotionVectorModeOverride: 3
--- !u!1 &332652183 --- !u!1 &332652183
GameObject: GameObject:
m_ObjectHideFlags: 3 m_ObjectHideFlags: 3
@@ -651,13 +664,13 @@ Transform:
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 332652183} m_GameObject: {fileID: 332652183}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 489189100} m_Father: {fileID: 489189100}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &332652185 --- !u!114 &332652185
MonoBehaviour: MonoBehaviour:
@@ -776,6 +789,7 @@ Transform:
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 400944144} m_GameObject: {fileID: 400944144}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0.000000059604645, y: 0, z: 0} m_LocalPosition: {x: 0.000000059604645, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
@@ -783,7 +797,6 @@ Transform:
m_Children: m_Children:
- {fileID: 1849954841} - {fileID: 1849954841}
m_Father: {fileID: 181717980} m_Father: {fileID: 181717980}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &400944146 --- !u!114 &400944146
MonoBehaviour: MonoBehaviour:
@@ -821,6 +834,7 @@ MonoBehaviour:
ModeOverride: 0 ModeOverride: 0
LensShift: {x: 0, y: 0} LensShift: {x: 0, y: 0}
GateFit: 2 GateFit: 2
FocusDistance: 10
m_SensorSize: {x: 1, y: 1} m_SensorSize: {x: 1, y: 1}
m_Transitions: m_Transitions:
m_BlendHint: 0 m_BlendHint: 0
@@ -856,13 +870,13 @@ Transform:
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 441433885} m_GameObject: {fileID: 441433885}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 1154405771} m_Father: {fileID: 1154405771}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &441433887 --- !u!114 &441433887
MonoBehaviour: MonoBehaviour:
@@ -981,6 +995,7 @@ Transform:
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 489189099} m_GameObject: {fileID: 489189099}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
@@ -988,7 +1003,6 @@ Transform:
m_Children: m_Children:
- {fileID: 332652184} - {fileID: 332652184}
m_Father: {fileID: 181717980} m_Father: {fileID: 181717980}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &489189101 --- !u!114 &489189101
MonoBehaviour: MonoBehaviour:
@@ -1026,6 +1040,7 @@ MonoBehaviour:
ModeOverride: 0 ModeOverride: 0
LensShift: {x: 0, y: 0} LensShift: {x: 0, y: 0}
GateFit: 2 GateFit: 2
FocusDistance: 10
m_SensorSize: {x: 1, y: 1} m_SensorSize: {x: 1, y: 1}
m_Transitions: m_Transitions:
m_BlendHint: 0 m_BlendHint: 0
@@ -1075,13 +1090,13 @@ Transform:
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 492996330} m_GameObject: {fileID: 492996330}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 3
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &569553487 --- !u!1 &569553487
GameObject: GameObject:
@@ -1116,7 +1131,6 @@ RectTransform:
m_Children: m_Children:
- {fileID: 1780905642} - {fileID: 1780905642}
m_Father: {fileID: 61202614} m_Father: {fileID: 61202614}
m_RootOrder: 4
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 1} m_AnchorMin: {x: 0.5, y: 1}
m_AnchorMax: {x: 0.5, y: 1} m_AnchorMax: {x: 0.5, y: 1}
@@ -1248,7 +1262,6 @@ RectTransform:
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 739776926} m_Father: {fileID: 739776926}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5} m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5} m_AnchorMax: {x: 0, y: 0.5}
@@ -1324,7 +1337,6 @@ RectTransform:
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 1531590483} m_Father: {fileID: 1531590483}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0} m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1}
@@ -1459,13 +1471,13 @@ Transform:
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 705507993} m_GameObject: {fileID: 705507993}
serializedVersion: 2
m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
m_LocalPosition: {x: 0, y: 3, z: 0} m_LocalPosition: {x: 0, y: 3, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
--- !u!1 &711409931 --- !u!1 &711409931
GameObject: GameObject:
@@ -1491,6 +1503,7 @@ Transform:
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 711409931} m_GameObject: {fileID: 711409931}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
@@ -1498,7 +1511,6 @@ Transform:
m_Children: m_Children:
- {fileID: 966399671} - {fileID: 966399671}
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 4
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &711409933 --- !u!114 &711409933
MonoBehaviour: MonoBehaviour:
@@ -1548,7 +1560,6 @@ RectTransform:
- {fileID: 693424984} - {fileID: 693424984}
- {fileID: 784179391} - {fileID: 784179391}
m_Father: {fileID: 1877206257} m_Father: {fileID: 1877206257}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5} m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 1, y: 0.5} m_AnchorMax: {x: 1, y: 0.5}
@@ -1634,7 +1645,6 @@ RectTransform:
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 739776926} m_Father: {fileID: 739776926}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0} m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1}
@@ -1716,7 +1726,6 @@ RectTransform:
m_Children: m_Children:
- {fileID: 1873991747} - {fileID: 1873991747}
m_Father: {fileID: 61202614} m_Father: {fileID: 61202614}
m_RootOrder: 3
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 1} m_AnchorMin: {x: 0.5, y: 1}
m_AnchorMax: {x: 0.5, y: 1} m_AnchorMax: {x: 0.5, y: 1}
@@ -1851,7 +1860,6 @@ RectTransform:
- {fileID: 1621253169} - {fileID: 1621253169}
- {fileID: 1837040637} - {fileID: 1837040637}
m_Father: {fileID: 1531590483} m_Father: {fileID: 1531590483}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0} m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 0}
@@ -1950,6 +1958,7 @@ Transform:
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 966399670} m_GameObject: {fileID: 966399670}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
@@ -1957,7 +1966,6 @@ Transform:
m_Children: m_Children:
- {fileID: 289208755} - {fileID: 289208755}
m_Father: {fileID: 711409932} m_Father: {fileID: 711409932}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &966399672 --- !u!114 &966399672
MonoBehaviour: MonoBehaviour:
@@ -1980,6 +1988,7 @@ MonoBehaviour:
m_Bits: 4294967295 m_Bits: 4294967295
m_UseGeometry: 0 m_UseGeometry: 0
m_DefaultArea: 0 m_DefaultArea: 0
m_GenerateLinks: 0
m_IgnoreNavMeshAgent: 1 m_IgnoreNavMeshAgent: 1
m_IgnoreNavMeshObstacle: 1 m_IgnoreNavMeshObstacle: 1
m_OverrideTileSize: 1 m_OverrideTileSize: 1
@@ -2020,7 +2029,6 @@ RectTransform:
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 739776926} m_Father: {fileID: 739776926}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0} m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1}
@@ -2125,13 +2133,13 @@ Transform:
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1088287025} m_GameObject: {fileID: 1088287025}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 6
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1154405769 --- !u!1 &1154405769
GameObject: GameObject:
@@ -2186,6 +2194,7 @@ MonoBehaviour:
ModeOverride: 0 ModeOverride: 0
LensShift: {x: 0, y: 0} LensShift: {x: 0, y: 0}
GateFit: 2 GateFit: 2
FocusDistance: 10
m_SensorSize: {x: 1, y: 1} m_SensorSize: {x: 1, y: 1}
m_Transitions: m_Transitions:
m_BlendHint: 0 m_BlendHint: 0
@@ -2202,6 +2211,7 @@ Transform:
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1154405769} m_GameObject: {fileID: 1154405769}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
@@ -2209,7 +2219,6 @@ Transform:
m_Children: m_Children:
- {fileID: 441433886} - {fileID: 441433886}
m_Father: {fileID: 181717980} m_Father: {fileID: 181717980}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1187505147 --- !u!1 &1187505147
GameObject: GameObject:
@@ -2236,13 +2245,13 @@ Transform:
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1187505147} m_GameObject: {fileID: 1187505147}
serializedVersion: 2
m_LocalRotation: {x: -0.26082727, y: -0.5956457, z: 0.21305256, w: -0.7292352} m_LocalRotation: {x: -0.26082727, y: -0.5956457, z: 0.21305256, w: -0.7292352}
m_LocalPosition: {x: -26.908585, y: 45.025223, z: 20.71292} m_LocalPosition: {x: -26.908585, y: 45.025223, z: 20.71292}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!20 &1187505150 --- !u!20 &1187505150
Camera: Camera:
@@ -2258,9 +2267,17 @@ Camera:
m_projectionMatrixMode: 1 m_projectionMatrixMode: 1
m_GateFitMode: 2 m_GateFitMode: 2
m_FOVAxisMode: 0 m_FOVAxisMode: 0
m_Iso: 200
m_ShutterSpeed: 0.005
m_Aperture: 16
m_FocusDistance: 10
m_FocalLength: 50
m_BladeCount: 5
m_Curvature: {x: 2, y: 11}
m_BarrelClipping: 0.25
m_Anamorphism: 0
m_SensorSize: {x: 36, y: 24} m_SensorSize: {x: 36, y: 24}
m_LensShift: {x: 0, y: 0} m_LensShift: {x: 0, y: 0}
m_FocalLength: 50
m_NormalizedViewPortRect: m_NormalizedViewPortRect:
serializedVersion: 2 serializedVersion: 2
x: 0 x: 0
@@ -2351,7 +2368,6 @@ RectTransform:
m_Children: m_Children:
- {fileID: 2058336311} - {fileID: 2058336311}
m_Father: {fileID: 1837040637} m_Father: {fileID: 1837040637}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0} m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1}
@@ -2389,7 +2405,6 @@ RectTransform:
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 1531590483} m_Father: {fileID: 1531590483}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0.5} m_AnchorMin: {x: 1, y: 0.5}
m_AnchorMax: {x: 1, y: 0.5} m_AnchorMax: {x: 1, y: 0.5}
@@ -2469,7 +2484,6 @@ RectTransform:
- {fileID: 1498355245} - {fileID: 1498355245}
- {fileID: 905393663} - {fileID: 905393663}
m_Father: {fileID: 61202614} m_Father: {fileID: 61202614}
m_RootOrder: 5
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5}
@@ -2612,7 +2626,6 @@ RectTransform:
m_Children: m_Children:
- {fileID: 1877206257} - {fileID: 1877206257}
m_Father: {fileID: 905393663} m_Father: {fileID: 905393663}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0} m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1}
@@ -2701,7 +2714,6 @@ RectTransform:
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 1983202942} m_Father: {fileID: 1983202942}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0} m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1}
@@ -2781,7 +2793,6 @@ RectTransform:
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 569553488} m_Father: {fileID: 569553488}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0} m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1}
@@ -2863,7 +2874,6 @@ RectTransform:
m_Children: m_Children:
- {fileID: 1471734305} - {fileID: 1471734305}
m_Father: {fileID: 905393663} m_Father: {fileID: 905393663}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0} m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1}
@@ -2983,13 +2993,13 @@ Transform:
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1849954840} m_GameObject: {fileID: 1849954840}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 400944145} m_Father: {fileID: 400944145}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1849954842 --- !u!114 &1849954842
MonoBehaviour: MonoBehaviour:
@@ -3115,7 +3125,6 @@ RectTransform:
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 898699214} m_Father: {fileID: 898699214}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0} m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1}
@@ -3194,7 +3203,6 @@ RectTransform:
m_Children: m_Children:
- {fileID: 739776926} - {fileID: 739776926}
m_Father: {fileID: 1621253169} m_Father: {fileID: 1621253169}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1} m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1}
@@ -3234,7 +3242,6 @@ RectTransform:
m_Children: m_Children:
- {fileID: 1684779459} - {fileID: 1684779459}
m_Father: {fileID: 61202614} m_Father: {fileID: 61202614}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 1} m_AnchorMin: {x: 0.5, y: 1}
m_AnchorMax: {x: 0.5, y: 1} m_AnchorMax: {x: 0.5, y: 1}
@@ -3366,7 +3373,6 @@ RectTransform:
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 1471734305} m_Father: {fileID: 1471734305}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0} m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 0.2} m_AnchorMax: {x: 1, y: 0.2}
@@ -3411,3 +3417,14 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2058336310} m_GameObject: {fileID: 2058336310}
m_CullTransparentMesh: 1 m_CullTransparentMesh: 1
--- !u!1660057539 &9223372036854775807
SceneRoots:
m_ObjectHideFlags: 0
m_Roots:
- {fileID: 1187505149}
- {fileID: 181717980}
- {fileID: 705507995}
- {fileID: 492996332}
- {fileID: 711409932}
- {fileID: 61202614}
- {fileID: 1088287028}
File diff suppressed because one or more lines are too long
@@ -1,5 +1,5 @@
fileFormatVersion: 2 fileFormatVersion: 2
guid: c2e7814c3ee7c6c489dcf0aff4116ab4 guid: e217f3b4d6de86e4d978c3ee3754437a
TextScriptImporter: TextScriptImporter:
externalObjects: {} externalObjects: {}
userData: userData:
File diff suppressed because one or more lines are too long
@@ -15,5 +15,10 @@ namespace BehaviorTreeSlayer
rd.material.color = color; rd.material.color = color;
return base.Tick(dt, args); return base.Tick(dt, args);
} }
public override string ToString()
{
return $"颜色";
}
} }
} }
@@ -1129,7 +1129,7 @@ MonoBehaviour:
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
AutoRun: 1 AutoRun: 1
config: {fileID: 4900000, guid: efbb9ae85b44479fac84562240d86ac3, type: 3} config: {fileID: 4900000, guid: 2ae8dd65757eda9499fd4559acc7d26f, type: 3}
Obj: Obj:
- {fileID: 716990035} - {fileID: 716990035}
--- !u!4 &1742566310 --- !u!4 &1742566310

Some files were not shown because too many files have changed in this diff Show More