aboutsummaryrefslogtreecommitdiff
path: root/site/udo/array_3d.udo
diff options
context:
space:
mode:
Diffstat (limited to 'site/udo/array_3d.udo')
-rwxr-xr-xsite/udo/array_3d.udo132
1 files changed, 132 insertions, 0 deletions
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
+