Log inGet started

nx

The nx namespace — the engine's Luau API reference for nx.

The nx namespace — 67 functions.

globals/nx/add

globals/nx/add(dst: NxBuffer, x: NxScalarOrBuffer) -> boolean

b[i] += x (x scalar) or b[i] += x[i] (x buffer). Dispatches on type(x). For interleaved-stride writes use nx.addStrided.

globals/nx/addStrided

globals/nx/addStrided(b: NxBuffer, scalar: number, stride: number, offset: number?) -> boolean

Strided add: buf[k * stride + offset] += scalar for every valid k.

globals/nx/addStridedFrom

globals/nx/addStridedFrom(dst: NxBuffer, src: NxBuffer, scale: number?, dst_stride: number, dst_off: number?, src_stride: number, src_off: number?) -> boolean

Strided BLAS-axpy from src into dst: dst[k * dst_stride + dst_off] += scale * src[k * src_stride + src_off].

globals/nx/applyAbs

globals/nx/applyAbs(b: NxBuffer) -> boolean

In-place b[i] = abs(b[i]).

globals/nx/applyCeil

globals/nx/applyCeil(b: NxBuffer) -> boolean

In-place b[i] = ceil(b[i]).

globals/nx/applyCos

globals/nx/applyCos(b: NxBuffer) -> boolean

In-place b[i] = cos(b[i]).

globals/nx/applyExp

globals/nx/applyExp(b: NxBuffer) -> boolean

In-place b[i] = exp(b[i]).

globals/nx/applyFloor

globals/nx/applyFloor(b: NxBuffer) -> boolean

In-place b[i] = floor(b[i]).

globals/nx/applyFract

globals/nx/applyFract(b: NxBuffer) -> boolean

In-place b[i] = fract(b[i]) (fractional part).

globals/nx/applyLog

globals/nx/applyLog(b: NxBuffer) -> boolean

In-place b[i] = ln(b[i]).

globals/nx/applyLog2

globals/nx/applyLog2(b: NxBuffer) -> boolean

In-place b[i] = log2(b[i]).

globals/nx/applyNeg

globals/nx/applyNeg(b: NxBuffer) -> boolean

In-place b[i] = -b[i].

globals/nx/applyRecip

globals/nx/applyRecip(b: NxBuffer) -> boolean

In-place b[i] = 1 / b[i].

globals/nx/applyRecipSqrt

globals/nx/applyRecipSqrt(b: NxBuffer) -> boolean

In-place b[i] = 1 / sqrt(b[i]).

globals/nx/applyRound

globals/nx/applyRound(b: NxBuffer) -> boolean

In-place b[i] = round(b[i]).

globals/nx/applySign

globals/nx/applySign(b: NxBuffer) -> boolean

In-place b[i] = sign(b[i]) (returns -1, 0, or +1).

globals/nx/applySin

globals/nx/applySin(b: NxBuffer) -> boolean

In-place b[i] = sin(b[i]).

globals/nx/applySqrt

globals/nx/applySqrt(b: NxBuffer) -> boolean

In-place b[i] = sqrt(b[i]).

globals/nx/applySquare

globals/nx/applySquare(b: NxBuffer) -> boolean

In-place b[i] = b[i] * b[i].

globals/nx/applyTan

globals/nx/applyTan(b: NxBuffer) -> boolean

In-place b[i] = tan(b[i]).

globals/nx/applyTrunc

globals/nx/applyTrunc(b: NxBuffer) -> boolean

In-place b[i] = trunc(b[i]).

globals/nx/applyWindow

globals/nx/applyWindow(signal: NxBuffer, window: NxBuffer) -> boolean

Element-wise signal[i] *= window[i] in place. Operates over the shorter of the two — passing a longer window to window a shorter clip is intentional, not an error.

globals/nx/axpby

globals/nx/axpby(dst: NxBuffer, a: number, src: NxBuffer, b: number) -> boolean

BLAS axpby: dst[i] = a*dst[i] + b*src[i].

globals/nx/clamp

globals/nx/clamp(b: NxBuffer, min_v: number, max_v: number) -> boolean

In-place clamp: b[i] = clamp(b[i], min_v, max_v).

globals/nx/copy

globals/nx/copy(dst: NxBuffer, src: NxBuffer) -> boolean

Copy every record from src into dst (memcpy fast path).

globals/nx/copyStridedFrom

globals/nx/copyStridedFrom(dst: NxBuffer, src: NxBuffer, scale: number?, dst_stride: number, dst_off: number?, src_stride: number, src_off: number?) -> boolean

Strided copy from src into dst with optional scaling: dst[k * dst_stride + dst_off] = scale * src[k * src_stride + src_off].

globals/nx/create

globals/nx/create(type_: NxType, n: number) -> NxBuffer?

Allocate a CPU buffer of type × len records. Thin alias for substrate.createBuffer({type=type_, len=n, kind="cpu"}) — kept here so the public nx library is the canonical entry point and users never need to import buffer separately.

globals/nx/div

globals/nx/div(dst: NxBuffer, x: NxScalarOrBuffer) -> boolean

b[i] /= x (x scalar) or b[i] /= x[i] (x buffer).

globals/nx/dot

globals/nx/dot(a: NxBuffer, b: NxBuffer) -> number?

Reduction: dot product of two same-shaped buffers.

globals/nx/fft1d

globals/nx/fft1d(re: NxBuffer, im: NxBuffer, inverse: boolean?) -> boolean

In-place 1D FFT over parallel re / im CPU buffers. inverse=true runs the inverse transform scaled by 1/N (so ifft(fft(x)) ≈ x).

globals/nx/fft2d

globals/nx/fft2d(re: NxBuffer, im: NxBuffer, width: number, height: number, inverse: boolean?) -> boolean

In-place 2D FFT over row-major parallel re / im buffers of length width*height. inverse=true is scaled by 1 / (width * height).

globals/nx/fill

globals/nx/fill(b: NxBuffer, value: number?) -> boolean

Fill the buffer with value (default 0.0). Equivalent to the scalar form of nx.add against a zeroed buffer, but skips the type-dispatch.

globals/nx/fillRandomNormal

globals/nx/fillRandomNormal(b: NxBuffer, mean: number?, stddev: number?, seed: NxSeed) -> boolean

Fill the buffer with Gaussian samples (Box-Muller), with the given mean and standard deviation, using a splitmix-keyed PRNG.

globals/nx/fillRandomUniform

globals/nx/fillRandomUniform(b: NxBuffer, min_v: number?, max_v: number?, seed: NxSeed) -> boolean

Fill the buffer with uniform-random samples in [min, max), using a splitmix-keyed deterministic PRNG.

globals/nx/fillStrided

globals/nx/fillStrided(b: NxBuffer, value: number, stride: number, offset: number?) -> boolean

Strided fill: buf[k * stride + offset] = value for every valid k.

globals/nx/fromTable

globals/nx/fromTable(arr: { number }, type_: NxType?) -> NxBuffer?

Build a CPU buffer from a Lua table of numbers. The table is written through buf:write in a single FFI crossing — no per-element Lua loop. For large arrays, prefer one of the nx.* constructors + a kernel pass over building a Lua array first.

globals/nx/full

globals/nx/full(n: number, type_: NxType?, value: number?) -> NxBuffer?

Allocate a buffer of type × len records and fill with value.

globals/nx/ifft1d

globals/nx/ifft1d(re: NxBuffer, im: NxBuffer) -> boolean

Convenience: nx.fft1d(re, im, true).

globals/nx/ifft2d

globals/nx/ifft2d(re: NxBuffer, im: NxBuffer, width: number, height: number) -> boolean

Convenience: nx.fft2d(re, im, w, h, true).

globals/nx/integratePosition

globals/nx/integratePosition(pos: NxBuffer, vel: NxBuffer, dt: number) -> boolean

Per-vec3: pos[i] += vel[i] * dt — semi-implicit Euler position integration. Both buffers must be vec3 (stride 3).

globals/nx/irfft1d

globals/nx/irfft1d(re: NxBuffer, im: NxBuffer) -> NxBuffer?

Real-output inverse 1D FFT. Input re / im are length N/2 + 1. Returns a fresh CPU f32 buffer of length 2 * (N/2 + 1 - 1) = N real samples.

globals/nx/irfft2d

globals/nx/irfft2d(re: NxBuffer, im: NxBuffer, width: number, height: number) -> NxBuffer?

Real-output inverse 2D FFT. Input re / im are (width/2 + 1) * height row-major. Returns a fresh f32 buffer of length width * height.

globals/nx/lerpTo

globals/nx/lerpTo(dst: NxBuffer, src: NxBuffer, t: number) -> boolean

dst[i] += t * (src[i] - dst[i]) — element-wise lerp toward src by t.

globals/nx/max

globals/nx/max(b: NxBuffer) -> number?

Reduction: maximum of all elements.

globals/nx/maxOp

globals/nx/maxOp(dst: NxBuffer, x: NxScalarOrBuffer) -> boolean

Element-wise b[i] = max(b[i], x) (scalar) or b[i] = max(b[i], x[i]) (buffer).

globals/nx/mean

globals/nx/mean(b: NxBuffer) -> number?

Reduction: arithmetic mean of all elements.

globals/nx/min

globals/nx/min(b: NxBuffer) -> number?

Reduction: minimum of all elements.

globals/nx/minOp

globals/nx/minOp(dst: NxBuffer, x: NxScalarOrBuffer) -> boolean

Element-wise b[i] = min(b[i], x) (scalar) or b[i] = min(b[i], x[i]) (buffer).

globals/nx/mul

globals/nx/mul(dst: NxBuffer, x: NxScalarOrBuffer) -> boolean

b[i] *= x (x scalar) or b[i] *= x[i] (x buffer).

globals/nx/mulStrided

globals/nx/mulStrided(b: NxBuffer, scalar: number, stride: number, offset: number?) -> boolean

Strided multiply: buf[k * stride + offset] *= scalar for every valid k.

globals/nx/normL1

globals/nx/normL1(b: NxBuffer) -> number?

Reduction: L1 norm — sum(|b[i]|).

globals/nx/normL2

globals/nx/normL2(b: NxBuffer) -> number?

Reduction: L2 norm — sqrt(sum(b[i]^2)).

globals/nx/normalizeVec3

globals/nx/normalizeVec3(b: NxBuffer) -> boolean

Normalise each vec3 in-place. Vectors below 1e-8 are left untouched.

globals/nx/ones

globals/nx/ones(n: number, type_: NxType?) -> NxBuffer?

Allocate a buffer of type × len records and fill with 1.0.

globals/nx/pow

globals/nx/pow(b: NxBuffer, p: number) -> boolean

In-place b[i] = b[i] ^ p (scalar exponent).

globals/nx/quatFromYaw

globals/nx/quatFromYaw(dst: NxBuffer, yaw: NxBuffer) -> boolean

Per-quat: dst[i] = (0, sin(yaw[i]/2), 0, cos(yaw[i]/2)) — the pure-Y axis-angle quaternion for each yaw value. dst must be stride-4 (quat); yaw must be stride-1 (f32).

globals/nx/rfft1d

globals/nx/rfft1d(signal: NxBuffer?) -> (NxBuffer?, NxBuffer?)

Real-input forward 1D FFT. Allocates two new CPU f32 buffers of length N/2 + 1 holding the (re, im) parts of the Hermitian-symmetric spectrum (same convention as NumPy np.fft.rfft).

globals/nx/rfft2d

globals/nx/rfft2d(signal: NxBuffer, width: number, height: number) -> (NxBuffer?, NxBuffer?)

Real-input forward 2D FFT. Input signal is row-major width*height. Returns (re_buf, im_buf) of length (width/2 + 1) * height each (matches np.fft.rfft2 layout).

globals/nx/scale

globals/nx/scale(b: NxBuffer, s: number) -> boolean

In-place b[i] *= s.

globals/nx/sinCosTo

globals/nx/sinCosTo(src: NxBuffer, sin_dst: NxBuffer, cos_dst: NxBuffer) -> boolean

Compute sin_dst[i] = sin(src[i]) and cos_dst[i] = cos(src[i]) in one pass using cheaper paired-trig argument reduction.

globals/nx/sub

globals/nx/sub(dst: NxBuffer, x: NxScalarOrBuffer) -> boolean

b[i] -= x (x scalar) or b[i] -= x[i] (x buffer).

globals/nx/sum

globals/nx/sum(b: NxBuffer) -> number?

Reduction: sum of all elements.

globals/nx/wanderYaw

globals/nx/wanderYaw(args: NxWanderArgs) -> boolean

Fused per-entity wander step. Each entity's yaw[i] walks by a uniform random delta in [-yawDelta, +yawDelta], then pos[i] advances forward in the (sin yaw, cos yaw) direction by step. Optional rot quat output writes a pure-Y axis-angle rotation. Replaces the per-entity Luau loop pattern (~12 ms / 5000 in interpreter) with a single Rust pass (~0.2 ms / 5000). Buffer requirements: pos vec3 (stride 3), yaw f32 (stride 1), rot optional quat (stride 4). All counts should match (kernel walks min(count_i)).

globals/nx/window/blackman

globals/nx/window.blackman(n: number) -> NxBuffer?

Allocate a fresh CPU f32 buffer of length n filled with a symmetric Blackman window (NumPy np.blackman convention).

globals/nx/window/hamming

globals/nx/window.hamming(n: number) -> NxBuffer?

Allocate a fresh CPU f32 buffer of length n filled with a symmetric Hamming window (NumPy np.hamming convention).

globals/nx/window/hann

globals/nx/window.hann(n: number) -> NxBuffer?

Allocate a fresh CPU f32 buffer of length n filled with a symmetric Hann window (NumPy np.hanning convention).

globals/nx/zeros

globals/nx/zeros(n: number, type_: NxType?) -> NxBuffer?

Allocate a buffer of type × len records and fill with 0.0.

  • api
  • reference