daily update on 20230730 by nitload youmu, 5th day of params displacement
This commit is contained in:
@@ -1,5 +1,4 @@
|
||||
using System;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
@@ -12,43 +11,60 @@ namespace StgSharp.Math
|
||||
Copy
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public class Matrix4x4
|
||||
public unsafe class Matrix4x4
|
||||
{
|
||||
internal long _row0Ptr;
|
||||
internal long _row1Ptr;
|
||||
internal long _row2Ptr;
|
||||
internal long _row3Ptr;
|
||||
internal M128Map map;
|
||||
|
||||
internal IntPtr _row0Ptr;
|
||||
internal IntPtr _row1Ptr;
|
||||
internal IntPtr _row2Ptr;
|
||||
internal IntPtr _row3Ptr;
|
||||
|
||||
|
||||
internal M128 _row0;
|
||||
internal M128 _row1;
|
||||
internal M128 _row2;
|
||||
internal M128 _row3;
|
||||
|
||||
private bool isTransposed=false;
|
||||
|
||||
private Matrix4x4 _transpose;
|
||||
|
||||
internal Matrix4x4()
|
||||
{
|
||||
_transpose = new Matrix4x4();
|
||||
_transpose._transpose = this;
|
||||
_transpose.isTransposed = true;
|
||||
|
||||
_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);
|
||||
|
||||
_transpose = new Matrix4x4(this);
|
||||
}
|
||||
|
||||
internal Matrix4x4(M128 row0, M128 row1, M128 row2, M128 row3)
|
||||
|
||||
//Ctor used for the matixes of transposed matrix
|
||||
internal Matrix4x4(Matrix4x4 transpose)
|
||||
{
|
||||
this._row0 = row0;
|
||||
this._row1 = row1;
|
||||
this._row2 = row2;
|
||||
this._row3 = row3;
|
||||
|
||||
_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);
|
||||
|
||||
_transpose = transpose;
|
||||
this.isTransposed=true;
|
||||
}
|
||||
|
||||
internal unsafe Matrix4x4(M128 row0, M128 row1, M128 row2, M128 row3)
|
||||
{
|
||||
|
||||
_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);
|
||||
|
||||
_transpose = new Matrix4x4(this);
|
||||
}
|
||||
|
||||
public Matrix4x4(
|
||||
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,
|
||||
@@ -56,37 +72,37 @@ namespace StgSharp.Math
|
||||
)
|
||||
{
|
||||
|
||||
_transpose = new Matrix4x4();
|
||||
_transpose._transpose = this;
|
||||
this._row0 = new M128(a00, a01, a02, a03);
|
||||
this._row1 = new M128(a10, a11, a12, a13);
|
||||
this._row2 = new M128(a20, a21, a22, a23);
|
||||
this._row3 = new M128(a30, a31, a32, a33);
|
||||
_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);
|
||||
|
||||
_transpose = new Matrix4x4(this);
|
||||
}
|
||||
|
||||
internal void internalTranspose()
|
||||
{
|
||||
if (!isTransposed)
|
||||
{
|
||||
_transpose._row0.single_0 = _row0.single_0;
|
||||
_transpose._row0.single_1 = _row1.single_0;
|
||||
_transpose._row0.single_2 = _row2.single_0;
|
||||
_transpose._row0.single_3 = _row3.single_0;
|
||||
(*(M128*)_transpose._row0Ptr).single_0 = (*(M128*)_row0Ptr).single_0;
|
||||
(*(M128*)_transpose._row0Ptr).single_1 = (*(M128*)_row1Ptr).single_0;
|
||||
(*(M128*)_transpose._row0Ptr).single_2 = (*(M128*)_row2Ptr).single_0;
|
||||
(*(M128*)_transpose._row0Ptr).single_3 = (*(M128*)_row3Ptr).single_0;
|
||||
|
||||
_transpose._row1.single_0 = _row0.single_1;
|
||||
_transpose._row1.single_1 = _row1.single_1;
|
||||
_transpose._row1.single_2 = _row2.single_1;
|
||||
_transpose._row1.single_3 = _row3.single_1;
|
||||
|
||||
_transpose._row2.single_0 = _row0.single_2;
|
||||
_transpose._row2.single_1 = _row1.single_2;
|
||||
_transpose._row2.single_2 = _row2.single_2;
|
||||
_transpose._row2.single_3 = _row3.single_2;
|
||||
|
||||
_transpose._row3.single_0 = _row0.single_3;
|
||||
_transpose._row3.single_1 = _row1.single_3;
|
||||
_transpose._row3.single_2 = _row2.single_3;
|
||||
_transpose._row3.single_3 = _row3.single_3;
|
||||
(*(M128*)_transpose._row1Ptr).single_0 = (*(M128*)_row0Ptr).single_1;
|
||||
(*(M128*)_transpose._row1Ptr).single_1 = (*(M128*)_row1Ptr).single_1;
|
||||
(*(M128*)_transpose._row1Ptr).single_2 = (*(M128*)_row2Ptr).single_1;
|
||||
(*(M128*)_transpose._row1Ptr).single_3 = (*(M128*)_row3Ptr).single_1;
|
||||
|
||||
(*(M128*)_transpose._row2Ptr).single_0 = (*(M128*)_row0Ptr).single_2;
|
||||
(*(M128*)_transpose._row2Ptr).single_1 = (*(M128*)_row1Ptr).single_2;
|
||||
(*(M128*)_transpose._row2Ptr).single_2 = (*(M128*)_row2Ptr).single_2;
|
||||
(*(M128*)_transpose._row2Ptr).single_3 = (*(M128*)_row3Ptr).single_2;
|
||||
|
||||
(*(M128*)_transpose._row3Ptr).single_0 = (*(M128*)_row0Ptr).single_3;
|
||||
(*(M128*)_transpose._row3Ptr).single_1 = (*(M128*)_row1Ptr).single_3;
|
||||
(*(M128*)_transpose._row3Ptr).single_2 = (*(M128*)_row2Ptr).single_3;
|
||||
(*(M128*)_transpose._row3Ptr).single_3 = (*(M128*)_row3Ptr).single_3;
|
||||
|
||||
isTransposed = true;
|
||||
}
|
||||
@@ -99,10 +115,10 @@ namespace StgSharp.Math
|
||||
{
|
||||
case TransposeMode.New:
|
||||
return new Matrix4x4(
|
||||
_transpose._row0,
|
||||
_transpose._row1,
|
||||
_transpose._row2,
|
||||
_transpose._row3
|
||||
*(M128*)_transpose._row0Ptr,
|
||||
*(M128*)_transpose._row1Ptr,
|
||||
*(M128*)_transpose._row2Ptr,
|
||||
*(M128*)_transpose._row3Ptr
|
||||
);
|
||||
break;
|
||||
case TransposeMode.Copy:
|
||||
@@ -114,44 +130,45 @@ namespace StgSharp.Math
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
public static Matrix4x4 operator +(Matrix4x4 matrix1, Matrix4x4 matrix2)
|
||||
{
|
||||
return new Matrix4x4(
|
||||
internalIO.VecAddVec(matrix1._row0, matrix2._row0),
|
||||
internalIO.VecAddVec(matrix1._row1, matrix2._row1),
|
||||
internalIO.VecAddVec(matrix1._row2, matrix2._row2),
|
||||
internalIO.VecAddVec(matrix1._row3, matrix2._row3)
|
||||
internalIO.VecAddVec(matrix1._row0Ptr, matrix2._row0Ptr),
|
||||
internalIO.VecAddVec(matrix1._row1Ptr, matrix2._row1Ptr),
|
||||
internalIO.VecAddVec(matrix1._row2Ptr, matrix2._row2Ptr),
|
||||
internalIO.VecAddVec(matrix1._row3Ptr, matrix2._row3Ptr)
|
||||
) ;
|
||||
}
|
||||
|
||||
public static Matrix4x4 operator *(Matrix4x4 matrix, float value)
|
||||
{
|
||||
M128 newRow0 = new M128(
|
||||
matrix._row0.single_0 * value,
|
||||
matrix._row0.single_1 * value,
|
||||
matrix._row0.single_2 * value,
|
||||
matrix._row0.single_3 * value
|
||||
(*(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(
|
||||
matrix._row1.single_0 * value,
|
||||
matrix._row1.single_1 * value,
|
||||
matrix._row1.single_2 * value,
|
||||
matrix._row1.single_3 * value
|
||||
(*(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(
|
||||
matrix._row2.single_0 * value,
|
||||
matrix._row2.single_1 * value,
|
||||
matrix._row2.single_2 * value,
|
||||
matrix._row2.single_3 * value
|
||||
(*(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(
|
||||
matrix._row3.single_0 * value,
|
||||
matrix._row3.single_1 * value,
|
||||
matrix._row3.single_2 * value,
|
||||
matrix._row3.single_3 * value
|
||||
(*(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(
|
||||
@@ -159,6 +176,28 @@ namespace StgSharp.Math
|
||||
);
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{*(M128*)_row0Ptr}\n{*(M128*)_row1Ptr}\n{*(M128*)_row2Ptr}\n{*(M128*)_row3Ptr}";
|
||||
}
|
||||
|
||||
|
||||
/**/
|
||||
~Matrix4x4()
|
||||
{
|
||||
if (map==null)
|
||||
{
|
||||
Marshal.FreeHGlobal((IntPtr)_row0Ptr);
|
||||
Marshal.FreeHGlobal((IntPtr)_row1Ptr);
|
||||
Marshal.FreeHGlobal((IntPtr)_row2Ptr);
|
||||
Marshal.FreeHGlobal((IntPtr)_row3Ptr);
|
||||
}
|
||||
else
|
||||
{
|
||||
//in case the matrix is in a M128 map
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -6,63 +6,86 @@ using System.Runtime.InteropServices;
|
||||
namespace StgSharp.Math
|
||||
{
|
||||
|
||||
|
||||
public class Vec4d
|
||||
{
|
||||
internal readonly int mapID;
|
||||
internal readonly long m128Ptr;
|
||||
internal readonly M128Map _map;
|
||||
internal readonly IntPtr _m128Ptr;
|
||||
|
||||
private M128 _value;
|
||||
|
||||
public unsafe float X
|
||||
{
|
||||
get { return (*(M128*)mapID).single_0; }
|
||||
set { (*(M128*)mapID).single_0 = value; }
|
||||
get { return (*(M128*)_m128Ptr).single_0; }
|
||||
set { (*(M128*)_m128Ptr).single_0 = value; }
|
||||
}
|
||||
|
||||
public float Y
|
||||
public unsafe float Y
|
||||
{
|
||||
get { return _value.single_1; }
|
||||
set { _value.single_1 = value; }
|
||||
get { return (*(M128*)_m128Ptr).single_1; }
|
||||
set { (*(M128*)_m128Ptr).single_1 = value; }
|
||||
}
|
||||
|
||||
public float Z
|
||||
public unsafe float Z
|
||||
{
|
||||
get { return _value.single_2; }
|
||||
set { _value.single_2 = value; }
|
||||
get { return (*(M128*)_m128Ptr).single_2; }
|
||||
set { (*(M128*)_m128Ptr).single_2 = value; }
|
||||
}
|
||||
|
||||
public float W
|
||||
public unsafe float W
|
||||
{
|
||||
get { return _value.single_3; }
|
||||
set { _value.single_3 = value; }
|
||||
get { return (*(M128*)_m128Ptr).single_3; }
|
||||
set { (*(M128*)_m128Ptr).single_3 = value; }
|
||||
}
|
||||
|
||||
public Vec4d(float x, float y, float z, float w)
|
||||
{
|
||||
X = x;
|
||||
Y = y;
|
||||
Z = z;
|
||||
W = w;
|
||||
IntPtr a = internalIO.InternalInitM128(x,y,z,w);
|
||||
if ((ulong)a>=0)
|
||||
{
|
||||
this._m128Ptr = a;
|
||||
}
|
||||
}
|
||||
|
||||
internal Vec4d()
|
||||
{
|
||||
|
||||
_m128Ptr = internalIO.InternalInitM128(0,0,0,0);
|
||||
}
|
||||
|
||||
public static Vec4d operator +(Vec4d vec1,Vec4d vec2)
|
||||
{
|
||||
Vec4d result = new Vec4d();
|
||||
result._value = internalIO.VecAddVec(vec1._value,vec2._value);
|
||||
internalIO.VecAddVec(vec1._m128Ptr, vec2._m128Ptr/**/,result._m128Ptr/**/);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**/
|
||||
public static Vec4d operator -(Vec4d vec1, Vec4d vec2)
|
||||
{
|
||||
Vec4d result = new Vec4d();
|
||||
result._value = internalIO.VecAddVec(vec1._value, vec2._value);
|
||||
internalIO.VecSubVec(vec1._m128Ptr,vec2._m128Ptr,result._m128Ptr);
|
||||
return result;
|
||||
}
|
||||
/**/
|
||||
|
||||
|
||||
public unsafe override string ToString()
|
||||
{
|
||||
return $"{*(M128*)_m128Ptr}";
|
||||
}
|
||||
|
||||
~Vec4d()
|
||||
{
|
||||
if (_map == null)
|
||||
{
|
||||
internalIO.InternalDeinitM128(this._m128Ptr);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user