daily update on 20230822 by nitload youmu

This commit is contained in:
Nitload
2023-08-22 23:01:20 +08:00
parent 969406c4e4
commit 8aac9fee87
111 changed files with 3205 additions and 11145 deletions
+74 -13
View File
@@ -11,10 +11,18 @@ namespace StgSharp
{
internal static partial class internalIO
{
[DllImport("StgSharpGraphic.dll", EntryPoint = "load",
#region load
[DllImport(dllName: "StgSharpGraphic.dll", EntryPoint = "load",
CallingConvention = CallingConvention.Cdecl)]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static extern IntPtr load_internal(float x,float y, float z, float w);
internal static extern ref M128 load_internal(float x,float y, float z, float w);
[DllImport(dllName: "StgSharpGraphic.dll", EntryPoint = "load",
CallingConvention = CallingConvention.Cdecl)]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static unsafe extern M128* loadptr_internal(float x, float y, float z, float w);
[DllImport("StgSharpGraphic.dll",EntryPoint = "load_matmap",
CallingConvention = CallingConvention.Cdecl)]
@@ -24,6 +32,11 @@ namespace StgSharp
CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr load_cpy_internal(IntPtr ptr);
#endregion
#region add sub
[DllImport("StgSharpGraphic.dll", EntryPoint = "addps",
CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr addps_internal(IntPtr ptr1, IntPtr ptr2);
@@ -32,18 +45,33 @@ namespace StgSharp
CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr subps_internal(IntPtr ptr1, IntPtr ptr2);
#endregion
#region mulps
[DllImport("StgSharpGraphic.dll", EntryPoint = "mulps",
CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr mulps_internal(IntPtr ptr1, IntPtr ptr2);
[DllImport("StgSharpGraphic.dll", EntryPoint = "mulps_const",
CallingConvention = CallingConvention.Cdecl)]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static extern IntPtr mulps_const_internal(IntPtr ptr, float value);
[DllImport("StgSharpGraphic.dll", EntryPoint = "mulps_sum",
CallingConvention = CallingConvention.Cdecl)]
internal static extern float mulps_sum_internal(IntPtr ptr1, IntPtr ptr2);
[DllImport("StgSharpGraphic.dll", EntryPoint = "mulps_sum",
CallingConvention = CallingConvention.Cdecl)]
internal static extern unsafe float mulps_sum_internal(M128* ptr1, M128* ptr2);
#endregion
#region div
[DllImport("StgSharpGraphic.dll", EntryPoint = "mulps",
CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr divps_internal(IntPtr ptr1, IntPtr ptr2);
@@ -52,14 +80,12 @@ namespace StgSharp
CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr divps_const_internal(IntPtr ptr, float value);
#endregion
[DllImport("StgSharpGraphic.dll", EntryPoint = "sqrtss_const",
CallingConvention = CallingConvention.Cdecl)]
internal static extern float sqrtss_const_internal(float a);
[DllImport("StgSharpGraphic.dll",EntryPoint = "test_addps_mat",
CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr addps_mat_internal_test(IntPtr ptr1, IntPtr ptr2);
@@ -67,21 +93,56 @@ namespace StgSharp
CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr set_m128ptr_default_internal();
[DllImport("StgSharpGraphic.dll", EntryPoint = "transpose_ssemat_2",
#region deinit m128
[DllImport(
"msvcrt.dll",
EntryPoint = "_aligned_free",
CallingConvention = CallingConvention.Cdecl)]
internal static extern ref M128matMap transpose_ssemat2_internal(ref M128matMap matMap);
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static extern unsafe void deinit_internal(M128* ptr);
[DllImport("StgSharpGraphic.dll",EntryPoint = "transpose_ssemat_3",
[DllImport(
"msvcrt.dll",
EntryPoint = "_aligned_free",
CallingConvention = CallingConvention.Cdecl)]
internal static extern ref M128matMap transpose_ssemat3_internal(ref M128matMap matMap);
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static extern unsafe void deinit_internal(Mat2* ptr);
/*
[DllImport(
"msvcrt.dll",
EntryPoint = "_aligned_free",
CallingConvention = CallingConvention.Cdecl)]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static extern unsafe void deinit_internal(Mat3* ptr);
*/
[DllImport(
"msvcrt.dll",
EntryPoint = "_aligned_free",
CallingConvention = CallingConvention.Cdecl)]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static extern unsafe void deinit_internal(Mat4* ptr);
[DllImport("StgSharpGraphic.dll", EntryPoint = "deinitM128",
CallingConvention = CallingConvention.Cdecl)]
internal static extern void deinitM128_internal(IntPtr M128Ptr);
internal static extern void deinitM128_internal(ref M128 vec);
[DllImport("StgSharpGraphic.dll", EntryPoint = "deinitM128",
CallingConvention = CallingConvention.Cdecl)]
internal static extern unsafe void deinitM128_internal(M128* vec);
#endregion
[DllImport("StgSharpGraphic.dll", EntryPoint = "deinit_matmapPtr_sse",
CallingConvention = CallingConvention.Cdecl)]
internal static extern void deinitMatmapPtr_sse_internal(ref M128matMap mapPtr);
[DllImport("StgSharpGraphic.dll", EntryPoint = "deinit_matmap_sse",
CallingConvention = CallingConvention.Cdecl)]
+2 -17
View File
@@ -6,20 +6,11 @@ using System.Text;
namespace StgSharp.Math
{
[StructLayout(LayoutKind.Explicit)]
internal struct MatSize
{
[FieldOffset(0)]
internal ushort sizePair;
[FieldOffset(0)]
internal byte width;
[FieldOffset(1)]
internal byte height;
}
public static unsafe partial class SSE
{
public static int M128Size = 16;
internal static IntPtr defaultM128Ptr =
internalIO.set_m128ptr_default_internal();
@@ -43,11 +34,5 @@ namespace StgSharp.Math
{
}
public static Vec4d addps(Vec4d vec1, Vec4d vec2)
{
return new Vec4d(
internalIO.addps_internal(vec1._m128Ptr,vec2._m128Ptr)
) ;
}
}
}
@@ -3,7 +3,7 @@ using System.Runtime.InteropServices;
namespace StgSharp.Math
{
public static unsafe partial class VectorCalc
public static partial class VectorCalc
{
/*
@@ -527,30 +527,34 @@ namespace StgSharp.Math
);
}
/*
public static Matrix4x4 Multiple( Matrix4x4 matrix1, Matrix4x4 matrix2)
{
Matrix4x4 transpose = matrix1.Transpose(TransposeMode.Copy);
matrix1.InternalTranspose();
return new Matrix4x4(
internalIO.mulps_sum_internal(matrix2._colum0Ptr, transpose._colum0Ptr),
internalIO.mulps_sum_internal(matrix2._colum0Ptr, transpose._colum1Ptr),
internalIO.mulps_sum_internal(matrix2._colum0Ptr, transpose._colum2Ptr),
internalIO.mulps_sum_internal(matrix2._colum0Ptr, transpose._colum3Ptr),
internalIO.mulps_sum_internal(matrix1._transpose.colum0Ptr,matrix2._matMap.colum0Ptr),
internalIO.mulps_sum_internal(matrix1._transpose.colum0Ptr,matrix2._matMap.colum1Ptr),
internalIO.mulps_sum_internal(matrix1._transpose.colum0Ptr,matrix2._matMap.colum2Ptr),
internalIO.mulps_sum_internal(matrix1._transpose.colum0Ptr,matrix2._matMap.colum3Ptr),
internalIO.mulps_sum_internal(matrix2._colum1Ptr, transpose._colum0Ptr),
internalIO.mulps_sum_internal(matrix2._colum1Ptr, transpose._colum1Ptr),
internalIO.mulps_sum_internal(matrix2._colum1Ptr, transpose._colum2Ptr),
internalIO.mulps_sum_internal(matrix2._colum1Ptr, transpose._colum3Ptr),
internalIO.mulps_sum_internal(matrix1._transpose.colum1Ptr,matrix2._matMap.colum0Ptr),
internalIO.mulps_sum_internal(matrix1._transpose.colum1Ptr,matrix2._matMap.colum1Ptr),
internalIO.mulps_sum_internal(matrix1._transpose.colum1Ptr,matrix2._matMap.colum2Ptr),
internalIO.mulps_sum_internal(matrix1._transpose.colum1Ptr,matrix2._matMap.colum3Ptr),
internalIO.mulps_sum_internal(matrix2._colum2Ptr, transpose._colum0Ptr),
internalIO.mulps_sum_internal(matrix2._colum2Ptr, transpose._colum1Ptr),
internalIO.mulps_sum_internal(matrix2._colum2Ptr, transpose._colum2Ptr),
internalIO.mulps_sum_internal(matrix2._colum2Ptr, transpose._colum3Ptr),
internalIO.mulps_sum_internal(matrix1._transpose.colum2Ptr,matrix2._matMap.colum0Ptr),
internalIO.mulps_sum_internal(matrix1._transpose.colum2Ptr,matrix2._matMap.colum1Ptr),
internalIO.mulps_sum_internal(matrix1._transpose.colum2Ptr,matrix2._matMap.colum2Ptr),
internalIO.mulps_sum_internal(matrix1._transpose.colum2Ptr,matrix2._matMap.colum3Ptr),
internalIO.mulps_sum_internal(matrix2._colum3Ptr, transpose._colum0Ptr),
internalIO.mulps_sum_internal(matrix2._colum3Ptr, transpose._colum1Ptr),
internalIO.mulps_sum_internal(matrix2._colum3Ptr, transpose._colum2Ptr),
internalIO.mulps_sum_internal(matrix2._colum3Ptr, transpose._colum3Ptr)
internalIO.mulps_sum_internal(matrix1._transpose.colum3Ptr,matrix2._matMap.colum0Ptr),
internalIO.mulps_sum_internal(matrix1._transpose.colum3Ptr,matrix2._matMap.colum1Ptr),
internalIO.mulps_sum_internal(matrix1._transpose.colum3Ptr,matrix2._matMap.colum2Ptr),
internalIO.mulps_sum_internal(matrix1._transpose.colum3Ptr,matrix2._matMap.colum3Ptr)
);
}
-84
View File
@@ -1,84 +0,0 @@
using System;
using System.Runtime.InteropServices;
namespace StgSharp.Math
{
[StructLayout(LayoutKind.Explicit)]
public struct colum2 : IEquatable<colum2>
{
[FieldOffset(0)]
public float X;
[FieldOffset(4)]
public float Y;
public colum2(float x, float y)
{
X = x;
Y = y;
}
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
else if (obj.GetType() != typeof(colum2))
{
return false;
}
else
{
return this.Equals((colum2)obj);
}
}
bool IEquatable<colum2>.Equals(colum2 other)
{
if (this.GetHashCode() != other.GetHashCode())
{
return false;
}
else
{
return X == other.X && Y == other.Y;
}
}
public override int GetHashCode()
{
return HashCode.Combine(X, Y);
}
public override string ToString()
{
return $"{X}\n{Y}";
}
public static colum2 operator +(colum2 c1, colum2 c2)
{
return new colum2(
c1.X + c2.X,
c1.Y + c2.Y
);
}
public static colum2 operator -(colum2 c1, colum2 c2)
{
return new colum2(
c1.X - c2.X,
c1.Y - c2.Y
);
}
public static colum2 operator *(colum2 colum, float x)
{
return new colum2(colum.X * x, colum.Y * x);
}
public static colum2 operator /(colum2 colum, float x)
{
return new colum2(colum.X / x, colum.Y / x);
}
}
}
-121
View File
@@ -1,121 +0,0 @@
using System;
using System.Runtime.InteropServices;
namespace StgSharp.Math
{
[StructLayout(LayoutKind.Explicit)]
public struct colum3 : IEquatable<colum3>
{
[FieldOffset(0)]
public float X;
[FieldOffset(4)]
public float Y;
[FieldOffset(8)]
public float Z;
public colum3(float x, float y, float z)
{
X = x;
Y = y;
Z = z;
}
bool IEquatable<colum3>.Equals(colum3 other)
{
if (this.GetHashCode() != other.GetHashCode())
{
return false;
}
else
{
return this.X == other.X
&& this.Y == other.Y
&& this.Z == other.Z;
}
}
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
else if (obj.GetType() != typeof(colum3))
{
return false;
}
else
{
return this.Equals((colum3)obj);
}
}
public override int GetHashCode()
{
return HashCode.Combine(X, Y, Z);
}
public override string ToString()
{
return $"{X}\t{Y}\t{Z}";
}
public static bool operator ==(colum3 vec1, colum3 vec2)
{
return vec1.X == vec2.X
&& vec1.Y == vec2.Y
&& vec1.Z == vec2.Z;
}
public static bool operator !=(colum3 vec1, colum3 vec2)
{
return !(vec1.X == vec2.X
&& vec1.Y == vec2.Y
&& vec1.Z == vec2.Z);
}
public static colum3 operator +(colum3 vec1, colum3 vec2)
{
return new colum3(
vec1.X + vec2.X,
vec1.Y + vec2.Y,
vec1.Z + vec2.Z
);
}
public static colum3 operator -(colum3 vec1, colum3 vec2)
{
return new colum3(
vec1.X - vec2.X,
vec1.Y - vec2.Y,
vec1.Z - vec2.Z
);
}
public static float operator *(colum3 vec1, colum3 vec2)
{
return
vec1.X * vec2.X
+ vec1.Y + vec2.Y
+ vec1.Z + vec2.Z;
}
public static colum3 operator *(colum3 vec, float x)
{
return new colum3(
vec.X * x,
vec.Y * x,
vec.Z * x
);
}
public static colum3 operator /(colum3 vec, float x)
{
return new colum3(
vec.X / x,
vec.Y / x,
vec.Z / x
);
}
}
}
-46
View File
@@ -1,46 +0,0 @@
using System;
using System.Runtime.InteropServices;
namespace StgSharp.Math
{
[StructLayout(LayoutKind.Explicit)]
public struct colum4 : IEquatable<colum4>
{
[FieldOffset(0)]
public float X;
[FieldOffset(4)]
public float Y;
[FieldOffset(8)]
public float Z;
[FieldOffset(12)]
public float W;
public colum4(float x, float y, float z, float w)
{
X = x;
Y = y;
Z = z;
W = w;
}
public bool Equals(colum4 other)
{
throw new NotImplementedException();
}
public override bool Equals(object obj)
{
return base.Equals(obj);
}
public override int GetHashCode()
{
return base.GetHashCode();
}
public override string ToString()
{
return base.ToString();
}
}
}
+73
View File
@@ -0,0 +1,73 @@
using StgSharp.Math;
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
namespace StgSharp
{
internal static unsafe partial class internalIO
{
#region add
[DllImport("StgsharpGraphic", EntryPoint = "add_Mat2",
CallingConvention = CallingConvention.Cdecl)]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static extern Mat2* add_mat2(Mat2* left, Mat2* right);
#endregion
#region sub
[DllImport("StgsharpGraphic", EntryPoint = "sub_mat2",
CallingConvention = CallingConvention.Cdecl)]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static extern unsafe Mat2* sub_mat2(Mat2* left, Mat2* right);
#endregion
#region transpose
[DllImport("StgsharpGraphic", EntryPoint = "transmpose2to4",
CallingConvention = CallingConvention.Cdecl)]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static extern unsafe void Transpose2to4_internal(Mat2* source, Mat4* target);
#endregion
#region deinit mat2
[DllImport("StgsharpGraphic", EntryPoint = "deinit_mat2",
CallingConvention = CallingConvention.Cdecl)]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static extern unsafe void deinit_mat2(Mat2* mat);
#endregion
}
}
namespace StgSharp.Math
{
[StructLayout(LayoutKind.Explicit, Size = 12 * sizeof(float), Pack = 16)]
internal struct Mat2
{
[FieldOffset(0)] internal M128 colum0;
[FieldOffset(4 * sizeof(float))] internal M128 colum1;
[FieldOffset(0 * sizeof(float))] internal float m00;
[FieldOffset(1 * sizeof(float))] internal float m10;
[FieldOffset(2 * sizeof(float))] internal float m20;
[FieldOffset(3 * sizeof(float))] internal float m30;
[FieldOffset(4 * sizeof(float))] internal float m01;
[FieldOffset(5 * sizeof(float))] internal float m11;
[FieldOffset(6 * sizeof(float))] internal float m21;
[FieldOffset(7 * sizeof(float))] internal float m31;
}
}
+33
View File
@@ -0,0 +1,33 @@
using StgSharp.Math;
using System;
using System.Runtime.InteropServices;
namespace StgSharp.Math
{
[StructLayout(LayoutKind.Explicit, Size = 12*sizeof(float),Pack = 16)]
internal struct mat3
{
[FieldOffset(0)] internal M128 colum0;
[FieldOffset(4 * sizeof(float))] internal M128 colum1;
[FieldOffset(8 * sizeof(float))] internal M128 colum2;
[FieldOffset(0 * sizeof(float))] internal float m00;
[FieldOffset(1 * sizeof(float))] internal float m10;
[FieldOffset(2 * sizeof(float))] internal float m20;
[FieldOffset(3 * sizeof(float))] internal float m30;
[FieldOffset(4 * sizeof(float))] internal float m01;
[FieldOffset(5 * sizeof(float))] internal float m11;
[FieldOffset(6 * sizeof(float))] internal float m21;
[FieldOffset(7 * sizeof(float))] internal float m31;
[FieldOffset(8 * sizeof(float))] internal float m02;
[FieldOffset(9 * sizeof(float))] internal float m12;
[FieldOffset(10 * sizeof(float))] internal float m22;
[FieldOffset(11 * sizeof(float))] internal float m32;
}
}
+142
View File
@@ -0,0 +1,142 @@
using StgSharp;
using StgSharp.Math;
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
namespace StgSharp
{
internal static unsafe partial class internalIO
{
#region add_mat4
#if NET7_0_OR_GREATER
#else
[DllImport("StgSharpGraphic.dll", EntryPoint = "addmat4",
#endif
CallingConvention = CallingConvention.Cdecl)]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static extern unsafe StgSharp.Math.Mat4* add_mat4(
ref StgSharp.Math.Mat4 mat1, ref StgSharp.Math.Mat4 Mat2);
[DllImport("StgSharpGraphic.dll", EntryPoint = "addmat4",
CallingConvention = CallingConvention.Cdecl)]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static extern unsafe StgSharp.Math.Mat4* add_mat4(
StgSharp.Math.Mat4* mat1, StgSharp.Math.Mat4* Mat2);
#endregion
#region sub_mat4
[DllImport("StgSharpGraphic.dll", EntryPoint = "sub_mat4",
CallingConvention = CallingConvention.Cdecl)]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static unsafe extern StgSharp.Math.Mat4* sub_mat4(
ref StgSharp.Math.Mat4 mat1, ref StgSharp.Math.Mat4 Mat2);
[DllImport("StgSharpGraphic.dll", EntryPoint = "StgSharp.Math.Mat4",
CallingConvention = CallingConvention.Cdecl)]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static unsafe extern StgSharp.Math.Mat4* sub_mat4(
StgSharp.Math.Mat4* mat1, StgSharp.Math.Mat4* Mat2);
#endregion
#region mul
[DllImport("StgSharpGraphic.dll", EntryPoint = "mul_const",
CallingConvention = CallingConvention.Cdecl)]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static unsafe extern StgSharp.Math.Mat4* mul_const(
StgSharp.Math.Mat4* mat, float value);
[DllImport("StgSharpGraphic.dll", EntryPoint = "mul_const",
CallingConvention = CallingConvention.Cdecl)]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static unsafe extern StgSharp.Math.Mat4* mul_const(
ref StgSharp.Math.Mat4 mat, float value);
[DllImport("StgsharpGraphic", EntryPoint = "mul_4_4",
CallingConvention = CallingConvention.Cdecl)]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static extern unsafe Mat4* mul_4_4(Mat4* left, Mat4* right);
#endregion
#region transpose
[DllImport("StgsharpGraphic.dll", EntryPoint = "transpose4to4",
CallingConvention = CallingConvention.Cdecl)]
internal static extern unsafe void Transpose4to4_internal(Mat4* source, Mat4* target);
[DllImport("StgsharpGraphic.dll", EntryPoint = "transpose4to4",
CallingConvention = CallingConvention.Cdecl)]
internal static extern unsafe void Transpose4to4_internal(ref Mat4* source, ref Mat4* target);
#endregion
#region det
[DllImport("StgsharpGraphic", EntryPoint = "det_mat4",
CallingConvention = CallingConvention.Cdecl)]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static unsafe extern float det_mat4(Matrix4x4* matPtr);
#endregion
#region deinit_mat4
[DllImport("StgSharpGraphic.dll", EntryPoint = "deinit_mat4",
CallingConvention = CallingConvention.Cdecl)]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static extern void deinit_mat4(ref StgSharp.Math.Mat4 mat);
[DllImport("StgSharpGraphic.dll", EntryPoint = "deinit_mat4",
CallingConvention = CallingConvention.Cdecl)]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static extern void deinit_mat4(StgSharp.Math.Mat4* mat);
#endregion
}
}
namespace StgSharp.Math
{
[StructLayout(LayoutKind.Explicit, Size = 16 * sizeof(float))]
public struct Mat4
{
[FieldOffset(0)] internal M128 colum0;
[FieldOffset(16)] internal M128 colum1;
[FieldOffset(32)] internal M128 colum2;
[FieldOffset(48)] internal M128 colum3;
[FieldOffset(0)] public float a00;
[FieldOffset(4)] public float a10;
[FieldOffset(8)] public float a20;
[FieldOffset(12)] public float a30;
[FieldOffset(16)] public float a01;
[FieldOffset(20)] public float a11;
[FieldOffset(24)] public float a21;
[FieldOffset(28)] public float a31;
[FieldOffset(32)] public float a02;
[FieldOffset(36)] public float a12;
[FieldOffset(40)] public float a22;
[FieldOffset(44)] public float a32;
[FieldOffset(48)] public float a03;
[FieldOffset(52)] public float a13;
[FieldOffset(56)] public float a23;
[FieldOffset(60)] public float a33;
}
}
@@ -3,6 +3,7 @@ using System.Runtime.InteropServices;
namespace StgSharp.Math
{
/*
public class Matrix2x2
{
public static Matrix2x2 Unit
@@ -115,4 +116,7 @@ namespace StgSharp.Math
}
}
/**/
}
@@ -3,6 +3,8 @@ using System.Runtime.InteropServices;
namespace StgSharp.Math
{
/*
public class Matrix2x3
{
internal M128Map _map;
@@ -126,4 +128,6 @@ namespace StgSharp.Math
}
}
}
/**/
}
+1 -117
View File
@@ -4,124 +4,8 @@ using System.Runtime.InteropServices;
namespace StgSharp.Math
{
public class Matrix2x4
public struct Matrix2x4
{
internal M128Map _map;
internal IntPtr _colum0Ptr;
internal IntPtr _colum1Ptr;
internal IntPtr _colum2Ptr;
internal IntPtr _colum3Ptr;
private bool _isTranposed;
private Matrix4x2 _transpose;
public Matrix2x4(
float a00, float a01, float a02, float a03,
float a10, float a11, float a12, float a13
)
{
_colum0Ptr = internalIO.load_internal(a00, a10, 0, 0);
_colum1Ptr = internalIO.load_internal(a01, a11, 0, 0);
_colum2Ptr = internalIO.load_internal(a02, a12, 0, 0);
_colum3Ptr = internalIO.load_internal(a03, a13, 0, 0);
_transpose = new Matrix4x2(this);
}
internal Matrix2x4(
IntPtr colum0Ptr,
IntPtr colum1Ptr,
IntPtr colum2Ptr,
IntPtr colum3Ptr
)
{
_colum0Ptr = colum0Ptr;
_colum1Ptr = colum1Ptr;
_colum2Ptr = colum2Ptr;
_colum3Ptr = colum3Ptr;
_transpose = new Matrix4x2(this);
}
public unsafe Matrix4x2 Transpose(TransposeMode transposeMode)
{
if (_isTranposed)
{
(*(M128*)_transpose._colum0Ptr).single_0 = (*(M128*)_colum0Ptr).single_0;
(*(M128*)_transpose._colum0Ptr).single_1 = (*(M128*)_colum1Ptr).single_0;
(*(M128*)_transpose._colum0Ptr).single_2 = (*(M128*)_colum2Ptr).single_0;
(*(M128*)_transpose._colum0Ptr).single_3 = (*(M128*)_colum3Ptr).single_0;
(*(M128*)_transpose._colum1Ptr).single_0 = (*(M128*)_colum0Ptr).single_1;
(*(M128*)_transpose._colum1Ptr).single_1 = (*(M128*)_colum1Ptr).single_1;
(*(M128*)_transpose._colum1Ptr).single_2 = (*(M128*)_colum2Ptr).single_1;
(*(M128*)_transpose._colum1Ptr).single_3 = (*(M128*)_colum3Ptr).single_1;
_isTranposed = true;
}
switch (transposeMode)
{
case TransposeMode.New:
return new Matrix4x2(
internalIO.load_cpy_internal(_transpose._colum0Ptr),
internalIO.load_cpy_internal(_transpose._colum1Ptr)
);
break;
case TransposeMode.Copy:
return _transpose;
break;
default:
throw new Exception();
break;
}
}
public static Matrix2x4 operator +(Matrix2x4 matrix1,Matrix2x4 matrix2)
{
return new Matrix2x4(
internalIO.addps_internal(matrix1._colum0Ptr, matrix2._colum0Ptr),
internalIO.addps_internal(matrix1._colum1Ptr, matrix2._colum1Ptr),
internalIO.addps_internal(matrix1._colum2Ptr, matrix2._colum2Ptr),
internalIO.addps_internal(matrix1._colum3Ptr, matrix2._colum3Ptr)
);
}
public static Matrix2x4 operator -(Matrix2x4 matrix1, Matrix2x4 matrix2)
{
return new Matrix2x4(
internalIO.subps_internal(matrix1._colum0Ptr, matrix2._colum0Ptr),
internalIO.subps_internal(matrix1._colum1Ptr, matrix2._colum1Ptr),
internalIO.subps_internal(matrix1._colum2Ptr, matrix2._colum2Ptr),
internalIO.subps_internal(matrix1._colum3Ptr, matrix2._colum3Ptr)
);
}
public static Matrix2x4 operator *(Matrix2x4 matrix, float value)
{
return new Matrix2x4(
internalIO.mulps_const_internal(matrix._colum0Ptr,value),
internalIO.mulps_const_internal(matrix._colum1Ptr,value),
internalIO.mulps_const_internal(matrix._colum2Ptr,value),
internalIO.mulps_const_internal(matrix._colum3Ptr,value)
);
}
public static Matrix2x4 operator /(Matrix2x4 matrix, float value)
{
return new Matrix2x4(
internalIO.divps_const_internal(matrix._colum0Ptr, value),
internalIO.divps_const_internal(matrix._colum1Ptr, value),
internalIO.divps_const_internal(matrix._colum2Ptr, value),
internalIO.divps_const_internal(matrix._colum3Ptr, value)
);
}
internal Matrix2x4(
Matrix4x2 transpose)
{
_transpose = transpose;
}
}
@@ -3,86 +3,5 @@ using System.Runtime.InteropServices;
namespace StgSharp.Math
{
public class Matrix3x2
{
internal M128Map _map;
internal IntPtr _colum0Ptr;
internal IntPtr _colum1Ptr;
private bool _isTransposed;
private Matrix2x3 _transpose;
public Matrix3x2(
float a00,float a01,
float a10,float a11,
float a20,float a21
)
{
_colum0Ptr = internalIO.load_internal(a00,a10,a20,0);
_colum0Ptr = internalIO.load_internal(a01,a11,a21,0);
_transpose = new Matrix2x3(this);
}
internal Matrix3x2(
IntPtr colum0Ptr,
IntPtr colum1Ptr
)
{
_colum0Ptr = colum0Ptr;
_colum1Ptr = colum1Ptr;
_transpose = new Matrix2x3(this);
}
internal Matrix3x2(Matrix2x3 transpose)
{
_transpose = transpose;
}
public unsafe Matrix2x3 Transpose(TransposeMode transposeMode)
{
if (_isTransposed)
{
(*(M128*)_transpose._colum0Ptr).single_0 = (*(M128*)_colum0Ptr).single_0;
(*(M128*)_transpose._colum1Ptr).single_0 = (*(M128*)_colum0Ptr).single_1;
(*(M128*)_transpose._colum2Ptr).single_0 = (*(M128*)_colum0Ptr).single_2;
(*(M128*)_transpose._colum0Ptr).single_1 = (*(M128*)_colum1Ptr).single_0;
(*(M128*)_transpose._colum1Ptr).single_1 = (*(M128*)_colum1Ptr).single_1;
(*(M128*)_transpose._colum2Ptr).single_1 = (*(M128*)_colum1Ptr).single_2;
_isTransposed = true;
}
switch (transposeMode)
{
case TransposeMode.New:
return new Matrix2x3(
_transpose._colum0Ptr,
_transpose._colum0Ptr,
_transpose._colum0Ptr
);
break;
case TransposeMode.Copy:
return _transpose;
break;
default:
throw new Exception();
break;
}
}
~Matrix3x2()
{
if (_map==null)
{
internalIO.deinitM128_internal(_colum0Ptr);
internalIO.deinitM128_internal(_colum1Ptr);
}
}
}
}
-132
View File
@@ -5,138 +5,6 @@ namespace StgSharp.Math
{
public class Matrix3x3
{
public static Matrix3x3 Unit
= new Matrix3x3(
1,0,0,
0,1,0,
0,0,1
);
internal M128Map map;
internal IntPtr _colum0Ptr;
internal IntPtr _colum1Ptr;
internal IntPtr _colum2Ptr;
private bool _isDisposed;
private Matrix3x3 _transpose;
public Matrix3x3(
float a00, float a01, float a02,
float a10, float a11, float a12,
float a20, float a21, float a22
)
{
_colum0Ptr = internalIO.load_internal(a00,a10,a20,0);
_colum1Ptr = internalIO.load_internal(a01,a11,a21,0);
_colum2Ptr = internalIO.load_internal(a02,a12,a22,0);
_transpose = new Matrix3x3(this);
}
internal Matrix3x3(Matrix3x3 transpose)
{
_transpose = transpose;
}
internal Matrix3x3(
IntPtr colum0Ptr,
IntPtr colum1Ptr,
IntPtr colum2Ptr
)
{
_colum0Ptr= colum0Ptr;
_colum1Ptr= colum1Ptr;
_colum2Ptr= colum2Ptr;
_transpose = new Matrix3x3(this);
}
public unsafe Matrix3x3 Transpose(TransposeMode transposeMode)
{
if (!_isDisposed)
{
(*(M128*)_transpose._colum0Ptr).single_0 = (*(M128*)_colum0Ptr).single_0;
(*(M128*)_transpose._colum0Ptr).single_1 = (*(M128*)_colum1Ptr).single_0;
(*(M128*)_transpose._colum0Ptr).single_2 = (*(M128*)_colum2Ptr).single_0;
(*(M128*)_transpose._colum1Ptr).single_0 = (*(M128*)_colum0Ptr).single_1;
(*(M128*)_transpose._colum1Ptr).single_1 = (*(M128*)_colum1Ptr).single_1;
(*(M128*)_transpose._colum1Ptr).single_2 = (*(M128*)_colum2Ptr).single_1;
(*(M128*)_transpose._colum2Ptr).single_0 = (*(M128*)_colum0Ptr).single_2;
(*(M128*)_transpose._colum2Ptr).single_1 = (*(M128*)_colum1Ptr).single_2;
(*(M128*)_transpose._colum2Ptr).single_2 = (*(M128*)_colum2Ptr).single_2;
_isDisposed = true;
}
switch (transposeMode)
{
case TransposeMode.New:
return new Matrix3x3(
internalIO.load_cpy_internal(_transpose._colum0Ptr),
internalIO.load_cpy_internal(_transpose._colum1Ptr),
internalIO.load_cpy_internal(_transpose._colum2Ptr)
);
break;
case TransposeMode.Copy:
return _transpose;
break;
default:
throw new Exception();
break;
}
}
public static Matrix3x3 operator +(Matrix3x3 matrix1, Matrix3x3 matrix2)
{
return new Matrix3x3(
internalIO.addps_internal(matrix1._colum0Ptr,matrix2._colum0Ptr),
internalIO.addps_internal(matrix1._colum1Ptr,matrix2._colum1Ptr),
internalIO.addps_internal(matrix1._colum2Ptr,matrix2._colum2Ptr)
);
}
public static Matrix3x3 operator -(Matrix3x3 matrix1, Matrix3x3 matrix2)
{
return new Matrix3x3(
internalIO.subps_internal(matrix1._colum0Ptr,matrix2._colum0Ptr),
internalIO.subps_internal(matrix1._colum1Ptr,matrix2._colum1Ptr),
internalIO.subps_internal(matrix1._colum2Ptr,matrix2._colum2Ptr)
);
}
public static Matrix3x3 operator *(Matrix3x3 matrix, float value)
{
return new Matrix3x3(
internalIO.mulps_const_internal(matrix._colum0Ptr,value),
internalIO.mulps_const_internal(matrix._colum1Ptr,value),
internalIO.mulps_const_internal(matrix._colum2Ptr,value)
);
}
public static Matrix3x3 operator /(Matrix3x3 matrix, float value)
{
return new Matrix3x3(
internalIO.divps_const_internal(matrix._colum0Ptr, value),
internalIO.divps_const_internal(matrix._colum1Ptr, value),
internalIO.divps_const_internal(matrix._colum2Ptr, value)
);
}
~Matrix3x3()
{
if (map==null)
{
internalIO.deinitM128_internal(_colum0Ptr);
internalIO.deinitM128_internal(_colum1Ptr);
internalIO.deinitM128_internal(_colum2Ptr);
}
}
}
}
-141
View File
@@ -1,151 +1,10 @@
using System;
using System.Reflection.Emit;
using System.Runtime.InteropServices;
namespace StgSharp.Math
{
public class Matrix3x4
{
internal M128Map map;
internal IntPtr _colum0Ptr;
internal IntPtr _colum1Ptr;
internal IntPtr _colum2Ptr;
internal IntPtr _colum3Ptr;
private bool _isTransposed;
private Matrix4x3 _transpose;
public Matrix3x4(
float a00, float a01, float a02, float a03,
float a10, float a11, float a12, float a13,
float a20, float a21, float a22, float a23
)
{
_colum0Ptr = internalIO.load_internal(a00,a10,a20,0);
_colum1Ptr = internalIO.load_internal(a01,a11,a21,0);
_colum2Ptr = internalIO.load_internal(a02,a12,a22,0);
_colum2Ptr = internalIO.load_internal(a03,a13,a23,0);
_transpose = new Matrix4x3(this);
}
internal Matrix3x4(
IntPtr colum0Ptr,
IntPtr colum1Ptr,
IntPtr colum2Ptr,
IntPtr colum3Ptr
)
{
_colum0Ptr = colum0Ptr;
_colum1Ptr = colum1Ptr;
_colum2Ptr = colum2Ptr;
_colum3Ptr = colum3Ptr;
}
internal Matrix3x4()
{
_transpose = new Matrix4x3(this);
}
internal Matrix3x4(Matrix4x3 transpose)
{
_transpose = transpose;
}
public unsafe Matrix4x3 Transpose(TransposeMode transposeMode)
{
if (!_isTransposed)
{
(*(M128*)_transpose._colum0Ptr).single_0 = (*(M128*)_colum0Ptr).single_0;
(*(M128*)_transpose._colum0Ptr).single_1 = (*(M128*)_colum1Ptr).single_0;
(*(M128*)_transpose._colum0Ptr).single_2 = (*(M128*)_colum2Ptr).single_0;
(*(M128*)_transpose._colum0Ptr).single_2 = (*(M128*)_colum3Ptr).single_0;
(*(M128*)_transpose._colum1Ptr).single_0 = (*(M128*)_colum0Ptr).single_1;
(*(M128*)_transpose._colum1Ptr).single_1 = (*(M128*)_colum1Ptr).single_1;
(*(M128*)_transpose._colum1Ptr).single_2 = (*(M128*)_colum2Ptr).single_1;
(*(M128*)_transpose._colum1Ptr).single_2 = (*(M128*)_colum3Ptr).single_1;
(*(M128*)_transpose._colum2Ptr).single_0 = (*(M128*)_colum0Ptr).single_2;
(*(M128*)_transpose._colum2Ptr).single_1 = (*(M128*)_colum1Ptr).single_2;
(*(M128*)_transpose._colum2Ptr).single_2 = (*(M128*)_colum2Ptr).single_2;
(*(M128*)_transpose._colum2Ptr).single_2 = (*(M128*)_colum3Ptr).single_2;
}
switch (transposeMode)
{
case TransposeMode.New:
return new Matrix4x3(
internalIO.load_cpy_internal(_transpose._colum0Ptr),
internalIO.load_cpy_internal(_transpose._colum1Ptr),
internalIO.load_cpy_internal(_transpose._colum2Ptr)
) ;
break;
case TransposeMode.Copy:
return _transpose;
break;
default:
throw new Exception();
break;
}
}
public static Matrix3x4 operator +(Matrix3x4 matrix1, Matrix3x4 matrix2)
{
return new Matrix3x4(
internalIO.addps_internal(matrix1._colum0Ptr,matrix1._colum0Ptr),
internalIO.addps_internal(matrix1._colum1Ptr,matrix1._colum1Ptr),
internalIO.addps_internal(matrix1._colum2Ptr,matrix1._colum2Ptr),
internalIO.addps_internal(matrix1._colum2Ptr,matrix1._colum2Ptr)
);
}
public static Matrix3x4 operator -(Matrix4x3 matrix1, Matrix3x4 matrix2)
{
return new Matrix3x4(
internalIO.subps_internal(matrix1._colum0Ptr,matrix2._colum0Ptr),
internalIO.subps_internal(matrix1._colum1Ptr,matrix2._colum1Ptr),
internalIO.subps_internal(matrix1._colum2Ptr,matrix2._colum2Ptr),
internalIO.subps_internal(matrix1._colum2Ptr,matrix2._colum2Ptr)
);
}
public static Matrix3x4 operator *(Matrix3x4 matrix, float value)
{
return new Matrix3x4(
internalIO.mulps_const_internal(matrix._colum0Ptr,value),
internalIO.mulps_const_internal(matrix._colum1Ptr,value),
internalIO.mulps_const_internal(matrix._colum2Ptr,value),
internalIO.mulps_const_internal(matrix._colum3Ptr,value)
);
}
public static Matrix3x4 operator /(Matrix3x4 matrix, float value)
{
return new Matrix3x4(
internalIO.divps_const_internal(matrix._colum0Ptr,value),
internalIO.divps_const_internal(matrix._colum1Ptr,value),
internalIO.divps_const_internal(matrix._colum2Ptr,value),
internalIO.divps_const_internal(matrix._colum3Ptr,value)
);
}
~Matrix3x4()
{
if (map == null)
{
internalIO.deinitM128_internal(_colum0Ptr);
internalIO.deinitM128_internal(_colum1Ptr);
internalIO.deinitM128_internal(_colum2Ptr);
}
else
{
}
}
}
+49 -99
View File
@@ -1,127 +1,77 @@
using System;
using System.Drawing;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using static StgSharp.Graphics.GLFWwndconfig;
namespace StgSharp.Math
{
public class Matrix4x2
[StructLayout(LayoutKind.Explicit,Size = (16 + 8) * sizeof(float) + sizeof(bool), Pack = 16)]
public struct Matrix4x2
{
internal M128Map _map;
[FieldOffset(0)] internal Mat2 mat;
[FieldOffset(8 * sizeof(float))] internal Mat4 transpose;
[FieldOffset((16 + 8) * sizeof(float))] internal bool isTranspose;
internal IntPtr _colum0Ptr;
internal IntPtr _colum1Ptr;
private bool _isTransposed;
private Matrix2x4 _transpose;
public Matrix4x2(
float a00, float a01,
float a10, float a11,
float a20, float a21,
float a30, float a31
unsafe public Matrix4x2(
float a00,float a01,
float a10,float a11,
float a20,float a21,
float a30,float a31
)
{
_colum0Ptr = internalIO.load_internal(a00,a10,a20,a30);
_colum0Ptr = internalIO.load_internal(a01,a11,a21,a31);
M128* c0ref = internalIO.loadptr_internal(a00, a10, a20, a30);
M128* c1ref = internalIO.loadptr_internal(a01, a11, a21, a31);
_transpose = new Matrix2x4(this);
mat.colum0 = *c0ref;
mat.colum1 = *c1ref;
/**/
internalIO.deinitM128_internal(c0ref);
internalIO.deinitM128_internal(c1ref);
}
public Matrix4x2(
IntPtr colum0Ptr,
IntPtr colum1Ptr
)
unsafe internal Matrix4x2(Mat2 mat)
{
_colum0Ptr = colum0Ptr;
_colum1Ptr = colum1Ptr;
_transpose = new Matrix2x4(this);
this.mat = mat;
}
public Matrix4x2(Matrix2x4 transpose)
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static unsafe Matrix4x2 operator +(Matrix4x2 left, Matrix4x2 right)
{
_transpose = transpose;
Mat2* p = internalIO.add_mat2(&left.mat, &right.mat);
Matrix4x2 ret = new Matrix4x2(*p);
internalIO.deinit_mat2(p);
return ret;
}
public unsafe Matrix2x4 Transpose(TransposeMode transposeMode )
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static unsafe Matrix4x2 operator -(Matrix4x2 left, Matrix4x2 right)
{
if (!_isTransposed)
Mat2* p = internalIO.sub_mat2(&left.mat, &right.mat);
Matrix4x2 ret = new Matrix4x2(*p);
internalIO.deinit_mat2(p);
return ret;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal unsafe void InternalTranspose()
{
if (!isTranspose)
{
(*(M128*)_transpose._colum0Ptr).single_0 = (*(M128*)_colum0Ptr).single_0;
(*(M128*)_transpose._colum1Ptr).single_0 = (*(M128*)_colum0Ptr).single_1;
(*(M128*)_transpose._colum2Ptr).single_0 = (*(M128*)_colum0Ptr).single_2;
(*(M128*)_transpose._colum3Ptr).single_0 = (*(M128*)_colum0Ptr).single_3;
fixed (Mat2* source = &this.mat)
fixed (Mat4* target = &this.transpose)
{
internalIO.Transpose2to4_internal(source, target);
}
(*(M128*)_transpose._colum0Ptr).single_1 = (*(M128*)_colum1Ptr).single_0;
(*(M128*)_transpose._colum1Ptr).single_1 = (*(M128*)_colum1Ptr).single_1;
(*(M128*)_transpose._colum2Ptr).single_1 = (*(M128*)_colum1Ptr).single_2;
(*(M128*)_transpose._colum3Ptr).single_1 = (*(M128*)_colum1Ptr).single_3;
_isTransposed = true;
}
switch (transposeMode)
{
case TransposeMode.New:
return new Matrix2x4(
internalIO.load_cpy_internal(_transpose._colum0Ptr),
internalIO.load_cpy_internal(_transpose._colum1Ptr),
internalIO.load_cpy_internal(_transpose._colum2Ptr),
internalIO.load_cpy_internal(_transpose._colum3Ptr)
);
break;
case TransposeMode.Copy:
return _transpose;
break;
default:
throw new Exception();
break;
}
}
public static Matrix4x2 operator +(Matrix4x2 matrix1, Matrix4x2 matrix2)
{
return new Matrix4x2(
internalIO.addps_internal(matrix1._colum0Ptr,matrix2._colum0Ptr),
internalIO.addps_internal(matrix1._colum1Ptr,matrix2._colum1Ptr)
);
}
public static Matrix4x2 operator -(Matrix4x2 matrix1, Matrix4x2 matrix2)
{
return new Matrix4x2(
internalIO.subps_internal(matrix1._colum0Ptr, matrix2._colum0Ptr),
internalIO.subps_internal(matrix1._colum1Ptr, matrix2._colum1Ptr)
);
}
public static Matrix4x2 operator *(Matrix4x2 matrix,float value)
{
return new Matrix4x2(
internalIO.mulps_const_internal(matrix._colum0Ptr,value),
internalIO.mulps_const_internal(matrix._colum1Ptr,value)
);
}
public static Matrix4x2 operator /(Matrix4x2 matrix, float value)
{
return new Matrix4x2(
internalIO.divps_const_internal(matrix._colum0Ptr,value),
internalIO.divps_const_internal(matrix._colum1Ptr,value)
);
}
~Matrix4x2()
{
if (_map == null)
{
internalIO.deinitM128_internal(_colum0Ptr);
internalIO.deinitM128_internal(_colum1Ptr);
isTranspose = true;
}
}
}
-132
View File
@@ -5,139 +5,7 @@ namespace StgSharp.Math
{
public class Matrix4x3
{
internal M128Map map;
internal IntPtr _colum0Ptr = IntPtr.Zero;
internal IntPtr _colum1Ptr;
internal IntPtr _colum2Ptr;
private bool _isTransposed;
private Matrix3x4 _transpose;
public Matrix4x3(
float a00, float a01, float a02,
float a10, float a11, float a12,
float a20, float a21, float a22,
float a30, float a31, float a32
)
{
_colum0Ptr = internalIO.load_internal(a00,a10,a20,a30);
_colum1Ptr = internalIO.load_internal(a01,a11,a21,a31);
_colum2Ptr = internalIO.load_internal(a02,a12,a22,a32);
_transpose = new Matrix3x4(this);
}
internal Matrix4x3(
IntPtr colum0Ptr,
IntPtr colum1Ptr,
IntPtr colum2Ptr
)
{
_colum0Ptr = colum0Ptr;
_colum1Ptr = colum1Ptr;
_colum2Ptr = colum2Ptr;
_transpose = new Matrix3x4(this);
}
internal Matrix4x3(Matrix3x4 transpose)
{
this._transpose = transpose;
}
public unsafe Matrix3x4 Transpose(TransposeMode transposeMode)
{
if (!_isTransposed)
{
(*(M128*)_transpose._colum0Ptr).single_0 = (*(M128*)_colum0Ptr).single_0;
(*(M128*)_transpose._colum0Ptr).single_1 = (*(M128*)_colum1Ptr).single_0;
(*(M128*)_transpose._colum0Ptr).single_2 = (*(M128*)_colum2Ptr).single_0;
(*(M128*)_transpose._colum1Ptr).single_0 = (*(M128*)_colum0Ptr).single_1;
(*(M128*)_transpose._colum1Ptr).single_1 = (*(M128*)_colum1Ptr).single_1;
(*(M128*)_transpose._colum1Ptr).single_2 = (*(M128*)_colum2Ptr).single_1;
(*(M128*)_transpose._colum2Ptr).single_0 = (*(M128*)_colum0Ptr).single_2;
(*(M128*)_transpose._colum2Ptr).single_1 = (*(M128*)_colum1Ptr).single_2;
(*(M128*)_transpose._colum2Ptr).single_2 = (*(M128*)_colum2Ptr).single_2;
(*(M128*)_transpose._colum3Ptr).single_0 = (*(M128*)_colum0Ptr).single_3;
(*(M128*)_transpose._colum3Ptr).single_1 = (*(M128*)_colum1Ptr).single_3;
(*(M128*)_transpose._colum3Ptr).single_2 = (*(M128*)_colum2Ptr).single_3;
_isTransposed = true;
}
switch (transposeMode)
{
case TransposeMode.New:
return new Matrix3x4(
_transpose._colum0Ptr,
_transpose._colum1Ptr,
_transpose._colum2Ptr,
_transpose._colum3Ptr
);
break;
case TransposeMode.Copy:
return _transpose;
break;
default:
throw new Exception();
break;
}
}
public static Matrix4x3 operator +(Matrix4x3 matrix1, Matrix4x3 matrix2)
{
return new Matrix4x3(
internalIO.addps_internal(matrix1._colum0Ptr, matrix2._colum0Ptr),
internalIO.addps_internal(matrix1._colum1Ptr, matrix2._colum1Ptr),
internalIO.addps_internal(matrix1._colum2Ptr, matrix2._colum2Ptr)
);
}
public static Matrix4x3 operator -(Matrix4x3 matrix1, Matrix4x3 matrix2)
{
return new Matrix4x3(
internalIO.subps_internal(matrix1._colum0Ptr, matrix2._colum0Ptr),
internalIO.subps_internal(matrix1._colum1Ptr, matrix2._colum1Ptr),
internalIO.subps_internal(matrix1._colum2Ptr, matrix2._colum2Ptr)
) ;
}
public static Matrix4x3 operator *(Matrix4x3 matrix, float value)
{
return new Matrix4x3(
internalIO.mulps_const_internal(matrix._colum0Ptr,value),
internalIO.mulps_const_internal(matrix._colum1Ptr,value),
internalIO.mulps_const_internal(matrix._colum2Ptr,value)
);
}
public static Matrix4x3 operator /(Matrix4x3 matrix, float value)
{
return new Matrix4x3(
internalIO.divps_const_internal(matrix._colum0Ptr,value),
internalIO.divps_const_internal(matrix._colum1Ptr,value),
internalIO.divps_const_internal(matrix._colum2Ptr,value)
);
}
~Matrix4x3()
{
if (map == null)
{
internalIO.deinitM128_internal(_colum0Ptr);
internalIO.deinitM128_internal(_colum1Ptr);
internalIO.deinitM128_internal(_colum2Ptr);
}
else
{
}
}
}
}
+160 -114
View File
@@ -1,145 +1,191 @@
using System;
using System.Drawing;
using System.Numerics;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace StgSharp.Math
{
public enum TransposeMode
{
New,
Copy
}
public unsafe class Matrix4x4:IDisposable
[StructLayout(LayoutKind.Explicit, Size = 2*16*sizeof(float)+sizeof(bool), Pack = 16)]
public struct Matrix4x4 : IEquatable<Matrix4x4>
{
[FieldOffset(0)] internal Mat4 mat;
[FieldOffset(64*sizeof(float))] internal Mat4 transpose;
[FieldOffset(2*64*sizeof(float))]internal bool isTransposed;
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 M128Map;
//pointers of 4 colums are collected
//in the array referred by these pointer.
internal M128matMap _matMap;
//define if this matrix has correctly stored its transpose matrix
internal bool isTransposed = false;
//store the transpose mat of this one to avoid calculate again
internal M128matMap _transpose;
private bool disposedValue;
internal Matrix4x4()
{
_matMap = new M128matMap(
internalIO.load_internal(0, 0, 0, 0),
internalIO.load_internal(0, 0, 0, 0),
internalIO.load_internal(0, 0, 0, 0),
internalIO.load_internal(0, 0, 0, 0)
);
}
//constructor used to transform a matMap from C to a Matrix class,
//the original matMap will be cleaned up after transformation
internal Matrix4x4(
ref M128matMap matMap
public unsafe Matrix4x4(
float a00, float a01, float a02, float a03,
float a10, float a11, float a12, float a13,
float a20, float a21, float a22, float a23,
float a30, float a31, float a32, float a33
)
{
_matMap = matMap;
internalIO .deinitMatmap_sse_internal( ref matMap );
M128* c0ref = internalIO.loadptr_internal(a00, a10, a20, a30);
M128* c1ref = internalIO.loadptr_internal(a01, a11, a21, a31);
M128* c2ref = internalIO.loadptr_internal(a02, a12, a22, a32);
M128* c3ref = internalIO.loadptr_internal(a03, a13, a23, a33);
mat.colum0 = *c0ref;
mat.colum1 = *c1ref;
mat.colum2 = *c2ref;
mat.colum3 = *c3ref;
/**/
internalIO.deinitM128_internal(c0ref);
internalIO.deinitM128_internal(c1ref);
internalIO.deinitM128_internal(c2ref);
internalIO.deinitM128_internal(c3ref);
/**/
}
internal Matrix4x4(
IntPtr c0Ptr,
IntPtr c1Ptr,
IntPtr c2Ptr,
IntPtr c3Ptr
)
public unsafe float this[int rowNum, int columNum]
{
_matMap = new M128matMap(c0Ptr,c1Ptr,c2Ptr,c3Ptr);
}
public Matrix4x4(
float a00,float a01,float a02,float a03,
float a10,float a11,float a12,float a13,
float a20,float a21,float a22,float a23,
float a30,float a31,float a32,float a33
)
{
_matMap = new M128matMap(
internalIO.load_internal(a00, a10, a20, a30),
internalIO.load_internal(a01, a11, a21, a31),
internalIO.load_internal(a02, a12, a22, a32),
internalIO.load_internal(a03, a13, a23, a33)
);
}
public Matrix4x4 Transpose
{
get {
if (isTransposed)
{
internalIO.deinitMatmap_sse_internal(ref _transpose);
}
return new Matrix4x4(
internalIO.load_cpy_internal(_transpose.colum0Ptr),
internalIO.load_cpy_internal(_transpose.colum1Ptr),
internalIO.load_cpy_internal(_transpose.colum2Ptr),
internalIO.load_cpy_internal(_transpose.colum3Ptr)
);
}
}
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
get
{
if (disposing)
if (rowNum>3||rowNum<0)
{
// TODO: 释放托管状态(托管对象)
throw new ArgumentOutOfRangeException(nameof(columNum));
}
if (columNum>3||columNum<0)
{
throw new ArgumentOutOfRangeException(nameof(columNum));
}
InternalTranspose();
fixed (float* p = &this.transpose.a00 )
{
ulong pbit = (ulong)p
+ (ulong)sizeof(M128) * (ulong)rowNum
+ (ulong)sizeof(float) * (ulong)columNum;
return *(float*)pbit;
}
// TODO: 释放未托管的资源(未托管的对象)并重写终结器
// TODO: 将大型字段设置为 null
disposedValue = true;
}
}
// // TODO: 仅当“Dispose(bool disposing)”拥有用于释放未托管资源的代码时才替代终结器
// ~Matrix4x4()
// {
// // 不要更改此代码。请将清理代码放入“Dispose(bool disposing)”方法中
// Dispose(disposing: false);
// }
public void Dispose()
internal Matrix4x4(
ref M128 vec0,
ref M128 vec1,
ref M128 vec2,
ref M128 vec3
)
{
// 不要更改此代码。请将清理代码放入“Dispose(bool disposing)”方法中
Dispose(disposing: true);
GC.SuppressFinalize(this);
mat.colum0 = vec0;
mat.colum1 = vec1;
mat.colum2 = vec2;
mat.colum3 = vec3;
}
internal Matrix4x4(Mat4 mat)
{
this.mat = mat;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static unsafe Matrix4x4 operator +(Matrix4x4 mat1, Matrix4x4 Mat2)
{
Mat4* refret = internalIO.add_mat4(ref mat1.mat, ref Mat2.mat);
Matrix4x4 ret = new Matrix4x4(*refret);
internalIO.deinit_mat4(refret);
return ret;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static unsafe Matrix4x4 operator -(Matrix4x4 mat1, Matrix4x4 Mat2)
{
Mat4* refret = internalIO.sub_mat4(ref mat1.mat, ref Mat2.mat);
Matrix4x4 ret = new Matrix4x4(*refret);
internalIO.deinit_mat4(refret);
return ret;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static unsafe Matrix4x4 operator *(Matrix4x4 mat, float value)
{
Mat4* refret = internalIO.mul_const(ref mat.mat, value);
Matrix4x4 ret = new Matrix4x4(*refret);
internalIO.deinit_mat4(refret);
return ret;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static unsafe Matrix4x2 operator *(Matrix4x4 left, Matrix4x2 right)
{
left.InternalTranspose();
Mat4 tr = left.transpose;
return new Matrix4x2(
internalIO.mulps_sum_internal(&tr.colum0, &right.mat.colum0),
internalIO.mulps_sum_internal(&tr.colum0, &right.mat.colum1),
internalIO.mulps_sum_internal(&tr.colum1, &right.mat.colum0),
internalIO.mulps_sum_internal(&tr.colum1, &right.mat.colum1),
internalIO.mulps_sum_internal(&tr.colum2, &right.mat.colum0),
internalIO.mulps_sum_internal(&tr.colum2, &right.mat.colum1),
internalIO.mulps_sum_internal(&tr.colum3, &right.mat.colum0),
internalIO.mulps_sum_internal(&tr.colum3, &right.mat.colum1)
);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static unsafe Matrix4x4 operator *(Matrix4x4 left, Matrix4x4 right)
{
left.InternalTranspose();
Mat4* p = internalIO.mul_4_4(&left.transpose, &right.mat);
Matrix4x4 ret = new Matrix4x4(*p);
internalIO.deinit_mat4(p);
return ret;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public unsafe float Det()
{
InternalTranspose();
fixed (Matrix4x4* _this = &this)
{
return internalIO.det_mat4(_this);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal unsafe void InternalTranspose()
{
if (!isTransposed)
{
fixed (Mat4* source = &this.mat, target = &this.transpose)
{
internalIO.Transpose4to4_internal(source, target);
}
isTransposed = true;
}
}
public override string ToString()
{
InternalTranspose();
return
$"{transpose.colum0}\n" +
$"{transpose.colum1}\n" +
$"{transpose.colum2}\n" +
$"{transpose.colum3}";
}
public bool Equals(Matrix4x4 other)
{
throw new NotImplementedException();
}
}
}
+21 -29
View File
@@ -1,4 +1,5 @@
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
namespace StgSharp.Math
@@ -8,67 +9,58 @@ namespace StgSharp.Math
/// A two dimension vector defined by two elements.
/// Vec2Ds in StgSharp are defaultly usaed as colum vector.
/// </summary>
public class Vec2d
[StructLayout(LayoutKind.Explicit, Size = 16,Pack = 16)]
public struct Vec2d
{
internal M128Map _map;
internal IntPtr _m128Ptr;
[FieldOffset(0)]
public float X;
[FieldOffset(4)]
public float Y;
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; }
}
[FieldOffset(0)]
internal M128 vec;
public Vec2d(float x, float y)
{
_m128Ptr = internalIO.load_internal(x, y, 0, 0);
}
internal Vec2d(IntPtr value)
{
_m128Ptr = value;
X = x; Y = y;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vec2d operator +(Vec2d vec1, Vec2d vec2)
{
return new Vec2d(
internalIO.addps_internal(vec1._m128Ptr,vec2._m128Ptr)
vec1.X + vec2.X,
vec1.Y + vec2.Y
);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vec2d operator -(Vec2d vec1, Vec2d vec2)
{
return new Vec2d(
internalIO.subps_internal(vec1._m128Ptr,vec2._m128Ptr)
vec1.X - vec2.X,
vec1.Y - vec2.Y
);
}
public static Vec2d operator *(Vec2d vec, float value)
{
return new Vec2d(
internalIO.mulps_const_internal(vec._m128Ptr,value)
vec.X * value,
vec.Y * value
);
}
public static Vec2d operator /(Vec2d vec, float value)
{
return new Vec2d(
internalIO.divps_const_internal(vec._m128Ptr, value)
vec.X / value,
vec.Y / value
);
}
public static float operator *(Vec2d vec1, Vec2d vec2)
{
return internalIO.mulps_sum_internal(vec1._m128Ptr, vec2._m128Ptr);
}
}
+34 -84
View File
@@ -1,125 +1,75 @@
using StgSharp.Control;
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
namespace StgSharp.Math
{
public class Vec3d
[StructLayout(LayoutKind.Explicit,Size = 16,Pack = 16)]
public struct Vec3d
{
public static Vec3d defaultValue =
new Vec3d(0, 0, 0);
[FieldOffset(0)]
internal M128 vec;
internal M128Map _map;
internal IntPtr _m128Ptr;
[FieldOffset(0)] public float X;
[FieldOffset(4)] public float Y;
[FieldOffset(8)] public float Z;
public unsafe float X
public Vec3d(
float x, float y, float z)
{
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;
X = x; Y = y; Z = z;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vec3d operator +(Vec3d vec1, Vec3d vec2)
{
return new Vec3d(
internalIO.addps_internal(vec1._m128Ptr, vec2._m128Ptr)
vec1.X + vec2.X,
vec1.Y + vec2.Y,
vec1.Z + vec2.Z
);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vec3d operator -(Vec3d vec1, Vec3d vec2)
{
return new Vec3d(
internalIO.subps_internal(vec1._m128Ptr, vec2._m128Ptr)
vec1.X - vec2.X,
vec1.Y - vec2.Y,
vec1.Z - vec2.Z
);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vec3d operator *(Vec3d vec, float value)
{
return new Vec3d(
internalIO.mulps_const_internal(vec._m128Ptr,value)
vec.X * value,
vec.Y * value,
vec.Z * value
);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vec3d operator /(Vec3d vec, float value)
{
return new Vec3d(
internalIO.divps_const_internal(vec._m128Ptr,value)
vec.X/value,
vec.Y/value,
vec.Z/value
);
}
/**/
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static float operator *(Vec3d vec1, Vec3d vec2)
{
//return VectorCalc.Multiple(vec1,vec2);
return 0;
}
/**/
public unsafe override string ToString()
{
return (*(M128*)_m128Ptr).ToString();
}
public unsafe string ToString(string sample)
{
return $"{(*(M128*)_m128Ptr).single_0.ToString(sample)}\t"+
$"{(*(M128*)_m128Ptr).single_1.ToString(sample)}\t"+
$"{(*(M128*)_m128Ptr).single_2.ToString(sample)}\t"+
$"{(*(M128*)_m128Ptr).single_3.ToString(sample)}\t";
}
~Vec3d()
{
if (_map == null)
{
if (_m128Ptr != defaultValue._m128Ptr)
{
internalIO.deinitM128_internal(this._m128Ptr);
}
else
{
_m128Ptr = IntPtr.Zero;
}
}
else
{
}
return
vec1.X * vec2.X +
vec1.Y * vec2.Y +
vec1.Z * vec2.Z;
}
}
+10 -116
View File
@@ -6,126 +6,20 @@ using System.Runtime.InteropServices;
namespace StgSharp.Math
{
public class Vec4d
[StructLayout(LayoutKind.Explicit, Size = 16, Pack = 16)]
public struct Vec4d
{
internal static readonly Vec4d defaultValue
= new Vec4d( 0,0,0,0 );
[FieldOffset(0)] internal M128 vec;
internal M128Map _map;
internal IntPtr _m128Ptr;
[FieldOffset(0)]public float X;
[FieldOffset(4)]public float Y;
[FieldOffset(8)]public float Z;
[FieldOffset(12)]public float W;
public unsafe float X
unsafe public Vec4d(
float x, float y, float z, float w)
{
get { return (*(M128*)_m128Ptr).single_0; }
set { (*(M128*)_m128Ptr).single_0 = value; }
X = x; Y = y; Z = z; W = w;
}
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; }
}
public unsafe float W
{
get { return (*(M128*)_m128Ptr).single_3; }
set { (*(M128*)_m128Ptr).single_3 = value; }
}
public Vec4d(float x, float y, float z, float w)
{
IntPtr a = internalIO.load_internal(x,y,z,w);
if ((ulong)a>=0)
{
this._m128Ptr = a;
}
}
/// <summary>
/// internal constructor to recive a pointer of the M128 value
/// </summary>
/// <param name="value"></param>
internal Vec4d(IntPtr value)
{
if ((long)value == -1)
{
throw new Exception("Failed to init M128 pointer!");
}
else
{
_m128Ptr = value;
}
}
public Vec4d()
{
_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)
{
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 static Vec4d operator /(Vec4d vec, float value)
{
return new Vec4d(
internalIO.divps_const_internal(vec._m128Ptr, value)
);
}
public unsafe override string ToString()
{
return $"{*(M128*)_m128Ptr}";
}
~Vec4d()
{
if (_map == null)
{
if (_m128Ptr != defaultValue._m128Ptr)
{
internalIO.deinitM128_internal(this._m128Ptr);
}
else
{
_m128Ptr = IntPtr.Zero;
}
}
else
{
}
}
}
}