From 9fbf91db06a6d4f4b5cd8bb45389a731bb86bf22 Mon Sep 17 00:00:00 2001 From: Richard Date: Sun, 13 Apr 2025 18:48:02 +0100 Subject: initial --- site/udo/array_3d.udo | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100755 site/udo/array_3d.udo (limited to 'site/udo/array_3d.udo') diff --git a/site/udo/array_3d.udo b/site/udo/array_3d.udo new file mode 100755 index 0000000..845ecb6 --- /dev/null +++ b/site/udo/array_3d.udo @@ -0,0 +1,132 @@ +/* + Virtual 3D array behaviour + + This file is part of the SONICS UDO collection by Richard Knight 2024 + License: GPL-2.0-or-later + http://1bpm.net +*/ + + +/* + Initialise 3D array + + ifn arr3d_init idim1, idim2, idim3 + + ifn resulting ftable + idim1 size of dimension 1 + idim2 size of dimension 2 + idim3 size of dimension 3 + +*/ +opcode arr3d_init, i, iii + idim1, idim2, idim3 xin + xout ftgen(0, 0, -((idim1 * idim2 * idim3) + 3), -2, idim1, idim2, idim3) +endop + +/* + Obtain 1D index from 3D reference + + index arr3d_index ifn, idx1, idx2, idx3 + + index resulting index + idx1 dimension 1 index + idx2 dimension 2 index + idx3 dimension 3 index +*/ +opcode arr3d_index, i, iiii + ifn, idx1, idx2, idx3 xin + i1len tab_i 0, ifn + i2len tab_i 1, ifn + i3len tab_i 2, ifn + ;xout ((i1len * idx2 * idx3) + (i2len * idx3) + i3len) + 3 + xout ((idx1 * i2len * i3len) + (idx2 * i3len) + idx3) + 3 +endop + +/* + Obtain 1D index from 3D reference + + kindex arr3d_index ifn, kdx1, kdx2, kdx3 + + kindex resulting index + kdx1 dimension 1 index + kdx2 dimension 2 index + kdx3 dimension 3 index +*/ +opcode arr3d_index, k, ikkk + ifn, kdx1, kdx2, kdx3 xin + k1len tab 0, ifn + k2len tab 1, ifn + k3len tab 2, ifn + ;xout ((k1len * kdx2 * kdx3) + (k2len * kdx3) + k3len) + 3 + xout ((kdx1 * k2len * k3len) + (kdx2 * k3len) + kdx3) + 3 +endop + + + +/* + Set 3D array value + + arr3d_set ifn, idx1, idx2, idx3, ivalue + + ifn ftable created with arr3d_init + idx1 dimension 1 index + idx2 dimension 2 index + idx3 dimension 3 index + ivalue value to set +*/ +opcode arr3d_set, 0, iiiii + ifn, idx1, idx2, idx3, ivalue xin + tabw_i ivalue, arr3d_index:i(ifn, idx1, idx2, idx3), ifn +endop + +/* + Set 3D array value + + arr3d_set ifn, kdx1, kdx2, kdx3, kvalue + + ifn ftable created with arr3d_init + kdx1 dimension 1 index + kdx2 dimension 2 index + kdx3 dimension 3 index + kvalue value to set +*/ + +opcode arr3d_set, 0, ikkkk + ifn, kdx1, kdx2, kdx3, kvalue xin + tabw kvalue, arr3d_index:k(ifn, kdx1, kdx2, kdx3), ifn +endop + + +/* + Get 3D array value + + ivalue arr3d_get ifn, idx1, idx2, idx3 + + ivalue returned value + ifn ftable created with arr3d_init + idx1 dimension 1 index + idx2 dimension 2 index + idx3 dimension 3 index +*/ +opcode arr3d_get, i, iiii + ifn, idx1, idx2, idx3 xin + xout tab_i(arr3d_index:i(ifn, idx1, idx2, idx3), ifn) +endop + + +/* + Get 3D array value + + kvalue arr3d_get ifn, kdx1, kdx2, kdx3 + + kvalue returned value + ifn ftable created with arr3d_init + kdx1 dimension 1 index + kdx2 dimension 2 index + kdx3 dimension 3 index +*/ +opcode arr3d_get, k, ikkk + ifn, kdx1, kdx2, kdx3 xin + xout tab:k(arr3d_index:k(ifn, kdx1, kdx2, kdx3), ifn) +endop + -- cgit v1.2.3