using StgSharp; using StgSharp.Math; using System; using System.Numerics; 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", EntryPoint = "addmat4", #endif CallingConvention = CallingConvention.Cdecl)] [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static extern unsafe Mat4* add_mat4( ref Mat4 mat1, ref Mat4 Mat2); [DllImport("StgSharpGraphic", EntryPoint = "addmat4", CallingConvention = CallingConvention.Cdecl)] [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static extern unsafe Mat4* add_mat4( Mat4* mat1, Mat4* Mat2); #endregion #region sub_mat4 [DllImport("StgSharpGraphic", EntryPoint = "sub_mat4", CallingConvention = CallingConvention.Cdecl)] [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static unsafe extern Mat4* sub_mat4( ref Mat4 mat1, ref Mat4 Mat2); [DllImport("StgSharpGraphic", EntryPoint = "Mat4", CallingConvention = CallingConvention.Cdecl)] [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static unsafe extern Mat4* sub_mat4( Mat4* mat1, Mat4* Mat2); #endregion #region mul [DllImport("StgSharpGraphic", EntryPoint = "mul_const", CallingConvention = CallingConvention.Cdecl)] [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static unsafe extern Mat4* mul_const( Mat4* mat, float value); [DllImport("StgSharpGraphic", EntryPoint = "mul_const", CallingConvention = CallingConvention.Cdecl)] [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static unsafe extern Mat4* mul_const( ref Mat4 mat, float value); [DllImport("StgsharpGraphic", EntryPoint = "mul_4_2", CallingConvention = CallingConvention.Cdecl)] [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static extern unsafe Mat2* mul_4_2(Mat4* left, Mat2* right); [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", EntryPoint = "transpose4to4", CallingConvention = CallingConvention.Cdecl)] internal static extern unsafe void Transpose4to4_internal(Mat4* source, Mat4* target); [DllImport("StgsharpGraphic", EntryPoint = "transpose4to3", CallingConvention = CallingConvention.Cdecl)] internal static extern unsafe void Transpose4to3_internal(Mat4* source, Mat3* target); [DllImport("StgsharpGraphic", EntryPoint = "transpose4to2", CallingConvention = CallingConvention.Cdecl)] internal static extern unsafe void Transpose4to2_internal(Mat4* source, Mat2* target); #endregion #region det [DllImport("StgsharpGraphic", EntryPoint = "det_mat4", CallingConvention = CallingConvention.Cdecl)] [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static unsafe extern float det_mat4(Mat4* matPtr, Mat4* transpose); #endregion #region deinit_mat4 [DllImport("StgSharpGraphic", EntryPoint = "deinit_mat4", CallingConvention = CallingConvention.Cdecl)] [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static extern void deinit_mat4(ref Mat4 mat); [DllImport("StgSharpGraphic", EntryPoint = "deinit_mat4", CallingConvention = CallingConvention.Cdecl)] [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static extern void deinit_mat4(Mat4* mat); #endregion } } namespace StgSharp.Math { [StructLayout(LayoutKind.Explicit, Size = 16 * sizeof(float))] public struct Mat4 { [FieldOffset(0)] internal Vector4 colum0; [FieldOffset(16)] internal Vector4 colum1; [FieldOffset(32)] internal Vector4 colum2; [FieldOffset(48)] internal Vector4 colum3; [FieldOffset(0)] public float m00; [FieldOffset(4)] public float m10; [FieldOffset(8)] public float m20; [FieldOffset(12)] public float m30; [FieldOffset(16)] public float m01; [FieldOffset(20)] public float m11; [FieldOffset(24)] public float m21; [FieldOffset(28)] public float m31; [FieldOffset(32)] public float m02; [FieldOffset(36)] public float m12; [FieldOffset(40)] public float m22; [FieldOffset(44)] public float m32; [FieldOffset(48)] public float m03; [FieldOffset(52)] public float m13; [FieldOffset(56)] public float m23; [FieldOffset(60)] public float m33; [MethodImpl(MethodImplOptions.AggressiveInlining)] internal Mat4( Vector4 colum0, Vector4 colum1, Vector4 colum2, Vector4 colum3 ) { this.colum0 = colum0; this.colum1 = colum1; this.colum2 = colum2; this.colum3 = colum3; } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static Mat4 add(Mat4 left, Mat4 right) { return new Mat4( left.colum0 + right.colum0, left.colum1 + right.colum1, left.colum2 + right.colum2, left.colum3 + right.colum3 ); } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static Mat4 sub(Mat4 left, Mat4 right) { return new Mat4( left.colum0 - right.colum0, left.colum1 - right.colum1, left.colum2 - right.colum2, left.colum3 - right.colum3 ); } } }