From c15afd9c27969d6c03400713417e239f94b0b3a7 Mon Sep 17 00:00:00 2001 From: John Gietzen Date: Sat, 31 May 2025 14:05:30 -0700 Subject: [PATCH 1/7] Generic Math.md Restrict lerp function to F matrices. --- documentation/proposals/Proposal - Generic Math.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/proposals/Proposal - Generic Math.md b/documentation/proposals/Proposal - Generic Math.md index c80c9ba083..92de8595e9 100644 --- a/documentation/proposals/Proposal - Generic Math.md +++ b/documentation/proposals/Proposal - Generic Math.md @@ -242,7 +242,7 @@ Matrix structs **must** fulfill the following requirements: - Invert function for square matricies - GetDeterminant function for square matricies and Matrix3x2, Matrix4x3, and Matrix 5x4 - Transpose function -- static lerp function +- for F matrices, a static lerp function - static identity property - For Matrix3x2, Matrix3x3, Matrix4x3, and Matrix4x4 include the following static functions - CreateBillboardRH From f99ac00118d0cdafb7be3d2ccabc2e2fee4273f1 Mon Sep 17 00:00:00 2001 From: John Gietzen Date: Sat, 31 May 2025 14:11:41 -0700 Subject: [PATCH 2/7] Update Proposal - Generic Math.md --- documentation/proposals/Proposal - Generic Math.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/proposals/Proposal - Generic Math.md b/documentation/proposals/Proposal - Generic Math.md index 92de8595e9..3199060f87 100644 --- a/documentation/proposals/Proposal - Generic Math.md +++ b/documentation/proposals/Proposal - Generic Math.md @@ -99,7 +99,7 @@ For I types, the following additional requirements **must** be fulfilled: - returns The number of set bits in the vector For F types, the following additional requirements **must** be fulfilled: -- A Length property which returns the square root of LengthSquared. +- A GetLength function which returns the square root of LengthSquared. - A Normalize function which divides all components by the length of the vector - A static implementation of this function **must** be available but it should return a normalized vector without affecting the original vector - A static Lerp function which takes Two vectors to interpolate between and a vector representing the t value for each component, and returns a vector which components are linearly interpolated between the original two vectors based on the respective t values. From f01d89d5ab7dc317f027df5a09b0533134e7e3bf Mon Sep 17 00:00:00 2001 From: John Gietzen Date: Sat, 31 May 2025 14:13:40 -0700 Subject: [PATCH 3/7] Propose detupling / implicit tuple conversion. --- documentation/proposals/Proposal - Generic Math.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/documentation/proposals/Proposal - Generic Math.md b/documentation/proposals/Proposal - Generic Math.md index 3199060f87..c9494a0fdf 100644 --- a/documentation/proposals/Proposal - Generic Math.md +++ b/documentation/proposals/Proposal - Generic Math.md @@ -78,6 +78,8 @@ For each vector struct, the following requirements **must** fulfill the followin - A Static Zero Vector with zero for all components - A Static One Vector with one for all components - A static AllBitsSet Vector with all bits set for all components +- A deconstruct method for detupling +- An implicit conversion from a value tuple of the same size. - Define static CreateChecked, CreateSaturating, and CreateTruncating which converts other vector types to this type - Try variants of these methods should also be defined which out the resulting vector and return a bool representing success or failure of the operation. - Define Transform functions which take a Matrix of higher dimensionality assuming 1 in for the final missing component and 0 for the rest (Vector 2 can use Matrix2xn, Matrix3xn, and matrix4xn) and return a vector containing the output (type should match the outer type e.g. Vector2.Transform(Matrix4x4) returns Vector2) From b291a8ddc1199d5bcb13526e9d0ac9ec808af51f Mon Sep 17 00:00:00 2001 From: John Gietzen Date: Sat, 31 May 2025 14:20:28 -0700 Subject: [PATCH 4/7] Propose extension API for Math 3.0 --- .../proposals/Proposal - Generic Math.md | 47 +++++++------------ 1 file changed, 18 insertions(+), 29 deletions(-) diff --git a/documentation/proposals/Proposal - Generic Math.md b/documentation/proposals/Proposal - Generic Math.md index c9494a0fdf..541c99f5e1 100644 --- a/documentation/proposals/Proposal - Generic Math.md +++ b/documentation/proposals/Proposal - Generic Math.md @@ -45,25 +45,19 @@ For each vector struct, the following requirements **must** fulfill the followin - A ref indexer that takes a int index and returns the corresponding component value (0 -> x, 1 -> y, etc.) - An AsSpan function which returns this vector as a Span of the generic type - A LengthSquared property which returns the dot product of the vector with itself. -- A Dot function which takes another vector and returns the dot product with our original vector. - - A static implementation of this function **must** be available as well. -- For 3D Vectors, a Cross function which takes another vector and returns the cross product with our original vector. +- A Dot extension method which takes another vector and returns the dot product with our original vector. +- For 3D Vectors, a Cross extension method which takes another vector and returns the cross product with our original vector. - A static implementation of this function **must** be available as well. - `+`, `-`, `*`, `/`, and `%` operators defined between two vectors of the same type which returns a vector which has had each operation applied component-wise. - `+`, `-`, `*`, `/`, and `%` operators defined between a vector and a scalar value that matches the generic type which returns a vector which has had each operation applied component-wise with the scalar value. Both vector first and scalar first should be implemented. - A `-` unary operator which returns the negated vector. - A `+` unary operator which returns the vector. - Overrides ToString to show component values. -- Max and Min functions, which takes another vector and returns a new vector which component-wise has the Max or Min value, respectively. - - A Static implementation of this function **must** be available as well. -- Max and Min functions, which takes a scalar value which matches the generic type and returns a new vector which component-wise has the Max or Min value with the scalar value, respectively. - - A Static implementation of this function **must** be available as well. -- A Clamp function which takes a Max vector and a Min vector and returns a vector which has its components bounded between the Min and Max vectors. - - A Static implementation of this function **must** be available as well. -- A Clamp function which takes a Max scalar and a Min scalar, both which match the generic type, and returns a vector which has its components bounded between the Min and Max scalars. - - A Static implementation of this function **must** be available as well. -- An Abs function which returns a vector where each component is the absolute value of the original - - A Static implementation of this function **must** be available as well. +- Max and Min extension methods, which takes another vector and returns a new vector which component-wise has the Max or Min value, respectively. +- Max and Min extension methods, which takes a scalar value which matches the generic type and returns a new vector which component-wise has the Max or Min value with the scalar value, respectively. +- A Clamp extension method which takes a Max vector and a Min vector and returns a vector which has its components bounded between the Min and Max vectors. +- A Clamp extension method which takes a Max scalar and a Min scalar, both which match the generic type, and returns a vector which has its components bounded between the Min and Max scalars. +- An Abs extension method which returns a vector where each component is the absolute value of the original - CopyTo functions which copy to an array or span, with or without a starting index - Explicit cast and checked cast operators to all standard variants of the F and I vector types of the same dimensionality - Explicit cast and checked cast to and from matching System.Numerics vector type @@ -72,8 +66,7 @@ For each vector struct, the following requirements **must** fulfill the followin - A Static implementation of this function **must** be available but it should return a new vector without affecting the original - A Copy sign function which takes a scalar which matches the generic type, and copies the scalars sign onto each component of the vector - A Static implementation of this function **must** be available but it should return a new vector without affecting the original -- A Sign function which returns a vector where each component is only the sign segment of the original vector - - A Static implementation of this function **must** be available +- A Sign extension method which returns a vector where each component is only the sign segment of the original vector - Static Unit Vectors for each component - A Static Zero Vector with zero for all components - A Static One Vector with one for all components @@ -93,7 +86,7 @@ For I types, the following additional requirements **must** be fulfilled: - the bitwise `&`, `|`, and `^` operators defined between two vectors which returns a vector which has had these operators applied on a component-wise basis. - the bitwise `&`, `|`, and `^` operators defined between a vectors and a scalar value that matches the generic type which returns a vector which has had these operators applied on a component-wise basis with the scalar. - the unary bitwise `~` operator defined which negates the bits of the vector components. -- Define the following static functions for these types to match IBinaryInteger (Vector replaced with type, e.g. `Vector2I`) which returns a new vector with these operations applied component-wise, unless otherwise specified: +- Define the following extension methods for these types to match IBinaryInteger (Vector replaced with type, e.g. `Vector2I`) which returns a new vector with these operations applied component-wise, unless otherwise specified: - Log2(Vector x) - DivRem(Vector left, Vector right) - Returns tuple of 2 Vectors (Vector Quotient, Vector Remainder) @@ -101,15 +94,11 @@ For I types, the following additional requirements **must** be fulfilled: - returns The number of set bits in the vector For F types, the following additional requirements **must** be fulfilled: -- A GetLength function which returns the square root of LengthSquared. -- A Normalize function which divides all components by the length of the vector - - A static implementation of this function **must** be available but it should return a normalized vector without affecting the original vector -- A static Lerp function which takes Two vectors to interpolate between and a vector representing the t value for each component, and returns a vector which components are linearly interpolated between the original two vectors based on the respective t values. - - A clamped version of this function **must** also be available which clamps the t-values between 0 and 1 -- A static Lerp function which takes Two vectors and a scalar value which matches the generic type, and returns a vector which is linearly interpolated between the two vectors using the scalar as the t value. - - A clamped version of this function **must** also be available which clamps the t-values between 0 and 1 -- A Reflect Function which takes a normal vector and reflects the vector over the normal - - A Static implemenation of this function **must** be available as well, but should return the reflected vector without affecting the original vector. +- A GetLength extension method which returns the square root of LengthSquared. +- A Normalize extension method which divides all components by the length of the vector +- A Lerp extension method which takes Two vectors to interpolate between and a vector representing the t value for each component, and returns a vector which components are linearly interpolated between the original two vectors based on the respective t values. +- A Lerp extension method which takes Two vectors and a scalar value which matches the generic type, and returns a vector which is linearly interpolated between the two vectors using the scalar as the t value. +- A Reflect extension method which takes a normal vector and reflects the vector over the normal - The following static Vector properties which have the given value for all components - PositiveInfinity - NegativeInfinity @@ -119,7 +108,7 @@ For F types, the following additional requirements **must** be fulfilled: - Pi - Tau - E -- Define the following static functions for these types to match IBinaryFloatingPointIeee754 (Vector replaced with type, e.g. `Vector2F`) which returns a new vector with these operations applied component-wise, unless otherwise specified: +- Define the following extension methods for these types to match IBinaryFloatingPointIeee754 (Vector replaced with type, e.g. `Vector2F`) which returns a new vector with these operations applied component-wise, unless otherwise specified: - Sqrt(Vector x) - Acosh(Vector x) - Asinh(Vector x) @@ -241,9 +230,9 @@ Matrix structs **must** fulfill the following requirements: - Multiply operators defined with compatible matricies, if the output matrix type already exists (AxB * BxC = AxC) - Negate Operator defined - Implicit conversion to and from the System.Numerics matrix type, if available -- Invert function for square matricies -- GetDeterminant function for square matricies and Matrix3x2, Matrix4x3, and Matrix 5x4 -- Transpose function +- Invert extension method for square matricies +- GetDeterminant extension method for square matricies and Matrix3x2, Matrix4x3, and Matrix 5x4 +- Transpose extension method - for F matrices, a static lerp function - static identity property - For Matrix3x2, Matrix3x3, Matrix4x3, and Matrix4x4 include the following static functions From da30776ebf1cce5fca22949476c705c979edeb9b Mon Sep 17 00:00:00 2001 From: John Gietzen Date: Sat, 31 May 2025 14:22:09 -0700 Subject: [PATCH 5/7] Propose only square identity matrices. --- documentation/proposals/Proposal - Generic Math.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/proposals/Proposal - Generic Math.md b/documentation/proposals/Proposal - Generic Math.md index 541c99f5e1..079d2133fb 100644 --- a/documentation/proposals/Proposal - Generic Math.md +++ b/documentation/proposals/Proposal - Generic Math.md @@ -234,7 +234,7 @@ Matrix structs **must** fulfill the following requirements: - GetDeterminant extension method for square matricies and Matrix3x2, Matrix4x3, and Matrix 5x4 - Transpose extension method - for F matrices, a static lerp function -- static identity property +- static identity property for square matrices - For Matrix3x2, Matrix3x3, Matrix4x3, and Matrix4x4 include the following static functions - CreateBillboardRH - CreateBillboardLH From cbbcf5223ab1d4846c26b36c0d6f3ef82b8cfd79 Mon Sep 17 00:00:00 2001 From: John Gietzen Date: Mon, 2 Jun 2025 12:13:13 -0700 Subject: [PATCH 6/7] Update Proposal - Generic Math.md --- documentation/proposals/Proposal - Generic Math.md | 1 - 1 file changed, 1 deletion(-) diff --git a/documentation/proposals/Proposal - Generic Math.md b/documentation/proposals/Proposal - Generic Math.md index 079d2133fb..2f73c6a7b6 100644 --- a/documentation/proposals/Proposal - Generic Math.md +++ b/documentation/proposals/Proposal - Generic Math.md @@ -47,7 +47,6 @@ For each vector struct, the following requirements **must** fulfill the followin - A LengthSquared property which returns the dot product of the vector with itself. - A Dot extension method which takes another vector and returns the dot product with our original vector. - For 3D Vectors, a Cross extension method which takes another vector and returns the cross product with our original vector. - - A static implementation of this function **must** be available as well. - `+`, `-`, `*`, `/`, and `%` operators defined between two vectors of the same type which returns a vector which has had each operation applied component-wise. - `+`, `-`, `*`, `/`, and `%` operators defined between a vector and a scalar value that matches the generic type which returns a vector which has had each operation applied component-wise with the scalar value. Both vector first and scalar first should be implemented. - A `-` unary operator which returns the negated vector. From 40bd85e2c9f8e989e51a8e45a93a84fded59f0cd Mon Sep 17 00:00:00 2001 From: John Gietzen Date: Thu, 26 Jun 2025 00:02:26 -0700 Subject: [PATCH 7/7] Update Proposal - Generic Math.md --- documentation/proposals/Proposal - Generic Math.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/documentation/proposals/Proposal - Generic Math.md b/documentation/proposals/Proposal - Generic Math.md index 2f73c6a7b6..29db099f0a 100644 --- a/documentation/proposals/Proposal - Generic Math.md +++ b/documentation/proposals/Proposal - Generic Math.md @@ -21,7 +21,8 @@ This API aims to replace the existing implementation of Silk.NET.Maths. - If any of the APIs contained herein are later deemed mathematically invalid in the context of their exposing primitive (e.g. a specific operation being inappropriate for a specific sized matrix), the Silk.NET team reserves the right to remove them at their own accord. # **INFORMATIVE** Integer and Floating Point Types -While investigating the use of generic math we came to the conclusion that making types which supports both integer and floating point types would not be optimal. This was discussed at length on the discord [here](https://discord.com/channels/521092042781229087/587346162802229298/1167705816812498974). Ultimately it was decided to provide both an integer and floating point variant for each vector type and every type built from them. These types are generic where `Vector2I` will be a 2D vector which takes any binary integer type for `T`. Similarly `Vector2F` will be a 2D vector which takes any floating point type for `T`. By extension we get types like `BoxI` and `RectangleF`. The integer types are granted the bitwise operators `&`, `~`, `|`, and `^`. Floating point types will include some operations that require certain functions unavailable to integer types like `Length` which requires `Sqrt`. +While investigating the use of generic math we came to the conclusion that making types which supports both integer and floating point types would not be optimal. This was discussed at length on the discord [here](https://discord.com/channels/521092042781229087/587346162802229298/1167705816812498974). Ultimately it was decided to provide both an integer and floating point variant for each vector type and every type built from them. These types are generic where `Vector2I` will be a 2D vector which takes any binary integer type for `T`. Similarly `Vector2F` will be a 2D vector which takes any floating point type for `T`. The I/F types would share a common interface hierarchy. By extension we get types like `BoxI` and `RectangleF`. The integer types are granted the bitwise operators `&`, `~`, `|`, and `^`. Floating point types will include some operations that require certain functions unavailable to integer types like `GetLength` which requires `Sqrt`. +Whenever possible (e.g. other than operators), methods should be added via extension methods and these types should behave as simple containers. This allows users to properly extend the functionality when providing custom `INumber` types. # I types versus F Types Each type in this proposal, aside from `Quaternion`, ends in I or F, defining whether it is an integer type or floating point type. Integer types **must** use a generic type argument `T` with the constraint of `IBinaryInteger`. On the other hand, floating point types **must** use a generic type argument `T` with the constraint of `IFloatingPointIeee754`. @@ -44,7 +45,7 @@ For each vector struct, the following requirements **must** fulfill the followin - Constructors for 3 dimensions and up **must** include lower dimension variants that use the lower dimensions for their specific components (vector2 -> X,Y). - A ref indexer that takes a int index and returns the corresponding component value (0 -> x, 1 -> y, etc.) - An AsSpan function which returns this vector as a Span of the generic type -- A LengthSquared property which returns the dot product of the vector with itself. +- A GetLengthSquared extension method which returns the dot product of the vector with itself. - A Dot extension method which takes another vector and returns the dot product with our original vector. - For 3D Vectors, a Cross extension method which takes another vector and returns the cross product with our original vector. - `+`, `-`, `*`, `/`, and `%` operators defined between two vectors of the same type which returns a vector which has had each operation applied component-wise. pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy