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
+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;
}
}
}