aboutsummaryrefslogtreecommitdiff
path: root/site/udo/array_3d.udo
blob: 845ecb661aa780f3486bd3af04e1934f36c0a295 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
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(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(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(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(ifn, kdx1, kdx2, kdx3), ifn)
endop