From 08c8db2d194d0373aa604052a97919133b8c8020 Mon Sep 17 00:00:00 2001 From: ikpil Date: Fri, 3 May 2024 22:44:04 +0900 Subject: [PATCH] SOH --- src/DotRecast.Recast.Demo/Draw/DebugDraw.cs | 4 +-- src/DotRecast.Recast.Demo/Draw/GLU.cs | 37 ++++++++++----------- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/src/DotRecast.Recast.Demo/Draw/DebugDraw.cs b/src/DotRecast.Recast.Demo/Draw/DebugDraw.cs index 875f17b..5374158 100644 --- a/src/DotRecast.Recast.Demo/Draw/DebugDraw.cs +++ b/src/DotRecast.Recast.Demo/Draw/DebugDraw.cs @@ -694,7 +694,7 @@ public class DebugDraw plane[3] = pw; } - public bool FrustumTest(float[] bounds) + public bool FrustumTest(Span bounds) { foreach (float[] plane in frustumPlanes) { @@ -748,6 +748,6 @@ public class DebugDraw public bool FrustumTest(RcVec3f bmin, RcVec3f bmax) { - return FrustumTest(new float[] { bmin.X, bmin.Y, bmin.Z, bmax.X, bmax.Y, bmax.Z }); + return FrustumTest(stackalloc float[] { bmin.X, bmin.Y, bmin.Z, bmax.X, bmax.Y, bmax.Z }); } } \ No newline at end of file diff --git a/src/DotRecast.Recast.Demo/Draw/GLU.cs b/src/DotRecast.Recast.Demo/Draw/GLU.cs index f14aa22..3868787 100644 --- a/src/DotRecast.Recast.Demo/Draw/GLU.cs +++ b/src/DotRecast.Recast.Demo/Draw/GLU.cs @@ -68,8 +68,8 @@ public static class GLU public static int GlhUnProjectf(float winx, float winy, float winz, float[] modelview, float[] projection, int[] viewport, ref RcVec3f objectCoordinate) { // Transformation matrices - float[] m = new float[16], A = new float[16]; - float[] @in = new float[4], @out = new float[4]; + Span m = stackalloc float[16], A = stackalloc float[16]; + Span @in = stackalloc float[4], @out = stackalloc float[4]; // Calculation for inverting a matrix, compute projection x modelview // and store in A[16] MultiplyMatrices4by4OpenGL_FLOAT(A, projection, modelview); @@ -92,7 +92,7 @@ public static class GLU return 1; } - static void MultiplyMatrices4by4OpenGL_FLOAT(float[] result, float[] matrix1, float[] matrix2) + static void MultiplyMatrices4by4OpenGL_FLOAT(Span result, float[] matrix1, float[] matrix2) { result[0] = matrix1[0] * matrix2[0] + matrix1[4] * matrix2[1] + matrix1[8] * matrix2[2] + matrix1[12] * matrix2[3]; result[4] = matrix1[0] * matrix2[4] + matrix1[4] * matrix2[5] + matrix1[8] * matrix2[6] + matrix1[12] * matrix2[7]; @@ -115,7 +115,7 @@ public static class GLU result[15] = matrix1[3] * matrix2[12] + matrix1[7] * matrix2[13] + matrix1[11] * matrix2[14] + matrix1[15] * matrix2[15]; } - static void MultiplyMatrixByVector4by4OpenGL_FLOAT(float[] resultvector, float[] matrix, float[] pvector) + static void MultiplyMatrixByVector4by4OpenGL_FLOAT(Span resultvector, Span matrix, Span pvector) { resultvector[0] = matrix[0] * pvector[0] + matrix[4] * pvector[1] + matrix[8] * pvector[2] + matrix[12] * pvector[3]; resultvector[1] = matrix[1] * pvector[0] + matrix[5] * pvector[1] + matrix[9] * pvector[2] + matrix[13] * pvector[3]; @@ -124,15 +124,13 @@ public static class GLU } // This code comes directly from GLU except that it is for float - static int GlhInvertMatrixf2(float[] m, float[] @out) + static int GlhInvertMatrixf2(Span m, Span @out) { - float[][] wtmp = RcArrays.Of(4, 8); float m0, m1, m2, m3, s; - float[] r0, r1, r2, r3; - r0 = wtmp[0]; - r1 = wtmp[1]; - r2 = wtmp[2]; - r3 = wtmp[3]; + Span r0 = stackalloc float[8]; + Span r1 = stackalloc float[8]; + Span r2 = stackalloc float[8]; + Span r3 = stackalloc float[8]; r0[0] = MAT(m, 0, 0); r0[1] = MAT(m, 0, 1); r0[2] = MAT(m, 0, 2); @@ -160,27 +158,28 @@ public static class GLU /* choose pivot - or die */ if (MathF.Abs(r3[0]) > MathF.Abs(r2[0])) { - float[] r = r2; + Span r = r2; r2 = r3; r3 = r; } if (MathF.Abs(r2[0]) > MathF.Abs(r1[0])) { - float[] r = r2; + Span r = r2; r2 = r1; r1 = r; } if (MathF.Abs(r1[0]) > MathF.Abs(r0[0])) { - float[] r = r1; + Span r = r1; r1 = r0; r0 = r; } if (0.0 == r0[0]) return 0; + /* eliminate first variable */ m1 = r1[0] / r0[0]; m2 = r2[0] / r0[0]; @@ -232,14 +231,14 @@ public static class GLU /* choose pivot - or die */ if (MathF.Abs(r3[1]) > MathF.Abs(r2[1])) { - float[] r = r2; + Span r = r2; r2 = r3; r3 = r; } if (MathF.Abs(r2[1]) > MathF.Abs(r1[1])) { - float[] r = r2; + Span r = r2; r2 = r1; r1 = r; } @@ -284,7 +283,7 @@ public static class GLU /* choose pivot - or die */ if (MathF.Abs(r3[2]) > MathF.Abs(r2[2])) { - float[] r = r2; + Span r = r2; r2 = r3; r3 = r; } @@ -358,12 +357,12 @@ public static class GLU return 1; } - static float MAT(float[] m, int r, int c) + static float MAT(Span m, int r, int c) { return m[(c) * 4 + (r)]; } - static void MAT(float[] m, int r, int c, float v) + static void MAT(Span m, int r, int c, float v) { m[(c) * 4 + (r)] = v; }