Daily update on 20230803 by nitload youmu, problem of parameter displacement solved, rewriting other linear math

This commit is contained in:
Nitload
2023-08-03 22:46:16 +08:00
parent 194d65edf6
commit aae7e0292c
105 changed files with 13858 additions and 11394 deletions
@@ -8,9 +8,9 @@
return vec1.X * vec2.Y - vec1.Y * vec2.X;
}
public static vec3d Cross(vec3d vec1, vec3d vec2)
public static Vec3d Cross(Vec3d vec1, Vec3d vec2)
{
return new vec3d(
return new Vec3d(
vec1.Y * vec2.Z - vec1.Z * vec2.Y,
vec1.X * vec2.Z - vec1.Z * vec2.X,
vec1.X * vec2.Y - vec1.Y * vec2.X
@@ -8,6 +8,8 @@
return Cross(array.row1, array.row2);
}
/*
public static unsafe float Det(matrix3x3 array)
{
float* p = &array.row1.X;
@@ -31,5 +33,7 @@
+ *(p + 2) * Det(matrix3)
;
}
*/
}
}
@@ -10,7 +10,7 @@
);
}
public static float GetAngle(vec3d vec1, vec3d vec2)
public static float GetAngle(Vec3d vec1, Vec3d vec2)
{
return Calc.ACos(
vec1 * vec2
@@ -2,7 +2,7 @@
{
public static unsafe partial class Vector
{
public static float GetLength(this vec3d vec)
public static float GetLength(this Vec3d vec)
{
return Calc.Sqrt(
vec.X * vec.X +
@@ -1,8 +1,30 @@
namespace StgSharp.Math
using System;
namespace StgSharp.Math
{
public static unsafe partial class VectorCalc
{
public static unsafe float Multiple(Vec3d vec1, Vec4d vec2)
{
M128* retPtr = (M128*)internalIO.mulps_internal(vec1._m128Ptr,vec2._m128Ptr);
return
retPtr->single_0 +
retPtr->single_1 +
retPtr->single_2;
}
public static unsafe float Multiple(Vec4d vec1,Vec4d vec2)
{
M128* retPtr = (M128*)internalIO.mulps_internal(vec1._m128Ptr,vec2._m128Ptr);
return
retPtr->single_0 +
retPtr->single_1 +
retPtr->single_2 +
retPtr->single_3;
}
public static unsafe Matrix4x4 Multiple(
Matrix4x4 matrix1, Matrix4x4 matrix2
)
@@ -74,7 +96,7 @@
);
}
public static float multiple(this vec3d vec, colum3 colum)
public static float multiple(this Vec3d vec, colum3 colum)
{
return vec.X * colum.X + vec.Y * colum.Y + vec.Z * colum.Z;
}
@@ -85,11 +107,11 @@
/// <param name="vec"></param>
/// <param name="matrix"></param>
/// <returns></returns>
public static unsafe vec3d multiple(this vec2d vec, matrix2x3 matrix)
public static unsafe Vec3d multiple(this vec2d vec, matrix2x3 matrix)
{
float* p = &matrix.row1.X;
return new vec3d(
return new Vec3d(
vec.X * *(p + 0) + vec.Y * *(p + 3),
vec.X * *(p + 1) + vec.Y * *(p + 4),
vec.X * *(p + 2) + vec.Y * *(p + 5)
@@ -2,12 +2,12 @@
{
public unsafe static partial class Vector
{
public static vec3d To3D(vec2d vec)
public static Vec3d To3D(vec2d vec)
{
return new vec3d(vec.X, vec.Y, 0.0f);
return new Vec3d(vec.X, vec.Y, 0.0f);
}
public static vec2d To2D(vec3d vec, CordinatePlain plain)
public static vec2d To2D(Vec3d vec, CordinatePlain plain)
{
switch (plain)
{
+1 -1
View File
@@ -55,7 +55,7 @@ namespace StgSharp.Math
}
else
{
return this.Equals((vec3d)obj);
return this.Equals((Vec3d)obj);
}
}
+6 -6
View File
@@ -7,11 +7,11 @@ namespace StgSharp.Math
public struct matrix2x3 : IEquatable<matrix2x3>
{
[FieldOffset(0)]
public vec3d row1;
public Vec3d row1;
[FieldOffset(12)]
public vec3d row2;
public Vec3d row2;
public matrix2x3(vec3d r1, vec3d r2)
public matrix2x3(Vec3d r1, Vec3d r2)
{
row1 = r1;
row2 = r2;
@@ -22,8 +22,8 @@ namespace StgSharp.Math
float r21, float r22, float r23
)
{
row1 = new vec3d(r11, r12, r13);
row2 = new vec3d(r21, r22, r23);
row1 = new Vec3d(r11, r12, r13);
row2 = new Vec3d(r21, r22, r23);
}
public override bool Equals(object obj)
@@ -38,7 +38,7 @@ namespace StgSharp.Math
}
else
{
return this.Equals((vec3d)obj);
return this.Equals((Vec3d)obj);
}
}
+7 -7
View File
@@ -7,13 +7,13 @@ namespace StgSharp.Math
public struct matrix3x3 : IEquatable<matrix3x3>
{
[FieldOffset(0)]
public vec3d row1;
public Vec3d row1;
[FieldOffset(12)]
public vec3d row2;
public Vec3d row2;
[FieldOffset(24)]
public vec3d row3;
public Vec3d row3;
public matrix3x3(vec3d r0, vec3d r1, vec3d r2)
public matrix3x3(Vec3d r0, Vec3d r1, Vec3d r2)
{
row1 = r0;
row2 = r1;
@@ -26,9 +26,9 @@ namespace StgSharp.Math
float a31, float a32, float a33
)
{
row1 = new vec3d(a11, a12, a13);
row2 = new vec3d(a21, a22, a23);
row3 = new vec3d(a31, a32, a33);
row1 = new Vec3d(a11, a12, a13);
row2 = new Vec3d(a21, a22, a23);
row3 = new Vec3d(a31, a32, a33);
}
public override int GetHashCode()
+8 -8
View File
@@ -8,13 +8,13 @@ namespace StgSharp.Math
public struct matrix4x3 : IEquatable<matrix4x3>
{
[FieldOffset(0)]
public vec3d row1;
public Vec3d row1;
[FieldOffset(12)]
public vec3d row2;
public Vec3d row2;
[FieldOffset(24)]
public vec3d row3;
public Vec3d row3;
[FieldOffset(36)]
public vec3d row4;
public Vec3d row4;
public matrix4x3(
float a11, float a12, float a13,
@@ -23,10 +23,10 @@ namespace StgSharp.Math
float a41, float a42, float a43
)
{
row1 = new vec3d(a11, a12, a13);
row2 = new vec3d(a21, a22, a23);
row3 = new vec3d(a31, a32, a33);
row4 = new vec3d(a41, a42, a43);
row1 = new Vec3d(a11, a12, a13);
row2 = new Vec3d(a21, a22, a23);
row3 = new Vec3d(a31, a32, a33);
row4 = new Vec3d(a41, a42, a43);
}
public override bool Equals(object obj)
+60 -66
View File
@@ -13,6 +13,15 @@ namespace StgSharp.Math
public unsafe class Matrix4x4
{
public static readonly Matrix4x4 Unit
= new Matrix4x4(
1,0,0,0,
0,1,0,0,
0,0,1,0,
0,0,0,1
);
internal M128Map map;
internal IntPtr _row0Ptr;
@@ -27,11 +36,10 @@ namespace StgSharp.Math
internal Matrix4x4()
{
_row0Ptr = internalIO.InternalInitM128(0, 0, 0, 0);
_row1Ptr = internalIO.InternalInitM128(0, 0, 0, 0);
_row2Ptr = internalIO.InternalInitM128(0, 0, 0, 0);
_row3Ptr = internalIO.InternalInitM128(0, 0, 0, 0);
_row0Ptr = internalIO.load_internal(0,0,0,0);
_row1Ptr = internalIO.load_internal(0,0,0,0);
_row2Ptr = internalIO.load_internal(0,0,0,0);
_row3Ptr = internalIO.load_internal(0,0,0,0);
_transpose = new Matrix4x4(this);
}
@@ -39,27 +47,26 @@ namespace StgSharp.Math
//Ctor used for the matixes of transposed matrix
internal Matrix4x4(Matrix4x4 transpose)
{
_row0Ptr = internalIO.InternalInitM128(0, 0, 0, 0);
_row1Ptr = internalIO.InternalInitM128(0, 0, 0, 0);
_row2Ptr = internalIO.InternalInitM128(0, 0, 0, 0);
_row3Ptr = internalIO.InternalInitM128(0, 0, 0, 0);
_row0Ptr = internalIO.load_internal(0, 0, 0, 0);
_row1Ptr = internalIO.load_internal(0, 0, 0, 0);
_row2Ptr = internalIO.load_internal(0, 0, 0, 0);
_row3Ptr = internalIO.load_internal(0, 0, 0, 0);
_transpose = transpose;
this.isTransposed=true;
}
internal unsafe Matrix4x4(M128 row0, M128 row1, M128 row2, M128 row3)
internal unsafe Matrix4x4(
IntPtr row0Ptr,
IntPtr row1Ptr,
IntPtr row2Ptr,
IntPtr row3Ptr)
{
_row0Ptr = internalIO.InternalInitM128(
row0.single_0, row0.single_1, row0.single_2, row0.single_3);
_row1Ptr = internalIO.InternalInitM128(
row1.single_0, row1.single_1, row1.single_2, row1.single_3);
_row2Ptr = internalIO.InternalInitM128(
row2.single_0, row2.single_1, row2.single_2, row2.single_3);
_row3Ptr = internalIO.InternalInitM128(
row3.single_0, row3.single_1, row3.single_2, row3.single_3);
_row0Ptr = row0Ptr;
_row1Ptr = row1Ptr;
_row2Ptr = row2Ptr;
_row3Ptr = row3Ptr;
_transpose = new Matrix4x4(this);
}
@@ -72,10 +79,10 @@ namespace StgSharp.Math
)
{
_row0Ptr = internalIO.InternalInitM128(a00,a01,a02,a03);
_row1Ptr = internalIO.InternalInitM128(a10,a11,a12,a13);
_row2Ptr = internalIO.InternalInitM128(a20,a21,a22,a23);
_row3Ptr = internalIO.InternalInitM128(a30,a31,a32,a33);
_row0Ptr = internalIO.load_internal(a00,a01,a02,a03);
_row1Ptr = internalIO.load_internal(a10,a11,a12,a13);
_row2Ptr = internalIO.load_internal(a20,a21,a22,a23);
_row3Ptr = internalIO.load_internal(a30,a31,a32,a33);
_transpose = new Matrix4x4(this);
}
@@ -115,10 +122,10 @@ namespace StgSharp.Math
{
case TransposeMode.New:
return new Matrix4x4(
*(M128*)_transpose._row0Ptr,
*(M128*)_transpose._row1Ptr,
*(M128*)_transpose._row2Ptr,
*(M128*)_transpose._row3Ptr
_transpose._row0Ptr,
_transpose._row1Ptr,
_transpose._row2Ptr,
_transpose._row3Ptr
);
break;
case TransposeMode.Copy:
@@ -130,52 +137,39 @@ namespace StgSharp.Math
}
}
/*
/**/
public static Matrix4x4 operator +(Matrix4x4 matrix1, Matrix4x4 matrix2)
{
return new Matrix4x4(
internalIO.VecAddVec(matrix1._row0Ptr, matrix2._row0Ptr),
internalIO.VecAddVec(matrix1._row1Ptr, matrix2._row1Ptr),
internalIO.VecAddVec(matrix1._row2Ptr, matrix2._row2Ptr),
internalIO.VecAddVec(matrix1._row3Ptr, matrix2._row3Ptr)
internalIO.addps_internal(matrix1._row0Ptr, matrix2._row0Ptr),
internalIO.addps_internal(matrix1._row1Ptr, matrix2._row1Ptr),
internalIO.addps_internal(matrix1._row2Ptr, matrix2._row2Ptr),
internalIO.addps_internal(matrix1._row3Ptr, matrix2._row3Ptr)
) ;
}
public static Matrix4x4 operator *(Matrix4x4 matrix, float value)
public static Matrix4x4 operator -(Matrix4x4 matrix1, Matrix4x4 matrix2)
{
M128 newRow0 = new M128(
(*(M128*)matrix._row0Ptr).single_0 * value,
(*(M128*)matrix._row0Ptr).single_1 * value,
(*(M128*)matrix._row0Ptr).single_2 * value,
(*(M128*)matrix._row0Ptr).single_3 * value
);
M128 newRow1 = new M128(
(*(M128*)matrix._row1Ptr).single_0 * value,
(*(M128*)matrix._row1Ptr).single_1 * value,
(*(M128*)matrix._row1Ptr).single_2 * value,
(*(M128*)matrix._row1Ptr).single_3 * value
);
M128 newRow2 = new M128(
(*(M128*)matrix._row2Ptr).single_0 * value,
(*(M128*)matrix._row2Ptr).single_1 * value,
(*(M128*)matrix._row2Ptr).single_2 * value,
(*(M128*)matrix._row2Ptr).single_3 * value
);
M128 newRow3 = new M128(
(*(M128*)matrix._row3Ptr).single_0 * value,
(*(M128*)matrix._row3Ptr).single_1 * value,
(*(M128*)matrix._row3Ptr).single_2 * value,
(*(M128*)matrix._row3Ptr).single_3 * value
);
return new Matrix4x4(
newRow0, newRow1, newRow2, newRow3
internalIO.subps_internal(matrix1._row0Ptr, matrix2._row0Ptr),
internalIO.subps_internal(matrix1._row1Ptr, matrix2._row1Ptr),
internalIO.subps_internal(matrix1._row2Ptr, matrix2._row2Ptr),
internalIO.subps_internal(matrix1._row3Ptr, matrix2._row3Ptr)
);
}
/**/
public static Matrix4x4 operator *(Matrix4x4 matrix, float value)
{
return new Matrix4x4(
internalIO.mulps_const_internal(matrix._row0Ptr,value),
internalIO.mulps_const_internal(matrix._row1Ptr,value),
internalIO.mulps_const_internal(matrix._row2Ptr,value),
internalIO.mulps_const_internal(matrix._row3Ptr,value)
);
}
public override string ToString()
{
return $"{*(M128*)_row0Ptr}\n{*(M128*)_row1Ptr}\n{*(M128*)_row2Ptr}\n{*(M128*)_row3Ptr}";
@@ -187,10 +181,10 @@ namespace StgSharp.Math
{
if (map==null)
{
Marshal.FreeHGlobal((IntPtr)_row0Ptr);
Marshal.FreeHGlobal((IntPtr)_row1Ptr);
Marshal.FreeHGlobal((IntPtr)_row2Ptr);
Marshal.FreeHGlobal((IntPtr)_row3Ptr);
internalIO.deinitM128_internal(_row0Ptr);
internalIO.deinitM128_internal(_row1Ptr);
internalIO.deinitM128_internal(_row2Ptr);
internalIO.deinitM128_internal(_row3Ptr);
}
else
{
+125 -22
View File
@@ -1,10 +1,13 @@
using System;
using StgSharp.Control;
using System;
using System.Runtime.InteropServices;
namespace StgSharp.Math
{
/*
[StructLayout(LayoutKind.Explicit, Size = 12, Pack = 16)]
public struct vec3d : IEquatable<vec3d>
public struct Vec3d : IEquatable<Vec3d>
{
[FieldOffset(0)]
public float X;
@@ -13,14 +16,14 @@ namespace StgSharp.Math
[FieldOffset(8)]
public float Z;
public vec3d(float x, float y, float z)
public Vec3d(float x, float y, float z)
{
X = x;
Y = y;
Z = z;
}
bool IEquatable<vec3d>.Equals(vec3d other)
bool IEquatable<Vec3d>.Equals(Vec3d other)
{
if (this.GetHashCode() != other.GetHashCode())
{
@@ -40,13 +43,13 @@ namespace StgSharp.Math
{
return false;
}
else if (obj.GetType() != typeof(vec3d))
else if (obj.GetType() != typeof(Vec3d))
{
return false;
}
else
{
return this.Equals((vec3d)obj);
return this.Equals((Vec3d)obj);
}
}
@@ -65,39 +68,39 @@ namespace StgSharp.Math
return $"{X.ToString(sample)}\t{Y.ToString(sample)}\t{Z.ToString(sample)}";
}
public static bool operator ==(vec3d vec1, vec3d vec2)
public static bool operator ==(Vec3d vec1, Vec3d vec2)
{
return vec1.X == vec2.X
&& vec1.Y == vec2.Y
&& vec1.Z == vec2.Z;
}
public static bool operator !=(vec3d vec1, vec3d vec2)
public static bool operator !=(Vec3d vec1, Vec3d vec2)
{
return !(vec1.X == vec2.X
&& vec1.Y == vec2.Y
&& vec1.Z == vec2.Z);
}
public static vec3d operator +(vec3d vec1, vec3d vec2)
public static Vec3d operator +(Vec3d vec1, Vec3d vec2)
{
return new vec3d(
return new Vec3d(
vec1.X + vec2.X,
vec1.Y + vec2.Y,
vec1.Z + vec2.Z
);
}
public static vec3d operator -(vec3d vec1, vec3d vec2)
public static Vec3d operator -(Vec3d vec1, Vec3d vec2)
{
return new vec3d(
return new Vec3d(
vec1.X - vec2.X,
vec1.Y - vec2.Y,
vec1.Z - vec2.Z
);
}
public static float operator *(vec3d vec1, vec3d vec2)
public static float operator *(Vec3d vec1, Vec3d vec2)
{
return
vec1.X * vec2.X
@@ -105,41 +108,141 @@ namespace StgSharp.Math
+ vec1.Z + vec2.Z;
}
public static vec3d operator *(vec3d vec, float x)
public static Vec3d operator *(Vec3d vec, float x)
{
return new vec3d(
return new Vec3d(
vec.X * x,
vec.Y * x,
vec.Z * x
);
}
public static vec3d operator *(float x, vec3d vec)
public static Vec3d operator *(float x, Vec3d vec)
{
return new vec3d(
return new Vec3d(
vec.X * x,
vec.Y * x,
vec.Z * x
);
}
public static vec3d operator /(vec3d vec, float x)
public static Vec3d operator /(Vec3d vec, float x)
{
return new vec3d(
return new Vec3d(
vec.X / x,
vec.Y / x,
vec.Z / x
);
}
public static implicit operator float[](vec3d vec)
public static implicit operator float[](Vec3d vec)
{
return new float[3] { vec.X, vec.Y, vec.Y };
}
public static implicit operator vec3d(float[] floatArray)
public static implicit operator Vec3d(float[] floatArray)
{
return new vec3d(floatArray[0], floatArray[1], floatArray[2]);
return new Vec3d(floatArray[0], floatArray[1], floatArray[2]);
}
}
/**/
public class Vec3d
{
public static Vec3d defaultValue =
new Vec3d(0, 0, 0);
internal M128Map _map;
internal IntPtr _m128Ptr;
public unsafe float X
{
get { return ((M128*)_m128Ptr)->single_0; }
set { ((M128*)_m128Ptr)->single_0 = value; }
}
public unsafe float Y
{
get { return ((M128*)_m128Ptr)->single_1; }
set { ((M128*)_m128Ptr)->single_1 = value; }
}
public unsafe float Z
{
get { return ((M128*)_m128Ptr)->single_2; }
set { ((M128*)_m128Ptr)->single_2 = value; }
}
internal Vec3d(IntPtr value)
{
if ((long)value == -1)
{
throw new Exception("Failed to creat M128 pointer");
}
else
{
_m128Ptr = value;
}
}
public Vec3d(float x, float y, float z)
{
_m128Ptr = internalIO.load_internal(x,y,z,0);
}
internal Vec3d()
{
_m128Ptr = defaultValue._m128Ptr;
}
public static Vec3d operator +(Vec3d vec1, Vec3d vec2)
{
return new Vec3d(
internalIO.addps_internal(vec1._m128Ptr, vec2._m128Ptr)
);
}
public static Vec3d operator -(Vec3d vec1, Vec3d vec2)
{
return new Vec3d(
internalIO.subps_internal(vec1._m128Ptr, vec2._m128Ptr)
);
}
public static Vec3d operator *(Vec3d vec, float value)
{
return new Vec3d(
internalIO.mulps_const_internal(vec._m128Ptr,value)
);
}
public unsafe override string ToString()
{
return (*(M128*)_m128Ptr).ToString();
}
~Vec3d()
{
if (_map == null)
{
if (_m128Ptr != defaultValue._m128Ptr)
{
internalIO.deinitM128_internal(this._m128Ptr);
}
else
{
_m128Ptr = IntPtr.Zero;
}
}
else
{
}
}
}
}
+46 -13
View File
@@ -9,8 +9,11 @@ namespace StgSharp.Math
public class Vec4d
{
internal readonly M128Map _map;
internal readonly IntPtr _m128Ptr;
internal static readonly Vec4d defaultValue
= new Vec4d( 0,0,0,0 );
internal M128Map _map;
internal IntPtr _m128Ptr;
public unsafe float X
@@ -39,34 +42,57 @@ namespace StgSharp.Math
public Vec4d(float x, float y, float z, float w)
{
IntPtr a = internalIO.InternalInitM128(x,y,z,w);
IntPtr a = internalIO.load_internal(x,y,z,w);
if ((ulong)a>=0)
{
this._m128Ptr = a;
}
}
internal Vec4d()
/// <summary>
/// internal constructor to recive a pointer of the M128 value
/// </summary>
/// <param name="value"></param>
internal Vec4d(IntPtr value)
{
_m128Ptr = internalIO.InternalInitM128(0,0,0,0);
if ((long)value == -1)
{
throw new Exception("Failed to init M128 pointer!");
}
else
{
_m128Ptr = value;
}
}
public static Vec4d operator +(Vec4d vec1,Vec4d vec2)
public Vec4d()
{
Vec4d result = new Vec4d();
internalIO.VecAddVec(vec1._m128Ptr, vec2._m128Ptr/**/,result._m128Ptr/**/);
return result;
_m128Ptr = defaultValue._m128Ptr;
}
public static unsafe Vec4d operator +(Vec4d vec1,Vec4d vec2)
{
return new Vec4d(
internalIO.addps_internal(vec1._m128Ptr,vec2._m128Ptr)
) ;
}
/**/
public static Vec4d operator -(Vec4d vec1, Vec4d vec2)
{
Vec4d result = new Vec4d();
internalIO.VecSubVec(vec1._m128Ptr,vec2._m128Ptr,result._m128Ptr);
return result;
return new Vec4d(
internalIO.subps_internal(vec1._m128Ptr,vec2._m128Ptr)
);
}
/**/
public static Vec4d operator *(Vec4d vec, float value)
{
return new Vec4d(
internalIO.mulps_const_internal(vec._m128Ptr,value)
);
}
public unsafe override string ToString()
{
@@ -77,7 +103,14 @@ namespace StgSharp.Math
{
if (_map == null)
{
internalIO.InternalDeinitM128(this._m128Ptr);
if (_m128Ptr != defaultValue._m128Ptr)
{
internalIO.deinitM128_internal(this._m128Ptr);
}
else
{
_m128Ptr = IntPtr.Zero;
}
}
else
{