daily update on 20230813 by nitload youmu, weritting matrix algs

This commit is contained in:
Nitload
2023-08-13 22:45:22 +08:00
parent f9f339405e
commit 969406c4e4
212 changed files with 14880 additions and 13745 deletions
+96 -151
View File
@@ -1,6 +1,7 @@
using System;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace StgSharp.Math
@@ -11,8 +12,12 @@ namespace StgSharp.Math
Copy
}
public unsafe class Matrix4x4
public unsafe class Matrix4x4:IDisposable
{
public static readonly Matrix4x4 Unit
= new Matrix4x4(
1,0,0,0,
@@ -22,178 +27,118 @@ namespace StgSharp.Math
);
internal M128Map M128Map;
internal M128Map map;
internal IntPtr _colum0Ptr;
internal IntPtr _colum1Ptr;
internal IntPtr _colum2Ptr;
internal IntPtr _colum3Ptr;
//pointers of 4 colums are collected
//in the array referred by these pointer.
internal M128matMap _matMap;
private bool isTransposed=false;
private Matrix4x4 _transpose;
//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()
{
_colum0Ptr = internalIO.load_internal(0,0,0,0);
_colum1Ptr = internalIO.load_internal(0,0,0,0);
_colum2Ptr = internalIO.load_internal(0,0,0,0);
_colum3Ptr = internalIO.load_internal(0,0,0,0);
_transpose = new Matrix4x4(this);
}
//Ctor used for the matixes of transposed matrix
internal Matrix4x4(Matrix4x4 transpose)
{
_colum0Ptr = internalIO.load_internal(0, 0, 0, 0);
_colum1Ptr = internalIO.load_internal(0, 0, 0, 0);
_colum2Ptr = internalIO.load_internal(0, 0, 0, 0);
_colum3Ptr = internalIO.load_internal(0, 0, 0, 0);
_transpose = transpose;
this.isTransposed=true;
}
internal unsafe Matrix4x4(
IntPtr row0Ptr,
IntPtr row1Ptr,
IntPtr row2Ptr,
IntPtr row3Ptr
)
{
_colum0Ptr= row0Ptr;
_colum1Ptr= row1Ptr;
_colum2Ptr= row2Ptr;
_colum3Ptr= row3Ptr;
_transpose = new Matrix4x4(this);
}
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
)
{
_colum0Ptr = internalIO.load_internal(a00,a10,a20,a30);
_colum1Ptr = internalIO.load_internal(a01,a11,a21,a31);
_colum2Ptr = internalIO.load_internal(a02,a12,a22,a32);
_colum3Ptr = internalIO.load_internal(a03,a13,a23,a33);
_transpose = new Matrix4x4(this);
}
public unsafe Matrix4x4 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_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;
(*(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_3 = (*(M128*)_colum3Ptr).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;
(*(M128*)_transpose._colum3Ptr).single_3 = (*(M128*)_colum3Ptr).single_3;
isTransposed = true;
}
switch (transposeMode)
{
case TransposeMode.New:
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)
);
break;
case TransposeMode.Copy:
return _transpose;
break;
default:
throw new Exception();
break;
}
}
/**/
public static Matrix4x4 operator +(Matrix4x4 matrix1, Matrix4x4 matrix2)
{
return new Matrix4x4(
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 Matrix4x4 operator -(Matrix4x4 matrix1, Matrix4x4 matrix2)
{
return new Matrix4x4(
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)
_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)
);
}
/**/
public static Matrix4x4 operator *(Matrix4x4 matrix, float value)
//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
)
{
return new Matrix4x4(
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)
_matMap = matMap;
internalIO .deinitMatmap_sse_internal( ref matMap );
}
internal Matrix4x4(
IntPtr c0Ptr,
IntPtr c1Ptr,
IntPtr c2Ptr,
IntPtr c3Ptr
)
{
_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 override string ToString()
{
return $"{*(M128*)_colum0Ptr}\n{*(M128*)_colum1Ptr}\n{*(M128*)_colum2Ptr}\n{*(M128*)_colum3Ptr}";
}
/**/
~Matrix4x4()
public Matrix4x4 Transpose
{
if (map==null)
{
internalIO.deinitM128_internal(_colum0Ptr);
internalIO.deinitM128_internal(_colum1Ptr);
internalIO.deinitM128_internal(_colum2Ptr);
internalIO.deinitM128_internal(_colum3Ptr);
}
else
{
//in case the matrix is in a M128 map
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)
{
if (disposing)
{
// TODO: 释放托管状态(托管对象)
}
// TODO: 释放未托管的资源(未托管的对象)并重写终结器
// TODO: 将大型字段设置为 null
disposedValue = true;
}
}
// // TODO: 仅当“Dispose(bool disposing)”拥有用于释放未托管资源的代码时才替代终结器
// ~Matrix4x4()
// {
// // 不要更改此代码。请将清理代码放入“Dispose(bool disposing)”方法中
// Dispose(disposing: false);
// }
public void Dispose()
{
// 不要更改此代码。请将清理代码放入“Dispose(bool disposing)”方法中
Dispose(disposing: true);
GC.SuppressFinalize(this);
}
}