37 |
|
|
38 |
|
select(N, a1, a2, ..) - return aN |
39 |
|
|
40 |
+ |
min(a1, a2, ..) - return minimum argument |
41 |
+ |
max(a1, a2, ..) - return maximum argument |
42 |
+ |
|
43 |
|
sqrt(x) - square root function |
44 |
|
|
45 |
|
sin(x), cos(x), tan(x), |
96 |
|
abs(x) : if( x, x, -x ); |
97 |
|
sgn(x) : if( x, 1, if(-x, -1, 0) ); |
98 |
|
sq(x) : x*x; |
96 |
– |
max(a,b) : if( a-b, a, b ); |
97 |
– |
min(a,b) : if( a-b, b, a ); |
99 |
|
inside(a,x,b) : and(x-a,b-x); |
100 |
|
frac(x) : x - floor(x); |
101 |
|
mod(n,d) : n - floor(n/d)*d; |
169 |
|
V = if( crosslen`P. - FTINY, |
170 |
|
Pz - Nz*(Px*Nx + Py*Ny)/crosslen`P., |
171 |
|
Py); |
172 |
+ |
|
173 |
+ |
{ Local hemisphere direction for *func & *data types } |
174 |
+ |
{ last 3 real args = unnormalized up-vector } |
175 |
+ |
Vux`P. = arg(AC-1)*NzP - arg(AC)*NyP; |
176 |
+ |
Vuy`P. = arg(AC)*NxP - arg(AC-2)*NzP; |
177 |
+ |
Vuz`P. = arg(AC-2)*NyP - arg(AC-1)*NxP; |
178 |
+ |
vnorm`P. = 1/sqrt(Vux`P.*Vux`P. + Vuy`P.*Vuy`P. + Vuz`P.*Vuz`P.); |
179 |
+ |
Vnx`P. = Vux`P.*vnorm`P.; |
180 |
+ |
Vny`P. = Vuy`P.*vnorm`P.; |
181 |
+ |
Vnz`P. = Vuz`P.*vnorm`P.; |
182 |
+ |
Unx`P. = NyP*Vnz`P. - NzP*Vny`P.; |
183 |
+ |
Uny`P. = NzP*Vnx`P. - NxP*Vnz`P.; |
184 |
+ |
Unz`P. = NxP*Vny`P. - NyP*Vnx`P.; |
185 |
+ |
{ Transform vectors, normalized (dx,dy,dz) away from surf } |
186 |
+ |
Ldx(dx,dy,dz) = dx*Unx`P. + dy*Uny`P. + dz*Unz`P.; |
187 |
+ |
Ldy(dx,dy,dz) = dx*Vnx`P. + dy*Vny`P. + dz*Vnz`P.; |
188 |
+ |
Ldz(dx,dy,dz) = dx*NxP + dy*NyP + dz*NzP; |
189 |
+ |
{ Incident vector transformed to our coords } |
190 |
+ |
Idx = Ldx(-Dx,-Dy,-Dz); |
191 |
+ |
Idy = Ldy(-Dx,-Dy,-Dz); |
192 |
+ |
Idz = RdotP; |