qbhf2's picture
added NvidiaWarp and GarmentCode repos
66c9c8a
raw
history blame
57 kB
..
Autogenerated File - Do not edit. Run build_docs.py to generate.
.. functions:
.. currentmodule:: warp
Kernel Reference
================
Scalar Types
------------
.. class:: int8
.. class:: uint8
.. class:: int16
.. class:: uint16
.. class:: int32
.. class:: uint32
.. class:: int64
.. class:: uint64
.. class:: float16
.. class:: float32
.. class:: float64
.. class:: bool
Vector Types
------------
.. class:: vec2b
.. class:: vec2ub
.. class:: vec2s
.. class:: vec2us
.. class:: vec2i
.. class:: vec2ui
.. class:: vec2l
.. class:: vec2ul
.. class:: vec2h
.. class:: vec2f
.. class:: vec2d
.. class:: vec3b
.. class:: vec3ub
.. class:: vec3s
.. class:: vec3us
.. class:: vec3i
.. class:: vec3ui
.. class:: vec3l
.. class:: vec3ul
.. class:: vec3h
.. class:: vec3f
.. class:: vec3d
.. class:: vec4b
.. class:: vec4ub
.. class:: vec4s
.. class:: vec4us
.. class:: vec4i
.. class:: vec4ui
.. class:: vec4l
.. class:: vec4ul
.. class:: vec4h
.. class:: vec4f
.. class:: vec4d
.. class:: mat22h
.. class:: mat22f
.. class:: mat22d
.. class:: mat33h
.. class:: mat33f
.. class:: mat33d
.. class:: mat44h
.. class:: mat44f
.. class:: mat44d
.. class:: quath
.. class:: quatf
.. class:: quatd
.. class:: transformh
.. class:: transformf
.. class:: transformd
.. class:: spatial_vectorh
.. class:: spatial_vectorf
.. class:: spatial_vectord
.. class:: spatial_matrixh
.. class:: spatial_matrixf
.. class:: spatial_matrixd
Generic Types
-------------
.. class:: Int
.. class:: Float
.. class:: Scalar
.. class:: Vector
.. class:: Matrix
.. class:: Quaternion
.. class:: Transformation
.. class:: Array
Query Types
-------------
.. autoclass:: bvh_query_t
.. autoclass:: hash_grid_query_t
.. autoclass:: mesh_query_aabb_t
.. autoclass:: mesh_query_point_t
.. autoclass:: mesh_query_ray_t
Scalar Math
---------------
.. function:: min(x: Scalar, y: Scalar) -> Scalar
Return the minimum of two scalars.
.. function:: min(x: Vector[Any,Scalar], y: Vector[Any,Scalar]) -> Vector[Any,Scalar]
:noindex:
:nocontentsentry:
Return the element-wise minimum of two vectors.
.. function:: min(v: Vector[Any,Scalar]) -> Scalar
:noindex:
:nocontentsentry:
Return the minimum element of a vector ``v``.
.. function:: max(x: Scalar, y: Scalar) -> Scalar
Return the maximum of two scalars.
.. function:: max(x: Vector[Any,Scalar], y: Vector[Any,Scalar]) -> Vector[Any,Scalar]
:noindex:
:nocontentsentry:
Return the element-wise maximum of two vectors.
.. function:: max(v: Vector[Any,Scalar]) -> Scalar
:noindex:
:nocontentsentry:
Return the maximum element of a vector ``v``.
.. function:: clamp(x: Scalar, a: Scalar, b: Scalar) -> Scalar
Clamp the value of ``x`` to the range [a, b].
.. function:: abs(x: Scalar) -> Scalar
Return the absolute value of ``x``.
.. function:: sign(x: Scalar) -> Scalar
Return -1 if ``x`` < 0, return 1 otherwise.
.. function:: step(x: Scalar) -> Scalar
Return 1.0 if ``x`` < 0.0, return 0.0 otherwise.
.. function:: nonzero(x: Scalar) -> Scalar
Return 1.0 if ``x`` is not equal to zero, return 0.0 otherwise.
.. function:: sin(x: Float) -> Float
Return the sine of ``x`` in radians.
.. function:: cos(x: Float) -> Float
Return the cosine of ``x`` in radians.
.. function:: acos(x: Float) -> Float
Return arccos of ``x`` in radians. Inputs are automatically clamped to [-1.0, 1.0].
.. function:: asin(x: Float) -> Float
Return arcsin of ``x`` in radians. Inputs are automatically clamped to [-1.0, 1.0].
.. function:: sqrt(x: Float) -> Float
Return the square root of ``x``, where ``x`` is positive.
.. function:: cbrt(x: Float) -> Float
Return the cube root of ``x``.
.. function:: tan(x: Float) -> Float
Return the tangent of ``x`` in radians.
.. function:: atan(x: Float) -> Float
Return the arctangent of ``x`` in radians.
.. function:: atan2(y: Float, x: Float) -> Float
Return the 2-argument arctangent, atan2, of the point ``(x, y)`` in radians.
.. function:: sinh(x: Float) -> Float
Return the sinh of ``x``.
.. function:: cosh(x: Float) -> Float
Return the cosh of ``x``.
.. function:: tanh(x: Float) -> Float
Return the tanh of ``x``.
.. function:: degrees(x: Float) -> Float
Convert ``x`` from radians into degrees.
.. function:: radians(x: Float) -> Float
Convert ``x`` from degrees into radians.
.. function:: log(x: Float) -> Float
Return the natural logarithm (base-e) of ``x``, where ``x`` is positive.
.. function:: log2(x: Float) -> Float
Return the binary logarithm (base-2) of ``x``, where ``x`` is positive.
.. function:: log10(x: Float) -> Float
Return the common logarithm (base-10) of ``x``, where ``x`` is positive.
.. function:: exp(x: Float) -> Float
Return the value of the exponential function :math:`e^x`.
.. function:: pow(x: Float, y: Float) -> Float
Return the result of ``x`` raised to power of ``y``.
.. function:: round(x: Float) -> Float
Return the nearest integer value to ``x``, rounding halfway cases away from zero.
This is the most intuitive form of rounding in the colloquial sense, but can be slower than other options like :func:`warp.rint()`.
Differs from :func:`numpy.round()`, which behaves the same way as :func:`numpy.rint()`.
.. function:: rint(x: Float) -> Float
Return the nearest integer value to ``x``, rounding halfway cases to nearest even integer.
It is generally faster than :func:`warp.round()`. Equivalent to :func:`numpy.rint()`.
.. function:: trunc(x: Float) -> Float
Return the nearest integer that is closer to zero than ``x``.
In other words, it discards the fractional part of ``x``.
It is similar to casting ``float(int(x))``, but preserves the negative sign when x is in the range [-0.0, -1.0).
Equivalent to :func:`numpy.trunc()` and :func:`numpy.fix()`.
.. function:: floor(x: Float) -> Float
Return the largest integer that is less than or equal to ``x``.
.. function:: ceil(x: Float) -> Float
Return the smallest integer that is greater than or equal to ``x``.
.. function:: frac(x: Float) -> Float
Retrieve the fractional part of x.
In other words, it discards the integer part of x and is equivalent to ``x - trunc(x)``.
Vector Math
---------------
.. function:: dot(x: Vector[Any,Scalar], y: Vector[Any,Scalar]) -> Scalar
Compute the dot product between two vectors.
.. function:: dot(x: Quaternion[Float], y: Quaternion[Float]) -> Scalar
:noindex:
:nocontentsentry:
Compute the dot product between two quaternions.
.. function:: ddot(x: Matrix[Any,Any,Scalar], y: Matrix[Any,Any,Scalar]) -> Scalar
Compute the double dot product between two matrices.
.. function:: argmin(v: Vector[Any,Scalar]) -> uint32
Return the index of the minimum element of a vector ``v``. [1]_
.. function:: argmax(v: Vector[Any,Scalar]) -> uint32
Return the index of the maximum element of a vector ``v``. [1]_
.. function:: outer(x: Vector[Any,Scalar], y: Vector[Any,Scalar]) -> Matrix[Any,Any,Scalar]
Compute the outer product ``x*y^T`` for two vectors.
.. function:: cross(x: Vector[3,Scalar], y: Vector[3,Scalar]) -> Vector[3,Scalar]
Compute the cross product of two 3D vectors.
.. function:: skew(x: Vector[3,Scalar])
Compute the skew-symmetric 3x3 matrix for a 3D vector ``x``.
.. function:: length(x: Vector[Any,Float]) -> Scalar
Compute the length of a vector ``x``.
.. function:: length(x: Quaternion[Float]) -> Scalar
:noindex:
:nocontentsentry:
Compute the length of a quaternion ``x``.
.. function:: length_sq(x: Vector[Any,Scalar]) -> Scalar
Compute the squared length of a 2D vector ``x``.
.. function:: length_sq(x: Quaternion[Scalar]) -> Scalar
:noindex:
:nocontentsentry:
Compute the squared length of a quaternion ``x``.
.. function:: normalize(x: Vector[Any,Float]) -> Vector[Any,Scalar]
Compute the normalized value of ``x``. If ``length(x)`` is 0 then the zero vector is returned.
.. function:: normalize(x: Quaternion[Float]) -> Quaternion[Scalar]
:noindex:
:nocontentsentry:
Compute the normalized value of ``x``. If ``length(x)`` is 0, then the zero quaternion is returned.
.. function:: transpose(m: Matrix[Any,Any,Scalar])
Return the transpose of the matrix ``m``.
.. function:: inverse(m: Matrix[2,2,Float]) -> Matrix[Any,Any,Float]
Return the inverse of a 2x2 matrix ``m``.
.. function:: inverse(m: Matrix[3,3,Float]) -> Matrix[Any,Any,Float]
:noindex:
:nocontentsentry:
Return the inverse of a 3x3 matrix ``m``.
.. function:: inverse(m: Matrix[4,4,Float]) -> Matrix[Any,Any,Float]
:noindex:
:nocontentsentry:
Return the inverse of a 4x4 matrix ``m``.
.. function:: determinant(m: Matrix[2,2,Float]) -> Scalar
Return the determinant of a 2x2 matrix ``m``.
.. function:: determinant(m: Matrix[3,3,Float]) -> Scalar
:noindex:
:nocontentsentry:
Return the determinant of a 3x3 matrix ``m``.
.. function:: determinant(m: Matrix[4,4,Float]) -> Scalar
:noindex:
:nocontentsentry:
Return the determinant of a 4x4 matrix ``m``.
.. function:: trace(m: Matrix[Any,Any,Scalar]) -> Scalar
Return the trace of the matrix ``m``.
.. function:: diag(d: Vector[Any,Scalar]) -> Matrix[Any,Any,Scalar]
Returns a matrix with the components of the vector ``d`` on the diagonal.
.. function:: get_diag(m: Matrix[Any,Any,Scalar]) -> Vector[Any,Scalar]
Returns a vector containing the diagonal elements of the square matrix ``m``.
.. function:: cw_mul(x: Vector[Any,Scalar], y: Vector[Any,Scalar]) -> Vector[Any,Scalar]
Component-wise multiplication of two 2D vectors.
.. function:: cw_mul(x: Matrix[Any,Any,Scalar], y: Matrix[Any,Any,Scalar]) -> Matrix[Any,Any,Scalar]
:noindex:
:nocontentsentry:
Component-wise multiplication of two 2D vectors.
.. function:: cw_div(x: Vector[Any,Scalar], y: Vector[Any,Scalar]) -> Vector[Any,Scalar]
Component-wise division of two 2D vectors.
.. function:: cw_div(x: Matrix[Any,Any,Scalar], y: Matrix[Any,Any,Scalar]) -> Matrix[Any,Any,Scalar]
:noindex:
:nocontentsentry:
Component-wise division of two 2D vectors.
.. function:: vector(w: Vector[3,Float], v: Vector[3,Float])
Construct a 6D screw vector from two 3D vectors.
.. function:: vector(*arg_types: Scalar, length: int32, dtype: Scalar) -> Vector[Any,Scalar]
:noindex:
:nocontentsentry:
Construct a vector of with given length and dtype.
.. function:: matrix(pos: Vector[3,Float], rot: Quaternion[Float], scale: Vector[3,Float]) -> Matrix[Any,Any,Float]
Construct a 4x4 transformation matrix that applies the transformations as
Translation(pos)*Rotation(rot)*Scale(scale) when applied to column vectors, i.e.: y = (TRS)*x
.. function:: matrix(*arg_types: Scalar, shape: Tuple[int, int], dtype: Scalar) -> Matrix[Any,Any,Scalar]
:noindex:
:nocontentsentry:
Construct a matrix. If the positional ``arg_types`` are not given, then matrix will be zero-initialized.
.. function:: identity(n: int32, dtype: Scalar) -> Matrix[Any,Any,Scalar]
Create an identity matrix with shape=(n,n) with the type given by ``dtype``.
.. function:: svd3(A: Matrix[3,3,Float], U: Matrix[3,3,Float], sigma: Vector[3,Float], V: Matrix[3,3,Scalar]) -> None
Compute the SVD of a 3x3 matrix ``A``. The singular values are returned in ``sigma``,
while the left and right basis vectors are returned in ``U`` and ``V``.
.. function:: qr3(A: Matrix[3,3,Float], Q: Matrix[3,3,Float], R: Matrix[3,3,Float]) -> None
Compute the QR decomposition of a 3x3 matrix ``A``. The orthogonal matrix is returned in ``Q``,
while the upper triangular matrix is returned in ``R``.
.. function:: eig3(A: Matrix[3,3,Float], Q: Matrix[3,3,Float], d: Vector[3,Float]) -> None
Compute the eigendecomposition of a 3x3 matrix ``A``. The eigenvectors are returned as the columns of ``Q``,
while the corresponding eigenvalues are returned in ``d``.
Other
---------------
.. function:: lower_bound(arr: Array[Scalar], value: Scalar) -> int
Search a sorted array ``arr`` for the closest element greater than or equal to ``value``.
.. function:: lower_bound(arr: Array[Scalar], arr_begin: int32, arr_end: int32, value: Scalar) -> int
:noindex:
:nocontentsentry:
Search a sorted array ``arr`` in the range [arr_begin, arr_end) for the closest element greater than or equal to ``value``.
Quaternion Math
---------------
.. function:: quaternion() -> Quaternion[Float]
Construct a zero-initialized quaternion. Quaternions are laid out as
[ix, iy, iz, r], where ix, iy, iz are the imaginary part, and r the real part.
.. function:: quaternion(x: Float, y: Float, z: Float, w: Float) -> Quaternion[Float]
:noindex:
:nocontentsentry:
Create a quaternion using the supplied components (type inferred from component type).
.. function:: quaternion(i: Vector[3,Float], r: Float) -> Quaternion[Float]
:noindex:
:nocontentsentry:
Create a quaternion using the supplied vector/scalar (type inferred from scalar type).
.. function:: quaternion(q: Quaternion[Float])
:noindex:
:nocontentsentry:
Construct a quaternion of type dtype from another quaternion of a different dtype.
.. function:: quat_identity() -> quatf
Construct an identity quaternion with zero imaginary part and real part of 1.0
.. function:: quat_from_axis_angle(axis: Vector[3,Float], angle: Float) -> Quaternion[Scalar]
Construct a quaternion representing a rotation of angle radians around the given axis.
.. function:: quat_to_axis_angle(q: Quaternion[Float], axis: Vector[3,Float], angle: Float) -> None
Extract the rotation axis and angle radians a quaternion represents.
.. function:: quat_from_matrix(m: Matrix[3,3,Float]) -> Quaternion[Scalar]
Construct a quaternion from a 3x3 matrix.
.. function:: quat_rpy(roll: Float, pitch: Float, yaw: Float) -> Quaternion[Scalar]
Construct a quaternion representing a combined roll (z), pitch (x), yaw rotations (y) in radians.
.. function:: quat_inverse(q: Quaternion[Float]) -> Quaternion[Scalar]
Compute quaternion conjugate.
.. function:: quat_rotate(q: Quaternion[Float], p: Vector[3,Float]) -> Vector[3,Scalar]
Rotate a vector by a quaternion.
.. function:: quat_rotate_inv(q: Quaternion[Float], p: Vector[3,Float]) -> Vector[3,Scalar]
Rotate a vector by the inverse of a quaternion.
.. function:: quat_slerp(q0: Quaternion[Float], q1: Quaternion[Float], t: Float) -> Quaternion[Scalar]
Linearly interpolate between two quaternions.
.. function:: quat_to_matrix(q: Quaternion[Float]) -> Matrix[3,3,Scalar]
Convert a quaternion to a 3x3 rotation matrix.
Transformations
---------------
.. function:: transformation(p: Vector[3,Float], q: Quaternion[Float]) -> Transformation[Scalar]
Construct a rigid-body transformation with translation part ``p`` and rotation ``q``.
.. function:: transform_identity() -> transformf
Construct an identity transform with zero translation and identity rotation.
.. function:: transform_get_translation(t: Transformation[Float]) -> Vector[3,Scalar]
Return the translational part of a transform ``t``.
.. function:: transform_get_rotation(t: Transformation[Float]) -> Quaternion[Scalar]
Return the rotational part of a transform ``t``.
.. function:: transform_multiply(a: Transformation[Float], b: Transformation[Float]) -> Transformation[Scalar]
Multiply two rigid body transformations together.
.. function:: transform_point(t: Transformation[Scalar], p: Vector[3,Scalar]) -> Vector[3,Scalar]
Apply the transform to a point ``p`` treating the homogenous coordinate as w=1 (translation and rotation).
.. function:: transform_point(m: Matrix[4,4,Scalar], p: Vector[3,Scalar]) -> Vector[3,Scalar]
:noindex:
:nocontentsentry:
Apply the transform to a point ``p`` treating the homogenous coordinate as w=1.
The transformation is applied treating ``p`` as a column vector, e.g.: ``y = M*p``.
Note this is in contrast to some libraries, notably USD, which applies transforms to row vectors, ``y^T = p^T*M^T``.
If the transform is coming from a library that uses row-vectors, then users should transpose the transformation
matrix before calling this method.
.. function:: transform_vector(t: Transformation[Scalar], v: Vector[3,Scalar]) -> Vector[3,Scalar]
Apply the transform to a vector ``v`` treating the homogenous coordinate as w=0 (rotation only).
.. function:: transform_vector(m: Matrix[4,4,Scalar], v: Vector[3,Scalar]) -> Vector[3,Scalar]
:noindex:
:nocontentsentry:
Apply the transform to a vector ``v`` treating the homogenous coordinate as w=0.
The transformation is applied treating ``v`` as a column vector, e.g.: ``y = M*v``
note this is in contrast to some libraries, notably USD, which applies transforms to row vectors, ``y^T = v^T*M^T``.
If the transform is coming from a library that uses row-vectors, then users should transpose the transformation
matrix before calling this method.
.. function:: transform_inverse(t: Transformation[Float]) -> Transformation[Float]
Compute the inverse of the transformation ``t``.
Spatial Math
---------------
.. function:: spatial_adjoint(r: Matrix[3,3,Float], s: Matrix[3,3,Float]) -> Matrix[6,6,Scalar]
Construct a 6x6 spatial inertial matrix from two 3x3 diagonal blocks.
.. function:: spatial_dot(a: Vector[6,Float], b: Vector[6,Float]) -> Scalar
Compute the dot product of two 6D screw vectors.
.. function:: spatial_cross(a: Vector[6,Float], b: Vector[6,Float]) -> Vector[6,Float]
Compute the cross product of two 6D screw vectors.
.. function:: spatial_cross_dual(a: Vector[6,Float], b: Vector[6,Float]) -> Vector[6,Float]
Compute the dual cross product of two 6D screw vectors.
.. function:: spatial_top(a: Vector[6,Float])
Return the top (first) part of a 6D screw vector.
.. function:: spatial_bottom(a: Vector[6,Float])
Return the bottom (second) part of a 6D screw vector.
.. function:: spatial_jacobian(S: Array[Vector[6,Float]], joint_parents: Array[int32], joint_qd_start: Array[int32], joint_start: int32, joint_count: int32, J_start: int32, J_out: Array[Float]) -> None
.. function:: spatial_mass(I_s: Array[Matrix[6,6,Float]], joint_start: int32, joint_count: int32, M_start: int32, M: Array[Float]) -> None
Utility
---------------
.. function:: mlp(weights: Array[float32], bias: Array[float32], activation: Callable, index: int32, x: Array[float32], out: Array[float32]) -> None
Evaluate a multi-layer perceptron (MLP) layer in the form: ``out = act(weights*x + bias)``.
:param weights: A layer's network weights with dimensions ``(m, n)``.
:param bias: An array with dimensions ``(n)``.
:param activation: A ``wp.func`` function that takes a single scalar float as input and returns a scalar float as output
:param index: The batch item to process, typically each thread will process one item in the batch, in which case
index should be ``wp.tid()``
:param x: The feature matrix with dimensions ``(n, b)``
:param out: The network output with dimensions ``(m, b)``
:note: Feature and output matrices are transposed compared to some other frameworks such as PyTorch.
All matrices are assumed to be stored in flattened row-major memory layout (NumPy default).
.. function:: printf() -> None
Allows printing formatted strings using C-style format specifiers.
.. function:: print(value: Any) -> None
Print variable to stdout
.. function:: breakpoint() -> None
Debugger breakpoint
.. function:: tid() -> int
Return the current thread index for a 1D kernel launch. Note that this is the *global* index of the thread in the range [0, dim)
where dim is the parameter passed to kernel launch. This function may not be called from user-defined Warp functions.
.. function:: tid() -> Tuple[int, int]
:noindex:
:nocontentsentry:
Return the current thread indices for a 2D kernel launch. Use ``i,j = wp.tid()`` syntax to retrieve the
coordinates inside the kernel thread grid. This function may not be called from user-defined Warp functions.
.. function:: tid() -> Tuple[int, int, int]
:noindex:
:nocontentsentry:
Return the current thread indices for a 3D kernel launch. Use ``i,j,k = wp.tid()`` syntax to retrieve the
coordinates inside the kernel thread grid. This function may not be called from user-defined Warp functions.
.. function:: tid() -> Tuple[int, int, int, int]
:noindex:
:nocontentsentry:
Return the current thread indices for a 4D kernel launch. Use ``i,j,k,l = wp.tid()`` syntax to retrieve the
coordinates inside the kernel thread grid. This function may not be called from user-defined Warp functions.
.. function:: select(cond: bool, arg1: Any, arg2: Any)
Select between two arguments, if ``cond`` is ``False`` then return ``arg1``, otherwise return ``arg2``
.. function:: select(cond: bool, arg1: Any, arg2: Any)
:noindex:
:nocontentsentry:
Select between two arguments, if ``cond`` is ``False`` then return ``arg1``, otherwise return ``arg2``
.. function:: select(cond: int8, arg1: Any, arg2: Any)
:noindex:
:nocontentsentry:
Select between two arguments, if ``cond`` is ``False`` then return ``arg1``, otherwise return ``arg2``
.. function:: select(cond: uint8, arg1: Any, arg2: Any)
:noindex:
:nocontentsentry:
Select between two arguments, if ``cond`` is ``False`` then return ``arg1``, otherwise return ``arg2``
.. function:: select(cond: int16, arg1: Any, arg2: Any)
:noindex:
:nocontentsentry:
Select between two arguments, if ``cond`` is ``False`` then return ``arg1``, otherwise return ``arg2``
.. function:: select(cond: uint16, arg1: Any, arg2: Any)
:noindex:
:nocontentsentry:
Select between two arguments, if ``cond`` is ``False`` then return ``arg1``, otherwise return ``arg2``
.. function:: select(cond: int32, arg1: Any, arg2: Any)
:noindex:
:nocontentsentry:
Select between two arguments, if ``cond`` is ``False`` then return ``arg1``, otherwise return ``arg2``
.. function:: select(cond: uint32, arg1: Any, arg2: Any)
:noindex:
:nocontentsentry:
Select between two arguments, if ``cond`` is ``False`` then return ``arg1``, otherwise return ``arg2``
.. function:: select(cond: int64, arg1: Any, arg2: Any)
:noindex:
:nocontentsentry:
Select between two arguments, if ``cond`` is ``False`` then return ``arg1``, otherwise return ``arg2``
.. function:: select(cond: uint64, arg1: Any, arg2: Any)
:noindex:
:nocontentsentry:
Select between two arguments, if ``cond`` is ``False`` then return ``arg1``, otherwise return ``arg2``
.. function:: select(arr: Array[Any], arg1: Any, arg2: Any)
:noindex:
:nocontentsentry:
Select between two arguments, if ``arr`` is null then return ``arg1``, otherwise return ``arg2``
.. function:: atomic_add(a: Array[Any], i: int32, value: Any)
Atomically add ``value`` onto ``a[i]``.
.. function:: atomic_add(a: Array[Any], i: int32, j: int32, value: Any)
:noindex:
:nocontentsentry:
Atomically add ``value`` onto ``a[i,j]``.
.. function:: atomic_add(a: Array[Any], i: int32, j: int32, k: int32, value: Any)
:noindex:
:nocontentsentry:
Atomically add ``value`` onto ``a[i,j,k]``.
.. function:: atomic_add(a: Array[Any], i: int32, j: int32, k: int32, l: int32, value: Any)
:noindex:
:nocontentsentry:
Atomically add ``value`` onto ``a[i,j,k,l]``.
.. function:: atomic_add(a: FabricArray[Any], i: int32, value: Any)
:noindex:
:nocontentsentry:
Atomically add ``value`` onto ``a[i]``.
.. function:: atomic_add(a: FabricArray[Any], i: int32, j: int32, value: Any)
:noindex:
:nocontentsentry:
Atomically add ``value`` onto ``a[i,j]``.
.. function:: atomic_add(a: FabricArray[Any], i: int32, j: int32, k: int32, value: Any)
:noindex:
:nocontentsentry:
Atomically add ``value`` onto ``a[i,j,k]``.
.. function:: atomic_add(a: FabricArray[Any], i: int32, j: int32, k: int32, l: int32, value: Any)
:noindex:
:nocontentsentry:
Atomically add ``value`` onto ``a[i,j,k,l]``.
.. function:: atomic_add(a: IndexedFabricArray[Any], i: int32, value: Any)
:noindex:
:nocontentsentry:
Atomically add ``value`` onto ``a[i]``.
.. function:: atomic_add(a: IndexedFabricArray[Any], i: int32, j: int32, value: Any)
:noindex:
:nocontentsentry:
Atomically add ``value`` onto ``a[i,j]``.
.. function:: atomic_add(a: IndexedFabricArray[Any], i: int32, j: int32, k: int32, value: Any)
:noindex:
:nocontentsentry:
Atomically add ``value`` onto ``a[i,j,k]``.
.. function:: atomic_add(a: IndexedFabricArray[Any], i: int32, j: int32, k: int32, l: int32, value: Any)
:noindex:
:nocontentsentry:
Atomically add ``value`` onto ``a[i,j,k,l]``.
.. function:: atomic_sub(a: Array[Any], i: int32, value: Any)
Atomically subtract ``value`` onto ``a[i]``.
.. function:: atomic_sub(a: Array[Any], i: int32, j: int32, value: Any)
:noindex:
:nocontentsentry:
Atomically subtract ``value`` onto ``a[i,j]``.
.. function:: atomic_sub(a: Array[Any], i: int32, j: int32, k: int32, value: Any)
:noindex:
:nocontentsentry:
Atomically subtract ``value`` onto ``a[i,j,k]``.
.. function:: atomic_sub(a: Array[Any], i: int32, j: int32, k: int32, l: int32, value: Any)
:noindex:
:nocontentsentry:
Atomically subtract ``value`` onto ``a[i,j,k,l]``.
.. function:: atomic_sub(a: FabricArray[Any], i: int32, value: Any)
:noindex:
:nocontentsentry:
Atomically subtract ``value`` onto ``a[i]``.
.. function:: atomic_sub(a: FabricArray[Any], i: int32, j: int32, value: Any)
:noindex:
:nocontentsentry:
Atomically subtract ``value`` onto ``a[i,j]``.
.. function:: atomic_sub(a: FabricArray[Any], i: int32, j: int32, k: int32, value: Any)
:noindex:
:nocontentsentry:
Atomically subtract ``value`` onto ``a[i,j,k]``.
.. function:: atomic_sub(a: FabricArray[Any], i: int32, j: int32, k: int32, l: int32, value: Any)
:noindex:
:nocontentsentry:
Atomically subtract ``value`` onto ``a[i,j,k,l]``.
.. function:: atomic_sub(a: IndexedFabricArray[Any], i: int32, value: Any)
:noindex:
:nocontentsentry:
Atomically subtract ``value`` onto ``a[i]``.
.. function:: atomic_sub(a: IndexedFabricArray[Any], i: int32, j: int32, value: Any)
:noindex:
:nocontentsentry:
Atomically subtract ``value`` onto ``a[i,j]``.
.. function:: atomic_sub(a: IndexedFabricArray[Any], i: int32, j: int32, k: int32, value: Any)
:noindex:
:nocontentsentry:
Atomically subtract ``value`` onto ``a[i,j,k]``.
.. function:: atomic_sub(a: IndexedFabricArray[Any], i: int32, j: int32, k: int32, l: int32, value: Any)
:noindex:
:nocontentsentry:
Atomically subtract ``value`` onto ``a[i,j,k,l]``.
.. function:: atomic_min(a: Array[Any], i: int32, value: Any)
Compute the minimum of ``value`` and ``a[i]`` and atomically update the array.
Note that for vectors and matrices the operation is only atomic on a per-component basis.
.. function:: atomic_min(a: Array[Any], i: int32, j: int32, value: Any)
:noindex:
:nocontentsentry:
Compute the minimum of ``value`` and ``a[i,j]`` and atomically update the array.
Note that for vectors and matrices the operation is only atomic on a per-component basis.
.. function:: atomic_min(a: Array[Any], i: int32, j: int32, k: int32, value: Any)
:noindex:
:nocontentsentry:
Compute the minimum of ``value`` and ``a[i,j,k]`` and atomically update the array.
Note that for vectors and matrices the operation is only atomic on a per-component basis.
.. function:: atomic_min(a: Array[Any], i: int32, j: int32, k: int32, l: int32, value: Any)
:noindex:
:nocontentsentry:
Compute the minimum of ``value`` and ``a[i,j,k,l]`` and atomically update the array.
Note that for vectors and matrices the operation is only atomic on a per-component basis.
.. function:: atomic_min(a: FabricArray[Any], i: int32, value: Any)
:noindex:
:nocontentsentry:
Compute the minimum of ``value`` and ``a[i]`` and atomically update the array.
Note that for vectors and matrices the operation is only atomic on a per-component basis.
.. function:: atomic_min(a: FabricArray[Any], i: int32, j: int32, value: Any)
:noindex:
:nocontentsentry:
Compute the minimum of ``value`` and ``a[i,j]`` and atomically update the array.
Note that for vectors and matrices the operation is only atomic on a per-component basis.
.. function:: atomic_min(a: FabricArray[Any], i: int32, j: int32, k: int32, value: Any)
:noindex:
:nocontentsentry:
Compute the minimum of ``value`` and ``a[i,j,k]`` and atomically update the array.
Note that for vectors and matrices the operation is only atomic on a per-component basis.
.. function:: atomic_min(a: FabricArray[Any], i: int32, j: int32, k: int32, l: int32, value: Any)
:noindex:
:nocontentsentry:
Compute the minimum of ``value`` and ``a[i,j,k,l]`` and atomically update the array.
Note that for vectors and matrices the operation is only atomic on a per-component basis.
.. function:: atomic_min(a: IndexedFabricArray[Any], i: int32, value: Any)
:noindex:
:nocontentsentry:
Compute the minimum of ``value`` and ``a[i]`` and atomically update the array.
Note that for vectors and matrices the operation is only atomic on a per-component basis.
.. function:: atomic_min(a: IndexedFabricArray[Any], i: int32, j: int32, value: Any)
:noindex:
:nocontentsentry:
Compute the minimum of ``value`` and ``a[i,j]`` and atomically update the array.
Note that for vectors and matrices the operation is only atomic on a per-component basis.
.. function:: atomic_min(a: IndexedFabricArray[Any], i: int32, j: int32, k: int32, value: Any)
:noindex:
:nocontentsentry:
Compute the minimum of ``value`` and ``a[i,j,k]`` and atomically update the array.
Note that for vectors and matrices the operation is only atomic on a per-component basis.
.. function:: atomic_min(a: IndexedFabricArray[Any], i: int32, j: int32, k: int32, l: int32, value: Any)
:noindex:
:nocontentsentry:
Compute the minimum of ``value`` and ``a[i,j,k,l]`` and atomically update the array.
Note that for vectors and matrices the operation is only atomic on a per-component basis.
.. function:: atomic_max(a: Array[Any], i: int32, value: Any)
Compute the maximum of ``value`` and ``a[i]`` and atomically update the array.
Note that for vectors and matrices the operation is only atomic on a per-component basis.
.. function:: atomic_max(a: Array[Any], i: int32, j: int32, value: Any)
:noindex:
:nocontentsentry:
Compute the maximum of ``value`` and ``a[i,j]`` and atomically update the array.
Note that for vectors and matrices the operation is only atomic on a per-component basis.
.. function:: atomic_max(a: Array[Any], i: int32, j: int32, k: int32, value: Any)
:noindex:
:nocontentsentry:
Compute the maximum of ``value`` and ``a[i,j,k]`` and atomically update the array.
Note that for vectors and matrices the operation is only atomic on a per-component basis.
.. function:: atomic_max(a: Array[Any], i: int32, j: int32, k: int32, l: int32, value: Any)
:noindex:
:nocontentsentry:
Compute the maximum of ``value`` and ``a[i,j,k,l]`` and atomically update the array.
Note that for vectors and matrices the operation is only atomic on a per-component basis.
.. function:: atomic_max(a: FabricArray[Any], i: int32, value: Any)
:noindex:
:nocontentsentry:
Compute the maximum of ``value`` and ``a[i]`` and atomically update the array.
Note that for vectors and matrices the operation is only atomic on a per-component basis.
.. function:: atomic_max(a: FabricArray[Any], i: int32, j: int32, value: Any)
:noindex:
:nocontentsentry:
Compute the maximum of ``value`` and ``a[i,j]`` and atomically update the array.
Note that for vectors and matrices the operation is only atomic on a per-component basis.
.. function:: atomic_max(a: FabricArray[Any], i: int32, j: int32, k: int32, value: Any)
:noindex:
:nocontentsentry:
Compute the maximum of ``value`` and ``a[i,j,k]`` and atomically update the array.
Note that for vectors and matrices the operation is only atomic on a per-component basis.
.. function:: atomic_max(a: FabricArray[Any], i: int32, j: int32, k: int32, l: int32, value: Any)
:noindex:
:nocontentsentry:
Compute the maximum of ``value`` and ``a[i,j,k,l]`` and atomically update the array.
Note that for vectors and matrices the operation is only atomic on a per-component basis.
.. function:: atomic_max(a: IndexedFabricArray[Any], i: int32, value: Any)
:noindex:
:nocontentsentry:
Compute the maximum of ``value`` and ``a[i]`` and atomically update the array.
Note that for vectors and matrices the operation is only atomic on a per-component basis.
.. function:: atomic_max(a: IndexedFabricArray[Any], i: int32, j: int32, value: Any)
:noindex:
:nocontentsentry:
Compute the maximum of ``value`` and ``a[i,j]`` and atomically update the array.
Note that for vectors and matrices the operation is only atomic on a per-component basis.
.. function:: atomic_max(a: IndexedFabricArray[Any], i: int32, j: int32, k: int32, value: Any)
:noindex:
:nocontentsentry:
Compute the maximum of ``value`` and ``a[i,j,k]`` and atomically update the array.
Note that for vectors and matrices the operation is only atomic on a per-component basis.
.. function:: atomic_max(a: IndexedFabricArray[Any], i: int32, j: int32, k: int32, l: int32, value: Any)
:noindex:
:nocontentsentry:
Compute the maximum of ``value`` and ``a[i,j,k,l]`` and atomically update the array.
Note that for vectors and matrices the operation is only atomic on a per-component basis.
.. function:: lerp(a: Float, b: Float, t: Float) -> Float
Linearly interpolate two values ``a`` and ``b`` using factor ``t``, computed as ``a*(1-t) + b*t``
.. function:: lerp(a: Vector[Any,Float], b: Vector[Any,Float], t: Float) -> Vector[Any,Float]
:noindex:
:nocontentsentry:
Linearly interpolate two values ``a`` and ``b`` using factor ``t``, computed as ``a*(1-t) + b*t``
.. function:: lerp(a: Matrix[Any,Any,Float], b: Matrix[Any,Any,Float], t: Float) -> Matrix[Any,Any,Float]
:noindex:
:nocontentsentry:
Linearly interpolate two values ``a`` and ``b`` using factor ``t``, computed as ``a*(1-t) + b*t``
.. function:: lerp(a: Quaternion[Float], b: Quaternion[Float], t: Float) -> Quaternion[Float]
:noindex:
:nocontentsentry:
Linearly interpolate two values ``a`` and ``b`` using factor ``t``, computed as ``a*(1-t) + b*t``
.. function:: lerp(a: Transformation[Float], b: Transformation[Float], t: Float) -> Transformation[Float]
:noindex:
:nocontentsentry:
Linearly interpolate two values ``a`` and ``b`` using factor ``t``, computed as ``a*(1-t) + b*t``
.. function:: smoothstep(edge0: Float, edge1: Float, x: Float) -> Float
Smoothly interpolate between two values ``edge0`` and ``edge1`` using a factor ``x``,
and return a result between 0 and 1 using a cubic Hermite interpolation after clamping.
.. function:: expect_near(arg1: Float, arg2: Float, tolerance: Float) -> None
Prints an error to stdout if ``arg1`` and ``arg2`` are not closer than tolerance in magnitude
.. function:: expect_near(arg1: vec3f, arg2: vec3f, tolerance: float32) -> None
:noindex:
:nocontentsentry:
Prints an error to stdout if any element of ``arg1`` and ``arg2`` are not closer than tolerance in magnitude
Geometry
---------------
.. function:: bvh_query_aabb(id: uint64, lower: vec3f, upper: vec3f) -> bvh_query_t
Construct an axis-aligned bounding box query against a BVH object. This query can be used to iterate over all bounds
inside a BVH.
:param id: The BVH identifier
:param lower: The lower bound of the bounding box in BVH space
:param upper: The upper bound of the bounding box in BVH space
.. function:: bvh_query_ray(id: uint64, start: vec3f, dir: vec3f) -> bvh_query_t
Construct a ray query against a BVH object. This query can be used to iterate over all bounds
that intersect the ray.
:param id: The BVH identifier
:param start: The start of the ray in BVH space
:param dir: The direction of the ray in BVH space
.. function:: bvh_query_next(query: bvh_query_t, index: int32) -> bool
Move to the next bound returned by the query.
The index of the current bound is stored in ``index``, returns ``False`` if there are no more overlapping bound.
.. function:: mesh_query_point(id: uint64, point: vec3f, max_dist: float32) -> mesh_query_point_t
Computes the closest point on the :class:`Mesh` with identifier ``id`` to the given ``point`` in space.
Identifies the sign of the distance using additional ray-casts to determine if the point is inside or outside.
This method is relatively robust, but does increase computational cost.
See below for additional sign determination methods.
:param id: The mesh identifier
:param point: The point in space to query
:param max_dist: Mesh faces above this distance will not be considered by the query
.. function:: mesh_query_point_no_sign(id: uint64, point: vec3f, max_dist: float32) -> mesh_query_point_t
Computes the closest point on the :class:`Mesh` with identifier ``id`` to the given ``point`` in space.
This method does not compute the sign of the point (inside/outside) which makes it faster than other point query methods.
:param id: The mesh identifier
:param point: The point in space to query
:param max_dist: Mesh faces above this distance will not be considered by the query
.. function:: mesh_query_furthest_point_no_sign(id: uint64, point: vec3f, min_dist: float32) -> mesh_query_point_t
Computes the furthest point on the mesh with identifier `id` to the given point in space.
This method does not compute the sign of the point (inside/outside).
:param id: The mesh identifier
:param point: The point in space to query
:param min_dist: Mesh faces below this distance will not be considered by the query
.. function:: mesh_query_point_sign_normal(id: uint64, point: vec3f, max_dist: float32, epsilon: float32) -> mesh_query_point_t
Computes the closest point on the :class:`Mesh` with identifier ``id`` to the given ``point`` in space.
Identifies the sign of the distance (inside/outside) using the angle-weighted pseudo normal.
This approach to sign determination is robust for well conditioned meshes that are watertight and non-self intersecting.
It is also comparatively fast to compute.
:param id: The mesh identifier
:param point: The point in space to query
:param max_dist: Mesh faces above this distance will not be considered by the query
:param epsilon: Epsilon treating distance values as equal, when locating the minimum distance vertex/face/edge, as a
fraction of the average edge length, also for treating closest point as being on edge/vertex default 1e-3
.. function:: mesh_query_point_sign_winding_number(id: uint64, point: vec3f, max_dist: float32, accuracy: float32, threshold: float32) -> mesh_query_point_t
Computes the closest point on the :class:`Mesh` with identifier ``id`` to the given point in space.
Identifies the sign using the winding number of the mesh relative to the query point. This method of sign determination is robust for poorly conditioned meshes
and provides a smooth approximation to sign even when the mesh is not watertight. This method is the most robust and accurate of the sign determination meshes
but also the most expensive.
.. note:: The :class:`Mesh` object must be constructed with ``support_winding_number=True`` for this method to return correct results.
:param id: The mesh identifier
:param point: The point in space to query
:param max_dist: Mesh faces above this distance will not be considered by the query
:param accuracy: Accuracy for computing the winding number with fast winding number method utilizing second-order dipole approximation, default 2.0
:param threshold: The threshold of the winding number to be considered inside, default 0.5
.. function:: mesh_query_ray(id: uint64, start: vec3f, dir: vec3f, max_t: float32) -> mesh_query_ray_t
Computes the closest ray hit on the :class:`Mesh` with identifier ``id``.
:param id: The mesh identifier
:param start: The start point of the ray
:param dir: The ray direction (should be normalized)
:param max_t: The maximum distance along the ray to check for intersections
.. function:: mesh_query_aabb(id: uint64, lower: vec3f, upper: vec3f) -> mesh_query_aabb_t
Construct an axis-aligned bounding box query against a :class:`Mesh`.
This query can be used to iterate over all triangles inside a volume.
:param id: The mesh identifier
:param lower: The lower bound of the bounding box in mesh space
:param upper: The upper bound of the bounding box in mesh space
.. function:: mesh_query_aabb_next(query: mesh_query_aabb_t, index: int32) -> bool
Move to the next triangle overlapping the query bounding box.
The index of the current face is stored in ``index``, returns ``False`` if there are no more overlapping triangles.
.. function:: mesh_eval_position(id: uint64, face: int32, bary_u: float32, bary_v: float32) -> vec3f
Evaluates the position on the :class:`Mesh` given a face index and barycentric coordinates.
.. function:: mesh_eval_velocity(id: uint64, face: int32, bary_u: float32, bary_v: float32) -> vec3f
Evaluates the velocity on the :class:`Mesh` given a face index and barycentric coordinates.
.. function:: hash_grid_query(id: uint64, point: vec3f, max_dist: float32) -> hash_grid_query_t
Construct a point query against a :class:`HashGrid`. This query can be used to iterate over all neighboring points within a fixed radius from the query point.
.. function:: hash_grid_query_next(query: hash_grid_query_t, index: int32) -> bool
Move to the next point in the hash grid query. The index of the current neighbor is stored in ``index``, returns ``False``
if there are no more neighbors.
.. function:: hash_grid_point_id(id: uint64, index: int32) -> int
Return the index of a point in the :class:`HashGrid`. This can be used to reorder threads such that grid
traversal occurs in a spatially coherent order.
Returns -1 if the :class:`HashGrid` has not been reserved.
.. function:: intersect_tri_tri(v0: vec3f, v1: vec3f, v2: vec3f, u0: vec3f, u1: vec3f, u2: vec3f) -> int
Tests for intersection between two triangles (v0, v1, v2) and (u0, u1, u2) using Moller's method. Returns > 0 if triangles intersect.
.. function:: mesh_get(id: uint64) -> Mesh
Retrieves the mesh given its index. [1]_
.. function:: mesh_eval_face_normal(id: uint64, face: int32) -> vec3f
Evaluates the face normal the mesh given a face index.
.. function:: mesh_get_point(id: uint64, index: int32) -> vec3f
Returns the point of the mesh given a index.
.. function:: mesh_get_velocity(id: uint64, index: int32) -> vec3f
Returns the velocity of the mesh given a index.
.. function:: mesh_get_index(id: uint64, index: int32) -> int
Returns the point-index of the mesh given a face-vertex index.
.. function:: closest_point_edge_edge(p1: vec3f, q1: vec3f, p2: vec3f, q2: vec3f, epsilon: float32) -> vec3f
Finds the closest points between two edges. Returns barycentric weights to the points on each edge, as well as the closest distance between the edges.
:param p1: First point of first edge
:param q1: Second point of first edge
:param p2: First point of second edge
:param q2: Second point of second edge
:param epsilon: Zero tolerance for determining if points in an edge are degenerate.
:param out: vec3 output containing (s,t,d), where `s` in [0,1] is the barycentric weight for the first edge, `t` is the barycentric weight for the second edge, and `d` is the distance between the two edges at these two closest points.
Volumes
---------------
.. function:: volume_sample_f(id: uint64, uvw: vec3f, sampling_mode: int32) -> float
Sample the volume given by ``id`` at the volume local-space point ``uvw``.
Interpolation should be :attr:`warp.Volume.CLOSEST` or :attr:`wp.Volume.LINEAR.`
.. function:: volume_sample_grad_f(id: uint64, uvw: vec3f, sampling_mode: int32, grad: vec3f) -> float
Sample the volume and its gradient given by ``id`` at the volume local-space point ``uvw``.
Interpolation should be :attr:`warp.Volume.CLOSEST` or :attr:`wp.Volume.LINEAR.`
.. function:: volume_lookup_f(id: uint64, i: int32, j: int32, k: int32) -> float
Returns the value of voxel with coordinates ``i``, ``j``, ``k``.
If the voxel at this index does not exist, this function returns the background value
.. function:: volume_store_f(id: uint64, i: int32, j: int32, k: int32, value: float32) -> None
Store ``value`` at the voxel with coordinates ``i``, ``j``, ``k``.
.. function:: volume_sample_v(id: uint64, uvw: vec3f, sampling_mode: int32) -> vec3f
Sample the vector volume given by ``id`` at the volume local-space point ``uvw``.
Interpolation should be :attr:`warp.Volume.CLOSEST` or :attr:`wp.Volume.LINEAR.`
.. function:: volume_lookup_v(id: uint64, i: int32, j: int32, k: int32) -> vec3f
Returns the vector value of voxel with coordinates ``i``, ``j``, ``k``.
If the voxel at this index does not exist, this function returns the background value.
.. function:: volume_store_v(id: uint64, i: int32, j: int32, k: int32, value: vec3f) -> None
Store ``value`` at the voxel with coordinates ``i``, ``j``, ``k``.
.. function:: volume_sample_i(id: uint64, uvw: vec3f) -> int
Sample the :class:`int32` volume given by ``id`` at the volume local-space point ``uvw``.
.. function:: volume_lookup_i(id: uint64, i: int32, j: int32, k: int32) -> int
Returns the :class:`int32` value of voxel with coordinates ``i``, ``j``, ``k``.
If the voxel at this index does not exist, this function returns the background value.
.. function:: volume_store_i(id: uint64, i: int32, j: int32, k: int32, value: int32) -> None
Store ``value`` at the voxel with coordinates ``i``, ``j``, ``k``.
.. function:: volume_index_to_world(id: uint64, uvw: vec3f) -> vec3f
Transform a point ``uvw`` defined in volume index space to world space given the volume's intrinsic affine transformation.
.. function:: volume_world_to_index(id: uint64, xyz: vec3f) -> vec3f
Transform a point ``xyz`` defined in volume world space to the volume's index space given the volume's intrinsic affine transformation.
.. function:: volume_index_to_world_dir(id: uint64, uvw: vec3f) -> vec3f
Transform a direction ``uvw`` defined in volume index space to world space given the volume's intrinsic affine transformation.
.. function:: volume_world_to_index_dir(id: uint64, xyz: vec3f) -> vec3f
Transform a direction ``xyz`` defined in volume world space to the volume's index space given the volume's intrinsic affine transformation.
Random
---------------
.. function:: rand_init(seed: int32) -> uint32
Initialize a new random number generator given a user-defined seed. Returns a 32-bit integer representing the RNG state.
.. function:: rand_init(seed: int32, offset: int32) -> uint32
:noindex:
:nocontentsentry:
Initialize a new random number generator given a user-defined seed and an offset.
This alternative constructor can be useful in parallel programs, where a kernel as a whole should share a seed,
but each thread should generate uncorrelated values. In this case usage should be ``r = rand_init(seed, tid)``
.. function:: randi(state: uint32) -> int
Return a random integer in the range [0, 2^32).
.. function:: randi(state: uint32, min: int32, max: int32) -> int
:noindex:
:nocontentsentry:
Return a random integer between [min, max).
.. function:: randf(state: uint32) -> float
Return a random float between [0.0, 1.0).
.. function:: randf(state: uint32, min: float32, max: float32) -> float
:noindex:
:nocontentsentry:
Return a random float between [min, max).
.. function:: randn(state: uint32) -> float
Sample a normal distribution.
.. function:: sample_cdf(state: uint32, cdf: Array[float32]) -> int
Inverse-transform sample a cumulative distribution function.
.. function:: sample_triangle(state: uint32) -> vec2f
Uniformly sample a triangle. Returns sample barycentric coordinates.
.. function:: sample_unit_ring(state: uint32) -> vec2f
Uniformly sample a ring in the xy plane.
.. function:: sample_unit_disk(state: uint32) -> vec2f
Uniformly sample a disk in the xy plane.
.. function:: sample_unit_sphere_surface(state: uint32) -> vec3f
Uniformly sample a unit sphere surface.
.. function:: sample_unit_sphere(state: uint32) -> vec3f
Uniformly sample a unit sphere.
.. function:: sample_unit_hemisphere_surface(state: uint32) -> vec3f
Uniformly sample a unit hemisphere surface.
.. function:: sample_unit_hemisphere(state: uint32) -> vec3f
Uniformly sample a unit hemisphere.
.. function:: sample_unit_square(state: uint32) -> vec2f
Uniformly sample a unit square.
.. function:: sample_unit_cube(state: uint32) -> vec3f
Uniformly sample a unit cube.
.. function:: poisson(state: uint32, lam: float32) -> uint32
Generate a random sample from a Poisson distribution.
:param state: RNG state
:param lam: The expected value of the distribution
.. function:: noise(state: uint32, x: float32) -> float
Non-periodic Perlin-style noise in 1D.
.. function:: noise(state: uint32, xy: vec2f) -> float
:noindex:
:nocontentsentry:
Non-periodic Perlin-style noise in 2D.
.. function:: noise(state: uint32, xyz: vec3f) -> float
:noindex:
:nocontentsentry:
Non-periodic Perlin-style noise in 3D.
.. function:: noise(state: uint32, xyzt: vec4f) -> float
:noindex:
:nocontentsentry:
Non-periodic Perlin-style noise in 4D.
.. function:: pnoise(state: uint32, x: float32, px: int32) -> float
Periodic Perlin-style noise in 1D.
.. function:: pnoise(state: uint32, xy: vec2f, px: int32, py: int32) -> float
:noindex:
:nocontentsentry:
Periodic Perlin-style noise in 2D.
.. function:: pnoise(state: uint32, xyz: vec3f, px: int32, py: int32, pz: int32) -> float
:noindex:
:nocontentsentry:
Periodic Perlin-style noise in 3D.
.. function:: pnoise(state: uint32, xyzt: vec4f, px: int32, py: int32, pz: int32, pt: int32) -> float
:noindex:
:nocontentsentry:
Periodic Perlin-style noise in 4D.
.. function:: curlnoise(state: uint32, xy: vec2f, octaves: uint32, lacunarity: float32, gain: float32) -> vec2f
Divergence-free vector field based on the gradient of a Perlin noise function. [1]_
.. function:: curlnoise(state: uint32, xyz: vec3f, octaves: uint32, lacunarity: float32, gain: float32) -> vec3f
:noindex:
:nocontentsentry:
Divergence-free vector field based on the curl of three Perlin noise functions. [1]_
.. function:: curlnoise(state: uint32, xyzt: vec4f, octaves: uint32, lacunarity: float32, gain: float32) -> vec3f
:noindex:
:nocontentsentry:
Divergence-free vector field based on the curl of three Perlin noise functions. [1]_
Operators
---------------
.. function:: add(x: Scalar, y: Scalar) -> Scalar
.. function:: add(x: Vector[Any,Scalar], y: Vector[Any,Scalar]) -> Vector[Any,Scalar]
:noindex:
:nocontentsentry:
.. function:: add(x: Quaternion[Scalar], y: Quaternion[Scalar]) -> Quaternion[Scalar]
:noindex:
:nocontentsentry:
.. function:: add(x: Matrix[Any,Any,Scalar], y: Matrix[Any,Any,Scalar]) -> Matrix[Any,Any,Scalar]
:noindex:
:nocontentsentry:
.. function:: add(x: Transformation[Scalar], y: Transformation[Scalar]) -> Transformation[Scalar]
:noindex:
:nocontentsentry:
.. function:: sub(x: Scalar, y: Scalar) -> Scalar
.. function:: sub(x: Vector[Any,Scalar], y: Vector[Any,Scalar]) -> Vector[Any,Scalar]
:noindex:
:nocontentsentry:
.. function:: sub(x: Matrix[Any,Any,Scalar], y: Matrix[Any,Any,Scalar]) -> Matrix[Any,Any,Scalar]
:noindex:
:nocontentsentry:
.. function:: sub(x: Quaternion[Scalar], y: Quaternion[Scalar]) -> Quaternion[Scalar]
:noindex:
:nocontentsentry:
.. function:: sub(x: Transformation[Scalar], y: Transformation[Scalar]) -> Transformation[Scalar]
:noindex:
:nocontentsentry:
.. function:: bit_and(x: Int, y: Int) -> Int
.. function:: bit_or(x: Int, y: Int) -> Int
.. function:: bit_xor(x: Int, y: Int) -> Int
.. function:: lshift(x: Int, y: Int) -> Int
.. function:: rshift(x: Int, y: Int) -> Int
.. function:: invert(x: Int) -> Int
.. function:: mul(x: Scalar, y: Scalar) -> Scalar
.. function:: mul(x: Vector[Any,Scalar], y: Scalar) -> Vector[Any,Scalar]
:noindex:
:nocontentsentry:
.. function:: mul(x: Scalar, y: Vector[Any,Scalar]) -> Vector[Any,Scalar]
:noindex:
:nocontentsentry:
.. function:: mul(x: Quaternion[Scalar], y: Scalar) -> Quaternion[Scalar]
:noindex:
:nocontentsentry:
.. function:: mul(x: Scalar, y: Quaternion[Scalar]) -> Quaternion[Scalar]
:noindex:
:nocontentsentry:
.. function:: mul(x: Quaternion[Scalar], y: Quaternion[Scalar]) -> Quaternion[Scalar]
:noindex:
:nocontentsentry:
.. function:: mul(x: Scalar, y: Matrix[Any,Any,Scalar]) -> Matrix[Any,Any,Scalar]
:noindex:
:nocontentsentry:
.. function:: mul(x: Matrix[Any,Any,Scalar], y: Scalar) -> Matrix[Any,Any,Scalar]
:noindex:
:nocontentsentry:
.. function:: mul(x: Matrix[Any,Any,Scalar], y: Vector[Any,Scalar]) -> Vector[Any,Scalar]
:noindex:
:nocontentsentry:
.. function:: mul(x: Vector[Any,Scalar], y: Matrix[Any,Any,Scalar]) -> Vector[Any,Scalar]
:noindex:
:nocontentsentry:
.. function:: mul(x: Matrix[Any,Any,Scalar], y: Matrix[Any,Any,Scalar])
:noindex:
:nocontentsentry:
.. function:: mul(x: Transformation[Scalar], y: Transformation[Scalar]) -> Transformation[Scalar]
:noindex:
:nocontentsentry:
.. function:: mul(x: Scalar, y: Transformation[Scalar]) -> Transformation[Scalar]
:noindex:
:nocontentsentry:
.. function:: mul(x: Transformation[Scalar], y: Scalar) -> Transformation[Scalar]
:noindex:
:nocontentsentry:
.. function:: mod(x: Scalar, y: Scalar) -> Scalar
.. function:: div(x: Scalar, y: Scalar) -> Scalar
.. function:: div(x: Vector[Any,Scalar], y: Scalar) -> Vector[Any,Scalar]
:noindex:
:nocontentsentry:
.. function:: div(x: Scalar, y: Vector[Any,Scalar]) -> Vector[Any,Scalar]
:noindex:
:nocontentsentry:
.. function:: div(x: Matrix[Any,Any,Scalar], y: Scalar) -> Matrix[Any,Any,Scalar]
:noindex:
:nocontentsentry:
.. function:: div(x: Scalar, y: Matrix[Any,Any,Scalar]) -> Matrix[Any,Any,Scalar]
:noindex:
:nocontentsentry:
.. function:: div(x: Quaternion[Scalar], y: Scalar) -> Quaternion[Scalar]
:noindex:
:nocontentsentry:
.. function:: div(x: Scalar, y: Quaternion[Scalar]) -> Quaternion[Scalar]
:noindex:
:nocontentsentry:
.. function:: floordiv(x: Scalar, y: Scalar) -> Scalar
.. function:: pos(x: Scalar) -> Scalar
.. function:: pos(x: Vector[Any,Scalar]) -> Vector[Any,Scalar]
:noindex:
:nocontentsentry:
.. function:: pos(x: Quaternion[Scalar]) -> Quaternion[Scalar]
:noindex:
:nocontentsentry:
.. function:: pos(x: Matrix[Any,Any,Scalar]) -> Matrix[Any,Any,Scalar]
:noindex:
:nocontentsentry:
.. function:: neg(x: Scalar) -> Scalar
.. function:: neg(x: Vector[Any,Scalar]) -> Vector[Any,Scalar]
:noindex:
:nocontentsentry:
.. function:: neg(x: Quaternion[Scalar]) -> Quaternion[Scalar]
:noindex:
:nocontentsentry:
.. function:: neg(x: Matrix[Any,Any,Scalar]) -> Matrix[Any,Any,Scalar]
:noindex:
:nocontentsentry:
.. function:: unot(b: bool) -> bool
.. function:: unot(b: int8) -> bool
:noindex:
:nocontentsentry:
.. function:: unot(b: uint8) -> bool
:noindex:
:nocontentsentry:
.. function:: unot(b: int16) -> bool
:noindex:
:nocontentsentry:
.. function:: unot(b: uint16) -> bool
:noindex:
:nocontentsentry:
.. function:: unot(b: int32) -> bool
:noindex:
:nocontentsentry:
.. function:: unot(b: uint32) -> bool
:noindex:
:nocontentsentry:
.. function:: unot(b: int64) -> bool
:noindex:
:nocontentsentry:
.. function:: unot(b: uint64) -> bool
:noindex:
:nocontentsentry:
.. function:: unot(a: Array[Any]) -> bool
:noindex:
:nocontentsentry:
.. rubric:: Footnotes
.. [1] Note: function gradients not implemented for backpropagation.