Bug Summary

File:src/seek/textract.c
Location:line 1452, column 11
Description:Value stored to 'bestscore' is never read

Annotated Source Code

1/*
2 Teem: Tools to process and visualize scientific data and images .
3 Copyright (C) 2011, 2010, 2009, 2008 Thomas Schultz
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public License
7 (LGPL) as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9 The terms of redistributing and/or modifying this software also
10 include exceptions to the LGPL that facilitate static linking.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
16
17 You should have received a copy of the GNU Lesser General Public License
18 along with this library; if not, write to Free Software Foundation, Inc.,
19 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20*/
21
22/* This file collects functions that implement extraction of crease
23 * surfaces as proposed in Schultz / Theisel / Seidel, "Crease
24 * Surfaces: From Theory to Extraction and Application to Diffusion
25 * Tensor MRI", IEEE TVCG 16(1):109-119, 2010 */
26
27#include "seek.h"
28#include "privateSeek.h"
29
30/* private helper routines for the T-based extraction */
31
32/* Converts a Hessian into the transformed tensor T (cf. paper)
33 *
34 * T is a 9-vector representing the output
35 * evals is a 3-vector (eigenvalues of the Hessian)
36 * evecs is a 9-vector (eigenvectors of the Hessian)
37 * evalDiffThresh is the threshold parameter theta (cf. Eq. (4) in paper)
38 * ridge is non-zero if we are looking for a ridge (zero for valley)
39 */
40void
41_seekHess2T(double *T, const double *evals, const double *evecs,
42 const double evalDiffThresh, const char ridge) {
43 double lambdas[3]={0.0,0.0,0.0};
44 double tmpMat[9], diag[9], evecsT[9];
45 if (ridge) {
46 double diff = evals[1]-evals[2];
47 lambdas[0]=lambdas[1]=1.0;
48 if (diff<evalDiffThresh)
49 lambdas[2]=(1.0-diff/evalDiffThresh)*(1.0-diff/evalDiffThresh);
50 } else {
51 double diff = evals[0]-evals[1];
52 lambdas[1]=lambdas[2]=1.0;
53 if (diff<evalDiffThresh)
54 lambdas[0]=(1.0-diff/evalDiffThresh)*(1.0-diff/evalDiffThresh);
55 }
56 ELL_3M_ZERO_SET(diag)((((diag)+0)[0] = (0), ((diag)+0)[1] = (0), ((diag)+0)[2] = (
0)), (((diag)+3)[0] = (0), ((diag)+3)[1] = (0), ((diag)+3)[2]
= (0)), (((diag)+6)[0] = (0), ((diag)+6)[1] = (0), ((diag)+6
)[2] = (0)))
;
57 ELL_3M_DIAG_SET(diag, lambdas[0], lambdas[1], lambdas[2])((diag)[0] = (lambdas[0]), (diag)[4] = (lambdas[1]), (diag)[8
] = (lambdas[2]))
;
58 ELL_3M_TRANSPOSE(evecsT, evecs)((evecsT)[0] = (evecs)[0], (evecsT)[1] = (evecs)[3], (evecsT)
[2] = (evecs)[6], (evecsT)[3] = (evecs)[1], (evecsT)[4] = (evecs
)[4], (evecsT)[5] = (evecs)[7], (evecsT)[6] = (evecs)[2], (evecsT
)[7] = (evecs)[5], (evecsT)[8] = (evecs)[8])
;
59 ELL_3M_MUL(tmpMat, diag, evecs)((tmpMat)[0] = (diag)[0]*(evecs)[0] + (diag)[1]*(evecs)[3] + (
diag)[2]*(evecs)[6], (tmpMat)[1] = (diag)[0]*(evecs)[1] + (diag
)[1]*(evecs)[4] + (diag)[2]*(evecs)[7], (tmpMat)[2] = (diag)[
0]*(evecs)[2] + (diag)[1]*(evecs)[5] + (diag)[2]*(evecs)[8], (
tmpMat)[3] = (diag)[3]*(evecs)[0] + (diag)[4]*(evecs)[3] + (diag
)[5]*(evecs)[6], (tmpMat)[4] = (diag)[3]*(evecs)[1] + (diag)[
4]*(evecs)[4] + (diag)[5]*(evecs)[7], (tmpMat)[5] = (diag)[3]
*(evecs)[2] + (diag)[4]*(evecs)[5] + (diag)[5]*(evecs)[8], (tmpMat
)[6] = (diag)[6]*(evecs)[0] + (diag)[7]*(evecs)[3] + (diag)[8
]*(evecs)[6], (tmpMat)[7] = (diag)[6]*(evecs)[1] + (diag)[7]*
(evecs)[4] + (diag)[8]*(evecs)[7], (tmpMat)[8] = (diag)[6]*(evecs
)[2] + (diag)[7]*(evecs)[5] + (diag)[8]*(evecs)[8])
;
60 ELL_3M_MUL(T, evecsT, tmpMat)((T)[0] = (evecsT)[0]*(tmpMat)[0] + (evecsT)[1]*(tmpMat)[3] +
(evecsT)[2]*(tmpMat)[6], (T)[1] = (evecsT)[0]*(tmpMat)[1] + (
evecsT)[1]*(tmpMat)[4] + (evecsT)[2]*(tmpMat)[7], (T)[2] = (evecsT
)[0]*(tmpMat)[2] + (evecsT)[1]*(tmpMat)[5] + (evecsT)[2]*(tmpMat
)[8], (T)[3] = (evecsT)[3]*(tmpMat)[0] + (evecsT)[4]*(tmpMat)
[3] + (evecsT)[5]*(tmpMat)[6], (T)[4] = (evecsT)[3]*(tmpMat)[
1] + (evecsT)[4]*(tmpMat)[4] + (evecsT)[5]*(tmpMat)[7], (T)[5
] = (evecsT)[3]*(tmpMat)[2] + (evecsT)[4]*(tmpMat)[5] + (evecsT
)[5]*(tmpMat)[8], (T)[6] = (evecsT)[6]*(tmpMat)[0] + (evecsT)
[7]*(tmpMat)[3] + (evecsT)[8]*(tmpMat)[6], (T)[7] = (evecsT)[
6]*(tmpMat)[1] + (evecsT)[7]*(tmpMat)[4] + (evecsT)[8]*(tmpMat
)[7], (T)[8] = (evecsT)[6]*(tmpMat)[2] + (evecsT)[7]*(tmpMat)
[5] + (evecsT)[8]*(tmpMat)[8])
;
61}
62
63/* Converts a Hessian derivative into a derivative of the transformed
64 * tensor field T
65 *
66 * Tder is a 9-vector representing the output
67 * hessder is a 9-vector (Hessian derivative)
68 * evals is a 3-vector (eigenvalues of the Hessian value)
69 * evecs is a 9-vector (eigenvectors of the Hessian value)
70 * evalDiffThresh is the threshold parameter theta (cf. Eq. (4) in the paper)
71 * ridge is non-zero if we are looking for a ridge (zero for valley)
72 */
73void
74_seekHessder2Tder(double *Tder, const double *hessder, const double *evals,
75 const double *evecs, const double evalDiffThresh,
76 const char ridge) {
77 double evecTrans[9];
78 double hessderE[9]; /* Hessian derivative in eigenframe */
79 double tmp[9];
80 ELL_3M_TRANSPOSE(evecTrans,evecs)((evecTrans)[0] = (evecs)[0], (evecTrans)[1] = (evecs)[3], (evecTrans
)[2] = (evecs)[6], (evecTrans)[3] = (evecs)[1], (evecTrans)[4
] = (evecs)[4], (evecTrans)[5] = (evecs)[7], (evecTrans)[6] =
(evecs)[2], (evecTrans)[7] = (evecs)[5], (evecTrans)[8] = (evecs
)[8])
;
81 ell_3m_mul_d(tmp,hessder,evecTrans);
82 ell_3m_mul_d(hessderE,evecs,tmp);
83
84 if (ridge) {
85 double diff=evals[1]-evals[2];
86 double l3;
87 double l3der;
88 if (diff<evalDiffThresh)
89 l3=(1.0-diff/evalDiffThresh)*(1.0-diff/evalDiffThresh);
90 else l3=0.0;
91 hessderE[2]*=(1.0-l3)/(evals[0]-evals[2]);
92 hessderE[6]=hessderE[2];
93 hessderE[5]*=(1.0-l3)/(evals[1]-evals[2]);
94 hessderE[7]=hessderE[5];
95
96 if (diff<evalDiffThresh)
97 l3der = 2/evalDiffThresh*(1-diff/evalDiffThresh)*
98 (hessderE[8]-hessderE[4]);
99 else
100 l3der=0;
101 hessderE[8]=l3der;
102 hessderE[0]=hessderE[1]=hessderE[3]=hessderE[4]=0.0;
103 } else {
104 double diff=evals[0]-evals[1];
105 double l1;
106 double l1der;
107 if (diff<evalDiffThresh)
108 l1=(1.0-diff/evalDiffThresh)*(1.0-diff/evalDiffThresh);
109 else l1=0.0;
110 hessderE[1]*=(l1-1.0)/(evals[0]-evals[1]);
111 hessderE[3]=hessderE[1];
112 hessderE[2]*=(l1-1.0)/(evals[0]-evals[2]);
113 hessderE[6]=hessderE[2];
114
115 if (diff<evalDiffThresh)
116 l1der = 2/evalDiffThresh*(1-diff/evalDiffThresh)*
117 (hessderE[4]-hessderE[0]);
118 else
119 l1der = 0;
120 hessderE[0]=l1der;
121 hessderE[4]=hessderE[5]=hessderE[7]=hessderE[8]=0.0;
122 }
123
124 ell_3m_mul_d(tmp,hessderE,evecs);
125 ell_3m_mul_d(Tder,evecTrans,tmp);
126}
127
128static int
129findFeatureIntersection(double *results, double *Tleft,
130 double *hessleft, double *gleft,
131 double *Tright, double *hessright,
132 double *gright, double idxleft,
133 double idxright, char ridge,
134 const double evalDiffThresh,
135 const double dotThresh) {
136 double Tdp = ELL_3V_DOT(Tleft, Tright)((Tleft)[0]*(Tright)[0] + (Tleft)[1]*(Tright)[1] + (Tleft)[2]
*(Tright)[2])
+ ELL_3V_DOT(Tleft+3,Tright+3)((Tleft+3)[0]*(Tright+3)[0] + (Tleft+3)[1]*(Tright+3)[1] + (Tleft
+3)[2]*(Tright+3)[2])
+
137 ELL_3V_DOT(Tleft+6,Tright+6)((Tleft+6)[0]*(Tright+6)[0] + (Tleft+6)[1]*(Tright+6)[1] + (Tleft
+6)[2]*(Tright+6)[2])
;
138 double denom_l = sqrt(ELL_3V_DOT(Tleft, Tleft)((Tleft)[0]*(Tleft)[0] + (Tleft)[1]*(Tleft)[1] + (Tleft)[2]*(
Tleft)[2])
+ ELL_3V_DOT(Tleft+3, Tleft+3)((Tleft+3)[0]*(Tleft+3)[0] + (Tleft+3)[1]*(Tleft+3)[1] + (Tleft
+3)[2]*(Tleft+3)[2])
139 + ELL_3V_DOT(Tleft+6, Tleft+6)((Tleft+6)[0]*(Tleft+6)[0] + (Tleft+6)[1]*(Tleft+6)[1] + (Tleft
+6)[2]*(Tleft+6)[2])
),
140 denom_r = sqrt(ELL_3V_DOT(Tright,Tright)((Tright)[0]*(Tright)[0] + (Tright)[1]*(Tright)[1] + (Tright)
[2]*(Tright)[2])
+ ELL_3V_DOT(Tright+3, Tright+3)((Tright+3)[0]*(Tright+3)[0] + (Tright+3)[1]*(Tright+3)[1] + (
Tright+3)[2]*(Tright+3)[2])
141 + ELL_3V_DOT(Tright+6, Tright+6)((Tright+6)[0]*(Tright+6)[0] + (Tright+6)[1]*(Tright+6)[1] + (
Tright+6)[2]*(Tright+6)[2])
);
142
143 if (Tdp/(denom_l*denom_r)<dotThresh &&
144 idxright-idxleft>0.24) { /* do a recursive step */
145 double idxcenter = 0.5*(idxleft+idxright);
146 /* simply interpolate Hessian linearly */
147 double hessnew[9];
148 double evals[3],evecs[9];
149 double Tnew[9], gradnew[3];
150 int retval;
151
152 ELL_3M_LERP(hessnew,0.5,hessleft,hessright)((((hessnew)+0)[0] = ((((0.5)))*((((hessright)+0)[0]) - (((hessleft
)+0)[0])) + (((hessleft)+0)[0])), ((hessnew)+0)[1] = ((((0.5)
))*((((hessright)+0)[1]) - (((hessleft)+0)[1])) + (((hessleft
)+0)[1])), ((hessnew)+0)[2] = ((((0.5)))*((((hessright)+0)[2]
) - (((hessleft)+0)[2])) + (((hessleft)+0)[2]))), (((hessnew)
+3)[0] = ((((0.5)))*((((hessright)+3)[0]) - (((hessleft)+3)[0
])) + (((hessleft)+3)[0])), ((hessnew)+3)[1] = ((((0.5)))*(((
(hessright)+3)[1]) - (((hessleft)+3)[1])) + (((hessleft)+3)[1
])), ((hessnew)+3)[2] = ((((0.5)))*((((hessright)+3)[2]) - ((
(hessleft)+3)[2])) + (((hessleft)+3)[2]))), (((hessnew)+6)[0]
= ((((0.5)))*((((hessright)+6)[0]) - (((hessleft)+6)[0])) + (
((hessleft)+6)[0])), ((hessnew)+6)[1] = ((((0.5)))*((((hessright
)+6)[1]) - (((hessleft)+6)[1])) + (((hessleft)+6)[1])), ((hessnew
)+6)[2] = ((((0.5)))*((((hessright)+6)[2]) - (((hessleft)+6)[
2])) + (((hessleft)+6)[2]))))
;
153 ell_3m_eigensolve_d(evals, evecs, hessnew, AIR_TRUE1);
154
155 _seekHess2T(Tnew, evals, evecs, evalDiffThresh, ridge);
156
157 ELL_3V_LERP(gradnew,0.5,gleft,gright)((gradnew)[0] = (((0.5))*(((gright)[0]) - ((gleft)[0])) + ((gleft
)[0])), (gradnew)[1] = (((0.5))*(((gright)[1]) - ((gleft)[1])
) + ((gleft)[1])), (gradnew)[2] = (((0.5))*(((gright)[2]) - (
(gleft)[2])) + ((gleft)[2])))
;
158 retval = findFeatureIntersection(results, Tleft, hessleft,
159 gleft, Tnew, hessnew, gradnew,
160 idxleft, idxcenter,
161 ridge, evalDiffThresh, dotThresh);
162 retval += findFeatureIntersection(results+retval, Tnew, hessnew,
163 gradnew, Tright, hessright, gright,
164 idxcenter, idxright,
165 ridge, evalDiffThresh, dotThresh);
166 return retval;
167 } else {
168 double d1[3], d4[3];
169 ell_3mv_mul_d(d1, Tleft, gleft);
170 ELL_3V_SUB(d1,d1,gleft)((d1)[0] = (d1)[0] - (gleft)[0], (d1)[1] = (d1)[1] - (gleft)[
1], (d1)[2] = (d1)[2] - (gleft)[2])
;
171 ell_3mv_mul_d(d4, Tright, gright);
172 ELL_3V_SUB(d4,d4,gright)((d4)[0] = (d4)[0] - (gright)[0], (d4)[1] = (d4)[1] - (gright
)[1], (d4)[2] = (d4)[2] - (gright)[2])
;
173
174 if (ELL_3V_DOT(d1,d4)((d1)[0]*(d4)[0] + (d1)[1]*(d4)[1] + (d1)[2]*(d4)[2])<0) { /* mark edge as crossed */
175 /* find assumed intersection point */
176 double diff[3], dlen, alpha;
177 ELL_3V_SUB(diff,d4,d1)((diff)[0] = (d4)[0] - (d1)[0], (diff)[1] = (d4)[1] - (d1)[1]
, (diff)[2] = (d4)[2] - (d1)[2])
;
178 dlen=ELL_3V_LEN(diff)(sqrt((((diff))[0]*((diff))[0] + ((diff))[1]*((diff))[1] + ((
diff))[2]*((diff))[2])))
;
179 if (dlen>1e-5) {
180 double ap=-ELL_3V_DOT(d1,diff)((d1)[0]*(diff)[0] + (d1)[1]*(diff)[1] + (d1)[2]*(diff)[2])/dlen;
181 alpha = ap/dlen;
182 } else
183 alpha = 0.5;
184
185 *results = (1-alpha)*idxleft+alpha*idxright;
186 return 1;
187 }
188 }
189 return 0;
190}
191
192/* Assuming (simplistic) linearly interpolated Hessians and gradients,
193 * computes the analytical normal of the crease surface.
194 * The result is _not_ normalized. */
195static void
196computeGradientLin(double *result, double *T, double *g,
197 double *Txm, double *gxm, double *Txp, double *gxp,
198 double *Tym, double *gym, double *Typ, double *gyp,
199 double *Tzm, double *gzm, double *Tzp, double *gzp) {
200 double Tder[9];
201 double gder[3];
202 double tmp[3], tmp1[3], tmp2[3];
203 double derxv[3], deryv[3], derzv[3];
204 ELL_3M_SUB(Tder,Txp,Txm)((Tder)[0] = (Txp)[0] - (Txm)[0], (Tder)[1] = (Txp)[1] - (Txm
)[1], (Tder)[2] = (Txp)[2] - (Txm)[2], (Tder)[3] = (Txp)[3] -
(Txm)[3], (Tder)[4] = (Txp)[4] - (Txm)[4], (Tder)[5] = (Txp)
[5] - (Txm)[5], (Tder)[6] = (Txp)[6] - (Txm)[6], (Tder)[7] = (
Txp)[7] - (Txm)[7], (Tder)[8] = (Txp)[8] - (Txm)[8])
;
205 ELL_3V_SUB(gder,gxp,gxm)((gder)[0] = (gxp)[0] - (gxm)[0], (gder)[1] = (gxp)[1] - (gxm
)[1], (gder)[2] = (gxp)[2] - (gxm)[2])
;
206 ell_3mv_mul_d(tmp,T,gder);
207 ELL_3V_SUB(tmp,tmp,gder)((tmp)[0] = (tmp)[0] - (gder)[0], (tmp)[1] = (tmp)[1] - (gder
)[1], (tmp)[2] = (tmp)[2] - (gder)[2])
;
208 ell_3mv_mul_d(derxv,Tder,g);
209 ELL_3V_ADD2(derxv,derxv,tmp)((derxv)[0] = (derxv)[0] + (tmp)[0], (derxv)[1] = (derxv)[1] +
(tmp)[1], (derxv)[2] = (derxv)[2] + (tmp)[2])
;
210
211 ELL_3M_SUB(Tder,Typ,Tym)((Tder)[0] = (Typ)[0] - (Tym)[0], (Tder)[1] = (Typ)[1] - (Tym
)[1], (Tder)[2] = (Typ)[2] - (Tym)[2], (Tder)[3] = (Typ)[3] -
(Tym)[3], (Tder)[4] = (Typ)[4] - (Tym)[4], (Tder)[5] = (Typ)
[5] - (Tym)[5], (Tder)[6] = (Typ)[6] - (Tym)[6], (Tder)[7] = (
Typ)[7] - (Tym)[7], (Tder)[8] = (Typ)[8] - (Tym)[8])
;
212 ELL_3V_SUB(gder,gyp,gym)((gder)[0] = (gyp)[0] - (gym)[0], (gder)[1] = (gyp)[1] - (gym
)[1], (gder)[2] = (gyp)[2] - (gym)[2])
;
213 ell_3mv_mul_d(tmp,T,gder);
214 ELL_3V_SUB(tmp,tmp,gder)((tmp)[0] = (tmp)[0] - (gder)[0], (tmp)[1] = (tmp)[1] - (gder
)[1], (tmp)[2] = (tmp)[2] - (gder)[2])
;
215 ell_3mv_mul_d(deryv,Tder,g);
216 ELL_3V_ADD2(deryv,deryv,tmp)((deryv)[0] = (deryv)[0] + (tmp)[0], (deryv)[1] = (deryv)[1] +
(tmp)[1], (deryv)[2] = (deryv)[2] + (tmp)[2])
;
217
218 ELL_3M_SUB(Tder,Tzp,Tzm)((Tder)[0] = (Tzp)[0] - (Tzm)[0], (Tder)[1] = (Tzp)[1] - (Tzm
)[1], (Tder)[2] = (Tzp)[2] - (Tzm)[2], (Tder)[3] = (Tzp)[3] -
(Tzm)[3], (Tder)[4] = (Tzp)[4] - (Tzm)[4], (Tder)[5] = (Tzp)
[5] - (Tzm)[5], (Tder)[6] = (Tzp)[6] - (Tzm)[6], (Tder)[7] = (
Tzp)[7] - (Tzm)[7], (Tder)[8] = (Tzp)[8] - (Tzm)[8])
;
219 ELL_3V_SUB(gder,gzp,gzm)((gder)[0] = (gzp)[0] - (gzm)[0], (gder)[1] = (gzp)[1] - (gzm
)[1], (gder)[2] = (gzp)[2] - (gzm)[2])
;
220 ell_3mv_mul_d(tmp,T,gder);
221 ELL_3V_SUB(tmp,tmp,gder)((tmp)[0] = (tmp)[0] - (gder)[0], (tmp)[1] = (tmp)[1] - (gder
)[1], (tmp)[2] = (tmp)[2] - (gder)[2])
;
222 ell_3mv_mul_d(derzv,Tder,g);
223 ELL_3V_ADD2(derzv,derzv,tmp)((derzv)[0] = (derzv)[0] + (tmp)[0], (derzv)[1] = (derzv)[1] +
(tmp)[1], (derzv)[2] = (derzv)[2] + (tmp)[2])
;
224
225 /* accumulate a gradient */
226 tmp1[0]=derxv[0]; tmp1[1]=deryv[0]; tmp1[2]=derzv[0];
227 tmp2[0]=derxv[1]; tmp2[1]=deryv[1]; tmp2[2]=derzv[1];
228 if (ELL_3V_DOT(tmp1,tmp2)((tmp1)[0]*(tmp2)[0] + (tmp1)[1]*(tmp2)[1] + (tmp1)[2]*(tmp2)
[2])
<0)
229 ELL_3V_SCALE(tmp2,-1.0,tmp2)((tmp2)[0] = (-1.0)*(tmp2)[0], (tmp2)[1] = (-1.0)*(tmp2)[1], (
tmp2)[2] = (-1.0)*(tmp2)[2])
;
230 ELL_3V_ADD2(tmp1,tmp1,tmp2)((tmp1)[0] = (tmp1)[0] + (tmp2)[0], (tmp1)[1] = (tmp1)[1] + (
tmp2)[1], (tmp1)[2] = (tmp1)[2] + (tmp2)[2])
;
231 tmp2[0]=derxv[2]; tmp2[1]=deryv[2]; tmp2[2]=derzv[2];
232 if (ELL_3V_DOT(tmp1,tmp2)((tmp1)[0]*(tmp2)[0] + (tmp1)[1]*(tmp2)[1] + (tmp1)[2]*(tmp2)
[2])
<0)
233 ELL_3V_SCALE(tmp2,-1.0,tmp2)((tmp2)[0] = (-1.0)*(tmp2)[0], (tmp2)[1] = (-1.0)*(tmp2)[1], (
tmp2)[2] = (-1.0)*(tmp2)[2])
;
234 ELL_3V_ADD2(result,tmp1,tmp2)((result)[0] = (tmp1)[0] + (tmp2)[0], (result)[1] = (tmp1)[1]
+ (tmp2)[1], (result)[2] = (tmp1)[2] + (tmp2)[2])
;
235}
236
237/* Given a unique edge ID and an intersection point given by some value
238 * alpha \in [0,1], compute the crease surface normal at that point */
239static void
240computeEdgeGradient(seekContext *sctx, baggage *bag, double *res,
241 unsigned int xi, unsigned int yi, char edgeid, double alpha)
242{
243 double Txm[9], Txp[9], Tym[9], Typ[9], Tzm[9], Tzp[9], T[9],
244 gxm[3], gxp[3], gym[3], gyp[3], gzm[3], gzp[3], g[3];
245
246 unsigned int sx = AIR_CAST(unsigned int, sctx->sx)((unsigned int)(sctx->sx));
247 unsigned int sy = AIR_CAST(unsigned int, sctx->sy)((unsigned int)(sctx->sy));
248 unsigned int sz = AIR_CAST(unsigned int, sctx->sz)((unsigned int)(sctx->sz));
249 unsigned int si = xi + sx*yi;
250 unsigned int six = xi + 1 + sx*yi, siX = xi - 1 + sx*yi;
251 unsigned int siy = xi + sx*(yi+1), siY = xi + sx*(yi-1);
252 unsigned int sixy = xi + 1 + sx*(yi+1),
253 sixY = xi + 1 + sx*(yi-1),
254 siXy = xi - 1 + sx*(yi+1);
255 /* many special cases needed to fill Txm, gxm, etc. :-( */
256 switch (edgeid) {
257 case 0:
258 ELL_3M_LERP(T, alpha, sctx->t + 9*(0+2*si), sctx->t + 9*(0+2*six))((((T)+0)[0] = ((((alpha)))*((((sctx->t + 9*(0+2*six))+0)[
0]) - (((sctx->t + 9*(0+2*si))+0)[0])) + (((sctx->t + 9
*(0+2*si))+0)[0])), ((T)+0)[1] = ((((alpha)))*((((sctx->t +
9*(0+2*six))+0)[1]) - (((sctx->t + 9*(0+2*si))+0)[1])) + (
((sctx->t + 9*(0+2*si))+0)[1])), ((T)+0)[2] = ((((alpha)))
*((((sctx->t + 9*(0+2*six))+0)[2]) - (((sctx->t + 9*(0+
2*si))+0)[2])) + (((sctx->t + 9*(0+2*si))+0)[2]))), (((T)+
3)[0] = ((((alpha)))*((((sctx->t + 9*(0+2*six))+3)[0]) - (
((sctx->t + 9*(0+2*si))+3)[0])) + (((sctx->t + 9*(0+2*si
))+3)[0])), ((T)+3)[1] = ((((alpha)))*((((sctx->t + 9*(0+2
*six))+3)[1]) - (((sctx->t + 9*(0+2*si))+3)[1])) + (((sctx
->t + 9*(0+2*si))+3)[1])), ((T)+3)[2] = ((((alpha)))*((((sctx
->t + 9*(0+2*six))+3)[2]) - (((sctx->t + 9*(0+2*si))+3)
[2])) + (((sctx->t + 9*(0+2*si))+3)[2]))), (((T)+6)[0] = (
(((alpha)))*((((sctx->t + 9*(0+2*six))+6)[0]) - (((sctx->
t + 9*(0+2*si))+6)[0])) + (((sctx->t + 9*(0+2*si))+6)[0]))
, ((T)+6)[1] = ((((alpha)))*((((sctx->t + 9*(0+2*six))+6)[
1]) - (((sctx->t + 9*(0+2*si))+6)[1])) + (((sctx->t + 9
*(0+2*si))+6)[1])), ((T)+6)[2] = ((((alpha)))*((((sctx->t +
9*(0+2*six))+6)[2]) - (((sctx->t + 9*(0+2*si))+6)[2])) + (
((sctx->t + 9*(0+2*si))+6)[2]))))
;
259 ELL_3V_LERP(g, alpha, sctx->grad + 3*(0+2*si), sctx->grad + 3*(0+2*six))((g)[0] = (((alpha))*(((sctx->grad + 3*(0+2*six))[0]) - ((
sctx->grad + 3*(0+2*si))[0])) + ((sctx->grad + 3*(0+2*si
))[0])), (g)[1] = (((alpha))*(((sctx->grad + 3*(0+2*six))[
1]) - ((sctx->grad + 3*(0+2*si))[1])) + ((sctx->grad + 3
*(0+2*si))[1])), (g)[2] = (((alpha))*(((sctx->grad + 3*(0+
2*six))[2]) - ((sctx->grad + 3*(0+2*si))[2])) + ((sctx->
grad + 3*(0+2*si))[2])))
;
260 ELL_3M_LERP(Tzp, alpha, sctx->t + 9*(1+2*si), sctx->t + 9*(1+2*six))((((Tzp)+0)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*six))+0
)[0]) - (((sctx->t + 9*(1+2*si))+0)[0])) + (((sctx->t +
9*(1+2*si))+0)[0])), ((Tzp)+0)[1] = ((((alpha)))*((((sctx->
t + 9*(1+2*six))+0)[1]) - (((sctx->t + 9*(1+2*si))+0)[1]))
+ (((sctx->t + 9*(1+2*si))+0)[1])), ((Tzp)+0)[2] = ((((alpha
)))*((((sctx->t + 9*(1+2*six))+0)[2]) - (((sctx->t + 9*
(1+2*si))+0)[2])) + (((sctx->t + 9*(1+2*si))+0)[2]))), (((
Tzp)+3)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*six))+3)[0]
) - (((sctx->t + 9*(1+2*si))+3)[0])) + (((sctx->t + 9*(
1+2*si))+3)[0])), ((Tzp)+3)[1] = ((((alpha)))*((((sctx->t +
9*(1+2*six))+3)[1]) - (((sctx->t + 9*(1+2*si))+3)[1])) + (
((sctx->t + 9*(1+2*si))+3)[1])), ((Tzp)+3)[2] = ((((alpha)
))*((((sctx->t + 9*(1+2*six))+3)[2]) - (((sctx->t + 9*(
1+2*si))+3)[2])) + (((sctx->t + 9*(1+2*si))+3)[2]))), (((Tzp
)+6)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*six))+6)[0]) -
(((sctx->t + 9*(1+2*si))+6)[0])) + (((sctx->t + 9*(1+2
*si))+6)[0])), ((Tzp)+6)[1] = ((((alpha)))*((((sctx->t + 9
*(1+2*six))+6)[1]) - (((sctx->t + 9*(1+2*si))+6)[1])) + ((
(sctx->t + 9*(1+2*si))+6)[1])), ((Tzp)+6)[2] = ((((alpha))
)*((((sctx->t + 9*(1+2*six))+6)[2]) - (((sctx->t + 9*(1
+2*si))+6)[2])) + (((sctx->t + 9*(1+2*si))+6)[2]))))
;
261 ELL_3V_LERP(gzp, alpha, sctx->grad + 3*(1+2*si), sctx->grad + 3*(1+2*six))((gzp)[0] = (((alpha))*(((sctx->grad + 3*(1+2*six))[0]) - (
(sctx->grad + 3*(1+2*si))[0])) + ((sctx->grad + 3*(1+2*
si))[0])), (gzp)[1] = (((alpha))*(((sctx->grad + 3*(1+2*six
))[1]) - ((sctx->grad + 3*(1+2*si))[1])) + ((sctx->grad
+ 3*(1+2*si))[1])), (gzp)[2] = (((alpha))*(((sctx->grad +
3*(1+2*six))[2]) - ((sctx->grad + 3*(1+2*si))[2])) + ((sctx
->grad + 3*(1+2*si))[2])))
;
262 if (bag->zi==0) {
263 ELL_3M_COPY(Tzm, T)((((Tzm)+0)[0] = ((T)+0)[0], ((Tzm)+0)[1] = ((T)+0)[1], ((Tzm
)+0)[2] = ((T)+0)[2]), (((Tzm)+3)[0] = ((T)+3)[0], ((Tzm)+3)[
1] = ((T)+3)[1], ((Tzm)+3)[2] = ((T)+3)[2]), (((Tzm)+6)[0] = (
(T)+6)[0], ((Tzm)+6)[1] = ((T)+6)[1], ((Tzm)+6)[2] = ((T)+6)[
2]))
; ELL_3V_COPY(gzm, g)((gzm)[0] = (g)[0], (gzm)[1] = (g)[1], (gzm)[2] = (g)[2]);
264 } else {
265 ELL_3M_LERP(Tzm, alpha, sctx->tcontext + 9*(0+2*si),((((Tzm)+0)[0] = ((((alpha)))*((((sctx->tcontext + 9*(0+2*
six))+0)[0]) - (((sctx->tcontext + 9*(0+2*si))+0)[0])) + (
((sctx->tcontext + 9*(0+2*si))+0)[0])), ((Tzm)+0)[1] = (((
(alpha)))*((((sctx->tcontext + 9*(0+2*six))+0)[1]) - (((sctx
->tcontext + 9*(0+2*si))+0)[1])) + (((sctx->tcontext + 9
*(0+2*si))+0)[1])), ((Tzm)+0)[2] = ((((alpha)))*((((sctx->
tcontext + 9*(0+2*six))+0)[2]) - (((sctx->tcontext + 9*(0+
2*si))+0)[2])) + (((sctx->tcontext + 9*(0+2*si))+0)[2]))),
(((Tzm)+3)[0] = ((((alpha)))*((((sctx->tcontext + 9*(0+2*
six))+3)[0]) - (((sctx->tcontext + 9*(0+2*si))+3)[0])) + (
((sctx->tcontext + 9*(0+2*si))+3)[0])), ((Tzm)+3)[1] = (((
(alpha)))*((((sctx->tcontext + 9*(0+2*six))+3)[1]) - (((sctx
->tcontext + 9*(0+2*si))+3)[1])) + (((sctx->tcontext + 9
*(0+2*si))+3)[1])), ((Tzm)+3)[2] = ((((alpha)))*((((sctx->
tcontext + 9*(0+2*six))+3)[2]) - (((sctx->tcontext + 9*(0+
2*si))+3)[2])) + (((sctx->tcontext + 9*(0+2*si))+3)[2]))),
(((Tzm)+6)[0] = ((((alpha)))*((((sctx->tcontext + 9*(0+2*
six))+6)[0]) - (((sctx->tcontext + 9*(0+2*si))+6)[0])) + (
((sctx->tcontext + 9*(0+2*si))+6)[0])), ((Tzm)+6)[1] = (((
(alpha)))*((((sctx->tcontext + 9*(0+2*six))+6)[1]) - (((sctx
->tcontext + 9*(0+2*si))+6)[1])) + (((sctx->tcontext + 9
*(0+2*si))+6)[1])), ((Tzm)+6)[2] = ((((alpha)))*((((sctx->
tcontext + 9*(0+2*six))+6)[2]) - (((sctx->tcontext + 9*(0+
2*si))+6)[2])) + (((sctx->tcontext + 9*(0+2*si))+6)[2]))))
266 sctx->tcontext + 9*(0+2*six))((((Tzm)+0)[0] = ((((alpha)))*((((sctx->tcontext + 9*(0+2*
six))+0)[0]) - (((sctx->tcontext + 9*(0+2*si))+0)[0])) + (
((sctx->tcontext + 9*(0+2*si))+0)[0])), ((Tzm)+0)[1] = (((
(alpha)))*((((sctx->tcontext + 9*(0+2*six))+0)[1]) - (((sctx
->tcontext + 9*(0+2*si))+0)[1])) + (((sctx->tcontext + 9
*(0+2*si))+0)[1])), ((Tzm)+0)[2] = ((((alpha)))*((((sctx->
tcontext + 9*(0+2*six))+0)[2]) - (((sctx->tcontext + 9*(0+
2*si))+0)[2])) + (((sctx->tcontext + 9*(0+2*si))+0)[2]))),
(((Tzm)+3)[0] = ((((alpha)))*((((sctx->tcontext + 9*(0+2*
six))+3)[0]) - (((sctx->tcontext + 9*(0+2*si))+3)[0])) + (
((sctx->tcontext + 9*(0+2*si))+3)[0])), ((Tzm)+3)[1] = (((
(alpha)))*((((sctx->tcontext + 9*(0+2*six))+3)[1]) - (((sctx
->tcontext + 9*(0+2*si))+3)[1])) + (((sctx->tcontext + 9
*(0+2*si))+3)[1])), ((Tzm)+3)[2] = ((((alpha)))*((((sctx->
tcontext + 9*(0+2*six))+3)[2]) - (((sctx->tcontext + 9*(0+
2*si))+3)[2])) + (((sctx->tcontext + 9*(0+2*si))+3)[2]))),
(((Tzm)+6)[0] = ((((alpha)))*((((sctx->tcontext + 9*(0+2*
six))+6)[0]) - (((sctx->tcontext + 9*(0+2*si))+6)[0])) + (
((sctx->tcontext + 9*(0+2*si))+6)[0])), ((Tzm)+6)[1] = (((
(alpha)))*((((sctx->tcontext + 9*(0+2*six))+6)[1]) - (((sctx
->tcontext + 9*(0+2*si))+6)[1])) + (((sctx->tcontext + 9
*(0+2*si))+6)[1])), ((Tzm)+6)[2] = ((((alpha)))*((((sctx->
tcontext + 9*(0+2*six))+6)[2]) - (((sctx->tcontext + 9*(0+
2*si))+6)[2])) + (((sctx->tcontext + 9*(0+2*si))+6)[2]))))
;
267 ELL_3V_LERP(gzm, alpha, sctx->gradcontext + 3*(0+2*si),((gzm)[0] = (((alpha))*(((sctx->gradcontext + 3*(0+2*six))
[0]) - ((sctx->gradcontext + 3*(0+2*si))[0])) + ((sctx->
gradcontext + 3*(0+2*si))[0])), (gzm)[1] = (((alpha))*(((sctx
->gradcontext + 3*(0+2*six))[1]) - ((sctx->gradcontext +
3*(0+2*si))[1])) + ((sctx->gradcontext + 3*(0+2*si))[1]))
, (gzm)[2] = (((alpha))*(((sctx->gradcontext + 3*(0+2*six)
)[2]) - ((sctx->gradcontext + 3*(0+2*si))[2])) + ((sctx->
gradcontext + 3*(0+2*si))[2])))
268 sctx->gradcontext + 3*(0+2*six))((gzm)[0] = (((alpha))*(((sctx->gradcontext + 3*(0+2*six))
[0]) - ((sctx->gradcontext + 3*(0+2*si))[0])) + ((sctx->
gradcontext + 3*(0+2*si))[0])), (gzm)[1] = (((alpha))*(((sctx
->gradcontext + 3*(0+2*six))[1]) - ((sctx->gradcontext +
3*(0+2*si))[1])) + ((sctx->gradcontext + 3*(0+2*si))[1]))
, (gzm)[2] = (((alpha))*(((sctx->gradcontext + 3*(0+2*six)
)[2]) - ((sctx->gradcontext + 3*(0+2*si))[2])) + ((sctx->
gradcontext + 3*(0+2*si))[2])))
;
269 ELL_3M_SCALE(Tzm, 0.5, Tzm)((((Tzm)+0)[0] = ((0.5))*((Tzm)+0)[0], ((Tzm)+0)[1] = ((0.5))
*((Tzm)+0)[1], ((Tzm)+0)[2] = ((0.5))*((Tzm)+0)[2]), (((Tzm)+
3)[0] = ((0.5))*((Tzm)+3)[0], ((Tzm)+3)[1] = ((0.5))*((Tzm)+3
)[1], ((Tzm)+3)[2] = ((0.5))*((Tzm)+3)[2]), (((Tzm)+6)[0] = (
(0.5))*((Tzm)+6)[0], ((Tzm)+6)[1] = ((0.5))*((Tzm)+6)[1], ((Tzm
)+6)[2] = ((0.5))*((Tzm)+6)[2]))
; ELL_3M_SCALE(Tzp, 0.5, Tzp)((((Tzp)+0)[0] = ((0.5))*((Tzp)+0)[0], ((Tzp)+0)[1] = ((0.5))
*((Tzp)+0)[1], ((Tzp)+0)[2] = ((0.5))*((Tzp)+0)[2]), (((Tzp)+
3)[0] = ((0.5))*((Tzp)+3)[0], ((Tzp)+3)[1] = ((0.5))*((Tzp)+3
)[1], ((Tzp)+3)[2] = ((0.5))*((Tzp)+3)[2]), (((Tzp)+6)[0] = (
(0.5))*((Tzp)+6)[0], ((Tzp)+6)[1] = ((0.5))*((Tzp)+6)[1], ((Tzp
)+6)[2] = ((0.5))*((Tzp)+6)[2]))
;
270 ELL_3V_SCALE(gzm, 0.5, gzm)((gzm)[0] = (0.5)*(gzm)[0], (gzm)[1] = (0.5)*(gzm)[1], (gzm)[
2] = (0.5)*(gzm)[2])
; ELL_3V_SCALE(gzp, 0.5, gzp)((gzp)[0] = (0.5)*(gzp)[0], (gzp)[1] = (0.5)*(gzp)[1], (gzp)[
2] = (0.5)*(gzp)[2])
;
271 }
272 if (yi==0) {
273 ELL_3M_COPY(Tym, T)((((Tym)+0)[0] = ((T)+0)[0], ((Tym)+0)[1] = ((T)+0)[1], ((Tym
)+0)[2] = ((T)+0)[2]), (((Tym)+3)[0] = ((T)+3)[0], ((Tym)+3)[
1] = ((T)+3)[1], ((Tym)+3)[2] = ((T)+3)[2]), (((Tym)+6)[0] = (
(T)+6)[0], ((Tym)+6)[1] = ((T)+6)[1], ((Tym)+6)[2] = ((T)+6)[
2]))
; ELL_3V_COPY(gym, g)((gym)[0] = (g)[0], (gym)[1] = (g)[1], (gym)[2] = (g)[2]);
274 } else {
275 ELL_3M_LERP(Tym, alpha, sctx->t + 9*(0+2*siY), sctx->t + 9*(0+2*sixY))((((Tym)+0)[0] = ((((alpha)))*((((sctx->t + 9*(0+2*sixY))+
0)[0]) - (((sctx->t + 9*(0+2*siY))+0)[0])) + (((sctx->t
+ 9*(0+2*siY))+0)[0])), ((Tym)+0)[1] = ((((alpha)))*((((sctx
->t + 9*(0+2*sixY))+0)[1]) - (((sctx->t + 9*(0+2*siY))+
0)[1])) + (((sctx->t + 9*(0+2*siY))+0)[1])), ((Tym)+0)[2] =
((((alpha)))*((((sctx->t + 9*(0+2*sixY))+0)[2]) - (((sctx
->t + 9*(0+2*siY))+0)[2])) + (((sctx->t + 9*(0+2*siY))+
0)[2]))), (((Tym)+3)[0] = ((((alpha)))*((((sctx->t + 9*(0+
2*sixY))+3)[0]) - (((sctx->t + 9*(0+2*siY))+3)[0])) + (((sctx
->t + 9*(0+2*siY))+3)[0])), ((Tym)+3)[1] = ((((alpha)))*((
((sctx->t + 9*(0+2*sixY))+3)[1]) - (((sctx->t + 9*(0+2*
siY))+3)[1])) + (((sctx->t + 9*(0+2*siY))+3)[1])), ((Tym)+
3)[2] = ((((alpha)))*((((sctx->t + 9*(0+2*sixY))+3)[2]) - (
((sctx->t + 9*(0+2*siY))+3)[2])) + (((sctx->t + 9*(0+2*
siY))+3)[2]))), (((Tym)+6)[0] = ((((alpha)))*((((sctx->t +
9*(0+2*sixY))+6)[0]) - (((sctx->t + 9*(0+2*siY))+6)[0])) +
(((sctx->t + 9*(0+2*siY))+6)[0])), ((Tym)+6)[1] = ((((alpha
)))*((((sctx->t + 9*(0+2*sixY))+6)[1]) - (((sctx->t + 9
*(0+2*siY))+6)[1])) + (((sctx->t + 9*(0+2*siY))+6)[1])), (
(Tym)+6)[2] = ((((alpha)))*((((sctx->t + 9*(0+2*sixY))+6)[
2]) - (((sctx->t + 9*(0+2*siY))+6)[2])) + (((sctx->t + 9
*(0+2*siY))+6)[2]))))
;
276 ELL_3V_LERP(gym, alpha, sctx->grad + 3*(0+2*siY),((gym)[0] = (((alpha))*(((sctx->grad + 3*(0+2*sixY))[0]) -
((sctx->grad + 3*(0+2*siY))[0])) + ((sctx->grad + 3*(0
+2*siY))[0])), (gym)[1] = (((alpha))*(((sctx->grad + 3*(0+
2*sixY))[1]) - ((sctx->grad + 3*(0+2*siY))[1])) + ((sctx->
grad + 3*(0+2*siY))[1])), (gym)[2] = (((alpha))*(((sctx->grad
+ 3*(0+2*sixY))[2]) - ((sctx->grad + 3*(0+2*siY))[2])) + (
(sctx->grad + 3*(0+2*siY))[2])))
277 sctx->grad + 3*(0+2*sixY))((gym)[0] = (((alpha))*(((sctx->grad + 3*(0+2*sixY))[0]) -
((sctx->grad + 3*(0+2*siY))[0])) + ((sctx->grad + 3*(0
+2*siY))[0])), (gym)[1] = (((alpha))*(((sctx->grad + 3*(0+
2*sixY))[1]) - ((sctx->grad + 3*(0+2*siY))[1])) + ((sctx->
grad + 3*(0+2*siY))[1])), (gym)[2] = (((alpha))*(((sctx->grad
+ 3*(0+2*sixY))[2]) - ((sctx->grad + 3*(0+2*siY))[2])) + (
(sctx->grad + 3*(0+2*siY))[2])))
;
278 }
279 if (yi==sy-1) {
280 ELL_3M_COPY(Typ, T)((((Typ)+0)[0] = ((T)+0)[0], ((Typ)+0)[1] = ((T)+0)[1], ((Typ
)+0)[2] = ((T)+0)[2]), (((Typ)+3)[0] = ((T)+3)[0], ((Typ)+3)[
1] = ((T)+3)[1], ((Typ)+3)[2] = ((T)+3)[2]), (((Typ)+6)[0] = (
(T)+6)[0], ((Typ)+6)[1] = ((T)+6)[1], ((Typ)+6)[2] = ((T)+6)[
2]))
; ELL_3V_COPY(gyp, g)((gyp)[0] = (g)[0], (gyp)[1] = (g)[1], (gyp)[2] = (g)[2]);
281 } else {
282 ELL_3M_LERP(Typ, alpha, sctx->t + 9*(0+2*siy), sctx->t + 9*(0+2*sixy))((((Typ)+0)[0] = ((((alpha)))*((((sctx->t + 9*(0+2*sixy))+
0)[0]) - (((sctx->t + 9*(0+2*siy))+0)[0])) + (((sctx->t
+ 9*(0+2*siy))+0)[0])), ((Typ)+0)[1] = ((((alpha)))*((((sctx
->t + 9*(0+2*sixy))+0)[1]) - (((sctx->t + 9*(0+2*siy))+
0)[1])) + (((sctx->t + 9*(0+2*siy))+0)[1])), ((Typ)+0)[2] =
((((alpha)))*((((sctx->t + 9*(0+2*sixy))+0)[2]) - (((sctx
->t + 9*(0+2*siy))+0)[2])) + (((sctx->t + 9*(0+2*siy))+
0)[2]))), (((Typ)+3)[0] = ((((alpha)))*((((sctx->t + 9*(0+
2*sixy))+3)[0]) - (((sctx->t + 9*(0+2*siy))+3)[0])) + (((sctx
->t + 9*(0+2*siy))+3)[0])), ((Typ)+3)[1] = ((((alpha)))*((
((sctx->t + 9*(0+2*sixy))+3)[1]) - (((sctx->t + 9*(0+2*
siy))+3)[1])) + (((sctx->t + 9*(0+2*siy))+3)[1])), ((Typ)+
3)[2] = ((((alpha)))*((((sctx->t + 9*(0+2*sixy))+3)[2]) - (
((sctx->t + 9*(0+2*siy))+3)[2])) + (((sctx->t + 9*(0+2*
siy))+3)[2]))), (((Typ)+6)[0] = ((((alpha)))*((((sctx->t +
9*(0+2*sixy))+6)[0]) - (((sctx->t + 9*(0+2*siy))+6)[0])) +
(((sctx->t + 9*(0+2*siy))+6)[0])), ((Typ)+6)[1] = ((((alpha
)))*((((sctx->t + 9*(0+2*sixy))+6)[1]) - (((sctx->t + 9
*(0+2*siy))+6)[1])) + (((sctx->t + 9*(0+2*siy))+6)[1])), (
(Typ)+6)[2] = ((((alpha)))*((((sctx->t + 9*(0+2*sixy))+6)[
2]) - (((sctx->t + 9*(0+2*siy))+6)[2])) + (((sctx->t + 9
*(0+2*siy))+6)[2]))))
;
283 ELL_3V_LERP(gyp, alpha, sctx->grad + 3*(0+2*siy),((gyp)[0] = (((alpha))*(((sctx->grad + 3*(0+2*sixy))[0]) -
((sctx->grad + 3*(0+2*siy))[0])) + ((sctx->grad + 3*(0
+2*siy))[0])), (gyp)[1] = (((alpha))*(((sctx->grad + 3*(0+
2*sixy))[1]) - ((sctx->grad + 3*(0+2*siy))[1])) + ((sctx->
grad + 3*(0+2*siy))[1])), (gyp)[2] = (((alpha))*(((sctx->grad
+ 3*(0+2*sixy))[2]) - ((sctx->grad + 3*(0+2*siy))[2])) + (
(sctx->grad + 3*(0+2*siy))[2])))
284 sctx->grad + 3*(0+2*sixy))((gyp)[0] = (((alpha))*(((sctx->grad + 3*(0+2*sixy))[0]) -
((sctx->grad + 3*(0+2*siy))[0])) + ((sctx->grad + 3*(0
+2*siy))[0])), (gyp)[1] = (((alpha))*(((sctx->grad + 3*(0+
2*sixy))[1]) - ((sctx->grad + 3*(0+2*siy))[1])) + ((sctx->
grad + 3*(0+2*siy))[1])), (gyp)[2] = (((alpha))*(((sctx->grad
+ 3*(0+2*sixy))[2]) - ((sctx->grad + 3*(0+2*siy))[2])) + (
(sctx->grad + 3*(0+2*siy))[2])))
;
285 }
286 if (yi!=0 && yi!=sy-1) {
287 ELL_3M_SCALE(Tym, 0.5, Tym)((((Tym)+0)[0] = ((0.5))*((Tym)+0)[0], ((Tym)+0)[1] = ((0.5))
*((Tym)+0)[1], ((Tym)+0)[2] = ((0.5))*((Tym)+0)[2]), (((Tym)+
3)[0] = ((0.5))*((Tym)+3)[0], ((Tym)+3)[1] = ((0.5))*((Tym)+3
)[1], ((Tym)+3)[2] = ((0.5))*((Tym)+3)[2]), (((Tym)+6)[0] = (
(0.5))*((Tym)+6)[0], ((Tym)+6)[1] = ((0.5))*((Tym)+6)[1], ((Tym
)+6)[2] = ((0.5))*((Tym)+6)[2]))
; ELL_3M_SCALE(Typ, 0.5, Typ)((((Typ)+0)[0] = ((0.5))*((Typ)+0)[0], ((Typ)+0)[1] = ((0.5))
*((Typ)+0)[1], ((Typ)+0)[2] = ((0.5))*((Typ)+0)[2]), (((Typ)+
3)[0] = ((0.5))*((Typ)+3)[0], ((Typ)+3)[1] = ((0.5))*((Typ)+3
)[1], ((Typ)+3)[2] = ((0.5))*((Typ)+3)[2]), (((Typ)+6)[0] = (
(0.5))*((Typ)+6)[0], ((Typ)+6)[1] = ((0.5))*((Typ)+6)[1], ((Typ
)+6)[2] = ((0.5))*((Typ)+6)[2]))
;
288 ELL_3V_SCALE(gym, 0.5, gym)((gym)[0] = (0.5)*(gym)[0], (gym)[1] = (0.5)*(gym)[1], (gym)[
2] = (0.5)*(gym)[2])
; ELL_3V_SCALE(gyp, 0.5, gyp)((gyp)[0] = (0.5)*(gyp)[0], (gyp)[1] = (0.5)*(gyp)[1], (gyp)[
2] = (0.5)*(gyp)[2])
;
289 }
290 computeGradientLin(res, T, g,
291 sctx->t + 9*(0+2*si), sctx->grad + 3*(0+2*si),
292 sctx->t + 9*(0+2*six), sctx->grad + 3*(0+2*six),
293 Tym, gym, Typ, gyp,
294 Tzm, gzm, Tzp, gzp);
295 break;
296 case 1:
297 ELL_3M_LERP(T, alpha, sctx->t + 9*(0+2*si), sctx->t + 9*(0+2*siy))((((T)+0)[0] = ((((alpha)))*((((sctx->t + 9*(0+2*siy))+0)[
0]) - (((sctx->t + 9*(0+2*si))+0)[0])) + (((sctx->t + 9
*(0+2*si))+0)[0])), ((T)+0)[1] = ((((alpha)))*((((sctx->t +
9*(0+2*siy))+0)[1]) - (((sctx->t + 9*(0+2*si))+0)[1])) + (
((sctx->t + 9*(0+2*si))+0)[1])), ((T)+0)[2] = ((((alpha)))
*((((sctx->t + 9*(0+2*siy))+0)[2]) - (((sctx->t + 9*(0+
2*si))+0)[2])) + (((sctx->t + 9*(0+2*si))+0)[2]))), (((T)+
3)[0] = ((((alpha)))*((((sctx->t + 9*(0+2*siy))+3)[0]) - (
((sctx->t + 9*(0+2*si))+3)[0])) + (((sctx->t + 9*(0+2*si
))+3)[0])), ((T)+3)[1] = ((((alpha)))*((((sctx->t + 9*(0+2
*siy))+3)[1]) - (((sctx->t + 9*(0+2*si))+3)[1])) + (((sctx
->t + 9*(0+2*si))+3)[1])), ((T)+3)[2] = ((((alpha)))*((((sctx
->t + 9*(0+2*siy))+3)[2]) - (((sctx->t + 9*(0+2*si))+3)
[2])) + (((sctx->t + 9*(0+2*si))+3)[2]))), (((T)+6)[0] = (
(((alpha)))*((((sctx->t + 9*(0+2*siy))+6)[0]) - (((sctx->
t + 9*(0+2*si))+6)[0])) + (((sctx->t + 9*(0+2*si))+6)[0]))
, ((T)+6)[1] = ((((alpha)))*((((sctx->t + 9*(0+2*siy))+6)[
1]) - (((sctx->t + 9*(0+2*si))+6)[1])) + (((sctx->t + 9
*(0+2*si))+6)[1])), ((T)+6)[2] = ((((alpha)))*((((sctx->t +
9*(0+2*siy))+6)[2]) - (((sctx->t + 9*(0+2*si))+6)[2])) + (
((sctx->t + 9*(0+2*si))+6)[2]))))
;
298 ELL_3V_LERP(g, alpha, sctx->grad + 3*(0+2*si), sctx->grad + 3*(0+2*siy))((g)[0] = (((alpha))*(((sctx->grad + 3*(0+2*siy))[0]) - ((
sctx->grad + 3*(0+2*si))[0])) + ((sctx->grad + 3*(0+2*si
))[0])), (g)[1] = (((alpha))*(((sctx->grad + 3*(0+2*siy))[
1]) - ((sctx->grad + 3*(0+2*si))[1])) + ((sctx->grad + 3
*(0+2*si))[1])), (g)[2] = (((alpha))*(((sctx->grad + 3*(0+
2*siy))[2]) - ((sctx->grad + 3*(0+2*si))[2])) + ((sctx->
grad + 3*(0+2*si))[2])))
;
299 ELL_3M_LERP(Tzp, alpha, sctx->t + 9*(1+2*si), sctx->t + 9*(1+2*siy))((((Tzp)+0)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*siy))+0
)[0]) - (((sctx->t + 9*(1+2*si))+0)[0])) + (((sctx->t +
9*(1+2*si))+0)[0])), ((Tzp)+0)[1] = ((((alpha)))*((((sctx->
t + 9*(1+2*siy))+0)[1]) - (((sctx->t + 9*(1+2*si))+0)[1]))
+ (((sctx->t + 9*(1+2*si))+0)[1])), ((Tzp)+0)[2] = ((((alpha
)))*((((sctx->t + 9*(1+2*siy))+0)[2]) - (((sctx->t + 9*
(1+2*si))+0)[2])) + (((sctx->t + 9*(1+2*si))+0)[2]))), (((
Tzp)+3)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*siy))+3)[0]
) - (((sctx->t + 9*(1+2*si))+3)[0])) + (((sctx->t + 9*(
1+2*si))+3)[0])), ((Tzp)+3)[1] = ((((alpha)))*((((sctx->t +
9*(1+2*siy))+3)[1]) - (((sctx->t + 9*(1+2*si))+3)[1])) + (
((sctx->t + 9*(1+2*si))+3)[1])), ((Tzp)+3)[2] = ((((alpha)
))*((((sctx->t + 9*(1+2*siy))+3)[2]) - (((sctx->t + 9*(
1+2*si))+3)[2])) + (((sctx->t + 9*(1+2*si))+3)[2]))), (((Tzp
)+6)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*siy))+6)[0]) -
(((sctx->t + 9*(1+2*si))+6)[0])) + (((sctx->t + 9*(1+2
*si))+6)[0])), ((Tzp)+6)[1] = ((((alpha)))*((((sctx->t + 9
*(1+2*siy))+6)[1]) - (((sctx->t + 9*(1+2*si))+6)[1])) + ((
(sctx->t + 9*(1+2*si))+6)[1])), ((Tzp)+6)[2] = ((((alpha))
)*((((sctx->t + 9*(1+2*siy))+6)[2]) - (((sctx->t + 9*(1
+2*si))+6)[2])) + (((sctx->t + 9*(1+2*si))+6)[2]))))
;
300 ELL_3V_LERP(gzp, alpha, sctx->grad + 3*(1+2*si), sctx->grad + 3*(1+2*siy))((gzp)[0] = (((alpha))*(((sctx->grad + 3*(1+2*siy))[0]) - (
(sctx->grad + 3*(1+2*si))[0])) + ((sctx->grad + 3*(1+2*
si))[0])), (gzp)[1] = (((alpha))*(((sctx->grad + 3*(1+2*siy
))[1]) - ((sctx->grad + 3*(1+2*si))[1])) + ((sctx->grad
+ 3*(1+2*si))[1])), (gzp)[2] = (((alpha))*(((sctx->grad +
3*(1+2*siy))[2]) - ((sctx->grad + 3*(1+2*si))[2])) + ((sctx
->grad + 3*(1+2*si))[2])))
;
301 if (bag->zi==0) {
302 ELL_3M_COPY(Tzm, T)((((Tzm)+0)[0] = ((T)+0)[0], ((Tzm)+0)[1] = ((T)+0)[1], ((Tzm
)+0)[2] = ((T)+0)[2]), (((Tzm)+3)[0] = ((T)+3)[0], ((Tzm)+3)[
1] = ((T)+3)[1], ((Tzm)+3)[2] = ((T)+3)[2]), (((Tzm)+6)[0] = (
(T)+6)[0], ((Tzm)+6)[1] = ((T)+6)[1], ((Tzm)+6)[2] = ((T)+6)[
2]))
; ELL_3V_COPY(gzm, g)((gzm)[0] = (g)[0], (gzm)[1] = (g)[1], (gzm)[2] = (g)[2]);
303 } else {
304 ELL_3M_LERP(Tzm, alpha, sctx->tcontext + 9*(0+2*si),((((Tzm)+0)[0] = ((((alpha)))*((((sctx->tcontext + 9*(0+2*
siy))+0)[0]) - (((sctx->tcontext + 9*(0+2*si))+0)[0])) + (
((sctx->tcontext + 9*(0+2*si))+0)[0])), ((Tzm)+0)[1] = (((
(alpha)))*((((sctx->tcontext + 9*(0+2*siy))+0)[1]) - (((sctx
->tcontext + 9*(0+2*si))+0)[1])) + (((sctx->tcontext + 9
*(0+2*si))+0)[1])), ((Tzm)+0)[2] = ((((alpha)))*((((sctx->
tcontext + 9*(0+2*siy))+0)[2]) - (((sctx->tcontext + 9*(0+
2*si))+0)[2])) + (((sctx->tcontext + 9*(0+2*si))+0)[2]))),
(((Tzm)+3)[0] = ((((alpha)))*((((sctx->tcontext + 9*(0+2*
siy))+3)[0]) - (((sctx->tcontext + 9*(0+2*si))+3)[0])) + (
((sctx->tcontext + 9*(0+2*si))+3)[0])), ((Tzm)+3)[1] = (((
(alpha)))*((((sctx->tcontext + 9*(0+2*siy))+3)[1]) - (((sctx
->tcontext + 9*(0+2*si))+3)[1])) + (((sctx->tcontext + 9
*(0+2*si))+3)[1])), ((Tzm)+3)[2] = ((((alpha)))*((((sctx->
tcontext + 9*(0+2*siy))+3)[2]) - (((sctx->tcontext + 9*(0+
2*si))+3)[2])) + (((sctx->tcontext + 9*(0+2*si))+3)[2]))),
(((Tzm)+6)[0] = ((((alpha)))*((((sctx->tcontext + 9*(0+2*
siy))+6)[0]) - (((sctx->tcontext + 9*(0+2*si))+6)[0])) + (
((sctx->tcontext + 9*(0+2*si))+6)[0])), ((Tzm)+6)[1] = (((
(alpha)))*((((sctx->tcontext + 9*(0+2*siy))+6)[1]) - (((sctx
->tcontext + 9*(0+2*si))+6)[1])) + (((sctx->tcontext + 9
*(0+2*si))+6)[1])), ((Tzm)+6)[2] = ((((alpha)))*((((sctx->
tcontext + 9*(0+2*siy))+6)[2]) - (((sctx->tcontext + 9*(0+
2*si))+6)[2])) + (((sctx->tcontext + 9*(0+2*si))+6)[2]))))
305 sctx->tcontext + 9*(0+2*siy))((((Tzm)+0)[0] = ((((alpha)))*((((sctx->tcontext + 9*(0+2*
siy))+0)[0]) - (((sctx->tcontext + 9*(0+2*si))+0)[0])) + (
((sctx->tcontext + 9*(0+2*si))+0)[0])), ((Tzm)+0)[1] = (((
(alpha)))*((((sctx->tcontext + 9*(0+2*siy))+0)[1]) - (((sctx
->tcontext + 9*(0+2*si))+0)[1])) + (((sctx->tcontext + 9
*(0+2*si))+0)[1])), ((Tzm)+0)[2] = ((((alpha)))*((((sctx->
tcontext + 9*(0+2*siy))+0)[2]) - (((sctx->tcontext + 9*(0+
2*si))+0)[2])) + (((sctx->tcontext + 9*(0+2*si))+0)[2]))),
(((Tzm)+3)[0] = ((((alpha)))*((((sctx->tcontext + 9*(0+2*
siy))+3)[0]) - (((sctx->tcontext + 9*(0+2*si))+3)[0])) + (
((sctx->tcontext + 9*(0+2*si))+3)[0])), ((Tzm)+3)[1] = (((
(alpha)))*((((sctx->tcontext + 9*(0+2*siy))+3)[1]) - (((sctx
->tcontext + 9*(0+2*si))+3)[1])) + (((sctx->tcontext + 9
*(0+2*si))+3)[1])), ((Tzm)+3)[2] = ((((alpha)))*((((sctx->
tcontext + 9*(0+2*siy))+3)[2]) - (((sctx->tcontext + 9*(0+
2*si))+3)[2])) + (((sctx->tcontext + 9*(0+2*si))+3)[2]))),
(((Tzm)+6)[0] = ((((alpha)))*((((sctx->tcontext + 9*(0+2*
siy))+6)[0]) - (((sctx->tcontext + 9*(0+2*si))+6)[0])) + (
((sctx->tcontext + 9*(0+2*si))+6)[0])), ((Tzm)+6)[1] = (((
(alpha)))*((((sctx->tcontext + 9*(0+2*siy))+6)[1]) - (((sctx
->tcontext + 9*(0+2*si))+6)[1])) + (((sctx->tcontext + 9
*(0+2*si))+6)[1])), ((Tzm)+6)[2] = ((((alpha)))*((((sctx->
tcontext + 9*(0+2*siy))+6)[2]) - (((sctx->tcontext + 9*(0+
2*si))+6)[2])) + (((sctx->tcontext + 9*(0+2*si))+6)[2]))))
;
306 ELL_3V_LERP(gzm, alpha, sctx->gradcontext + 3*(0+2*si),((gzm)[0] = (((alpha))*(((sctx->gradcontext + 3*(0+2*siy))
[0]) - ((sctx->gradcontext + 3*(0+2*si))[0])) + ((sctx->
gradcontext + 3*(0+2*si))[0])), (gzm)[1] = (((alpha))*(((sctx
->gradcontext + 3*(0+2*siy))[1]) - ((sctx->gradcontext +
3*(0+2*si))[1])) + ((sctx->gradcontext + 3*(0+2*si))[1]))
, (gzm)[2] = (((alpha))*(((sctx->gradcontext + 3*(0+2*siy)
)[2]) - ((sctx->gradcontext + 3*(0+2*si))[2])) + ((sctx->
gradcontext + 3*(0+2*si))[2])))
307 sctx->gradcontext + 3*(0+2*siy))((gzm)[0] = (((alpha))*(((sctx->gradcontext + 3*(0+2*siy))
[0]) - ((sctx->gradcontext + 3*(0+2*si))[0])) + ((sctx->
gradcontext + 3*(0+2*si))[0])), (gzm)[1] = (((alpha))*(((sctx
->gradcontext + 3*(0+2*siy))[1]) - ((sctx->gradcontext +
3*(0+2*si))[1])) + ((sctx->gradcontext + 3*(0+2*si))[1]))
, (gzm)[2] = (((alpha))*(((sctx->gradcontext + 3*(0+2*siy)
)[2]) - ((sctx->gradcontext + 3*(0+2*si))[2])) + ((sctx->
gradcontext + 3*(0+2*si))[2])))
;
308 ELL_3M_SCALE(Tzm, 0.5, Tzm)((((Tzm)+0)[0] = ((0.5))*((Tzm)+0)[0], ((Tzm)+0)[1] = ((0.5))
*((Tzm)+0)[1], ((Tzm)+0)[2] = ((0.5))*((Tzm)+0)[2]), (((Tzm)+
3)[0] = ((0.5))*((Tzm)+3)[0], ((Tzm)+3)[1] = ((0.5))*((Tzm)+3
)[1], ((Tzm)+3)[2] = ((0.5))*((Tzm)+3)[2]), (((Tzm)+6)[0] = (
(0.5))*((Tzm)+6)[0], ((Tzm)+6)[1] = ((0.5))*((Tzm)+6)[1], ((Tzm
)+6)[2] = ((0.5))*((Tzm)+6)[2]))
; ELL_3M_SCALE(Tzp, 0.5, Tzp)((((Tzp)+0)[0] = ((0.5))*((Tzp)+0)[0], ((Tzp)+0)[1] = ((0.5))
*((Tzp)+0)[1], ((Tzp)+0)[2] = ((0.5))*((Tzp)+0)[2]), (((Tzp)+
3)[0] = ((0.5))*((Tzp)+3)[0], ((Tzp)+3)[1] = ((0.5))*((Tzp)+3
)[1], ((Tzp)+3)[2] = ((0.5))*((Tzp)+3)[2]), (((Tzp)+6)[0] = (
(0.5))*((Tzp)+6)[0], ((Tzp)+6)[1] = ((0.5))*((Tzp)+6)[1], ((Tzp
)+6)[2] = ((0.5))*((Tzp)+6)[2]))
;
309 ELL_3V_SCALE(gzm, 0.5, gzm)((gzm)[0] = (0.5)*(gzm)[0], (gzm)[1] = (0.5)*(gzm)[1], (gzm)[
2] = (0.5)*(gzm)[2])
; ELL_3V_SCALE(gzp, 0.5, gzp)((gzp)[0] = (0.5)*(gzp)[0], (gzp)[1] = (0.5)*(gzp)[1], (gzp)[
2] = (0.5)*(gzp)[2])
;
310 }
311 if (xi==0) {
312 ELL_3M_COPY(Txm, T)((((Txm)+0)[0] = ((T)+0)[0], ((Txm)+0)[1] = ((T)+0)[1], ((Txm
)+0)[2] = ((T)+0)[2]), (((Txm)+3)[0] = ((T)+3)[0], ((Txm)+3)[
1] = ((T)+3)[1], ((Txm)+3)[2] = ((T)+3)[2]), (((Txm)+6)[0] = (
(T)+6)[0], ((Txm)+6)[1] = ((T)+6)[1], ((Txm)+6)[2] = ((T)+6)[
2]))
; ELL_3V_COPY(gxm, g)((gxm)[0] = (g)[0], (gxm)[1] = (g)[1], (gxm)[2] = (g)[2]);
313 } else {
314 ELL_3M_LERP(Txm, alpha, sctx->t + 9*(0+2*siX), sctx->t + 9*(0+2*siXy))((((Txm)+0)[0] = ((((alpha)))*((((sctx->t + 9*(0+2*siXy))+
0)[0]) - (((sctx->t + 9*(0+2*siX))+0)[0])) + (((sctx->t
+ 9*(0+2*siX))+0)[0])), ((Txm)+0)[1] = ((((alpha)))*((((sctx
->t + 9*(0+2*siXy))+0)[1]) - (((sctx->t + 9*(0+2*siX))+
0)[1])) + (((sctx->t + 9*(0+2*siX))+0)[1])), ((Txm)+0)[2] =
((((alpha)))*((((sctx->t + 9*(0+2*siXy))+0)[2]) - (((sctx
->t + 9*(0+2*siX))+0)[2])) + (((sctx->t + 9*(0+2*siX))+
0)[2]))), (((Txm)+3)[0] = ((((alpha)))*((((sctx->t + 9*(0+
2*siXy))+3)[0]) - (((sctx->t + 9*(0+2*siX))+3)[0])) + (((sctx
->t + 9*(0+2*siX))+3)[0])), ((Txm)+3)[1] = ((((alpha)))*((
((sctx->t + 9*(0+2*siXy))+3)[1]) - (((sctx->t + 9*(0+2*
siX))+3)[1])) + (((sctx->t + 9*(0+2*siX))+3)[1])), ((Txm)+
3)[2] = ((((alpha)))*((((sctx->t + 9*(0+2*siXy))+3)[2]) - (
((sctx->t + 9*(0+2*siX))+3)[2])) + (((sctx->t + 9*(0+2*
siX))+3)[2]))), (((Txm)+6)[0] = ((((alpha)))*((((sctx->t +
9*(0+2*siXy))+6)[0]) - (((sctx->t + 9*(0+2*siX))+6)[0])) +
(((sctx->t + 9*(0+2*siX))+6)[0])), ((Txm)+6)[1] = ((((alpha
)))*((((sctx->t + 9*(0+2*siXy))+6)[1]) - (((sctx->t + 9
*(0+2*siX))+6)[1])) + (((sctx->t + 9*(0+2*siX))+6)[1])), (
(Txm)+6)[2] = ((((alpha)))*((((sctx->t + 9*(0+2*siXy))+6)[
2]) - (((sctx->t + 9*(0+2*siX))+6)[2])) + (((sctx->t + 9
*(0+2*siX))+6)[2]))))
;
315 ELL_3V_LERP(gxm, alpha, sctx->grad + 3*(0+2*siX),((gxm)[0] = (((alpha))*(((sctx->grad + 3*(0+2*siXy))[0]) -
((sctx->grad + 3*(0+2*siX))[0])) + ((sctx->grad + 3*(0
+2*siX))[0])), (gxm)[1] = (((alpha))*(((sctx->grad + 3*(0+
2*siXy))[1]) - ((sctx->grad + 3*(0+2*siX))[1])) + ((sctx->
grad + 3*(0+2*siX))[1])), (gxm)[2] = (((alpha))*(((sctx->grad
+ 3*(0+2*siXy))[2]) - ((sctx->grad + 3*(0+2*siX))[2])) + (
(sctx->grad + 3*(0+2*siX))[2])))
316 sctx->grad + 3*(0+2*siXy))((gxm)[0] = (((alpha))*(((sctx->grad + 3*(0+2*siXy))[0]) -
((sctx->grad + 3*(0+2*siX))[0])) + ((sctx->grad + 3*(0
+2*siX))[0])), (gxm)[1] = (((alpha))*(((sctx->grad + 3*(0+
2*siXy))[1]) - ((sctx->grad + 3*(0+2*siX))[1])) + ((sctx->
grad + 3*(0+2*siX))[1])), (gxm)[2] = (((alpha))*(((sctx->grad
+ 3*(0+2*siXy))[2]) - ((sctx->grad + 3*(0+2*siX))[2])) + (
(sctx->grad + 3*(0+2*siX))[2])))
;
317 }
318 if (xi==sx-1) {
319 ELL_3M_COPY(Txp, T)((((Txp)+0)[0] = ((T)+0)[0], ((Txp)+0)[1] = ((T)+0)[1], ((Txp
)+0)[2] = ((T)+0)[2]), (((Txp)+3)[0] = ((T)+3)[0], ((Txp)+3)[
1] = ((T)+3)[1], ((Txp)+3)[2] = ((T)+3)[2]), (((Txp)+6)[0] = (
(T)+6)[0], ((Txp)+6)[1] = ((T)+6)[1], ((Txp)+6)[2] = ((T)+6)[
2]))
; ELL_3V_COPY(gxm, g)((gxm)[0] = (g)[0], (gxm)[1] = (g)[1], (gxm)[2] = (g)[2]);
320 } else {
321 ELL_3M_LERP(Txp, alpha, sctx->t + 9*(0+2*six), sctx->t + 9*(0+2*sixy))((((Txp)+0)[0] = ((((alpha)))*((((sctx->t + 9*(0+2*sixy))+
0)[0]) - (((sctx->t + 9*(0+2*six))+0)[0])) + (((sctx->t
+ 9*(0+2*six))+0)[0])), ((Txp)+0)[1] = ((((alpha)))*((((sctx
->t + 9*(0+2*sixy))+0)[1]) - (((sctx->t + 9*(0+2*six))+
0)[1])) + (((sctx->t + 9*(0+2*six))+0)[1])), ((Txp)+0)[2] =
((((alpha)))*((((sctx->t + 9*(0+2*sixy))+0)[2]) - (((sctx
->t + 9*(0+2*six))+0)[2])) + (((sctx->t + 9*(0+2*six))+
0)[2]))), (((Txp)+3)[0] = ((((alpha)))*((((sctx->t + 9*(0+
2*sixy))+3)[0]) - (((sctx->t + 9*(0+2*six))+3)[0])) + (((sctx
->t + 9*(0+2*six))+3)[0])), ((Txp)+3)[1] = ((((alpha)))*((
((sctx->t + 9*(0+2*sixy))+3)[1]) - (((sctx->t + 9*(0+2*
six))+3)[1])) + (((sctx->t + 9*(0+2*six))+3)[1])), ((Txp)+
3)[2] = ((((alpha)))*((((sctx->t + 9*(0+2*sixy))+3)[2]) - (
((sctx->t + 9*(0+2*six))+3)[2])) + (((sctx->t + 9*(0+2*
six))+3)[2]))), (((Txp)+6)[0] = ((((alpha)))*((((sctx->t +
9*(0+2*sixy))+6)[0]) - (((sctx->t + 9*(0+2*six))+6)[0])) +
(((sctx->t + 9*(0+2*six))+6)[0])), ((Txp)+6)[1] = ((((alpha
)))*((((sctx->t + 9*(0+2*sixy))+6)[1]) - (((sctx->t + 9
*(0+2*six))+6)[1])) + (((sctx->t + 9*(0+2*six))+6)[1])), (
(Txp)+6)[2] = ((((alpha)))*((((sctx->t + 9*(0+2*sixy))+6)[
2]) - (((sctx->t + 9*(0+2*six))+6)[2])) + (((sctx->t + 9
*(0+2*six))+6)[2]))))
;
322 ELL_3V_LERP(gxp, alpha, sctx->grad + 3*(0+2*six),((gxp)[0] = (((alpha))*(((sctx->grad + 3*(0+2*sixy))[0]) -
((sctx->grad + 3*(0+2*six))[0])) + ((sctx->grad + 3*(0
+2*six))[0])), (gxp)[1] = (((alpha))*(((sctx->grad + 3*(0+
2*sixy))[1]) - ((sctx->grad + 3*(0+2*six))[1])) + ((sctx->
grad + 3*(0+2*six))[1])), (gxp)[2] = (((alpha))*(((sctx->grad
+ 3*(0+2*sixy))[2]) - ((sctx->grad + 3*(0+2*six))[2])) + (
(sctx->grad + 3*(0+2*six))[2])))
323 sctx->grad + 3*(0+2*sixy))((gxp)[0] = (((alpha))*(((sctx->grad + 3*(0+2*sixy))[0]) -
((sctx->grad + 3*(0+2*six))[0])) + ((sctx->grad + 3*(0
+2*six))[0])), (gxp)[1] = (((alpha))*(((sctx->grad + 3*(0+
2*sixy))[1]) - ((sctx->grad + 3*(0+2*six))[1])) + ((sctx->
grad + 3*(0+2*six))[1])), (gxp)[2] = (((alpha))*(((sctx->grad
+ 3*(0+2*sixy))[2]) - ((sctx->grad + 3*(0+2*six))[2])) + (
(sctx->grad + 3*(0+2*six))[2])))
;
324 }
325 if (xi!=0 && xi!=sx-1) {
326 ELL_3M_SCALE(Txm, 0.5, Txm)((((Txm)+0)[0] = ((0.5))*((Txm)+0)[0], ((Txm)+0)[1] = ((0.5))
*((Txm)+0)[1], ((Txm)+0)[2] = ((0.5))*((Txm)+0)[2]), (((Txm)+
3)[0] = ((0.5))*((Txm)+3)[0], ((Txm)+3)[1] = ((0.5))*((Txm)+3
)[1], ((Txm)+3)[2] = ((0.5))*((Txm)+3)[2]), (((Txm)+6)[0] = (
(0.5))*((Txm)+6)[0], ((Txm)+6)[1] = ((0.5))*((Txm)+6)[1], ((Txm
)+6)[2] = ((0.5))*((Txm)+6)[2]))
; ELL_3M_SCALE(Txp, 0.5, Txp)((((Txp)+0)[0] = ((0.5))*((Txp)+0)[0], ((Txp)+0)[1] = ((0.5))
*((Txp)+0)[1], ((Txp)+0)[2] = ((0.5))*((Txp)+0)[2]), (((Txp)+
3)[0] = ((0.5))*((Txp)+3)[0], ((Txp)+3)[1] = ((0.5))*((Txp)+3
)[1], ((Txp)+3)[2] = ((0.5))*((Txp)+3)[2]), (((Txp)+6)[0] = (
(0.5))*((Txp)+6)[0], ((Txp)+6)[1] = ((0.5))*((Txp)+6)[1], ((Txp
)+6)[2] = ((0.5))*((Txp)+6)[2]))
;
327 ELL_3V_SCALE(gxm, 0.5, gxm)((gxm)[0] = (0.5)*(gxm)[0], (gxm)[1] = (0.5)*(gxm)[1], (gxm)[
2] = (0.5)*(gxm)[2])
; ELL_3V_SCALE(gxp, 0.5, gxp)((gxp)[0] = (0.5)*(gxp)[0], (gxp)[1] = (0.5)*(gxp)[1], (gxp)[
2] = (0.5)*(gxp)[2])
;
328 }
329 computeGradientLin(res, T, g,
330 Txm, gxm, Txp, gxp,
331 sctx->t + 9*(0+2*si), sctx->grad + 3*(0+2*si),
332 sctx->t + 9*(0+2*siy), sctx->grad + 3*(0+2*siy),
333 T, g, Tzp, gzp);
334 break;
335 case 2:
336 ELL_3M_LERP(T, alpha, sctx->t + 9*(0+2*si), sctx->t + 9*(1+2*si))((((T)+0)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*si))+0)[0
]) - (((sctx->t + 9*(0+2*si))+0)[0])) + (((sctx->t + 9*
(0+2*si))+0)[0])), ((T)+0)[1] = ((((alpha)))*((((sctx->t +
9*(1+2*si))+0)[1]) - (((sctx->t + 9*(0+2*si))+0)[1])) + (
((sctx->t + 9*(0+2*si))+0)[1])), ((T)+0)[2] = ((((alpha)))
*((((sctx->t + 9*(1+2*si))+0)[2]) - (((sctx->t + 9*(0+2
*si))+0)[2])) + (((sctx->t + 9*(0+2*si))+0)[2]))), (((T)+3
)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*si))+3)[0]) - (((
sctx->t + 9*(0+2*si))+3)[0])) + (((sctx->t + 9*(0+2*si)
)+3)[0])), ((T)+3)[1] = ((((alpha)))*((((sctx->t + 9*(1+2*
si))+3)[1]) - (((sctx->t + 9*(0+2*si))+3)[1])) + (((sctx->
t + 9*(0+2*si))+3)[1])), ((T)+3)[2] = ((((alpha)))*((((sctx->
t + 9*(1+2*si))+3)[2]) - (((sctx->t + 9*(0+2*si))+3)[2])) +
(((sctx->t + 9*(0+2*si))+3)[2]))), (((T)+6)[0] = ((((alpha
)))*((((sctx->t + 9*(1+2*si))+6)[0]) - (((sctx->t + 9*(
0+2*si))+6)[0])) + (((sctx->t + 9*(0+2*si))+6)[0])), ((T)+
6)[1] = ((((alpha)))*((((sctx->t + 9*(1+2*si))+6)[1]) - ((
(sctx->t + 9*(0+2*si))+6)[1])) + (((sctx->t + 9*(0+2*si
))+6)[1])), ((T)+6)[2] = ((((alpha)))*((((sctx->t + 9*(1+2
*si))+6)[2]) - (((sctx->t + 9*(0+2*si))+6)[2])) + (((sctx->
t + 9*(0+2*si))+6)[2]))))
;
337 ELL_3V_LERP(g, alpha, sctx->grad + 3*(0+2*si), sctx->grad + 3*(1+2*si))((g)[0] = (((alpha))*(((sctx->grad + 3*(1+2*si))[0]) - ((sctx
->grad + 3*(0+2*si))[0])) + ((sctx->grad + 3*(0+2*si))[
0])), (g)[1] = (((alpha))*(((sctx->grad + 3*(1+2*si))[1]) -
((sctx->grad + 3*(0+2*si))[1])) + ((sctx->grad + 3*(0+
2*si))[1])), (g)[2] = (((alpha))*(((sctx->grad + 3*(1+2*si
))[2]) - ((sctx->grad + 3*(0+2*si))[2])) + ((sctx->grad
+ 3*(0+2*si))[2])))
;
338 if (xi==0) {
339 ELL_3M_COPY(Txm, T)((((Txm)+0)[0] = ((T)+0)[0], ((Txm)+0)[1] = ((T)+0)[1], ((Txm
)+0)[2] = ((T)+0)[2]), (((Txm)+3)[0] = ((T)+3)[0], ((Txm)+3)[
1] = ((T)+3)[1], ((Txm)+3)[2] = ((T)+3)[2]), (((Txm)+6)[0] = (
(T)+6)[0], ((Txm)+6)[1] = ((T)+6)[1], ((Txm)+6)[2] = ((T)+6)[
2]))
; ELL_3V_COPY(gxm, g)((gxm)[0] = (g)[0], (gxm)[1] = (g)[1], (gxm)[2] = (g)[2]);
340 } else {
341 ELL_3M_LERP(Txm, alpha, sctx->t + 9*(0+2*siX), sctx->t + 9*(1+2*siX))((((Txm)+0)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*siX))+0
)[0]) - (((sctx->t + 9*(0+2*siX))+0)[0])) + (((sctx->t +
9*(0+2*siX))+0)[0])), ((Txm)+0)[1] = ((((alpha)))*((((sctx->
t + 9*(1+2*siX))+0)[1]) - (((sctx->t + 9*(0+2*siX))+0)[1])
) + (((sctx->t + 9*(0+2*siX))+0)[1])), ((Txm)+0)[2] = ((((
alpha)))*((((sctx->t + 9*(1+2*siX))+0)[2]) - (((sctx->t
+ 9*(0+2*siX))+0)[2])) + (((sctx->t + 9*(0+2*siX))+0)[2])
)), (((Txm)+3)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*siX)
)+3)[0]) - (((sctx->t + 9*(0+2*siX))+3)[0])) + (((sctx->
t + 9*(0+2*siX))+3)[0])), ((Txm)+3)[1] = ((((alpha)))*((((sctx
->t + 9*(1+2*siX))+3)[1]) - (((sctx->t + 9*(0+2*siX))+3
)[1])) + (((sctx->t + 9*(0+2*siX))+3)[1])), ((Txm)+3)[2] =
((((alpha)))*((((sctx->t + 9*(1+2*siX))+3)[2]) - (((sctx->
t + 9*(0+2*siX))+3)[2])) + (((sctx->t + 9*(0+2*siX))+3)[2]
))), (((Txm)+6)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*siX
))+6)[0]) - (((sctx->t + 9*(0+2*siX))+6)[0])) + (((sctx->
t + 9*(0+2*siX))+6)[0])), ((Txm)+6)[1] = ((((alpha)))*((((sctx
->t + 9*(1+2*siX))+6)[1]) - (((sctx->t + 9*(0+2*siX))+6
)[1])) + (((sctx->t + 9*(0+2*siX))+6)[1])), ((Txm)+6)[2] =
((((alpha)))*((((sctx->t + 9*(1+2*siX))+6)[2]) - (((sctx->
t + 9*(0+2*siX))+6)[2])) + (((sctx->t + 9*(0+2*siX))+6)[2]
))))
;
342 ELL_3V_LERP(gxm, alpha, sctx->grad + 3*(0+2*siX),((gxm)[0] = (((alpha))*(((sctx->grad + 3*(1+2*siX))[0]) - (
(sctx->grad + 3*(0+2*siX))[0])) + ((sctx->grad + 3*(0+2
*siX))[0])), (gxm)[1] = (((alpha))*(((sctx->grad + 3*(1+2*
siX))[1]) - ((sctx->grad + 3*(0+2*siX))[1])) + ((sctx->
grad + 3*(0+2*siX))[1])), (gxm)[2] = (((alpha))*(((sctx->grad
+ 3*(1+2*siX))[2]) - ((sctx->grad + 3*(0+2*siX))[2])) + (
(sctx->grad + 3*(0+2*siX))[2])))
343 sctx->grad + 3*(1+2*siX))((gxm)[0] = (((alpha))*(((sctx->grad + 3*(1+2*siX))[0]) - (
(sctx->grad + 3*(0+2*siX))[0])) + ((sctx->grad + 3*(0+2
*siX))[0])), (gxm)[1] = (((alpha))*(((sctx->grad + 3*(1+2*
siX))[1]) - ((sctx->grad + 3*(0+2*siX))[1])) + ((sctx->
grad + 3*(0+2*siX))[1])), (gxm)[2] = (((alpha))*(((sctx->grad
+ 3*(1+2*siX))[2]) - ((sctx->grad + 3*(0+2*siX))[2])) + (
(sctx->grad + 3*(0+2*siX))[2])))
;
344 }
345 if (xi==sx-1) {
346 ELL_3M_COPY(Txp, T)((((Txp)+0)[0] = ((T)+0)[0], ((Txp)+0)[1] = ((T)+0)[1], ((Txp
)+0)[2] = ((T)+0)[2]), (((Txp)+3)[0] = ((T)+3)[0], ((Txp)+3)[
1] = ((T)+3)[1], ((Txp)+3)[2] = ((T)+3)[2]), (((Txp)+6)[0] = (
(T)+6)[0], ((Txp)+6)[1] = ((T)+6)[1], ((Txp)+6)[2] = ((T)+6)[
2]))
; ELL_3V_COPY(gxp, g)((gxp)[0] = (g)[0], (gxp)[1] = (g)[1], (gxp)[2] = (g)[2]);
347 } else {
348 ELL_3M_LERP(Txp, alpha, sctx->t + 9*(0+2*six), sctx->t + 9*(1+2*six))((((Txp)+0)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*six))+0
)[0]) - (((sctx->t + 9*(0+2*six))+0)[0])) + (((sctx->t +
9*(0+2*six))+0)[0])), ((Txp)+0)[1] = ((((alpha)))*((((sctx->
t + 9*(1+2*six))+0)[1]) - (((sctx->t + 9*(0+2*six))+0)[1])
) + (((sctx->t + 9*(0+2*six))+0)[1])), ((Txp)+0)[2] = ((((
alpha)))*((((sctx->t + 9*(1+2*six))+0)[2]) - (((sctx->t
+ 9*(0+2*six))+0)[2])) + (((sctx->t + 9*(0+2*six))+0)[2])
)), (((Txp)+3)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*six)
)+3)[0]) - (((sctx->t + 9*(0+2*six))+3)[0])) + (((sctx->
t + 9*(0+2*six))+3)[0])), ((Txp)+3)[1] = ((((alpha)))*((((sctx
->t + 9*(1+2*six))+3)[1]) - (((sctx->t + 9*(0+2*six))+3
)[1])) + (((sctx->t + 9*(0+2*six))+3)[1])), ((Txp)+3)[2] =
((((alpha)))*((((sctx->t + 9*(1+2*six))+3)[2]) - (((sctx->
t + 9*(0+2*six))+3)[2])) + (((sctx->t + 9*(0+2*six))+3)[2]
))), (((Txp)+6)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*six
))+6)[0]) - (((sctx->t + 9*(0+2*six))+6)[0])) + (((sctx->
t + 9*(0+2*six))+6)[0])), ((Txp)+6)[1] = ((((alpha)))*((((sctx
->t + 9*(1+2*six))+6)[1]) - (((sctx->t + 9*(0+2*six))+6
)[1])) + (((sctx->t + 9*(0+2*six))+6)[1])), ((Txp)+6)[2] =
((((alpha)))*((((sctx->t + 9*(1+2*six))+6)[2]) - (((sctx->
t + 9*(0+2*six))+6)[2])) + (((sctx->t + 9*(0+2*six))+6)[2]
))))
;
349 ELL_3V_LERP(gxp, alpha, sctx->grad + 3*(0+2*six),((gxp)[0] = (((alpha))*(((sctx->grad + 3*(1+2*six))[0]) - (
(sctx->grad + 3*(0+2*six))[0])) + ((sctx->grad + 3*(0+2
*six))[0])), (gxp)[1] = (((alpha))*(((sctx->grad + 3*(1+2*
six))[1]) - ((sctx->grad + 3*(0+2*six))[1])) + ((sctx->
grad + 3*(0+2*six))[1])), (gxp)[2] = (((alpha))*(((sctx->grad
+ 3*(1+2*six))[2]) - ((sctx->grad + 3*(0+2*six))[2])) + (
(sctx->grad + 3*(0+2*six))[2])))
350 sctx->grad + 3*(1+2*six))((gxp)[0] = (((alpha))*(((sctx->grad + 3*(1+2*six))[0]) - (
(sctx->grad + 3*(0+2*six))[0])) + ((sctx->grad + 3*(0+2
*six))[0])), (gxp)[1] = (((alpha))*(((sctx->grad + 3*(1+2*
six))[1]) - ((sctx->grad + 3*(0+2*six))[1])) + ((sctx->
grad + 3*(0+2*six))[1])), (gxp)[2] = (((alpha))*(((sctx->grad
+ 3*(1+2*six))[2]) - ((sctx->grad + 3*(0+2*six))[2])) + (
(sctx->grad + 3*(0+2*six))[2])))
;
351 }
352 if (xi!=0 && xi!=sx-1) {
353 ELL_3M_SCALE(Txm, 0.5, Txm)((((Txm)+0)[0] = ((0.5))*((Txm)+0)[0], ((Txm)+0)[1] = ((0.5))
*((Txm)+0)[1], ((Txm)+0)[2] = ((0.5))*((Txm)+0)[2]), (((Txm)+
3)[0] = ((0.5))*((Txm)+3)[0], ((Txm)+3)[1] = ((0.5))*((Txm)+3
)[1], ((Txm)+3)[2] = ((0.5))*((Txm)+3)[2]), (((Txm)+6)[0] = (
(0.5))*((Txm)+6)[0], ((Txm)+6)[1] = ((0.5))*((Txm)+6)[1], ((Txm
)+6)[2] = ((0.5))*((Txm)+6)[2]))
; ELL_3M_SCALE(Txp, 0.5, Txp)((((Txp)+0)[0] = ((0.5))*((Txp)+0)[0], ((Txp)+0)[1] = ((0.5))
*((Txp)+0)[1], ((Txp)+0)[2] = ((0.5))*((Txp)+0)[2]), (((Txp)+
3)[0] = ((0.5))*((Txp)+3)[0], ((Txp)+3)[1] = ((0.5))*((Txp)+3
)[1], ((Txp)+3)[2] = ((0.5))*((Txp)+3)[2]), (((Txp)+6)[0] = (
(0.5))*((Txp)+6)[0], ((Txp)+6)[1] = ((0.5))*((Txp)+6)[1], ((Txp
)+6)[2] = ((0.5))*((Txp)+6)[2]))
;
354 ELL_3V_SCALE(gxm, 0.5, gxm)((gxm)[0] = (0.5)*(gxm)[0], (gxm)[1] = (0.5)*(gxm)[1], (gxm)[
2] = (0.5)*(gxm)[2])
; ELL_3V_SCALE(gxp, 0.5, gxp)((gxp)[0] = (0.5)*(gxp)[0], (gxp)[1] = (0.5)*(gxp)[1], (gxp)[
2] = (0.5)*(gxp)[2])
;
355 }
356 if (yi==0) {
357 ELL_3M_COPY(Tym, T)((((Tym)+0)[0] = ((T)+0)[0], ((Tym)+0)[1] = ((T)+0)[1], ((Tym
)+0)[2] = ((T)+0)[2]), (((Tym)+3)[0] = ((T)+3)[0], ((Tym)+3)[
1] = ((T)+3)[1], ((Tym)+3)[2] = ((T)+3)[2]), (((Tym)+6)[0] = (
(T)+6)[0], ((Tym)+6)[1] = ((T)+6)[1], ((Tym)+6)[2] = ((T)+6)[
2]))
; ELL_3V_COPY(gym, g)((gym)[0] = (g)[0], (gym)[1] = (g)[1], (gym)[2] = (g)[2]);
358 } else {
359 ELL_3M_LERP(Tym, alpha, sctx->t + 9*(0+2*siY), sctx->t + 9*(1+2*siY))((((Tym)+0)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*siY))+0
)[0]) - (((sctx->t + 9*(0+2*siY))+0)[0])) + (((sctx->t +
9*(0+2*siY))+0)[0])), ((Tym)+0)[1] = ((((alpha)))*((((sctx->
t + 9*(1+2*siY))+0)[1]) - (((sctx->t + 9*(0+2*siY))+0)[1])
) + (((sctx->t + 9*(0+2*siY))+0)[1])), ((Tym)+0)[2] = ((((
alpha)))*((((sctx->t + 9*(1+2*siY))+0)[2]) - (((sctx->t
+ 9*(0+2*siY))+0)[2])) + (((sctx->t + 9*(0+2*siY))+0)[2])
)), (((Tym)+3)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*siY)
)+3)[0]) - (((sctx->t + 9*(0+2*siY))+3)[0])) + (((sctx->
t + 9*(0+2*siY))+3)[0])), ((Tym)+3)[1] = ((((alpha)))*((((sctx
->t + 9*(1+2*siY))+3)[1]) - (((sctx->t + 9*(0+2*siY))+3
)[1])) + (((sctx->t + 9*(0+2*siY))+3)[1])), ((Tym)+3)[2] =
((((alpha)))*((((sctx->t + 9*(1+2*siY))+3)[2]) - (((sctx->
t + 9*(0+2*siY))+3)[2])) + (((sctx->t + 9*(0+2*siY))+3)[2]
))), (((Tym)+6)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*siY
))+6)[0]) - (((sctx->t + 9*(0+2*siY))+6)[0])) + (((sctx->
t + 9*(0+2*siY))+6)[0])), ((Tym)+6)[1] = ((((alpha)))*((((sctx
->t + 9*(1+2*siY))+6)[1]) - (((sctx->t + 9*(0+2*siY))+6
)[1])) + (((sctx->t + 9*(0+2*siY))+6)[1])), ((Tym)+6)[2] =
((((alpha)))*((((sctx->t + 9*(1+2*siY))+6)[2]) - (((sctx->
t + 9*(0+2*siY))+6)[2])) + (((sctx->t + 9*(0+2*siY))+6)[2]
))))
;
360 ELL_3V_LERP(gym, alpha, sctx->grad + 3*(0+2*siY),((gym)[0] = (((alpha))*(((sctx->grad + 3*(1+2*siY))[0]) - (
(sctx->grad + 3*(0+2*siY))[0])) + ((sctx->grad + 3*(0+2
*siY))[0])), (gym)[1] = (((alpha))*(((sctx->grad + 3*(1+2*
siY))[1]) - ((sctx->grad + 3*(0+2*siY))[1])) + ((sctx->
grad + 3*(0+2*siY))[1])), (gym)[2] = (((alpha))*(((sctx->grad
+ 3*(1+2*siY))[2]) - ((sctx->grad + 3*(0+2*siY))[2])) + (
(sctx->grad + 3*(0+2*siY))[2])))
361 sctx->grad + 3*(1+2*siY))((gym)[0] = (((alpha))*(((sctx->grad + 3*(1+2*siY))[0]) - (
(sctx->grad + 3*(0+2*siY))[0])) + ((sctx->grad + 3*(0+2
*siY))[0])), (gym)[1] = (((alpha))*(((sctx->grad + 3*(1+2*
siY))[1]) - ((sctx->grad + 3*(0+2*siY))[1])) + ((sctx->
grad + 3*(0+2*siY))[1])), (gym)[2] = (((alpha))*(((sctx->grad
+ 3*(1+2*siY))[2]) - ((sctx->grad + 3*(0+2*siY))[2])) + (
(sctx->grad + 3*(0+2*siY))[2])))
;
362 }
363 if (yi==sy-1) {
364 ELL_3M_COPY(Typ, T)((((Typ)+0)[0] = ((T)+0)[0], ((Typ)+0)[1] = ((T)+0)[1], ((Typ
)+0)[2] = ((T)+0)[2]), (((Typ)+3)[0] = ((T)+3)[0], ((Typ)+3)[
1] = ((T)+3)[1], ((Typ)+3)[2] = ((T)+3)[2]), (((Typ)+6)[0] = (
(T)+6)[0], ((Typ)+6)[1] = ((T)+6)[1], ((Typ)+6)[2] = ((T)+6)[
2]))
; ELL_3V_COPY(gyp, g)((gyp)[0] = (g)[0], (gyp)[1] = (g)[1], (gyp)[2] = (g)[2]);
365 } else {
366 ELL_3M_LERP(Typ, alpha, sctx->t + 9*(0+2*siy), sctx->t + 9*(1+2*siy))((((Typ)+0)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*siy))+0
)[0]) - (((sctx->t + 9*(0+2*siy))+0)[0])) + (((sctx->t +
9*(0+2*siy))+0)[0])), ((Typ)+0)[1] = ((((alpha)))*((((sctx->
t + 9*(1+2*siy))+0)[1]) - (((sctx->t + 9*(0+2*siy))+0)[1])
) + (((sctx->t + 9*(0+2*siy))+0)[1])), ((Typ)+0)[2] = ((((
alpha)))*((((sctx->t + 9*(1+2*siy))+0)[2]) - (((sctx->t
+ 9*(0+2*siy))+0)[2])) + (((sctx->t + 9*(0+2*siy))+0)[2])
)), (((Typ)+3)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*siy)
)+3)[0]) - (((sctx->t + 9*(0+2*siy))+3)[0])) + (((sctx->
t + 9*(0+2*siy))+3)[0])), ((Typ)+3)[1] = ((((alpha)))*((((sctx
->t + 9*(1+2*siy))+3)[1]) - (((sctx->t + 9*(0+2*siy))+3
)[1])) + (((sctx->t + 9*(0+2*siy))+3)[1])), ((Typ)+3)[2] =
((((alpha)))*((((sctx->t + 9*(1+2*siy))+3)[2]) - (((sctx->
t + 9*(0+2*siy))+3)[2])) + (((sctx->t + 9*(0+2*siy))+3)[2]
))), (((Typ)+6)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*siy
))+6)[0]) - (((sctx->t + 9*(0+2*siy))+6)[0])) + (((sctx->
t + 9*(0+2*siy))+6)[0])), ((Typ)+6)[1] = ((((alpha)))*((((sctx
->t + 9*(1+2*siy))+6)[1]) - (((sctx->t + 9*(0+2*siy))+6
)[1])) + (((sctx->t + 9*(0+2*siy))+6)[1])), ((Typ)+6)[2] =
((((alpha)))*((((sctx->t + 9*(1+2*siy))+6)[2]) - (((sctx->
t + 9*(0+2*siy))+6)[2])) + (((sctx->t + 9*(0+2*siy))+6)[2]
))))
;
367 ELL_3V_LERP(gyp, alpha, sctx->grad + 3*(0+2*siy),((gyp)[0] = (((alpha))*(((sctx->grad + 3*(1+2*siy))[0]) - (
(sctx->grad + 3*(0+2*siy))[0])) + ((sctx->grad + 3*(0+2
*siy))[0])), (gyp)[1] = (((alpha))*(((sctx->grad + 3*(1+2*
siy))[1]) - ((sctx->grad + 3*(0+2*siy))[1])) + ((sctx->
grad + 3*(0+2*siy))[1])), (gyp)[2] = (((alpha))*(((sctx->grad
+ 3*(1+2*siy))[2]) - ((sctx->grad + 3*(0+2*siy))[2])) + (
(sctx->grad + 3*(0+2*siy))[2])))
368 sctx->grad + 3*(1+2*siy))((gyp)[0] = (((alpha))*(((sctx->grad + 3*(1+2*siy))[0]) - (
(sctx->grad + 3*(0+2*siy))[0])) + ((sctx->grad + 3*(0+2
*siy))[0])), (gyp)[1] = (((alpha))*(((sctx->grad + 3*(1+2*
siy))[1]) - ((sctx->grad + 3*(0+2*siy))[1])) + ((sctx->
grad + 3*(0+2*siy))[1])), (gyp)[2] = (((alpha))*(((sctx->grad
+ 3*(1+2*siy))[2]) - ((sctx->grad + 3*(0+2*siy))[2])) + (
(sctx->grad + 3*(0+2*siy))[2])))
;
369 }
370 if (yi!=0 && yi!=sy-1) {
371 ELL_3M_SCALE(Tym, 0.5, Tym)((((Tym)+0)[0] = ((0.5))*((Tym)+0)[0], ((Tym)+0)[1] = ((0.5))
*((Tym)+0)[1], ((Tym)+0)[2] = ((0.5))*((Tym)+0)[2]), (((Tym)+
3)[0] = ((0.5))*((Tym)+3)[0], ((Tym)+3)[1] = ((0.5))*((Tym)+3
)[1], ((Tym)+3)[2] = ((0.5))*((Tym)+3)[2]), (((Tym)+6)[0] = (
(0.5))*((Tym)+6)[0], ((Tym)+6)[1] = ((0.5))*((Tym)+6)[1], ((Tym
)+6)[2] = ((0.5))*((Tym)+6)[2]))
; ELL_3M_SCALE(Typ, 0.5, Typ)((((Typ)+0)[0] = ((0.5))*((Typ)+0)[0], ((Typ)+0)[1] = ((0.5))
*((Typ)+0)[1], ((Typ)+0)[2] = ((0.5))*((Typ)+0)[2]), (((Typ)+
3)[0] = ((0.5))*((Typ)+3)[0], ((Typ)+3)[1] = ((0.5))*((Typ)+3
)[1], ((Typ)+3)[2] = ((0.5))*((Typ)+3)[2]), (((Typ)+6)[0] = (
(0.5))*((Typ)+6)[0], ((Typ)+6)[1] = ((0.5))*((Typ)+6)[1], ((Typ
)+6)[2] = ((0.5))*((Typ)+6)[2]))
;
372 ELL_3V_SCALE(gym, 0.5, gym)((gym)[0] = (0.5)*(gym)[0], (gym)[1] = (0.5)*(gym)[1], (gym)[
2] = (0.5)*(gym)[2])
; ELL_3V_SCALE(gyp, 0.5, gyp)((gyp)[0] = (0.5)*(gyp)[0], (gyp)[1] = (0.5)*(gyp)[1], (gyp)[
2] = (0.5)*(gyp)[2])
;
373 }
374 if (bag->zi>0 && bag->zi<sz-2) {
375 ELL_3M_LERP(Tzm, alpha, sctx->tcontext + 9*(0+2*si),((((Tzm)+0)[0] = ((((alpha)))*((((sctx->t + 9*(0+2*si))+0)
[0]) - (((sctx->tcontext + 9*(0+2*si))+0)[0])) + (((sctx->
tcontext + 9*(0+2*si))+0)[0])), ((Tzm)+0)[1] = ((((alpha)))*(
(((sctx->t + 9*(0+2*si))+0)[1]) - (((sctx->tcontext + 9
*(0+2*si))+0)[1])) + (((sctx->tcontext + 9*(0+2*si))+0)[1]
)), ((Tzm)+0)[2] = ((((alpha)))*((((sctx->t + 9*(0+2*si))+
0)[2]) - (((sctx->tcontext + 9*(0+2*si))+0)[2])) + (((sctx
->tcontext + 9*(0+2*si))+0)[2]))), (((Tzm)+3)[0] = ((((alpha
)))*((((sctx->t + 9*(0+2*si))+3)[0]) - (((sctx->tcontext
+ 9*(0+2*si))+3)[0])) + (((sctx->tcontext + 9*(0+2*si))+3
)[0])), ((Tzm)+3)[1] = ((((alpha)))*((((sctx->t + 9*(0+2*si
))+3)[1]) - (((sctx->tcontext + 9*(0+2*si))+3)[1])) + (((sctx
->tcontext + 9*(0+2*si))+3)[1])), ((Tzm)+3)[2] = ((((alpha
)))*((((sctx->t + 9*(0+2*si))+3)[2]) - (((sctx->tcontext
+ 9*(0+2*si))+3)[2])) + (((sctx->tcontext + 9*(0+2*si))+3
)[2]))), (((Tzm)+6)[0] = ((((alpha)))*((((sctx->t + 9*(0+2
*si))+6)[0]) - (((sctx->tcontext + 9*(0+2*si))+6)[0])) + (
((sctx->tcontext + 9*(0+2*si))+6)[0])), ((Tzm)+6)[1] = (((
(alpha)))*((((sctx->t + 9*(0+2*si))+6)[1]) - (((sctx->tcontext
+ 9*(0+2*si))+6)[1])) + (((sctx->tcontext + 9*(0+2*si))+6
)[1])), ((Tzm)+6)[2] = ((((alpha)))*((((sctx->t + 9*(0+2*si
))+6)[2]) - (((sctx->tcontext + 9*(0+2*si))+6)[2])) + (((sctx
->tcontext + 9*(0+2*si))+6)[2]))))
376 sctx->t + 9*(0+2*si))((((Tzm)+0)[0] = ((((alpha)))*((((sctx->t + 9*(0+2*si))+0)
[0]) - (((sctx->tcontext + 9*(0+2*si))+0)[0])) + (((sctx->
tcontext + 9*(0+2*si))+0)[0])), ((Tzm)+0)[1] = ((((alpha)))*(
(((sctx->t + 9*(0+2*si))+0)[1]) - (((sctx->tcontext + 9
*(0+2*si))+0)[1])) + (((sctx->tcontext + 9*(0+2*si))+0)[1]
)), ((Tzm)+0)[2] = ((((alpha)))*((((sctx->t + 9*(0+2*si))+
0)[2]) - (((sctx->tcontext + 9*(0+2*si))+0)[2])) + (((sctx
->tcontext + 9*(0+2*si))+0)[2]))), (((Tzm)+3)[0] = ((((alpha
)))*((((sctx->t + 9*(0+2*si))+3)[0]) - (((sctx->tcontext
+ 9*(0+2*si))+3)[0])) + (((sctx->tcontext + 9*(0+2*si))+3
)[0])), ((Tzm)+3)[1] = ((((alpha)))*((((sctx->t + 9*(0+2*si
))+3)[1]) - (((sctx->tcontext + 9*(0+2*si))+3)[1])) + (((sctx
->tcontext + 9*(0+2*si))+3)[1])), ((Tzm)+3)[2] = ((((alpha
)))*((((sctx->t + 9*(0+2*si))+3)[2]) - (((sctx->tcontext
+ 9*(0+2*si))+3)[2])) + (((sctx->tcontext + 9*(0+2*si))+3
)[2]))), (((Tzm)+6)[0] = ((((alpha)))*((((sctx->t + 9*(0+2
*si))+6)[0]) - (((sctx->tcontext + 9*(0+2*si))+6)[0])) + (
((sctx->tcontext + 9*(0+2*si))+6)[0])), ((Tzm)+6)[1] = (((
(alpha)))*((((sctx->t + 9*(0+2*si))+6)[1]) - (((sctx->tcontext
+ 9*(0+2*si))+6)[1])) + (((sctx->tcontext + 9*(0+2*si))+6
)[1])), ((Tzm)+6)[2] = ((((alpha)))*((((sctx->t + 9*(0+2*si
))+6)[2]) - (((sctx->tcontext + 9*(0+2*si))+6)[2])) + (((sctx
->tcontext + 9*(0+2*si))+6)[2]))))
;
377 ELL_3V_LERP(gzm, alpha, sctx->gradcontext + 3*(0+2*si),((gzm)[0] = (((alpha))*(((sctx->grad + 3*(0+2*si))[0]) - (
(sctx->gradcontext + 3*(0+2*si))[0])) + ((sctx->gradcontext
+ 3*(0+2*si))[0])), (gzm)[1] = (((alpha))*(((sctx->grad +
3*(0+2*si))[1]) - ((sctx->gradcontext + 3*(0+2*si))[1])) +
((sctx->gradcontext + 3*(0+2*si))[1])), (gzm)[2] = (((alpha
))*(((sctx->grad + 3*(0+2*si))[2]) - ((sctx->gradcontext
+ 3*(0+2*si))[2])) + ((sctx->gradcontext + 3*(0+2*si))[2]
)))
378 sctx->grad + 3*(0+2*si))((gzm)[0] = (((alpha))*(((sctx->grad + 3*(0+2*si))[0]) - (
(sctx->gradcontext + 3*(0+2*si))[0])) + ((sctx->gradcontext
+ 3*(0+2*si))[0])), (gzm)[1] = (((alpha))*(((sctx->grad +
3*(0+2*si))[1]) - ((sctx->gradcontext + 3*(0+2*si))[1])) +
((sctx->gradcontext + 3*(0+2*si))[1])), (gzm)[2] = (((alpha
))*(((sctx->grad + 3*(0+2*si))[2]) - ((sctx->gradcontext
+ 3*(0+2*si))[2])) + ((sctx->gradcontext + 3*(0+2*si))[2]
)))
;
379 ELL_3M_LERP(Tzp, alpha, sctx->t + 9*(1+2*si),((((Tzp)+0)[0] = ((((alpha)))*((((sctx->tcontext + 9*(1+2*
si))+0)[0]) - (((sctx->t + 9*(1+2*si))+0)[0])) + (((sctx->
t + 9*(1+2*si))+0)[0])), ((Tzp)+0)[1] = ((((alpha)))*((((sctx
->tcontext + 9*(1+2*si))+0)[1]) - (((sctx->t + 9*(1+2*si
))+0)[1])) + (((sctx->t + 9*(1+2*si))+0)[1])), ((Tzp)+0)[2
] = ((((alpha)))*((((sctx->tcontext + 9*(1+2*si))+0)[2]) -
(((sctx->t + 9*(1+2*si))+0)[2])) + (((sctx->t + 9*(1+2
*si))+0)[2]))), (((Tzp)+3)[0] = ((((alpha)))*((((sctx->tcontext
+ 9*(1+2*si))+3)[0]) - (((sctx->t + 9*(1+2*si))+3)[0])) +
(((sctx->t + 9*(1+2*si))+3)[0])), ((Tzp)+3)[1] = ((((alpha
)))*((((sctx->tcontext + 9*(1+2*si))+3)[1]) - (((sctx->
t + 9*(1+2*si))+3)[1])) + (((sctx->t + 9*(1+2*si))+3)[1]))
, ((Tzp)+3)[2] = ((((alpha)))*((((sctx->tcontext + 9*(1+2*
si))+3)[2]) - (((sctx->t + 9*(1+2*si))+3)[2])) + (((sctx->
t + 9*(1+2*si))+3)[2]))), (((Tzp)+6)[0] = ((((alpha)))*((((sctx
->tcontext + 9*(1+2*si))+6)[0]) - (((sctx->t + 9*(1+2*si
))+6)[0])) + (((sctx->t + 9*(1+2*si))+6)[0])), ((Tzp)+6)[1
] = ((((alpha)))*((((sctx->tcontext + 9*(1+2*si))+6)[1]) -
(((sctx->t + 9*(1+2*si))+6)[1])) + (((sctx->t + 9*(1+2
*si))+6)[1])), ((Tzp)+6)[2] = ((((alpha)))*((((sctx->tcontext
+ 9*(1+2*si))+6)[2]) - (((sctx->t + 9*(1+2*si))+6)[2])) +
(((sctx->t + 9*(1+2*si))+6)[2]))))
380 sctx->tcontext + 9*(1+2*si))((((Tzp)+0)[0] = ((((alpha)))*((((sctx->tcontext + 9*(1+2*
si))+0)[0]) - (((sctx->t + 9*(1+2*si))+0)[0])) + (((sctx->
t + 9*(1+2*si))+0)[0])), ((Tzp)+0)[1] = ((((alpha)))*((((sctx
->tcontext + 9*(1+2*si))+0)[1]) - (((sctx->t + 9*(1+2*si
))+0)[1])) + (((sctx->t + 9*(1+2*si))+0)[1])), ((Tzp)+0)[2
] = ((((alpha)))*((((sctx->tcontext + 9*(1+2*si))+0)[2]) -
(((sctx->t + 9*(1+2*si))+0)[2])) + (((sctx->t + 9*(1+2
*si))+0)[2]))), (((Tzp)+3)[0] = ((((alpha)))*((((sctx->tcontext
+ 9*(1+2*si))+3)[0]) - (((sctx->t + 9*(1+2*si))+3)[0])) +
(((sctx->t + 9*(1+2*si))+3)[0])), ((Tzp)+3)[1] = ((((alpha
)))*((((sctx->tcontext + 9*(1+2*si))+3)[1]) - (((sctx->
t + 9*(1+2*si))+3)[1])) + (((sctx->t + 9*(1+2*si))+3)[1]))
, ((Tzp)+3)[2] = ((((alpha)))*((((sctx->tcontext + 9*(1+2*
si))+3)[2]) - (((sctx->t + 9*(1+2*si))+3)[2])) + (((sctx->
t + 9*(1+2*si))+3)[2]))), (((Tzp)+6)[0] = ((((alpha)))*((((sctx
->tcontext + 9*(1+2*si))+6)[0]) - (((sctx->t + 9*(1+2*si
))+6)[0])) + (((sctx->t + 9*(1+2*si))+6)[0])), ((Tzp)+6)[1
] = ((((alpha)))*((((sctx->tcontext + 9*(1+2*si))+6)[1]) -
(((sctx->t + 9*(1+2*si))+6)[1])) + (((sctx->t + 9*(1+2
*si))+6)[1])), ((Tzp)+6)[2] = ((((alpha)))*((((sctx->tcontext
+ 9*(1+2*si))+6)[2]) - (((sctx->t + 9*(1+2*si))+6)[2])) +
(((sctx->t + 9*(1+2*si))+6)[2]))))
;
381 ELL_3V_LERP(gzp, alpha, sctx->grad + 3*(1+2*si),((gzp)[0] = (((alpha))*(((sctx->gradcontext + 3*(1+2*si))[
0]) - ((sctx->grad + 3*(1+2*si))[0])) + ((sctx->grad + 3
*(1+2*si))[0])), (gzp)[1] = (((alpha))*(((sctx->gradcontext
+ 3*(1+2*si))[1]) - ((sctx->grad + 3*(1+2*si))[1])) + ((sctx
->grad + 3*(1+2*si))[1])), (gzp)[2] = (((alpha))*(((sctx->
gradcontext + 3*(1+2*si))[2]) - ((sctx->grad + 3*(1+2*si))
[2])) + ((sctx->grad + 3*(1+2*si))[2])))
382 sctx->gradcontext + 3*(1+2*si))((gzp)[0] = (((alpha))*(((sctx->gradcontext + 3*(1+2*si))[
0]) - ((sctx->grad + 3*(1+2*si))[0])) + ((sctx->grad + 3
*(1+2*si))[0])), (gzp)[1] = (((alpha))*(((sctx->gradcontext
+ 3*(1+2*si))[1]) - ((sctx->grad + 3*(1+2*si))[1])) + ((sctx
->grad + 3*(1+2*si))[1])), (gzp)[2] = (((alpha))*(((sctx->
gradcontext + 3*(1+2*si))[2]) - ((sctx->grad + 3*(1+2*si))
[2])) + ((sctx->grad + 3*(1+2*si))[2])))
;
383 ELL_3M_SCALE(Tzm, 0.5, Tzm)((((Tzm)+0)[0] = ((0.5))*((Tzm)+0)[0], ((Tzm)+0)[1] = ((0.5))
*((Tzm)+0)[1], ((Tzm)+0)[2] = ((0.5))*((Tzm)+0)[2]), (((Tzm)+
3)[0] = ((0.5))*((Tzm)+3)[0], ((Tzm)+3)[1] = ((0.5))*((Tzm)+3
)[1], ((Tzm)+3)[2] = ((0.5))*((Tzm)+3)[2]), (((Tzm)+6)[0] = (
(0.5))*((Tzm)+6)[0], ((Tzm)+6)[1] = ((0.5))*((Tzm)+6)[1], ((Tzm
)+6)[2] = ((0.5))*((Tzm)+6)[2]))
; ELL_3M_SCALE(Tzp, 0.5, Tzp)((((Tzp)+0)[0] = ((0.5))*((Tzp)+0)[0], ((Tzp)+0)[1] = ((0.5))
*((Tzp)+0)[1], ((Tzp)+0)[2] = ((0.5))*((Tzp)+0)[2]), (((Tzp)+
3)[0] = ((0.5))*((Tzp)+3)[0], ((Tzp)+3)[1] = ((0.5))*((Tzp)+3
)[1], ((Tzp)+3)[2] = ((0.5))*((Tzp)+3)[2]), (((Tzp)+6)[0] = (
(0.5))*((Tzp)+6)[0], ((Tzp)+6)[1] = ((0.5))*((Tzp)+6)[1], ((Tzp
)+6)[2] = ((0.5))*((Tzp)+6)[2]))
;
384 ELL_3V_SCALE(gzm, 0.5, gzm)((gzm)[0] = (0.5)*(gzm)[0], (gzm)[1] = (0.5)*(gzm)[1], (gzm)[
2] = (0.5)*(gzm)[2])
; ELL_3V_SCALE(gzp, 0.5, gzp)((gzp)[0] = (0.5)*(gzp)[0], (gzp)[1] = (0.5)*(gzp)[1], (gzp)[
2] = (0.5)*(gzp)[2])
;
385 } else {
386 ELL_3M_COPY(Tzm, sctx->t + 9*(0+2*si))((((Tzm)+0)[0] = ((sctx->t + 9*(0+2*si))+0)[0], ((Tzm)+0)[
1] = ((sctx->t + 9*(0+2*si))+0)[1], ((Tzm)+0)[2] = ((sctx->
t + 9*(0+2*si))+0)[2]), (((Tzm)+3)[0] = ((sctx->t + 9*(0+2
*si))+3)[0], ((Tzm)+3)[1] = ((sctx->t + 9*(0+2*si))+3)[1],
((Tzm)+3)[2] = ((sctx->t + 9*(0+2*si))+3)[2]), (((Tzm)+6)
[0] = ((sctx->t + 9*(0+2*si))+6)[0], ((Tzm)+6)[1] = ((sctx
->t + 9*(0+2*si))+6)[1], ((Tzm)+6)[2] = ((sctx->t + 9*(
0+2*si))+6)[2]))
;
387 ELL_3V_COPY(gzm, sctx->grad + 3*(0+2*si))((gzm)[0] = (sctx->grad + 3*(0+2*si))[0], (gzm)[1] = (sctx
->grad + 3*(0+2*si))[1], (gzm)[2] = (sctx->grad + 3*(0+
2*si))[2])
;
388 ELL_3M_COPY(Tzp, sctx->t + 9*(1+2*si))((((Tzp)+0)[0] = ((sctx->t + 9*(1+2*si))+0)[0], ((Tzp)+0)[
1] = ((sctx->t + 9*(1+2*si))+0)[1], ((Tzp)+0)[2] = ((sctx->
t + 9*(1+2*si))+0)[2]), (((Tzp)+3)[0] = ((sctx->t + 9*(1+2
*si))+3)[0], ((Tzp)+3)[1] = ((sctx->t + 9*(1+2*si))+3)[1],
((Tzp)+3)[2] = ((sctx->t + 9*(1+2*si))+3)[2]), (((Tzp)+6)
[0] = ((sctx->t + 9*(1+2*si))+6)[0], ((Tzp)+6)[1] = ((sctx
->t + 9*(1+2*si))+6)[1], ((Tzp)+6)[2] = ((sctx->t + 9*(
1+2*si))+6)[2]))
;
389 ELL_3V_COPY(gzp, sctx->grad + 3*(1+2*si))((gzp)[0] = (sctx->grad + 3*(1+2*si))[0], (gzp)[1] = (sctx
->grad + 3*(1+2*si))[1], (gzp)[2] = (sctx->grad + 3*(1+
2*si))[2])
;
390 }
391 computeGradientLin(res, T, g,
392 Txm, gxm, Txp, gxp,
393 Tym, gym, Typ, gyp,
394 Tzm, gzm, Tzp, gzp);
395 break;
396 case 3:
397 ELL_3M_LERP(T, alpha, sctx->t + 9*(1+2*si), sctx->t + 9*(1+2*six))((((T)+0)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*six))+0)[
0]) - (((sctx->t + 9*(1+2*si))+0)[0])) + (((sctx->t + 9
*(1+2*si))+0)[0])), ((T)+0)[1] = ((((alpha)))*((((sctx->t +
9*(1+2*six))+0)[1]) - (((sctx->t + 9*(1+2*si))+0)[1])) + (
((sctx->t + 9*(1+2*si))+0)[1])), ((T)+0)[2] = ((((alpha)))
*((((sctx->t + 9*(1+2*six))+0)[2]) - (((sctx->t + 9*(1+
2*si))+0)[2])) + (((sctx->t + 9*(1+2*si))+0)[2]))), (((T)+
3)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*six))+3)[0]) - (
((sctx->t + 9*(1+2*si))+3)[0])) + (((sctx->t + 9*(1+2*si
))+3)[0])), ((T)+3)[1] = ((((alpha)))*((((sctx->t + 9*(1+2
*six))+3)[1]) - (((sctx->t + 9*(1+2*si))+3)[1])) + (((sctx
->t + 9*(1+2*si))+3)[1])), ((T)+3)[2] = ((((alpha)))*((((sctx
->t + 9*(1+2*six))+3)[2]) - (((sctx->t + 9*(1+2*si))+3)
[2])) + (((sctx->t + 9*(1+2*si))+3)[2]))), (((T)+6)[0] = (
(((alpha)))*((((sctx->t + 9*(1+2*six))+6)[0]) - (((sctx->
t + 9*(1+2*si))+6)[0])) + (((sctx->t + 9*(1+2*si))+6)[0]))
, ((T)+6)[1] = ((((alpha)))*((((sctx->t + 9*(1+2*six))+6)[
1]) - (((sctx->t + 9*(1+2*si))+6)[1])) + (((sctx->t + 9
*(1+2*si))+6)[1])), ((T)+6)[2] = ((((alpha)))*((((sctx->t +
9*(1+2*six))+6)[2]) - (((sctx->t + 9*(1+2*si))+6)[2])) + (
((sctx->t + 9*(1+2*si))+6)[2]))))
;
398 ELL_3V_LERP(g, alpha, sctx->grad + 3*(1+2*si), sctx->grad + 3*(1+2*six))((g)[0] = (((alpha))*(((sctx->grad + 3*(1+2*six))[0]) - ((
sctx->grad + 3*(1+2*si))[0])) + ((sctx->grad + 3*(1+2*si
))[0])), (g)[1] = (((alpha))*(((sctx->grad + 3*(1+2*six))[
1]) - ((sctx->grad + 3*(1+2*si))[1])) + ((sctx->grad + 3
*(1+2*si))[1])), (g)[2] = (((alpha))*(((sctx->grad + 3*(1+
2*six))[2]) - ((sctx->grad + 3*(1+2*si))[2])) + ((sctx->
grad + 3*(1+2*si))[2])))
;
399 ELL_3M_LERP(Tzm, alpha, sctx->t + 9*(0+2*si), sctx->t + 9*(0+2*six))((((Tzm)+0)[0] = ((((alpha)))*((((sctx->t + 9*(0+2*six))+0
)[0]) - (((sctx->t + 9*(0+2*si))+0)[0])) + (((sctx->t +
9*(0+2*si))+0)[0])), ((Tzm)+0)[1] = ((((alpha)))*((((sctx->
t + 9*(0+2*six))+0)[1]) - (((sctx->t + 9*(0+2*si))+0)[1]))
+ (((sctx->t + 9*(0+2*si))+0)[1])), ((Tzm)+0)[2] = ((((alpha
)))*((((sctx->t + 9*(0+2*six))+0)[2]) - (((sctx->t + 9*
(0+2*si))+0)[2])) + (((sctx->t + 9*(0+2*si))+0)[2]))), (((
Tzm)+3)[0] = ((((alpha)))*((((sctx->t + 9*(0+2*six))+3)[0]
) - (((sctx->t + 9*(0+2*si))+3)[0])) + (((sctx->t + 9*(
0+2*si))+3)[0])), ((Tzm)+3)[1] = ((((alpha)))*((((sctx->t +
9*(0+2*six))+3)[1]) - (((sctx->t + 9*(0+2*si))+3)[1])) + (
((sctx->t + 9*(0+2*si))+3)[1])), ((Tzm)+3)[2] = ((((alpha)
))*((((sctx->t + 9*(0+2*six))+3)[2]) - (((sctx->t + 9*(
0+2*si))+3)[2])) + (((sctx->t + 9*(0+2*si))+3)[2]))), (((Tzm
)+6)[0] = ((((alpha)))*((((sctx->t + 9*(0+2*six))+6)[0]) -
(((sctx->t + 9*(0+2*si))+6)[0])) + (((sctx->t + 9*(0+2
*si))+6)[0])), ((Tzm)+6)[1] = ((((alpha)))*((((sctx->t + 9
*(0+2*six))+6)[1]) - (((sctx->t + 9*(0+2*si))+6)[1])) + ((
(sctx->t + 9*(0+2*si))+6)[1])), ((Tzm)+6)[2] = ((((alpha))
)*((((sctx->t + 9*(0+2*six))+6)[2]) - (((sctx->t + 9*(0
+2*si))+6)[2])) + (((sctx->t + 9*(0+2*si))+6)[2]))))
;
400 ELL_3V_LERP(gzm, alpha, sctx->grad + 3*(0+2*si), sctx->grad + 3*(0+2*six))((gzm)[0] = (((alpha))*(((sctx->grad + 3*(0+2*six))[0]) - (
(sctx->grad + 3*(0+2*si))[0])) + ((sctx->grad + 3*(0+2*
si))[0])), (gzm)[1] = (((alpha))*(((sctx->grad + 3*(0+2*six
))[1]) - ((sctx->grad + 3*(0+2*si))[1])) + ((sctx->grad
+ 3*(0+2*si))[1])), (gzm)[2] = (((alpha))*(((sctx->grad +
3*(0+2*six))[2]) - ((sctx->grad + 3*(0+2*si))[2])) + ((sctx
->grad + 3*(0+2*si))[2])))
;
401 if (bag->zi==sz-2) {
402 ELL_3M_COPY(Tzp, T)((((Tzp)+0)[0] = ((T)+0)[0], ((Tzp)+0)[1] = ((T)+0)[1], ((Tzp
)+0)[2] = ((T)+0)[2]), (((Tzp)+3)[0] = ((T)+3)[0], ((Tzp)+3)[
1] = ((T)+3)[1], ((Tzp)+3)[2] = ((T)+3)[2]), (((Tzp)+6)[0] = (
(T)+6)[0], ((Tzp)+6)[1] = ((T)+6)[1], ((Tzp)+6)[2] = ((T)+6)[
2]))
; ELL_3V_COPY(gzp, g)((gzp)[0] = (g)[0], (gzp)[1] = (g)[1], (gzp)[2] = (g)[2]);
403 } else {
404 ELL_3M_LERP(Tzp, alpha, sctx->tcontext + 9*(1+2*si),((((Tzp)+0)[0] = ((((alpha)))*((((sctx->tcontext + 9*(1+2*
six))+0)[0]) - (((sctx->tcontext + 9*(1+2*si))+0)[0])) + (
((sctx->tcontext + 9*(1+2*si))+0)[0])), ((Tzp)+0)[1] = (((
(alpha)))*((((sctx->tcontext + 9*(1+2*six))+0)[1]) - (((sctx
->tcontext + 9*(1+2*si))+0)[1])) + (((sctx->tcontext + 9
*(1+2*si))+0)[1])), ((Tzp)+0)[2] = ((((alpha)))*((((sctx->
tcontext + 9*(1+2*six))+0)[2]) - (((sctx->tcontext + 9*(1+
2*si))+0)[2])) + (((sctx->tcontext + 9*(1+2*si))+0)[2]))),
(((Tzp)+3)[0] = ((((alpha)))*((((sctx->tcontext + 9*(1+2*
six))+3)[0]) - (((sctx->tcontext + 9*(1+2*si))+3)[0])) + (
((sctx->tcontext + 9*(1+2*si))+3)[0])), ((Tzp)+3)[1] = (((
(alpha)))*((((sctx->tcontext + 9*(1+2*six))+3)[1]) - (((sctx
->tcontext + 9*(1+2*si))+3)[1])) + (((sctx->tcontext + 9
*(1+2*si))+3)[1])), ((Tzp)+3)[2] = ((((alpha)))*((((sctx->
tcontext + 9*(1+2*six))+3)[2]) - (((sctx->tcontext + 9*(1+
2*si))+3)[2])) + (((sctx->tcontext + 9*(1+2*si))+3)[2]))),
(((Tzp)+6)[0] = ((((alpha)))*((((sctx->tcontext + 9*(1+2*
six))+6)[0]) - (((sctx->tcontext + 9*(1+2*si))+6)[0])) + (
((sctx->tcontext + 9*(1+2*si))+6)[0])), ((Tzp)+6)[1] = (((
(alpha)))*((((sctx->tcontext + 9*(1+2*six))+6)[1]) - (((sctx
->tcontext + 9*(1+2*si))+6)[1])) + (((sctx->tcontext + 9
*(1+2*si))+6)[1])), ((Tzp)+6)[2] = ((((alpha)))*((((sctx->
tcontext + 9*(1+2*six))+6)[2]) - (((sctx->tcontext + 9*(1+
2*si))+6)[2])) + (((sctx->tcontext + 9*(1+2*si))+6)[2]))))
405 sctx->tcontext + 9*(1+2*six))((((Tzp)+0)[0] = ((((alpha)))*((((sctx->tcontext + 9*(1+2*
six))+0)[0]) - (((sctx->tcontext + 9*(1+2*si))+0)[0])) + (
((sctx->tcontext + 9*(1+2*si))+0)[0])), ((Tzp)+0)[1] = (((
(alpha)))*((((sctx->tcontext + 9*(1+2*six))+0)[1]) - (((sctx
->tcontext + 9*(1+2*si))+0)[1])) + (((sctx->tcontext + 9
*(1+2*si))+0)[1])), ((Tzp)+0)[2] = ((((alpha)))*((((sctx->
tcontext + 9*(1+2*six))+0)[2]) - (((sctx->tcontext + 9*(1+
2*si))+0)[2])) + (((sctx->tcontext + 9*(1+2*si))+0)[2]))),
(((Tzp)+3)[0] = ((((alpha)))*((((sctx->tcontext + 9*(1+2*
six))+3)[0]) - (((sctx->tcontext + 9*(1+2*si))+3)[0])) + (
((sctx->tcontext + 9*(1+2*si))+3)[0])), ((Tzp)+3)[1] = (((
(alpha)))*((((sctx->tcontext + 9*(1+2*six))+3)[1]) - (((sctx
->tcontext + 9*(1+2*si))+3)[1])) + (((sctx->tcontext + 9
*(1+2*si))+3)[1])), ((Tzp)+3)[2] = ((((alpha)))*((((sctx->
tcontext + 9*(1+2*six))+3)[2]) - (((sctx->tcontext + 9*(1+
2*si))+3)[2])) + (((sctx->tcontext + 9*(1+2*si))+3)[2]))),
(((Tzp)+6)[0] = ((((alpha)))*((((sctx->tcontext + 9*(1+2*
six))+6)[0]) - (((sctx->tcontext + 9*(1+2*si))+6)[0])) + (
((sctx->tcontext + 9*(1+2*si))+6)[0])), ((Tzp)+6)[1] = (((
(alpha)))*((((sctx->tcontext + 9*(1+2*six))+6)[1]) - (((sctx
->tcontext + 9*(1+2*si))+6)[1])) + (((sctx->tcontext + 9
*(1+2*si))+6)[1])), ((Tzp)+6)[2] = ((((alpha)))*((((sctx->
tcontext + 9*(1+2*six))+6)[2]) - (((sctx->tcontext + 9*(1+
2*si))+6)[2])) + (((sctx->tcontext + 9*(1+2*si))+6)[2]))))
;
406 ELL_3V_LERP(gzp, alpha, sctx->gradcontext + 3*(1+2*si),((gzp)[0] = (((alpha))*(((sctx->gradcontext + 3*(1+2*six))
[0]) - ((sctx->gradcontext + 3*(1+2*si))[0])) + ((sctx->
gradcontext + 3*(1+2*si))[0])), (gzp)[1] = (((alpha))*(((sctx
->gradcontext + 3*(1+2*six))[1]) - ((sctx->gradcontext +
3*(1+2*si))[1])) + ((sctx->gradcontext + 3*(1+2*si))[1]))
, (gzp)[2] = (((alpha))*(((sctx->gradcontext + 3*(1+2*six)
)[2]) - ((sctx->gradcontext + 3*(1+2*si))[2])) + ((sctx->
gradcontext + 3*(1+2*si))[2])))
407 sctx->gradcontext + 3*(1+2*six))((gzp)[0] = (((alpha))*(((sctx->gradcontext + 3*(1+2*six))
[0]) - ((sctx->gradcontext + 3*(1+2*si))[0])) + ((sctx->
gradcontext + 3*(1+2*si))[0])), (gzp)[1] = (((alpha))*(((sctx
->gradcontext + 3*(1+2*six))[1]) - ((sctx->gradcontext +
3*(1+2*si))[1])) + ((sctx->gradcontext + 3*(1+2*si))[1]))
, (gzp)[2] = (((alpha))*(((sctx->gradcontext + 3*(1+2*six)
)[2]) - ((sctx->gradcontext + 3*(1+2*si))[2])) + ((sctx->
gradcontext + 3*(1+2*si))[2])))
;
408 ELL_3M_SCALE(Tzm, 0.5, Tzm)((((Tzm)+0)[0] = ((0.5))*((Tzm)+0)[0], ((Tzm)+0)[1] = ((0.5))
*((Tzm)+0)[1], ((Tzm)+0)[2] = ((0.5))*((Tzm)+0)[2]), (((Tzm)+
3)[0] = ((0.5))*((Tzm)+3)[0], ((Tzm)+3)[1] = ((0.5))*((Tzm)+3
)[1], ((Tzm)+3)[2] = ((0.5))*((Tzm)+3)[2]), (((Tzm)+6)[0] = (
(0.5))*((Tzm)+6)[0], ((Tzm)+6)[1] = ((0.5))*((Tzm)+6)[1], ((Tzm
)+6)[2] = ((0.5))*((Tzm)+6)[2]))
; ELL_3M_SCALE(Tzp, 0.5, Tzp)((((Tzp)+0)[0] = ((0.5))*((Tzp)+0)[0], ((Tzp)+0)[1] = ((0.5))
*((Tzp)+0)[1], ((Tzp)+0)[2] = ((0.5))*((Tzp)+0)[2]), (((Tzp)+
3)[0] = ((0.5))*((Tzp)+3)[0], ((Tzp)+3)[1] = ((0.5))*((Tzp)+3
)[1], ((Tzp)+3)[2] = ((0.5))*((Tzp)+3)[2]), (((Tzp)+6)[0] = (
(0.5))*((Tzp)+6)[0], ((Tzp)+6)[1] = ((0.5))*((Tzp)+6)[1], ((Tzp
)+6)[2] = ((0.5))*((Tzp)+6)[2]))
;
409 ELL_3V_SCALE(gzm, 0.5, gzm)((gzm)[0] = (0.5)*(gzm)[0], (gzm)[1] = (0.5)*(gzm)[1], (gzm)[
2] = (0.5)*(gzm)[2])
; ELL_3V_SCALE(gzp, 0.5, gzp)((gzp)[0] = (0.5)*(gzp)[0], (gzp)[1] = (0.5)*(gzp)[1], (gzp)[
2] = (0.5)*(gzp)[2])
;
410 }
411 if (xi>0 && xi<sx-2) {
412 unsigned int sixx = xi + 2 + sx*yi;
413 ELL_3M_LERP(Txm, alpha, sctx->t + 9*(1+2*siX), sctx->t + 9*(1+2*si))((((Txm)+0)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*si))+0)
[0]) - (((sctx->t + 9*(1+2*siX))+0)[0])) + (((sctx->t +
9*(1+2*siX))+0)[0])), ((Txm)+0)[1] = ((((alpha)))*((((sctx->
t + 9*(1+2*si))+0)[1]) - (((sctx->t + 9*(1+2*siX))+0)[1]))
+ (((sctx->t + 9*(1+2*siX))+0)[1])), ((Txm)+0)[2] = ((((alpha
)))*((((sctx->t + 9*(1+2*si))+0)[2]) - (((sctx->t + 9*(
1+2*siX))+0)[2])) + (((sctx->t + 9*(1+2*siX))+0)[2]))), ((
(Txm)+3)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*si))+3)[0]
) - (((sctx->t + 9*(1+2*siX))+3)[0])) + (((sctx->t + 9*
(1+2*siX))+3)[0])), ((Txm)+3)[1] = ((((alpha)))*((((sctx->
t + 9*(1+2*si))+3)[1]) - (((sctx->t + 9*(1+2*siX))+3)[1]))
+ (((sctx->t + 9*(1+2*siX))+3)[1])), ((Txm)+3)[2] = ((((alpha
)))*((((sctx->t + 9*(1+2*si))+3)[2]) - (((sctx->t + 9*(
1+2*siX))+3)[2])) + (((sctx->t + 9*(1+2*siX))+3)[2]))), ((
(Txm)+6)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*si))+6)[0]
) - (((sctx->t + 9*(1+2*siX))+6)[0])) + (((sctx->t + 9*
(1+2*siX))+6)[0])), ((Txm)+6)[1] = ((((alpha)))*((((sctx->
t + 9*(1+2*si))+6)[1]) - (((sctx->t + 9*(1+2*siX))+6)[1]))
+ (((sctx->t + 9*(1+2*siX))+6)[1])), ((Txm)+6)[2] = ((((alpha
)))*((((sctx->t + 9*(1+2*si))+6)[2]) - (((sctx->t + 9*(
1+2*siX))+6)[2])) + (((sctx->t + 9*(1+2*siX))+6)[2]))))
;
414 ELL_3V_LERP(gxm, alpha, sctx->grad + 3*(1+2*siX),((gxm)[0] = (((alpha))*(((sctx->grad + 3*(1+2*si))[0]) - (
(sctx->grad + 3*(1+2*siX))[0])) + ((sctx->grad + 3*(1+2
*siX))[0])), (gxm)[1] = (((alpha))*(((sctx->grad + 3*(1+2*
si))[1]) - ((sctx->grad + 3*(1+2*siX))[1])) + ((sctx->grad
+ 3*(1+2*siX))[1])), (gxm)[2] = (((alpha))*(((sctx->grad +
3*(1+2*si))[2]) - ((sctx->grad + 3*(1+2*siX))[2])) + ((sctx
->grad + 3*(1+2*siX))[2])))
415 sctx->grad + 3*(1+2*si))((gxm)[0] = (((alpha))*(((sctx->grad + 3*(1+2*si))[0]) - (
(sctx->grad + 3*(1+2*siX))[0])) + ((sctx->grad + 3*(1+2
*siX))[0])), (gxm)[1] = (((alpha))*(((sctx->grad + 3*(1+2*
si))[1]) - ((sctx->grad + 3*(1+2*siX))[1])) + ((sctx->grad
+ 3*(1+2*siX))[1])), (gxm)[2] = (((alpha))*(((sctx->grad +
3*(1+2*si))[2]) - ((sctx->grad + 3*(1+2*siX))[2])) + ((sctx
->grad + 3*(1+2*siX))[2])))
;
416 ELL_3M_LERP(Txp, alpha, sctx->t + 9*(1+2*six), sctx->t + 9*(1+2*sixx))((((Txp)+0)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*sixx))+
0)[0]) - (((sctx->t + 9*(1+2*six))+0)[0])) + (((sctx->t
+ 9*(1+2*six))+0)[0])), ((Txp)+0)[1] = ((((alpha)))*((((sctx
->t + 9*(1+2*sixx))+0)[1]) - (((sctx->t + 9*(1+2*six))+
0)[1])) + (((sctx->t + 9*(1+2*six))+0)[1])), ((Txp)+0)[2] =
((((alpha)))*((((sctx->t + 9*(1+2*sixx))+0)[2]) - (((sctx
->t + 9*(1+2*six))+0)[2])) + (((sctx->t + 9*(1+2*six))+
0)[2]))), (((Txp)+3)[0] = ((((alpha)))*((((sctx->t + 9*(1+
2*sixx))+3)[0]) - (((sctx->t + 9*(1+2*six))+3)[0])) + (((sctx
->t + 9*(1+2*six))+3)[0])), ((Txp)+3)[1] = ((((alpha)))*((
((sctx->t + 9*(1+2*sixx))+3)[1]) - (((sctx->t + 9*(1+2*
six))+3)[1])) + (((sctx->t + 9*(1+2*six))+3)[1])), ((Txp)+
3)[2] = ((((alpha)))*((((sctx->t + 9*(1+2*sixx))+3)[2]) - (
((sctx->t + 9*(1+2*six))+3)[2])) + (((sctx->t + 9*(1+2*
six))+3)[2]))), (((Txp)+6)[0] = ((((alpha)))*((((sctx->t +
9*(1+2*sixx))+6)[0]) - (((sctx->t + 9*(1+2*six))+6)[0])) +
(((sctx->t + 9*(1+2*six))+6)[0])), ((Txp)+6)[1] = ((((alpha
)))*((((sctx->t + 9*(1+2*sixx))+6)[1]) - (((sctx->t + 9
*(1+2*six))+6)[1])) + (((sctx->t + 9*(1+2*six))+6)[1])), (
(Txp)+6)[2] = ((((alpha)))*((((sctx->t + 9*(1+2*sixx))+6)[
2]) - (((sctx->t + 9*(1+2*six))+6)[2])) + (((sctx->t + 9
*(1+2*six))+6)[2]))))
;
417 ELL_3V_LERP(gxp, alpha, sctx->grad + 3*(1+2*six),((gxp)[0] = (((alpha))*(((sctx->grad + 3*(1+2*sixx))[0]) -
((sctx->grad + 3*(1+2*six))[0])) + ((sctx->grad + 3*(1
+2*six))[0])), (gxp)[1] = (((alpha))*(((sctx->grad + 3*(1+
2*sixx))[1]) - ((sctx->grad + 3*(1+2*six))[1])) + ((sctx->
grad + 3*(1+2*six))[1])), (gxp)[2] = (((alpha))*(((sctx->grad
+ 3*(1+2*sixx))[2]) - ((sctx->grad + 3*(1+2*six))[2])) + (
(sctx->grad + 3*(1+2*six))[2])))
418 sctx->grad + 3*(1+2*sixx))((gxp)[0] = (((alpha))*(((sctx->grad + 3*(1+2*sixx))[0]) -
((sctx->grad + 3*(1+2*six))[0])) + ((sctx->grad + 3*(1
+2*six))[0])), (gxp)[1] = (((alpha))*(((sctx->grad + 3*(1+
2*sixx))[1]) - ((sctx->grad + 3*(1+2*six))[1])) + ((sctx->
grad + 3*(1+2*six))[1])), (gxp)[2] = (((alpha))*(((sctx->grad
+ 3*(1+2*sixx))[2]) - ((sctx->grad + 3*(1+2*six))[2])) + (
(sctx->grad + 3*(1+2*six))[2])))
;
419 ELL_3M_SCALE(Txm, 0.5, Txm)((((Txm)+0)[0] = ((0.5))*((Txm)+0)[0], ((Txm)+0)[1] = ((0.5))
*((Txm)+0)[1], ((Txm)+0)[2] = ((0.5))*((Txm)+0)[2]), (((Txm)+
3)[0] = ((0.5))*((Txm)+3)[0], ((Txm)+3)[1] = ((0.5))*((Txm)+3
)[1], ((Txm)+3)[2] = ((0.5))*((Txm)+3)[2]), (((Txm)+6)[0] = (
(0.5))*((Txm)+6)[0], ((Txm)+6)[1] = ((0.5))*((Txm)+6)[1], ((Txm
)+6)[2] = ((0.5))*((Txm)+6)[2]))
; ELL_3M_SCALE(Txp, 0.5, Txp)((((Txp)+0)[0] = ((0.5))*((Txp)+0)[0], ((Txp)+0)[1] = ((0.5))
*((Txp)+0)[1], ((Txp)+0)[2] = ((0.5))*((Txp)+0)[2]), (((Txp)+
3)[0] = ((0.5))*((Txp)+3)[0], ((Txp)+3)[1] = ((0.5))*((Txp)+3
)[1], ((Txp)+3)[2] = ((0.5))*((Txp)+3)[2]), (((Txp)+6)[0] = (
(0.5))*((Txp)+6)[0], ((Txp)+6)[1] = ((0.5))*((Txp)+6)[1], ((Txp
)+6)[2] = ((0.5))*((Txp)+6)[2]))
;
420 ELL_3V_SCALE(gxm, 0.5, gxm)((gxm)[0] = (0.5)*(gxm)[0], (gxm)[1] = (0.5)*(gxm)[1], (gxm)[
2] = (0.5)*(gxm)[2])
; ELL_3V_SCALE(gxp, 0.5, gxp)((gxp)[0] = (0.5)*(gxp)[0], (gxp)[1] = (0.5)*(gxp)[1], (gxp)[
2] = (0.5)*(gxp)[2])
;
421 } else {
422 ELL_3M_COPY(Txm, sctx->t + 9*(1+2*si))((((Txm)+0)[0] = ((sctx->t + 9*(1+2*si))+0)[0], ((Txm)+0)[
1] = ((sctx->t + 9*(1+2*si))+0)[1], ((Txm)+0)[2] = ((sctx->
t + 9*(1+2*si))+0)[2]), (((Txm)+3)[0] = ((sctx->t + 9*(1+2
*si))+3)[0], ((Txm)+3)[1] = ((sctx->t + 9*(1+2*si))+3)[1],
((Txm)+3)[2] = ((sctx->t + 9*(1+2*si))+3)[2]), (((Txm)+6)
[0] = ((sctx->t + 9*(1+2*si))+6)[0], ((Txm)+6)[1] = ((sctx
->t + 9*(1+2*si))+6)[1], ((Txm)+6)[2] = ((sctx->t + 9*(
1+2*si))+6)[2]))
;
423 ELL_3V_COPY(gxm, sctx->grad + 3*(1+2*si))((gxm)[0] = (sctx->grad + 3*(1+2*si))[0], (gxm)[1] = (sctx
->grad + 3*(1+2*si))[1], (gxm)[2] = (sctx->grad + 3*(1+
2*si))[2])
;
424 ELL_3M_COPY(Txp, sctx->t + 9*(1+2*six))((((Txp)+0)[0] = ((sctx->t + 9*(1+2*six))+0)[0], ((Txp)+0)
[1] = ((sctx->t + 9*(1+2*six))+0)[1], ((Txp)+0)[2] = ((sctx
->t + 9*(1+2*six))+0)[2]), (((Txp)+3)[0] = ((sctx->t + 9
*(1+2*six))+3)[0], ((Txp)+3)[1] = ((sctx->t + 9*(1+2*six))
+3)[1], ((Txp)+3)[2] = ((sctx->t + 9*(1+2*six))+3)[2]), ((
(Txp)+6)[0] = ((sctx->t + 9*(1+2*six))+6)[0], ((Txp)+6)[1]
= ((sctx->t + 9*(1+2*six))+6)[1], ((Txp)+6)[2] = ((sctx->
t + 9*(1+2*six))+6)[2]))
;
425 ELL_3V_COPY(gxp, sctx->grad + 3*(1+2*six))((gxp)[0] = (sctx->grad + 3*(1+2*six))[0], (gxp)[1] = (sctx
->grad + 3*(1+2*six))[1], (gxp)[2] = (sctx->grad + 3*(1
+2*six))[2])
;
426 }
427 if (yi==0) {
428 ELL_3M_COPY(Tym, T)((((Tym)+0)[0] = ((T)+0)[0], ((Tym)+0)[1] = ((T)+0)[1], ((Tym
)+0)[2] = ((T)+0)[2]), (((Tym)+3)[0] = ((T)+3)[0], ((Tym)+3)[
1] = ((T)+3)[1], ((Tym)+3)[2] = ((T)+3)[2]), (((Tym)+6)[0] = (
(T)+6)[0], ((Tym)+6)[1] = ((T)+6)[1], ((Tym)+6)[2] = ((T)+6)[
2]))
; ELL_3V_COPY(gym, g)((gym)[0] = (g)[0], (gym)[1] = (g)[1], (gym)[2] = (g)[2]);
429 } else {
430 ELL_3M_LERP(Tym, alpha, sctx->t + 9*(1+2*siY), sctx->t + 9*(1+2*sixY))((((Tym)+0)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*sixY))+
0)[0]) - (((sctx->t + 9*(1+2*siY))+0)[0])) + (((sctx->t
+ 9*(1+2*siY))+0)[0])), ((Tym)+0)[1] = ((((alpha)))*((((sctx
->t + 9*(1+2*sixY))+0)[1]) - (((sctx->t + 9*(1+2*siY))+
0)[1])) + (((sctx->t + 9*(1+2*siY))+0)[1])), ((Tym)+0)[2] =
((((alpha)))*((((sctx->t + 9*(1+2*sixY))+0)[2]) - (((sctx
->t + 9*(1+2*siY))+0)[2])) + (((sctx->t + 9*(1+2*siY))+
0)[2]))), (((Tym)+3)[0] = ((((alpha)))*((((sctx->t + 9*(1+
2*sixY))+3)[0]) - (((sctx->t + 9*(1+2*siY))+3)[0])) + (((sctx
->t + 9*(1+2*siY))+3)[0])), ((Tym)+3)[1] = ((((alpha)))*((
((sctx->t + 9*(1+2*sixY))+3)[1]) - (((sctx->t + 9*(1+2*
siY))+3)[1])) + (((sctx->t + 9*(1+2*siY))+3)[1])), ((Tym)+
3)[2] = ((((alpha)))*((((sctx->t + 9*(1+2*sixY))+3)[2]) - (
((sctx->t + 9*(1+2*siY))+3)[2])) + (((sctx->t + 9*(1+2*
siY))+3)[2]))), (((Tym)+6)[0] = ((((alpha)))*((((sctx->t +
9*(1+2*sixY))+6)[0]) - (((sctx->t + 9*(1+2*siY))+6)[0])) +
(((sctx->t + 9*(1+2*siY))+6)[0])), ((Tym)+6)[1] = ((((alpha
)))*((((sctx->t + 9*(1+2*sixY))+6)[1]) - (((sctx->t + 9
*(1+2*siY))+6)[1])) + (((sctx->t + 9*(1+2*siY))+6)[1])), (
(Tym)+6)[2] = ((((alpha)))*((((sctx->t + 9*(1+2*sixY))+6)[
2]) - (((sctx->t + 9*(1+2*siY))+6)[2])) + (((sctx->t + 9
*(1+2*siY))+6)[2]))))
;
431 ELL_3V_LERP(gym, alpha, sctx->grad + 3*(1+2*siY),((gym)[0] = (((alpha))*(((sctx->grad + 3*(1+2*sixY))[0]) -
((sctx->grad + 3*(1+2*siY))[0])) + ((sctx->grad + 3*(1
+2*siY))[0])), (gym)[1] = (((alpha))*(((sctx->grad + 3*(1+
2*sixY))[1]) - ((sctx->grad + 3*(1+2*siY))[1])) + ((sctx->
grad + 3*(1+2*siY))[1])), (gym)[2] = (((alpha))*(((sctx->grad
+ 3*(1+2*sixY))[2]) - ((sctx->grad + 3*(1+2*siY))[2])) + (
(sctx->grad + 3*(1+2*siY))[2])))
432 sctx->grad + 3*(1+2*sixY))((gym)[0] = (((alpha))*(((sctx->grad + 3*(1+2*sixY))[0]) -
((sctx->grad + 3*(1+2*siY))[0])) + ((sctx->grad + 3*(1
+2*siY))[0])), (gym)[1] = (((alpha))*(((sctx->grad + 3*(1+
2*sixY))[1]) - ((sctx->grad + 3*(1+2*siY))[1])) + ((sctx->
grad + 3*(1+2*siY))[1])), (gym)[2] = (((alpha))*(((sctx->grad
+ 3*(1+2*sixY))[2]) - ((sctx->grad + 3*(1+2*siY))[2])) + (
(sctx->grad + 3*(1+2*siY))[2])))
;
433 }
434 if (yi==sy-1) {
435 ELL_3M_COPY(Typ, T)((((Typ)+0)[0] = ((T)+0)[0], ((Typ)+0)[1] = ((T)+0)[1], ((Typ
)+0)[2] = ((T)+0)[2]), (((Typ)+3)[0] = ((T)+3)[0], ((Typ)+3)[
1] = ((T)+3)[1], ((Typ)+3)[2] = ((T)+3)[2]), (((Typ)+6)[0] = (
(T)+6)[0], ((Typ)+6)[1] = ((T)+6)[1], ((Typ)+6)[2] = ((T)+6)[
2]))
; ELL_3V_COPY(gyp, g)((gyp)[0] = (g)[0], (gyp)[1] = (g)[1], (gyp)[2] = (g)[2]);
436 } else {
437 ELL_3M_LERP(Typ, alpha, sctx->t + 9*(1+2*siy), sctx->t + 9*(1+2*sixy))((((Typ)+0)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*sixy))+
0)[0]) - (((sctx->t + 9*(1+2*siy))+0)[0])) + (((sctx->t
+ 9*(1+2*siy))+0)[0])), ((Typ)+0)[1] = ((((alpha)))*((((sctx
->t + 9*(1+2*sixy))+0)[1]) - (((sctx->t + 9*(1+2*siy))+
0)[1])) + (((sctx->t + 9*(1+2*siy))+0)[1])), ((Typ)+0)[2] =
((((alpha)))*((((sctx->t + 9*(1+2*sixy))+0)[2]) - (((sctx
->t + 9*(1+2*siy))+0)[2])) + (((sctx->t + 9*(1+2*siy))+
0)[2]))), (((Typ)+3)[0] = ((((alpha)))*((((sctx->t + 9*(1+
2*sixy))+3)[0]) - (((sctx->t + 9*(1+2*siy))+3)[0])) + (((sctx
->t + 9*(1+2*siy))+3)[0])), ((Typ)+3)[1] = ((((alpha)))*((
((sctx->t + 9*(1+2*sixy))+3)[1]) - (((sctx->t + 9*(1+2*
siy))+3)[1])) + (((sctx->t + 9*(1+2*siy))+3)[1])), ((Typ)+
3)[2] = ((((alpha)))*((((sctx->t + 9*(1+2*sixy))+3)[2]) - (
((sctx->t + 9*(1+2*siy))+3)[2])) + (((sctx->t + 9*(1+2*
siy))+3)[2]))), (((Typ)+6)[0] = ((((alpha)))*((((sctx->t +
9*(1+2*sixy))+6)[0]) - (((sctx->t + 9*(1+2*siy))+6)[0])) +
(((sctx->t + 9*(1+2*siy))+6)[0])), ((Typ)+6)[1] = ((((alpha
)))*((((sctx->t + 9*(1+2*sixy))+6)[1]) - (((sctx->t + 9
*(1+2*siy))+6)[1])) + (((sctx->t + 9*(1+2*siy))+6)[1])), (
(Typ)+6)[2] = ((((alpha)))*((((sctx->t + 9*(1+2*sixy))+6)[
2]) - (((sctx->t + 9*(1+2*siy))+6)[2])) + (((sctx->t + 9
*(1+2*siy))+6)[2]))))
;
438 ELL_3V_LERP(gyp, alpha, sctx->grad + 3*(1+2*siy),((gyp)[0] = (((alpha))*(((sctx->grad + 3*(1+2*sixy))[0]) -
((sctx->grad + 3*(1+2*siy))[0])) + ((sctx->grad + 3*(1
+2*siy))[0])), (gyp)[1] = (((alpha))*(((sctx->grad + 3*(1+
2*sixy))[1]) - ((sctx->grad + 3*(1+2*siy))[1])) + ((sctx->
grad + 3*(1+2*siy))[1])), (gyp)[2] = (((alpha))*(((sctx->grad
+ 3*(1+2*sixy))[2]) - ((sctx->grad + 3*(1+2*siy))[2])) + (
(sctx->grad + 3*(1+2*siy))[2])))
439 sctx->grad + 3*(1+2*sixy))((gyp)[0] = (((alpha))*(((sctx->grad + 3*(1+2*sixy))[0]) -
((sctx->grad + 3*(1+2*siy))[0])) + ((sctx->grad + 3*(1
+2*siy))[0])), (gyp)[1] = (((alpha))*(((sctx->grad + 3*(1+
2*sixy))[1]) - ((sctx->grad + 3*(1+2*siy))[1])) + ((sctx->
grad + 3*(1+2*siy))[1])), (gyp)[2] = (((alpha))*(((sctx->grad
+ 3*(1+2*sixy))[2]) - ((sctx->grad + 3*(1+2*siy))[2])) + (
(sctx->grad + 3*(1+2*siy))[2])))
;
440 }
441 if (yi!=0 && yi!=sy-1) {
442 ELL_3M_SCALE(Tym, 0.5, Tym)((((Tym)+0)[0] = ((0.5))*((Tym)+0)[0], ((Tym)+0)[1] = ((0.5))
*((Tym)+0)[1], ((Tym)+0)[2] = ((0.5))*((Tym)+0)[2]), (((Tym)+
3)[0] = ((0.5))*((Tym)+3)[0], ((Tym)+3)[1] = ((0.5))*((Tym)+3
)[1], ((Tym)+3)[2] = ((0.5))*((Tym)+3)[2]), (((Tym)+6)[0] = (
(0.5))*((Tym)+6)[0], ((Tym)+6)[1] = ((0.5))*((Tym)+6)[1], ((Tym
)+6)[2] = ((0.5))*((Tym)+6)[2]))
; ELL_3M_SCALE(Typ, 0.5, Typ)((((Typ)+0)[0] = ((0.5))*((Typ)+0)[0], ((Typ)+0)[1] = ((0.5))
*((Typ)+0)[1], ((Typ)+0)[2] = ((0.5))*((Typ)+0)[2]), (((Typ)+
3)[0] = ((0.5))*((Typ)+3)[0], ((Typ)+3)[1] = ((0.5))*((Typ)+3
)[1], ((Typ)+3)[2] = ((0.5))*((Typ)+3)[2]), (((Typ)+6)[0] = (
(0.5))*((Typ)+6)[0], ((Typ)+6)[1] = ((0.5))*((Typ)+6)[1], ((Typ
)+6)[2] = ((0.5))*((Typ)+6)[2]))
;
443 ELL_3V_SCALE(gym, 0.5, gym)((gym)[0] = (0.5)*(gym)[0], (gym)[1] = (0.5)*(gym)[1], (gym)[
2] = (0.5)*(gym)[2])
; ELL_3V_SCALE(gyp, 0.5, gyp)((gyp)[0] = (0.5)*(gyp)[0], (gyp)[1] = (0.5)*(gyp)[1], (gyp)[
2] = (0.5)*(gyp)[2])
;
444 }
445 computeGradientLin(res, T, g,
446 Txm, gxm, Txp, gxp,
447 Tym, gym, Typ, gyp,
448 Tzm, gzm, Tzp, gzp);
449 break;
450 case 4:
451 ELL_3M_LERP(T, alpha, sctx->t + 9*(1+2*si), sctx->t + 9*(1+2*siy))((((T)+0)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*siy))+0)[
0]) - (((sctx->t + 9*(1+2*si))+0)[0])) + (((sctx->t + 9
*(1+2*si))+0)[0])), ((T)+0)[1] = ((((alpha)))*((((sctx->t +
9*(1+2*siy))+0)[1]) - (((sctx->t + 9*(1+2*si))+0)[1])) + (
((sctx->t + 9*(1+2*si))+0)[1])), ((T)+0)[2] = ((((alpha)))
*((((sctx->t + 9*(1+2*siy))+0)[2]) - (((sctx->t + 9*(1+
2*si))+0)[2])) + (((sctx->t + 9*(1+2*si))+0)[2]))), (((T)+
3)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*siy))+3)[0]) - (
((sctx->t + 9*(1+2*si))+3)[0])) + (((sctx->t + 9*(1+2*si
))+3)[0])), ((T)+3)[1] = ((((alpha)))*((((sctx->t + 9*(1+2
*siy))+3)[1]) - (((sctx->t + 9*(1+2*si))+3)[1])) + (((sctx
->t + 9*(1+2*si))+3)[1])), ((T)+3)[2] = ((((alpha)))*((((sctx
->t + 9*(1+2*siy))+3)[2]) - (((sctx->t + 9*(1+2*si))+3)
[2])) + (((sctx->t + 9*(1+2*si))+3)[2]))), (((T)+6)[0] = (
(((alpha)))*((((sctx->t + 9*(1+2*siy))+6)[0]) - (((sctx->
t + 9*(1+2*si))+6)[0])) + (((sctx->t + 9*(1+2*si))+6)[0]))
, ((T)+6)[1] = ((((alpha)))*((((sctx->t + 9*(1+2*siy))+6)[
1]) - (((sctx->t + 9*(1+2*si))+6)[1])) + (((sctx->t + 9
*(1+2*si))+6)[1])), ((T)+6)[2] = ((((alpha)))*((((sctx->t +
9*(1+2*siy))+6)[2]) - (((sctx->t + 9*(1+2*si))+6)[2])) + (
((sctx->t + 9*(1+2*si))+6)[2]))))
;
452 ELL_3V_LERP(g, alpha, sctx->grad + 3*(1+2*si), sctx->grad + 3*(1+2*siy))((g)[0] = (((alpha))*(((sctx->grad + 3*(1+2*siy))[0]) - ((
sctx->grad + 3*(1+2*si))[0])) + ((sctx->grad + 3*(1+2*si
))[0])), (g)[1] = (((alpha))*(((sctx->grad + 3*(1+2*siy))[
1]) - ((sctx->grad + 3*(1+2*si))[1])) + ((sctx->grad + 3
*(1+2*si))[1])), (g)[2] = (((alpha))*(((sctx->grad + 3*(1+
2*siy))[2]) - ((sctx->grad + 3*(1+2*si))[2])) + ((sctx->
grad + 3*(1+2*si))[2])))
;
453 ELL_3M_LERP(Tzm, alpha, sctx->t + 9*(0+2*si), sctx->t + 9*(0+2*siy))((((Tzm)+0)[0] = ((((alpha)))*((((sctx->t + 9*(0+2*siy))+0
)[0]) - (((sctx->t + 9*(0+2*si))+0)[0])) + (((sctx->t +
9*(0+2*si))+0)[0])), ((Tzm)+0)[1] = ((((alpha)))*((((sctx->
t + 9*(0+2*siy))+0)[1]) - (((sctx->t + 9*(0+2*si))+0)[1]))
+ (((sctx->t + 9*(0+2*si))+0)[1])), ((Tzm)+0)[2] = ((((alpha
)))*((((sctx->t + 9*(0+2*siy))+0)[2]) - (((sctx->t + 9*
(0+2*si))+0)[2])) + (((sctx->t + 9*(0+2*si))+0)[2]))), (((
Tzm)+3)[0] = ((((alpha)))*((((sctx->t + 9*(0+2*siy))+3)[0]
) - (((sctx->t + 9*(0+2*si))+3)[0])) + (((sctx->t + 9*(
0+2*si))+3)[0])), ((Tzm)+3)[1] = ((((alpha)))*((((sctx->t +
9*(0+2*siy))+3)[1]) - (((sctx->t + 9*(0+2*si))+3)[1])) + (
((sctx->t + 9*(0+2*si))+3)[1])), ((Tzm)+3)[2] = ((((alpha)
))*((((sctx->t + 9*(0+2*siy))+3)[2]) - (((sctx->t + 9*(
0+2*si))+3)[2])) + (((sctx->t + 9*(0+2*si))+3)[2]))), (((Tzm
)+6)[0] = ((((alpha)))*((((sctx->t + 9*(0+2*siy))+6)[0]) -
(((sctx->t + 9*(0+2*si))+6)[0])) + (((sctx->t + 9*(0+2
*si))+6)[0])), ((Tzm)+6)[1] = ((((alpha)))*((((sctx->t + 9
*(0+2*siy))+6)[1]) - (((sctx->t + 9*(0+2*si))+6)[1])) + ((
(sctx->t + 9*(0+2*si))+6)[1])), ((Tzm)+6)[2] = ((((alpha))
)*((((sctx->t + 9*(0+2*siy))+6)[2]) - (((sctx->t + 9*(0
+2*si))+6)[2])) + (((sctx->t + 9*(0+2*si))+6)[2]))))
;
454 ELL_3V_LERP(gzm, alpha, sctx->grad + 3*(0+2*si), sctx->grad + 3*(0+2*siy))((gzm)[0] = (((alpha))*(((sctx->grad + 3*(0+2*siy))[0]) - (
(sctx->grad + 3*(0+2*si))[0])) + ((sctx->grad + 3*(0+2*
si))[0])), (gzm)[1] = (((alpha))*(((sctx->grad + 3*(0+2*siy
))[1]) - ((sctx->grad + 3*(0+2*si))[1])) + ((sctx->grad
+ 3*(0+2*si))[1])), (gzm)[2] = (((alpha))*(((sctx->grad +
3*(0+2*siy))[2]) - ((sctx->grad + 3*(0+2*si))[2])) + ((sctx
->grad + 3*(0+2*si))[2])))
;
455 if (bag->zi==sz-2) {
456 ELL_3M_COPY(Tzp, T)((((Tzp)+0)[0] = ((T)+0)[0], ((Tzp)+0)[1] = ((T)+0)[1], ((Tzp
)+0)[2] = ((T)+0)[2]), (((Tzp)+3)[0] = ((T)+3)[0], ((Tzp)+3)[
1] = ((T)+3)[1], ((Tzp)+3)[2] = ((T)+3)[2]), (((Tzp)+6)[0] = (
(T)+6)[0], ((Tzp)+6)[1] = ((T)+6)[1], ((Tzp)+6)[2] = ((T)+6)[
2]))
; ELL_3V_COPY(gzp, g)((gzp)[0] = (g)[0], (gzp)[1] = (g)[1], (gzp)[2] = (g)[2]);
457 } else {
458 ELL_3M_LERP(Tzp, alpha, sctx->tcontext + 9*(1+2*si),((((Tzp)+0)[0] = ((((alpha)))*((((sctx->tcontext + 9*(1+2*
siy))+0)[0]) - (((sctx->tcontext + 9*(1+2*si))+0)[0])) + (
((sctx->tcontext + 9*(1+2*si))+0)[0])), ((Tzp)+0)[1] = (((
(alpha)))*((((sctx->tcontext + 9*(1+2*siy))+0)[1]) - (((sctx
->tcontext + 9*(1+2*si))+0)[1])) + (((sctx->tcontext + 9
*(1+2*si))+0)[1])), ((Tzp)+0)[2] = ((((alpha)))*((((sctx->
tcontext + 9*(1+2*siy))+0)[2]) - (((sctx->tcontext + 9*(1+
2*si))+0)[2])) + (((sctx->tcontext + 9*(1+2*si))+0)[2]))),
(((Tzp)+3)[0] = ((((alpha)))*((((sctx->tcontext + 9*(1+2*
siy))+3)[0]) - (((sctx->tcontext + 9*(1+2*si))+3)[0])) + (
((sctx->tcontext + 9*(1+2*si))+3)[0])), ((Tzp)+3)[1] = (((
(alpha)))*((((sctx->tcontext + 9*(1+2*siy))+3)[1]) - (((sctx
->tcontext + 9*(1+2*si))+3)[1])) + (((sctx->tcontext + 9
*(1+2*si))+3)[1])), ((Tzp)+3)[2] = ((((alpha)))*((((sctx->
tcontext + 9*(1+2*siy))+3)[2]) - (((sctx->tcontext + 9*(1+
2*si))+3)[2])) + (((sctx->tcontext + 9*(1+2*si))+3)[2]))),
(((Tzp)+6)[0] = ((((alpha)))*((((sctx->tcontext + 9*(1+2*
siy))+6)[0]) - (((sctx->tcontext + 9*(1+2*si))+6)[0])) + (
((sctx->tcontext + 9*(1+2*si))+6)[0])), ((Tzp)+6)[1] = (((
(alpha)))*((((sctx->tcontext + 9*(1+2*siy))+6)[1]) - (((sctx
->tcontext + 9*(1+2*si))+6)[1])) + (((sctx->tcontext + 9
*(1+2*si))+6)[1])), ((Tzp)+6)[2] = ((((alpha)))*((((sctx->
tcontext + 9*(1+2*siy))+6)[2]) - (((sctx->tcontext + 9*(1+
2*si))+6)[2])) + (((sctx->tcontext + 9*(1+2*si))+6)[2]))))
459 sctx->tcontext + 9*(1+2*siy))((((Tzp)+0)[0] = ((((alpha)))*((((sctx->tcontext + 9*(1+2*
siy))+0)[0]) - (((sctx->tcontext + 9*(1+2*si))+0)[0])) + (
((sctx->tcontext + 9*(1+2*si))+0)[0])), ((Tzp)+0)[1] = (((
(alpha)))*((((sctx->tcontext + 9*(1+2*siy))+0)[1]) - (((sctx
->tcontext + 9*(1+2*si))+0)[1])) + (((sctx->tcontext + 9
*(1+2*si))+0)[1])), ((Tzp)+0)[2] = ((((alpha)))*((((sctx->
tcontext + 9*(1+2*siy))+0)[2]) - (((sctx->tcontext + 9*(1+
2*si))+0)[2])) + (((sctx->tcontext + 9*(1+2*si))+0)[2]))),
(((Tzp)+3)[0] = ((((alpha)))*((((sctx->tcontext + 9*(1+2*
siy))+3)[0]) - (((sctx->tcontext + 9*(1+2*si))+3)[0])) + (
((sctx->tcontext + 9*(1+2*si))+3)[0])), ((Tzp)+3)[1] = (((
(alpha)))*((((sctx->tcontext + 9*(1+2*siy))+3)[1]) - (((sctx
->tcontext + 9*(1+2*si))+3)[1])) + (((sctx->tcontext + 9
*(1+2*si))+3)[1])), ((Tzp)+3)[2] = ((((alpha)))*((((sctx->
tcontext + 9*(1+2*siy))+3)[2]) - (((sctx->tcontext + 9*(1+
2*si))+3)[2])) + (((sctx->tcontext + 9*(1+2*si))+3)[2]))),
(((Tzp)+6)[0] = ((((alpha)))*((((sctx->tcontext + 9*(1+2*
siy))+6)[0]) - (((sctx->tcontext + 9*(1+2*si))+6)[0])) + (
((sctx->tcontext + 9*(1+2*si))+6)[0])), ((Tzp)+6)[1] = (((
(alpha)))*((((sctx->tcontext + 9*(1+2*siy))+6)[1]) - (((sctx
->tcontext + 9*(1+2*si))+6)[1])) + (((sctx->tcontext + 9
*(1+2*si))+6)[1])), ((Tzp)+6)[2] = ((((alpha)))*((((sctx->
tcontext + 9*(1+2*siy))+6)[2]) - (((sctx->tcontext + 9*(1+
2*si))+6)[2])) + (((sctx->tcontext + 9*(1+2*si))+6)[2]))))
;
460 ELL_3V_LERP(gzp, alpha, sctx->gradcontext + 3*(1+2*si),((gzp)[0] = (((alpha))*(((sctx->gradcontext + 3*(1+2*siy))
[0]) - ((sctx->gradcontext + 3*(1+2*si))[0])) + ((sctx->
gradcontext + 3*(1+2*si))[0])), (gzp)[1] = (((alpha))*(((sctx
->gradcontext + 3*(1+2*siy))[1]) - ((sctx->gradcontext +
3*(1+2*si))[1])) + ((sctx->gradcontext + 3*(1+2*si))[1]))
, (gzp)[2] = (((alpha))*(((sctx->gradcontext + 3*(1+2*siy)
)[2]) - ((sctx->gradcontext + 3*(1+2*si))[2])) + ((sctx->
gradcontext + 3*(1+2*si))[2])))
461 sctx->gradcontext + 3*(1+2*siy))((gzp)[0] = (((alpha))*(((sctx->gradcontext + 3*(1+2*siy))
[0]) - ((sctx->gradcontext + 3*(1+2*si))[0])) + ((sctx->
gradcontext + 3*(1+2*si))[0])), (gzp)[1] = (((alpha))*(((sctx
->gradcontext + 3*(1+2*siy))[1]) - ((sctx->gradcontext +
3*(1+2*si))[1])) + ((sctx->gradcontext + 3*(1+2*si))[1]))
, (gzp)[2] = (((alpha))*(((sctx->gradcontext + 3*(1+2*siy)
)[2]) - ((sctx->gradcontext + 3*(1+2*si))[2])) + ((sctx->
gradcontext + 3*(1+2*si))[2])))
;
462 ELL_3M_SCALE(Tzm, 0.5, Tzm)((((Tzm)+0)[0] = ((0.5))*((Tzm)+0)[0], ((Tzm)+0)[1] = ((0.5))
*((Tzm)+0)[1], ((Tzm)+0)[2] = ((0.5))*((Tzm)+0)[2]), (((Tzm)+
3)[0] = ((0.5))*((Tzm)+3)[0], ((Tzm)+3)[1] = ((0.5))*((Tzm)+3
)[1], ((Tzm)+3)[2] = ((0.5))*((Tzm)+3)[2]), (((Tzm)+6)[0] = (
(0.5))*((Tzm)+6)[0], ((Tzm)+6)[1] = ((0.5))*((Tzm)+6)[1], ((Tzm
)+6)[2] = ((0.5))*((Tzm)+6)[2]))
; ELL_3M_SCALE(Tzp, 0.5, Tzp)((((Tzp)+0)[0] = ((0.5))*((Tzp)+0)[0], ((Tzp)+0)[1] = ((0.5))
*((Tzp)+0)[1], ((Tzp)+0)[2] = ((0.5))*((Tzp)+0)[2]), (((Tzp)+
3)[0] = ((0.5))*((Tzp)+3)[0], ((Tzp)+3)[1] = ((0.5))*((Tzp)+3
)[1], ((Tzp)+3)[2] = ((0.5))*((Tzp)+3)[2]), (((Tzp)+6)[0] = (
(0.5))*((Tzp)+6)[0], ((Tzp)+6)[1] = ((0.5))*((Tzp)+6)[1], ((Tzp
)+6)[2] = ((0.5))*((Tzp)+6)[2]))
;
463 ELL_3V_SCALE(gzm, 0.5, gzm)((gzm)[0] = (0.5)*(gzm)[0], (gzm)[1] = (0.5)*(gzm)[1], (gzm)[
2] = (0.5)*(gzm)[2])
; ELL_3V_SCALE(gzp, 0.5, gzp)((gzp)[0] = (0.5)*(gzp)[0], (gzp)[1] = (0.5)*(gzp)[1], (gzp)[
2] = (0.5)*(gzp)[2])
;
464 }
465 if (xi==0) {
466 ELL_3M_COPY(Txm, T)((((Txm)+0)[0] = ((T)+0)[0], ((Txm)+0)[1] = ((T)+0)[1], ((Txm
)+0)[2] = ((T)+0)[2]), (((Txm)+3)[0] = ((T)+3)[0], ((Txm)+3)[
1] = ((T)+3)[1], ((Txm)+3)[2] = ((T)+3)[2]), (((Txm)+6)[0] = (
(T)+6)[0], ((Txm)+6)[1] = ((T)+6)[1], ((Txm)+6)[2] = ((T)+6)[
2]))
; ELL_3V_COPY(gxm, g)((gxm)[0] = (g)[0], (gxm)[1] = (g)[1], (gxm)[2] = (g)[2]);
467 } else {
468 ELL_3M_LERP(Txm, alpha, sctx->t + 9*(1+2*siX), sctx->t + 9*(1+2*siXy))((((Txm)+0)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*siXy))+
0)[0]) - (((sctx->t + 9*(1+2*siX))+0)[0])) + (((sctx->t
+ 9*(1+2*siX))+0)[0])), ((Txm)+0)[1] = ((((alpha)))*((((sctx
->t + 9*(1+2*siXy))+0)[1]) - (((sctx->t + 9*(1+2*siX))+
0)[1])) + (((sctx->t + 9*(1+2*siX))+0)[1])), ((Txm)+0)[2] =
((((alpha)))*((((sctx->t + 9*(1+2*siXy))+0)[2]) - (((sctx
->t + 9*(1+2*siX))+0)[2])) + (((sctx->t + 9*(1+2*siX))+
0)[2]))), (((Txm)+3)[0] = ((((alpha)))*((((sctx->t + 9*(1+
2*siXy))+3)[0]) - (((sctx->t + 9*(1+2*siX))+3)[0])) + (((sctx
->t + 9*(1+2*siX))+3)[0])), ((Txm)+3)[1] = ((((alpha)))*((
((sctx->t + 9*(1+2*siXy))+3)[1]) - (((sctx->t + 9*(1+2*
siX))+3)[1])) + (((sctx->t + 9*(1+2*siX))+3)[1])), ((Txm)+
3)[2] = ((((alpha)))*((((sctx->t + 9*(1+2*siXy))+3)[2]) - (
((sctx->t + 9*(1+2*siX))+3)[2])) + (((sctx->t + 9*(1+2*
siX))+3)[2]))), (((Txm)+6)[0] = ((((alpha)))*((((sctx->t +
9*(1+2*siXy))+6)[0]) - (((sctx->t + 9*(1+2*siX))+6)[0])) +
(((sctx->t + 9*(1+2*siX))+6)[0])), ((Txm)+6)[1] = ((((alpha
)))*((((sctx->t + 9*(1+2*siXy))+6)[1]) - (((sctx->t + 9
*(1+2*siX))+6)[1])) + (((sctx->t + 9*(1+2*siX))+6)[1])), (
(Txm)+6)[2] = ((((alpha)))*((((sctx->t + 9*(1+2*siXy))+6)[
2]) - (((sctx->t + 9*(1+2*siX))+6)[2])) + (((sctx->t + 9
*(1+2*siX))+6)[2]))))
;
469 ELL_3V_LERP(gxm, alpha, sctx->grad + 3*(1+2*siX),((gxm)[0] = (((alpha))*(((sctx->grad + 3*(1+2*siXy))[0]) -
((sctx->grad + 3*(1+2*siX))[0])) + ((sctx->grad + 3*(1
+2*siX))[0])), (gxm)[1] = (((alpha))*(((sctx->grad + 3*(1+
2*siXy))[1]) - ((sctx->grad + 3*(1+2*siX))[1])) + ((sctx->
grad + 3*(1+2*siX))[1])), (gxm)[2] = (((alpha))*(((sctx->grad
+ 3*(1+2*siXy))[2]) - ((sctx->grad + 3*(1+2*siX))[2])) + (
(sctx->grad + 3*(1+2*siX))[2])))
470 sctx->grad + 3*(1+2*siXy))((gxm)[0] = (((alpha))*(((sctx->grad + 3*(1+2*siXy))[0]) -
((sctx->grad + 3*(1+2*siX))[0])) + ((sctx->grad + 3*(1
+2*siX))[0])), (gxm)[1] = (((alpha))*(((sctx->grad + 3*(1+
2*siXy))[1]) - ((sctx->grad + 3*(1+2*siX))[1])) + ((sctx->
grad + 3*(1+2*siX))[1])), (gxm)[2] = (((alpha))*(((sctx->grad
+ 3*(1+2*siXy))[2]) - ((sctx->grad + 3*(1+2*siX))[2])) + (
(sctx->grad + 3*(1+2*siX))[2])))
;
471 }
472 if (xi==sx-1) {
473 ELL_3M_COPY(Txp, T)((((Txp)+0)[0] = ((T)+0)[0], ((Txp)+0)[1] = ((T)+0)[1], ((Txp
)+0)[2] = ((T)+0)[2]), (((Txp)+3)[0] = ((T)+3)[0], ((Txp)+3)[
1] = ((T)+3)[1], ((Txp)+3)[2] = ((T)+3)[2]), (((Txp)+6)[0] = (
(T)+6)[0], ((Txp)+6)[1] = ((T)+6)[1], ((Txp)+6)[2] = ((T)+6)[
2]))
; ELL_3V_COPY(gxp, g)((gxp)[0] = (g)[0], (gxp)[1] = (g)[1], (gxp)[2] = (g)[2]);
474 } else {
475 ELL_3M_LERP(Txp, alpha, sctx->t + 9*(1+2*six), sctx->t + 9*(1+2*sixy))((((Txp)+0)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*sixy))+
0)[0]) - (((sctx->t + 9*(1+2*six))+0)[0])) + (((sctx->t
+ 9*(1+2*six))+0)[0])), ((Txp)+0)[1] = ((((alpha)))*((((sctx
->t + 9*(1+2*sixy))+0)[1]) - (((sctx->t + 9*(1+2*six))+
0)[1])) + (((sctx->t + 9*(1+2*six))+0)[1])), ((Txp)+0)[2] =
((((alpha)))*((((sctx->t + 9*(1+2*sixy))+0)[2]) - (((sctx
->t + 9*(1+2*six))+0)[2])) + (((sctx->t + 9*(1+2*six))+
0)[2]))), (((Txp)+3)[0] = ((((alpha)))*((((sctx->t + 9*(1+
2*sixy))+3)[0]) - (((sctx->t + 9*(1+2*six))+3)[0])) + (((sctx
->t + 9*(1+2*six))+3)[0])), ((Txp)+3)[1] = ((((alpha)))*((
((sctx->t + 9*(1+2*sixy))+3)[1]) - (((sctx->t + 9*(1+2*
six))+3)[1])) + (((sctx->t + 9*(1+2*six))+3)[1])), ((Txp)+
3)[2] = ((((alpha)))*((((sctx->t + 9*(1+2*sixy))+3)[2]) - (
((sctx->t + 9*(1+2*six))+3)[2])) + (((sctx->t + 9*(1+2*
six))+3)[2]))), (((Txp)+6)[0] = ((((alpha)))*((((sctx->t +
9*(1+2*sixy))+6)[0]) - (((sctx->t + 9*(1+2*six))+6)[0])) +
(((sctx->t + 9*(1+2*six))+6)[0])), ((Txp)+6)[1] = ((((alpha
)))*((((sctx->t + 9*(1+2*sixy))+6)[1]) - (((sctx->t + 9
*(1+2*six))+6)[1])) + (((sctx->t + 9*(1+2*six))+6)[1])), (
(Txp)+6)[2] = ((((alpha)))*((((sctx->t + 9*(1+2*sixy))+6)[
2]) - (((sctx->t + 9*(1+2*six))+6)[2])) + (((sctx->t + 9
*(1+2*six))+6)[2]))))
;
476 ELL_3V_LERP(gxp, alpha, sctx->grad + 3*(1+2*six),((gxp)[0] = (((alpha))*(((sctx->grad + 3*(1+2*sixy))[0]) -
((sctx->grad + 3*(1+2*six))[0])) + ((sctx->grad + 3*(1
+2*six))[0])), (gxp)[1] = (((alpha))*(((sctx->grad + 3*(1+
2*sixy))[1]) - ((sctx->grad + 3*(1+2*six))[1])) + ((sctx->
grad + 3*(1+2*six))[1])), (gxp)[2] = (((alpha))*(((sctx->grad
+ 3*(1+2*sixy))[2]) - ((sctx->grad + 3*(1+2*six))[2])) + (
(sctx->grad + 3*(1+2*six))[2])))
477 sctx->grad + 3*(1+2*sixy))((gxp)[0] = (((alpha))*(((sctx->grad + 3*(1+2*sixy))[0]) -
((sctx->grad + 3*(1+2*six))[0])) + ((sctx->grad + 3*(1
+2*six))[0])), (gxp)[1] = (((alpha))*(((sctx->grad + 3*(1+
2*sixy))[1]) - ((sctx->grad + 3*(1+2*six))[1])) + ((sctx->
grad + 3*(1+2*six))[1])), (gxp)[2] = (((alpha))*(((sctx->grad
+ 3*(1+2*sixy))[2]) - ((sctx->grad + 3*(1+2*six))[2])) + (
(sctx->grad + 3*(1+2*six))[2])))
;
478 }
479 if (xi!=0 && xi!=sx-1) {
480 ELL_3M_SCALE(Txm, 0.5, Txm)((((Txm)+0)[0] = ((0.5))*((Txm)+0)[0], ((Txm)+0)[1] = ((0.5))
*((Txm)+0)[1], ((Txm)+0)[2] = ((0.5))*((Txm)+0)[2]), (((Txm)+
3)[0] = ((0.5))*((Txm)+3)[0], ((Txm)+3)[1] = ((0.5))*((Txm)+3
)[1], ((Txm)+3)[2] = ((0.5))*((Txm)+3)[2]), (((Txm)+6)[0] = (
(0.5))*((Txm)+6)[0], ((Txm)+6)[1] = ((0.5))*((Txm)+6)[1], ((Txm
)+6)[2] = ((0.5))*((Txm)+6)[2]))
; ELL_3M_SCALE(Txp, 0.5, Txp)((((Txp)+0)[0] = ((0.5))*((Txp)+0)[0], ((Txp)+0)[1] = ((0.5))
*((Txp)+0)[1], ((Txp)+0)[2] = ((0.5))*((Txp)+0)[2]), (((Txp)+
3)[0] = ((0.5))*((Txp)+3)[0], ((Txp)+3)[1] = ((0.5))*((Txp)+3
)[1], ((Txp)+3)[2] = ((0.5))*((Txp)+3)[2]), (((Txp)+6)[0] = (
(0.5))*((Txp)+6)[0], ((Txp)+6)[1] = ((0.5))*((Txp)+6)[1], ((Txp
)+6)[2] = ((0.5))*((Txp)+6)[2]))
;
481 ELL_3V_SCALE(gxm, 0.5, gxm)((gxm)[0] = (0.5)*(gxm)[0], (gxm)[1] = (0.5)*(gxm)[1], (gxm)[
2] = (0.5)*(gxm)[2])
; ELL_3V_SCALE(gxp, 0.5, gxp)((gxp)[0] = (0.5)*(gxp)[0], (gxp)[1] = (0.5)*(gxp)[1], (gxp)[
2] = (0.5)*(gxp)[2])
;
482 }
483 if (yi>0 && yi<sy-2) {
484 unsigned int siyy = xi + sx*(yi+2);
485 ELL_3M_LERP(Tym, alpha, sctx->t + 9*(1+2*siY), sctx->t + 9*(1+2*si))((((Tym)+0)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*si))+0)
[0]) - (((sctx->t + 9*(1+2*siY))+0)[0])) + (((sctx->t +
9*(1+2*siY))+0)[0])), ((Tym)+0)[1] = ((((alpha)))*((((sctx->
t + 9*(1+2*si))+0)[1]) - (((sctx->t + 9*(1+2*siY))+0)[1]))
+ (((sctx->t + 9*(1+2*siY))+0)[1])), ((Tym)+0)[2] = ((((alpha
)))*((((sctx->t + 9*(1+2*si))+0)[2]) - (((sctx->t + 9*(
1+2*siY))+0)[2])) + (((sctx->t + 9*(1+2*siY))+0)[2]))), ((
(Tym)+3)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*si))+3)[0]
) - (((sctx->t + 9*(1+2*siY))+3)[0])) + (((sctx->t + 9*
(1+2*siY))+3)[0])), ((Tym)+3)[1] = ((((alpha)))*((((sctx->
t + 9*(1+2*si))+3)[1]) - (((sctx->t + 9*(1+2*siY))+3)[1]))
+ (((sctx->t + 9*(1+2*siY))+3)[1])), ((Tym)+3)[2] = ((((alpha
)))*((((sctx->t + 9*(1+2*si))+3)[2]) - (((sctx->t + 9*(
1+2*siY))+3)[2])) + (((sctx->t + 9*(1+2*siY))+3)[2]))), ((
(Tym)+6)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*si))+6)[0]
) - (((sctx->t + 9*(1+2*siY))+6)[0])) + (((sctx->t + 9*
(1+2*siY))+6)[0])), ((Tym)+6)[1] = ((((alpha)))*((((sctx->
t + 9*(1+2*si))+6)[1]) - (((sctx->t + 9*(1+2*siY))+6)[1]))
+ (((sctx->t + 9*(1+2*siY))+6)[1])), ((Tym)+6)[2] = ((((alpha
)))*((((sctx->t + 9*(1+2*si))+6)[2]) - (((sctx->t + 9*(
1+2*siY))+6)[2])) + (((sctx->t + 9*(1+2*siY))+6)[2]))))
;
486 ELL_3V_LERP(gym, alpha, sctx->grad + 3*(1+2*siY),((gym)[0] = (((alpha))*(((sctx->grad + 3*(1+2*si))[0]) - (
(sctx->grad + 3*(1+2*siY))[0])) + ((sctx->grad + 3*(1+2
*siY))[0])), (gym)[1] = (((alpha))*(((sctx->grad + 3*(1+2*
si))[1]) - ((sctx->grad + 3*(1+2*siY))[1])) + ((sctx->grad
+ 3*(1+2*siY))[1])), (gym)[2] = (((alpha))*(((sctx->grad +
3*(1+2*si))[2]) - ((sctx->grad + 3*(1+2*siY))[2])) + ((sctx
->grad + 3*(1+2*siY))[2])))
487 sctx->grad + 3*(1+2*si))((gym)[0] = (((alpha))*(((sctx->grad + 3*(1+2*si))[0]) - (
(sctx->grad + 3*(1+2*siY))[0])) + ((sctx->grad + 3*(1+2
*siY))[0])), (gym)[1] = (((alpha))*(((sctx->grad + 3*(1+2*
si))[1]) - ((sctx->grad + 3*(1+2*siY))[1])) + ((sctx->grad
+ 3*(1+2*siY))[1])), (gym)[2] = (((alpha))*(((sctx->grad +
3*(1+2*si))[2]) - ((sctx->grad + 3*(1+2*siY))[2])) + ((sctx
->grad + 3*(1+2*siY))[2])))
;
488 ELL_3M_LERP(Typ, alpha, sctx->t + 9*(1+2*siy), sctx->t + 9*(1+2*siyy))((((Typ)+0)[0] = ((((alpha)))*((((sctx->t + 9*(1+2*siyy))+
0)[0]) - (((sctx->t + 9*(1+2*siy))+0)[0])) + (((sctx->t
+ 9*(1+2*siy))+0)[0])), ((Typ)+0)[1] = ((((alpha)))*((((sctx
->t + 9*(1+2*siyy))+0)[1]) - (((sctx->t + 9*(1+2*siy))+
0)[1])) + (((sctx->t + 9*(1+2*siy))+0)[1])), ((Typ)+0)[2] =
((((alpha)))*((((sctx->t + 9*(1+2*siyy))+0)[2]) - (((sctx
->t + 9*(1+2*siy))+0)[2])) + (((sctx->t + 9*(1+2*siy))+
0)[2]))), (((Typ)+3)[0] = ((((alpha)))*((((sctx->t + 9*(1+
2*siyy))+3)[0]) - (((sctx->t + 9*(1+2*siy))+3)[0])) + (((sctx
->t + 9*(1+2*siy))+3)[0])), ((Typ)+3)[1] = ((((alpha)))*((
((sctx->t + 9*(1+2*siyy))+3)[1]) - (((sctx->t + 9*(1+2*
siy))+3)[1])) + (((sctx->t + 9*(1+2*siy))+3)[1])), ((Typ)+
3)[2] = ((((alpha)))*((((sctx->t + 9*(1+2*siyy))+3)[2]) - (
((sctx->t + 9*(1+2*siy))+3)[2])) + (((sctx->t + 9*(1+2*
siy))+3)[2]))), (((Typ)+6)[0] = ((((alpha)))*((((sctx->t +
9*(1+2*siyy))+6)[0]) - (((sctx->t + 9*(1+2*siy))+6)[0])) +
(((sctx->t + 9*(1+2*siy))+6)[0])), ((Typ)+6)[1] = ((((alpha
)))*((((sctx->t + 9*(1+2*siyy))+6)[1]) - (((sctx->t + 9
*(1+2*siy))+6)[1])) + (((sctx->t + 9*(1+2*siy))+6)[1])), (
(Typ)+6)[2] = ((((alpha)))*((((sctx->t + 9*(1+2*siyy))+6)[
2]) - (((sctx->t + 9*(1+2*siy))+6)[2])) + (((sctx->t + 9
*(1+2*siy))+6)[2]))))
;
489 ELL_3V_LERP(gyp, alpha, sctx->grad + 3*(1+2*siy),((gyp)[0] = (((alpha))*(((sctx->grad + 3*(1+2*siyy))[0]) -
((sctx->grad + 3*(1+2*siy))[0])) + ((sctx->grad + 3*(1
+2*siy))[0])), (gyp)[1] = (((alpha))*(((sctx->grad + 3*(1+
2*siyy))[1]) - ((sctx->grad + 3*(1+2*siy))[1])) + ((sctx->
grad + 3*(1+2*siy))[1])), (gyp)[2] = (((alpha))*(((sctx->grad
+ 3*(1+2*siyy))[2]) - ((sctx->grad + 3*(1+2*siy))[2])) + (
(sctx->grad + 3*(1+2*siy))[2])))
490 sctx->grad + 3*(1+2*siyy))((gyp)[0] = (((alpha))*(((sctx->grad + 3*(1+2*siyy))[0]) -
((sctx->grad + 3*(1+2*siy))[0])) + ((sctx->grad + 3*(1
+2*siy))[0])), (gyp)[1] = (((alpha))*(((sctx->grad + 3*(1+
2*siyy))[1]) - ((sctx->grad + 3*(1+2*siy))[1])) + ((sctx->
grad + 3*(1+2*siy))[1])), (gyp)[2] = (((alpha))*(((sctx->grad
+ 3*(1+2*siyy))[2]) - ((sctx->grad + 3*(1+2*siy))[2])) + (
(sctx->grad + 3*(1+2*siy))[2])))
;
491 ELL_3M_SCALE(Tym, 0.5, Tym)((((Tym)+0)[0] = ((0.5))*((Tym)+0)[0], ((Tym)+0)[1] = ((0.5))
*((Tym)+0)[1], ((Tym)+0)[2] = ((0.5))*((Tym)+0)[2]), (((Tym)+
3)[0] = ((0.5))*((Tym)+3)[0], ((Tym)+3)[1] = ((0.5))*((Tym)+3
)[1], ((Tym)+3)[2] = ((0.5))*((Tym)+3)[2]), (((Tym)+6)[0] = (
(0.5))*((Tym)+6)[0], ((Tym)+6)[1] = ((0.5))*((Tym)+6)[1], ((Tym
)+6)[2] = ((0.5))*((Tym)+6)[2]))
; ELL_3M_SCALE(Typ, 0.5, Typ)((((Typ)+0)[0] = ((0.5))*((Typ)+0)[0], ((Typ)+0)[1] = ((0.5))
*((Typ)+0)[1], ((Typ)+0)[2] = ((0.5))*((Typ)+0)[2]), (((Typ)+
3)[0] = ((0.5))*((Typ)+3)[0], ((Typ)+3)[1] = ((0.5))*((Typ)+3
)[1], ((Typ)+3)[2] = ((0.5))*((Typ)+3)[2]), (((Typ)+6)[0] = (
(0.5))*((Typ)+6)[0], ((Typ)+6)[1] = ((0.5))*((Typ)+6)[1], ((Typ
)+6)[2] = ((0.5))*((Typ)+6)[2]))
;
492 ELL_3V_SCALE(gym, 0.5, gym)((gym)[0] = (0.5)*(gym)[0], (gym)[1] = (0.5)*(gym)[1], (gym)[
2] = (0.5)*(gym)[2])
; ELL_3V_SCALE(gyp, 0.5, gyp)((gyp)[0] = (0.5)*(gyp)[0], (gyp)[1] = (0.5)*(gyp)[1], (gyp)[
2] = (0.5)*(gyp)[2])
;
493 } else {
494 ELL_3M_COPY(Tym, sctx->t + 9*(1+2*si))((((Tym)+0)[0] = ((sctx->t + 9*(1+2*si))+0)[0], ((Tym)+0)[
1] = ((sctx->t + 9*(1+2*si))+0)[1], ((Tym)+0)[2] = ((sctx->
t + 9*(1+2*si))+0)[2]), (((Tym)+3)[0] = ((sctx->t + 9*(1+2
*si))+3)[0], ((Tym)+3)[1] = ((sctx->t + 9*(1+2*si))+3)[1],
((Tym)+3)[2] = ((sctx->t + 9*(1+2*si))+3)[2]), (((Tym)+6)
[0] = ((sctx->t + 9*(1+2*si))+6)[0], ((Tym)+6)[1] = ((sctx
->t + 9*(1+2*si))+6)[1], ((Tym)+6)[2] = ((sctx->t + 9*(
1+2*si))+6)[2]))
;
495 ELL_3V_COPY(gym, sctx->grad + 3*(1+2*si))((gym)[0] = (sctx->grad + 3*(1+2*si))[0], (gym)[1] = (sctx
->grad + 3*(1+2*si))[1], (gym)[2] = (sctx->grad + 3*(1+
2*si))[2])
;
496 ELL_3M_COPY(Typ, sctx->t + 9*(1+2*six))((((Typ)+0)[0] = ((sctx->t + 9*(1+2*six))+0)[0], ((Typ)+0)
[1] = ((sctx->t + 9*(1+2*six))+0)[1], ((Typ)+0)[2] = ((sctx
->t + 9*(1+2*six))+0)[2]), (((Typ)+3)[0] = ((sctx->t + 9
*(1+2*six))+3)[0], ((Typ)+3)[1] = ((sctx->t + 9*(1+2*six))
+3)[1], ((Typ)+3)[2] = ((sctx->t + 9*(1+2*six))+3)[2]), ((
(Typ)+6)[0] = ((sctx->t + 9*(1+2*six))+6)[0], ((Typ)+6)[1]
= ((sctx->t + 9*(1+2*six))+6)[1], ((Typ)+6)[2] = ((sctx->
t + 9*(1+2*six))+6)[2]))
;
497 ELL_3V_COPY(gyp, sctx->grad + 3*(1+2*six))((gyp)[0] = (sctx->grad + 3*(1+2*six))[0], (gyp)[1] = (sctx
->grad + 3*(1+2*six))[1], (gyp)[2] = (sctx->grad + 3*(1
+2*six))[2])
;
498 }
499 computeGradientLin(res, T, g,
500 Txm, gxm, Txp, gxp,
501 Tym, gym, Typ, gyp,
502 Tzm, gzm, Tzp, gzp);
503 break;
504 }
505}
506
507/* Given a unique face ID and coordinates, compute the crease surface
508 * normal at the specified degenerate point */
509static void
510computeFaceGradient(seekContext *sctx, double *res,
511 unsigned int xi, unsigned int yi,
512 char faceid, double *coords) {
513 double T[9], Txm[9], Txp[9], Tym[9], Typ[9], Tzm[9], Tzp[9],
514 g[3], gxm[3], gxp[3], gym[3], gyp[3], gzm[3], gzp[3];
515 unsigned int sx = AIR_CAST(unsigned int, sctx->sx)((unsigned int)(sctx->sx));
516 unsigned int sy = AIR_CAST(unsigned int, sctx->sy)((unsigned int)(sctx->sy));
517 unsigned int si = xi + sx*yi;
518 unsigned int six = xi + 1 + sx*yi, siX = xi - 1 + sx*yi;
519 unsigned int siy = xi + sx*(yi+1), siY = xi + sx*(yi-1);
520 unsigned int sixy = xi + 1 + sx*(yi+1), sixY = xi + 1 + sx*(yi-1),
521 siXy = xi - 1 + sx*(yi+1);
522
523 /* Again, lots of special cases to fill Txm, gxm, etc. */
524 switch (faceid) {
525 case 0:
526 /* bilinearly interpolate Tzp/gzp first */
527 ELL_3M_LERP(Txm, coords[1], sctx->t + 9*(1+2*si), sctx->t + 9*(1+2*siy))((((Txm)+0)[0] = ((((coords[1])))*((((sctx->t + 9*(1+2*siy
))+0)[0]) - (((sctx->t + 9*(1+2*si))+0)[0])) + (((sctx->
t + 9*(1+2*si))+0)[0])), ((Txm)+0)[1] = ((((coords[1])))*((((
sctx->t + 9*(1+2*siy))+0)[1]) - (((sctx->t + 9*(1+2*si)
)+0)[1])) + (((sctx->t + 9*(1+2*si))+0)[1])), ((Txm)+0)[2]
= ((((coords[1])))*((((sctx->t + 9*(1+2*siy))+0)[2]) - ((
(sctx->t + 9*(1+2*si))+0)[2])) + (((sctx->t + 9*(1+2*si
))+0)[2]))), (((Txm)+3)[0] = ((((coords[1])))*((((sctx->t +
9*(1+2*siy))+3)[0]) - (((sctx->t + 9*(1+2*si))+3)[0])) + (
((sctx->t + 9*(1+2*si))+3)[0])), ((Txm)+3)[1] = ((((coords
[1])))*((((sctx->t + 9*(1+2*siy))+3)[1]) - (((sctx->t +
9*(1+2*si))+3)[1])) + (((sctx->t + 9*(1+2*si))+3)[1])), (
(Txm)+3)[2] = ((((coords[1])))*((((sctx->t + 9*(1+2*siy))+
3)[2]) - (((sctx->t + 9*(1+2*si))+3)[2])) + (((sctx->t +
9*(1+2*si))+3)[2]))), (((Txm)+6)[0] = ((((coords[1])))*((((sctx
->t + 9*(1+2*siy))+6)[0]) - (((sctx->t + 9*(1+2*si))+6)
[0])) + (((sctx->t + 9*(1+2*si))+6)[0])), ((Txm)+6)[1] = (
(((coords[1])))*((((sctx->t + 9*(1+2*siy))+6)[1]) - (((sctx
->t + 9*(1+2*si))+6)[1])) + (((sctx->t + 9*(1+2*si))+6)
[1])), ((Txm)+6)[2] = ((((coords[1])))*((((sctx->t + 9*(1+
2*siy))+6)[2]) - (((sctx->t + 9*(1+2*si))+6)[2])) + (((sctx
->t + 9*(1+2*si))+6)[2]))))
;
528 ELL_3V_LERP(gxm, coords[1], sctx->grad + 3*(1+2*si),((gxm)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*siy))[0]
) - ((sctx->grad + 3*(1+2*si))[0])) + ((sctx->grad + 3*
(1+2*si))[0])), (gxm)[1] = (((coords[1]))*(((sctx->grad + 3
*(1+2*siy))[1]) - ((sctx->grad + 3*(1+2*si))[1])) + ((sctx
->grad + 3*(1+2*si))[1])), (gxm)[2] = (((coords[1]))*(((sctx
->grad + 3*(1+2*siy))[2]) - ((sctx->grad + 3*(1+2*si))[
2])) + ((sctx->grad + 3*(1+2*si))[2])))
529 sctx->grad + 3*(1+2*siy))((gxm)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*siy))[0]
) - ((sctx->grad + 3*(1+2*si))[0])) + ((sctx->grad + 3*
(1+2*si))[0])), (gxm)[1] = (((coords[1]))*(((sctx->grad + 3
*(1+2*siy))[1]) - ((sctx->grad + 3*(1+2*si))[1])) + ((sctx
->grad + 3*(1+2*si))[1])), (gxm)[2] = (((coords[1]))*(((sctx
->grad + 3*(1+2*siy))[2]) - ((sctx->grad + 3*(1+2*si))[
2])) + ((sctx->grad + 3*(1+2*si))[2])))
;
530 ELL_3M_LERP(Txp, coords[1], sctx->t + 9*(1+2*six), sctx->t + 9*(1+2*sixy))((((Txp)+0)[0] = ((((coords[1])))*((((sctx->t + 9*(1+2*sixy
))+0)[0]) - (((sctx->t + 9*(1+2*six))+0)[0])) + (((sctx->
t + 9*(1+2*six))+0)[0])), ((Txp)+0)[1] = ((((coords[1])))*(((
(sctx->t + 9*(1+2*sixy))+0)[1]) - (((sctx->t + 9*(1+2*six
))+0)[1])) + (((sctx->t + 9*(1+2*six))+0)[1])), ((Txp)+0)[
2] = ((((coords[1])))*((((sctx->t + 9*(1+2*sixy))+0)[2]) -
(((sctx->t + 9*(1+2*six))+0)[2])) + (((sctx->t + 9*(1+
2*six))+0)[2]))), (((Txp)+3)[0] = ((((coords[1])))*((((sctx->
t + 9*(1+2*sixy))+3)[0]) - (((sctx->t + 9*(1+2*six))+3)[0]
)) + (((sctx->t + 9*(1+2*six))+3)[0])), ((Txp)+3)[1] = (((
(coords[1])))*((((sctx->t + 9*(1+2*sixy))+3)[1]) - (((sctx
->t + 9*(1+2*six))+3)[1])) + (((sctx->t + 9*(1+2*six))+
3)[1])), ((Txp)+3)[2] = ((((coords[1])))*((((sctx->t + 9*(
1+2*sixy))+3)[2]) - (((sctx->t + 9*(1+2*six))+3)[2])) + ((
(sctx->t + 9*(1+2*six))+3)[2]))), (((Txp)+6)[0] = ((((coords
[1])))*((((sctx->t + 9*(1+2*sixy))+6)[0]) - (((sctx->t +
9*(1+2*six))+6)[0])) + (((sctx->t + 9*(1+2*six))+6)[0])),
((Txp)+6)[1] = ((((coords[1])))*((((sctx->t + 9*(1+2*sixy
))+6)[1]) - (((sctx->t + 9*(1+2*six))+6)[1])) + (((sctx->
t + 9*(1+2*six))+6)[1])), ((Txp)+6)[2] = ((((coords[1])))*(((
(sctx->t + 9*(1+2*sixy))+6)[2]) - (((sctx->t + 9*(1+2*six
))+6)[2])) + (((sctx->t + 9*(1+2*six))+6)[2]))))
;
531 ELL_3V_LERP(gxp, coords[1], sctx->grad + 3*(1+2*six),((gxp)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*sixy))[0
]) - ((sctx->grad + 3*(1+2*six))[0])) + ((sctx->grad + 3
*(1+2*six))[0])), (gxp)[1] = (((coords[1]))*(((sctx->grad +
3*(1+2*sixy))[1]) - ((sctx->grad + 3*(1+2*six))[1])) + ((
sctx->grad + 3*(1+2*six))[1])), (gxp)[2] = (((coords[1]))*
(((sctx->grad + 3*(1+2*sixy))[2]) - ((sctx->grad + 3*(1
+2*six))[2])) + ((sctx->grad + 3*(1+2*six))[2])))
532 sctx->grad + 3*(1+2*sixy))((gxp)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*sixy))[0
]) - ((sctx->grad + 3*(1+2*six))[0])) + ((sctx->grad + 3
*(1+2*six))[0])), (gxp)[1] = (((coords[1]))*(((sctx->grad +
3*(1+2*sixy))[1]) - ((sctx->grad + 3*(1+2*six))[1])) + ((
sctx->grad + 3*(1+2*six))[1])), (gxp)[2] = (((coords[1]))*
(((sctx->grad + 3*(1+2*sixy))[2]) - ((sctx->grad + 3*(1
+2*six))[2])) + ((sctx->grad + 3*(1+2*six))[2])))
;
533 ELL_3M_LERP(Tzp, coords[0], Txm, Txp)((((Tzp)+0)[0] = ((((coords[0])))*((((Txp)+0)[0]) - (((Txm)+0
)[0])) + (((Txm)+0)[0])), ((Tzp)+0)[1] = ((((coords[0])))*(((
(Txp)+0)[1]) - (((Txm)+0)[1])) + (((Txm)+0)[1])), ((Tzp)+0)[2
] = ((((coords[0])))*((((Txp)+0)[2]) - (((Txm)+0)[2])) + (((Txm
)+0)[2]))), (((Tzp)+3)[0] = ((((coords[0])))*((((Txp)+3)[0]) -
(((Txm)+3)[0])) + (((Txm)+3)[0])), ((Tzp)+3)[1] = ((((coords
[0])))*((((Txp)+3)[1]) - (((Txm)+3)[1])) + (((Txm)+3)[1])), (
(Tzp)+3)[2] = ((((coords[0])))*((((Txp)+3)[2]) - (((Txm)+3)[2
])) + (((Txm)+3)[2]))), (((Tzp)+6)[0] = ((((coords[0])))*((((
Txp)+6)[0]) - (((Txm)+6)[0])) + (((Txm)+6)[0])), ((Tzp)+6)[1]
= ((((coords[0])))*((((Txp)+6)[1]) - (((Txm)+6)[1])) + (((Txm
)+6)[1])), ((Tzp)+6)[2] = ((((coords[0])))*((((Txp)+6)[2]) - (
((Txm)+6)[2])) + (((Txm)+6)[2]))))
;
534 ELL_3V_LERP(gzp, coords[0], gxm, gxp)((gzp)[0] = (((coords[0]))*(((gxp)[0]) - ((gxm)[0])) + ((gxm)
[0])), (gzp)[1] = (((coords[0]))*(((gxp)[1]) - ((gxm)[1])) + (
(gxm)[1])), (gzp)[2] = (((coords[0]))*(((gxp)[2]) - ((gxm)[2]
)) + ((gxm)[2])))
;
535 /* now, compute all required points on the bottom face */
536 ELL_3M_LERP(Txm, coords[1], sctx->t + 9*(0+2*si), sctx->t + 9*(0+2*siy))((((Txm)+0)[0] = ((((coords[1])))*((((sctx->t + 9*(0+2*siy
))+0)[0]) - (((sctx->t + 9*(0+2*si))+0)[0])) + (((sctx->
t + 9*(0+2*si))+0)[0])), ((Txm)+0)[1] = ((((coords[1])))*((((
sctx->t + 9*(0+2*siy))+0)[1]) - (((sctx->t + 9*(0+2*si)
)+0)[1])) + (((sctx->t + 9*(0+2*si))+0)[1])), ((Txm)+0)[2]
= ((((coords[1])))*((((sctx->t + 9*(0+2*siy))+0)[2]) - ((
(sctx->t + 9*(0+2*si))+0)[2])) + (((sctx->t + 9*(0+2*si
))+0)[2]))), (((Txm)+3)[0] = ((((coords[1])))*((((sctx->t +
9*(0+2*siy))+3)[0]) - (((sctx->t + 9*(0+2*si))+3)[0])) + (
((sctx->t + 9*(0+2*si))+3)[0])), ((Txm)+3)[1] = ((((coords
[1])))*((((sctx->t + 9*(0+2*siy))+3)[1]) - (((sctx->t +
9*(0+2*si))+3)[1])) + (((sctx->t + 9*(0+2*si))+3)[1])), (
(Txm)+3)[2] = ((((coords[1])))*((((sctx->t + 9*(0+2*siy))+
3)[2]) - (((sctx->t + 9*(0+2*si))+3)[2])) + (((sctx->t +
9*(0+2*si))+3)[2]))), (((Txm)+6)[0] = ((((coords[1])))*((((sctx
->t + 9*(0+2*siy))+6)[0]) - (((sctx->t + 9*(0+2*si))+6)
[0])) + (((sctx->t + 9*(0+2*si))+6)[0])), ((Txm)+6)[1] = (
(((coords[1])))*((((sctx->t + 9*(0+2*siy))+6)[1]) - (((sctx
->t + 9*(0+2*si))+6)[1])) + (((sctx->t + 9*(0+2*si))+6)
[1])), ((Txm)+6)[2] = ((((coords[1])))*((((sctx->t + 9*(0+
2*siy))+6)[2]) - (((sctx->t + 9*(0+2*si))+6)[2])) + (((sctx
->t + 9*(0+2*si))+6)[2]))))
;
537 ELL_3V_LERP(gxm, coords[1], sctx->grad + 3*(0+2*si),((gxm)[0] = (((coords[1]))*(((sctx->grad + 3*(0+2*siy))[0]
) - ((sctx->grad + 3*(0+2*si))[0])) + ((sctx->grad + 3*
(0+2*si))[0])), (gxm)[1] = (((coords[1]))*(((sctx->grad + 3
*(0+2*siy))[1]) - ((sctx->grad + 3*(0+2*si))[1])) + ((sctx
->grad + 3*(0+2*si))[1])), (gxm)[2] = (((coords[1]))*(((sctx
->grad + 3*(0+2*siy))[2]) - ((sctx->grad + 3*(0+2*si))[
2])) + ((sctx->grad + 3*(0+2*si))[2])))
538 sctx->grad + 3*(0+2*siy))((gxm)[0] = (((coords[1]))*(((sctx->grad + 3*(0+2*siy))[0]
) - ((sctx->grad + 3*(0+2*si))[0])) + ((sctx->grad + 3*
(0+2*si))[0])), (gxm)[1] = (((coords[1]))*(((sctx->grad + 3
*(0+2*siy))[1]) - ((sctx->grad + 3*(0+2*si))[1])) + ((sctx
->grad + 3*(0+2*si))[1])), (gxm)[2] = (((coords[1]))*(((sctx
->grad + 3*(0+2*siy))[2]) - ((sctx->grad + 3*(0+2*si))[
2])) + ((sctx->grad + 3*(0+2*si))[2])))
;
539 ELL_3M_LERP(Txp, coords[1], sctx->t + 9*(0+2*six), sctx->t + 9*(0+2*sixy))((((Txp)+0)[0] = ((((coords[1])))*((((sctx->t + 9*(0+2*sixy
))+0)[0]) - (((sctx->t + 9*(0+2*six))+0)[0])) + (((sctx->
t + 9*(0+2*six))+0)[0])), ((Txp)+0)[1] = ((((coords[1])))*(((
(sctx->t + 9*(0+2*sixy))+0)[1]) - (((sctx->t + 9*(0+2*six
))+0)[1])) + (((sctx->t + 9*(0+2*six))+0)[1])), ((Txp)+0)[
2] = ((((coords[1])))*((((sctx->t + 9*(0+2*sixy))+0)[2]) -
(((sctx->t + 9*(0+2*six))+0)[2])) + (((sctx->t + 9*(0+
2*six))+0)[2]))), (((Txp)+3)[0] = ((((coords[1])))*((((sctx->
t + 9*(0+2*sixy))+3)[0]) - (((sctx->t + 9*(0+2*six))+3)[0]
)) + (((sctx->t + 9*(0+2*six))+3)[0])), ((Txp)+3)[1] = (((
(coords[1])))*((((sctx->t + 9*(0+2*sixy))+3)[1]) - (((sctx
->t + 9*(0+2*six))+3)[1])) + (((sctx->t + 9*(0+2*six))+
3)[1])), ((Txp)+3)[2] = ((((coords[1])))*((((sctx->t + 9*(
0+2*sixy))+3)[2]) - (((sctx->t + 9*(0+2*six))+3)[2])) + ((
(sctx->t + 9*(0+2*six))+3)[2]))), (((Txp)+6)[0] = ((((coords
[1])))*((((sctx->t + 9*(0+2*sixy))+6)[0]) - (((sctx->t +
9*(0+2*six))+6)[0])) + (((sctx->t + 9*(0+2*six))+6)[0])),
((Txp)+6)[1] = ((((coords[1])))*((((sctx->t + 9*(0+2*sixy
))+6)[1]) - (((sctx->t + 9*(0+2*six))+6)[1])) + (((sctx->
t + 9*(0+2*six))+6)[1])), ((Txp)+6)[2] = ((((coords[1])))*(((
(sctx->t + 9*(0+2*sixy))+6)[2]) - (((sctx->t + 9*(0+2*six
))+6)[2])) + (((sctx->t + 9*(0+2*six))+6)[2]))))
;
540 ELL_3V_LERP(gxp, coords[1], sctx->grad + 3*(0+2*six),((gxp)[0] = (((coords[1]))*(((sctx->grad + 3*(0+2*sixy))[0
]) - ((sctx->grad + 3*(0+2*six))[0])) + ((sctx->grad + 3
*(0+2*six))[0])), (gxp)[1] = (((coords[1]))*(((sctx->grad +
3*(0+2*sixy))[1]) - ((sctx->grad + 3*(0+2*six))[1])) + ((
sctx->grad + 3*(0+2*six))[1])), (gxp)[2] = (((coords[1]))*
(((sctx->grad + 3*(0+2*sixy))[2]) - ((sctx->grad + 3*(0
+2*six))[2])) + ((sctx->grad + 3*(0+2*six))[2])))
541 sctx->grad + 3*(0+2*sixy))((gxp)[0] = (((coords[1]))*(((sctx->grad + 3*(0+2*sixy))[0
]) - ((sctx->grad + 3*(0+2*six))[0])) + ((sctx->grad + 3
*(0+2*six))[0])), (gxp)[1] = (((coords[1]))*(((sctx->grad +
3*(0+2*sixy))[1]) - ((sctx->grad + 3*(0+2*six))[1])) + ((
sctx->grad + 3*(0+2*six))[1])), (gxp)[2] = (((coords[1]))*
(((sctx->grad + 3*(0+2*sixy))[2]) - ((sctx->grad + 3*(0
+2*six))[2])) + ((sctx->grad + 3*(0+2*six))[2])))
;
542
543 ELL_3M_LERP(Tym, coords[0], sctx->t + 9*(0+2*si), sctx->t + 9*(0+2*six))((((Tym)+0)[0] = ((((coords[0])))*((((sctx->t + 9*(0+2*six
))+0)[0]) - (((sctx->t + 9*(0+2*si))+0)[0])) + (((sctx->
t + 9*(0+2*si))+0)[0])), ((Tym)+0)[1] = ((((coords[0])))*((((
sctx->t + 9*(0+2*six))+0)[1]) - (((sctx->t + 9*(0+2*si)
)+0)[1])) + (((sctx->t + 9*(0+2*si))+0)[1])), ((Tym)+0)[2]
= ((((coords[0])))*((((sctx->t + 9*(0+2*six))+0)[2]) - ((
(sctx->t + 9*(0+2*si))+0)[2])) + (((sctx->t + 9*(0+2*si
))+0)[2]))), (((Tym)+3)[0] = ((((coords[0])))*((((sctx->t +
9*(0+2*six))+3)[0]) - (((sctx->t + 9*(0+2*si))+3)[0])) + (
((sctx->t + 9*(0+2*si))+3)[0])), ((Tym)+3)[1] = ((((coords
[0])))*((((sctx->t + 9*(0+2*six))+3)[1]) - (((sctx->t +
9*(0+2*si))+3)[1])) + (((sctx->t + 9*(0+2*si))+3)[1])), (
(Tym)+3)[2] = ((((coords[0])))*((((sctx->t + 9*(0+2*six))+
3)[2]) - (((sctx->t + 9*(0+2*si))+3)[2])) + (((sctx->t +
9*(0+2*si))+3)[2]))), (((Tym)+6)[0] = ((((coords[0])))*((((sctx
->t + 9*(0+2*six))+6)[0]) - (((sctx->t + 9*(0+2*si))+6)
[0])) + (((sctx->t + 9*(0+2*si))+6)[0])), ((Tym)+6)[1] = (
(((coords[0])))*((((sctx->t + 9*(0+2*six))+6)[1]) - (((sctx
->t + 9*(0+2*si))+6)[1])) + (((sctx->t + 9*(0+2*si))+6)
[1])), ((Tym)+6)[2] = ((((coords[0])))*((((sctx->t + 9*(0+
2*six))+6)[2]) - (((sctx->t + 9*(0+2*si))+6)[2])) + (((sctx
->t + 9*(0+2*si))+6)[2]))))
;
544 ELL_3V_LERP(gym, coords[0], sctx->grad + 3*(0+2*si),((gym)[0] = (((coords[0]))*(((sctx->grad + 3*(0+2*six))[0]
) - ((sctx->grad + 3*(0+2*si))[0])) + ((sctx->grad + 3*
(0+2*si))[0])), (gym)[1] = (((coords[0]))*(((sctx->grad + 3
*(0+2*six))[1]) - ((sctx->grad + 3*(0+2*si))[1])) + ((sctx
->grad + 3*(0+2*si))[1])), (gym)[2] = (((coords[0]))*(((sctx
->grad + 3*(0+2*six))[2]) - ((sctx->grad + 3*(0+2*si))[
2])) + ((sctx->grad + 3*(0+2*si))[2])))
545 sctx->grad + 3*(0+2*six))((gym)[0] = (((coords[0]))*(((sctx->grad + 3*(0+2*six))[0]
) - ((sctx->grad + 3*(0+2*si))[0])) + ((sctx->grad + 3*
(0+2*si))[0])), (gym)[1] = (((coords[0]))*(((sctx->grad + 3
*(0+2*six))[1]) - ((sctx->grad + 3*(0+2*si))[1])) + ((sctx
->grad + 3*(0+2*si))[1])), (gym)[2] = (((coords[0]))*(((sctx
->grad + 3*(0+2*six))[2]) - ((sctx->grad + 3*(0+2*si))[
2])) + ((sctx->grad + 3*(0+2*si))[2])))
;
546 ELL_3M_LERP(Typ, coords[0], sctx->t + 9*(0+2*siy), sctx->t + 9*(0+2*sixy))((((Typ)+0)[0] = ((((coords[0])))*((((sctx->t + 9*(0+2*sixy
))+0)[0]) - (((sctx->t + 9*(0+2*siy))+0)[0])) + (((sctx->
t + 9*(0+2*siy))+0)[0])), ((Typ)+0)[1] = ((((coords[0])))*(((
(sctx->t + 9*(0+2*sixy))+0)[1]) - (((sctx->t + 9*(0+2*siy
))+0)[1])) + (((sctx->t + 9*(0+2*siy))+0)[1])), ((Typ)+0)[
2] = ((((coords[0])))*((((sctx->t + 9*(0+2*sixy))+0)[2]) -
(((sctx->t + 9*(0+2*siy))+0)[2])) + (((sctx->t + 9*(0+
2*siy))+0)[2]))), (((Typ)+3)[0] = ((((coords[0])))*((((sctx->
t + 9*(0+2*sixy))+3)[0]) - (((sctx->t + 9*(0+2*siy))+3)[0]
)) + (((sctx->t + 9*(0+2*siy))+3)[0])), ((Typ)+3)[1] = (((
(coords[0])))*((((sctx->t + 9*(0+2*sixy))+3)[1]) - (((sctx
->t + 9*(0+2*siy))+3)[1])) + (((sctx->t + 9*(0+2*siy))+
3)[1])), ((Typ)+3)[2] = ((((coords[0])))*((((sctx->t + 9*(
0+2*sixy))+3)[2]) - (((sctx->t + 9*(0+2*siy))+3)[2])) + ((
(sctx->t + 9*(0+2*siy))+3)[2]))), (((Typ)+6)[0] = ((((coords
[0])))*((((sctx->t + 9*(0+2*sixy))+6)[0]) - (((sctx->t +
9*(0+2*siy))+6)[0])) + (((sctx->t + 9*(0+2*siy))+6)[0])),
((Typ)+6)[1] = ((((coords[0])))*((((sctx->t + 9*(0+2*sixy
))+6)[1]) - (((sctx->t + 9*(0+2*siy))+6)[1])) + (((sctx->
t + 9*(0+2*siy))+6)[1])), ((Typ)+6)[2] = ((((coords[0])))*(((
(sctx->t + 9*(0+2*sixy))+6)[2]) - (((sctx->t + 9*(0+2*siy
))+6)[2])) + (((sctx->t + 9*(0+2*siy))+6)[2]))))
;
547 ELL_3V_LERP(gyp, coords[0], sctx->grad + 3*(0+2*siy),((gyp)[0] = (((coords[0]))*(((sctx->grad + 3*(0+2*sixy))[0
]) - ((sctx->grad + 3*(0+2*siy))[0])) + ((sctx->grad + 3
*(0+2*siy))[0])), (gyp)[1] = (((coords[0]))*(((sctx->grad +
3*(0+2*sixy))[1]) - ((sctx->grad + 3*(0+2*siy))[1])) + ((
sctx->grad + 3*(0+2*siy))[1])), (gyp)[2] = (((coords[0]))*
(((sctx->grad + 3*(0+2*sixy))[2]) - ((sctx->grad + 3*(0
+2*siy))[2])) + ((sctx->grad + 3*(0+2*siy))[2])))
548 sctx->grad + 3*(0+2*sixy))((gyp)[0] = (((coords[0]))*(((sctx->grad + 3*(0+2*sixy))[0
]) - ((sctx->grad + 3*(0+2*siy))[0])) + ((sctx->grad + 3
*(0+2*siy))[0])), (gyp)[1] = (((coords[0]))*(((sctx->grad +
3*(0+2*sixy))[1]) - ((sctx->grad + 3*(0+2*siy))[1])) + ((
sctx->grad + 3*(0+2*siy))[1])), (gyp)[2] = (((coords[0]))*
(((sctx->grad + 3*(0+2*sixy))[2]) - ((sctx->grad + 3*(0
+2*siy))[2])) + ((sctx->grad + 3*(0+2*siy))[2])))
;
549
550 ELL_3M_LERP(T, coords[0], Txm, Txp)((((T)+0)[0] = ((((coords[0])))*((((Txp)+0)[0]) - (((Txm)+0)[
0])) + (((Txm)+0)[0])), ((T)+0)[1] = ((((coords[0])))*((((Txp
)+0)[1]) - (((Txm)+0)[1])) + (((Txm)+0)[1])), ((T)+0)[2] = ((
((coords[0])))*((((Txp)+0)[2]) - (((Txm)+0)[2])) + (((Txm)+0)
[2]))), (((T)+3)[0] = ((((coords[0])))*((((Txp)+3)[0]) - (((Txm
)+3)[0])) + (((Txm)+3)[0])), ((T)+3)[1] = ((((coords[0])))*((
((Txp)+3)[1]) - (((Txm)+3)[1])) + (((Txm)+3)[1])), ((T)+3)[2]
= ((((coords[0])))*((((Txp)+3)[2]) - (((Txm)+3)[2])) + (((Txm
)+3)[2]))), (((T)+6)[0] = ((((coords[0])))*((((Txp)+6)[0]) - (
((Txm)+6)[0])) + (((Txm)+6)[0])), ((T)+6)[1] = ((((coords[0])
))*((((Txp)+6)[1]) - (((Txm)+6)[1])) + (((Txm)+6)[1])), ((T)+
6)[2] = ((((coords[0])))*((((Txp)+6)[2]) - (((Txm)+6)[2])) + (
((Txm)+6)[2]))))
;
551 ELL_3V_LERP(g, coords[0], gxm, gxp)((g)[0] = (((coords[0]))*(((gxp)[0]) - ((gxm)[0])) + ((gxm)[0
])), (g)[1] = (((coords[0]))*(((gxp)[1]) - ((gxm)[1])) + ((gxm
)[1])), (g)[2] = (((coords[0]))*(((gxp)[2]) - ((gxm)[2])) + (
(gxm)[2])))
;
552
553 computeGradientLin(sctx->facenorm+3*(faceid+4*si), T, g,
554 Txm, gxm, Txp, gxp,
555 Tym, gym, Typ, gyp,
556 T, g, Tzp, gzp);
557 break;
558 case 1:
559 /* bilinearly interpolate Typ/gyp first */
560 if (yi!=sy-1) {
561 ELL_3M_LERP(Txm, coords[1], sctx->t + 9*(0+2*siy), sctx->t + 9*(1+2*siy))((((Txm)+0)[0] = ((((coords[1])))*((((sctx->t + 9*(1+2*siy
))+0)[0]) - (((sctx->t + 9*(0+2*siy))+0)[0])) + (((sctx->
t + 9*(0+2*siy))+0)[0])), ((Txm)+0)[1] = ((((coords[1])))*(((
(sctx->t + 9*(1+2*siy))+0)[1]) - (((sctx->t + 9*(0+2*siy
))+0)[1])) + (((sctx->t + 9*(0+2*siy))+0)[1])), ((Txm)+0)[
2] = ((((coords[1])))*((((sctx->t + 9*(1+2*siy))+0)[2]) - (
((sctx->t + 9*(0+2*siy))+0)[2])) + (((sctx->t + 9*(0+2*
siy))+0)[2]))), (((Txm)+3)[0] = ((((coords[1])))*((((sctx->
t + 9*(1+2*siy))+3)[0]) - (((sctx->t + 9*(0+2*siy))+3)[0])
) + (((sctx->t + 9*(0+2*siy))+3)[0])), ((Txm)+3)[1] = ((((
coords[1])))*((((sctx->t + 9*(1+2*siy))+3)[1]) - (((sctx->
t + 9*(0+2*siy))+3)[1])) + (((sctx->t + 9*(0+2*siy))+3)[1]
)), ((Txm)+3)[2] = ((((coords[1])))*((((sctx->t + 9*(1+2*siy
))+3)[2]) - (((sctx->t + 9*(0+2*siy))+3)[2])) + (((sctx->
t + 9*(0+2*siy))+3)[2]))), (((Txm)+6)[0] = ((((coords[1])))*(
(((sctx->t + 9*(1+2*siy))+6)[0]) - (((sctx->t + 9*(0+2*
siy))+6)[0])) + (((sctx->t + 9*(0+2*siy))+6)[0])), ((Txm)+
6)[1] = ((((coords[1])))*((((sctx->t + 9*(1+2*siy))+6)[1])
- (((sctx->t + 9*(0+2*siy))+6)[1])) + (((sctx->t + 9*(
0+2*siy))+6)[1])), ((Txm)+6)[2] = ((((coords[1])))*((((sctx->
t + 9*(1+2*siy))+6)[2]) - (((sctx->t + 9*(0+2*siy))+6)[2])
) + (((sctx->t + 9*(0+2*siy))+6)[2]))))
;
562 ELL_3V_LERP(gxm, coords[1], sctx->grad + 3*(0+2*siy),((gxm)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*siy))[0]
) - ((sctx->grad + 3*(0+2*siy))[0])) + ((sctx->grad + 3
*(0+2*siy))[0])), (gxm)[1] = (((coords[1]))*(((sctx->grad +
3*(1+2*siy))[1]) - ((sctx->grad + 3*(0+2*siy))[1])) + ((sctx
->grad + 3*(0+2*siy))[1])), (gxm)[2] = (((coords[1]))*(((sctx
->grad + 3*(1+2*siy))[2]) - ((sctx->grad + 3*(0+2*siy))
[2])) + ((sctx->grad + 3*(0+2*siy))[2])))
563 sctx->grad + 3*(1+2*siy))((gxm)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*siy))[0]
) - ((sctx->grad + 3*(0+2*siy))[0])) + ((sctx->grad + 3
*(0+2*siy))[0])), (gxm)[1] = (((coords[1]))*(((sctx->grad +
3*(1+2*siy))[1]) - ((sctx->grad + 3*(0+2*siy))[1])) + ((sctx
->grad + 3*(0+2*siy))[1])), (gxm)[2] = (((coords[1]))*(((sctx
->grad + 3*(1+2*siy))[2]) - ((sctx->grad + 3*(0+2*siy))
[2])) + ((sctx->grad + 3*(0+2*siy))[2])))
;
564 ELL_3M_LERP(Txp, coords[1], sctx->t + 9*(0+2*sixy),((((Txp)+0)[0] = ((((coords[1])))*((((sctx->t + 9*(1+2*sixy
))+0)[0]) - (((sctx->t + 9*(0+2*sixy))+0)[0])) + (((sctx->
t + 9*(0+2*sixy))+0)[0])), ((Txp)+0)[1] = ((((coords[1])))*((
((sctx->t + 9*(1+2*sixy))+0)[1]) - (((sctx->t + 9*(0+2*
sixy))+0)[1])) + (((sctx->t + 9*(0+2*sixy))+0)[1])), ((Txp
)+0)[2] = ((((coords[1])))*((((sctx->t + 9*(1+2*sixy))+0)[
2]) - (((sctx->t + 9*(0+2*sixy))+0)[2])) + (((sctx->t +
9*(0+2*sixy))+0)[2]))), (((Txp)+3)[0] = ((((coords[1])))*(((
(sctx->t + 9*(1+2*sixy))+3)[0]) - (((sctx->t + 9*(0+2*sixy
))+3)[0])) + (((sctx->t + 9*(0+2*sixy))+3)[0])), ((Txp)+3)
[1] = ((((coords[1])))*((((sctx->t + 9*(1+2*sixy))+3)[1]) -
(((sctx->t + 9*(0+2*sixy))+3)[1])) + (((sctx->t + 9*(0
+2*sixy))+3)[1])), ((Txp)+3)[2] = ((((coords[1])))*((((sctx->
t + 9*(1+2*sixy))+3)[2]) - (((sctx->t + 9*(0+2*sixy))+3)[2
])) + (((sctx->t + 9*(0+2*sixy))+3)[2]))), (((Txp)+6)[0] =
((((coords[1])))*((((sctx->t + 9*(1+2*sixy))+6)[0]) - (((
sctx->t + 9*(0+2*sixy))+6)[0])) + (((sctx->t + 9*(0+2*sixy
))+6)[0])), ((Txp)+6)[1] = ((((coords[1])))*((((sctx->t + 9
*(1+2*sixy))+6)[1]) - (((sctx->t + 9*(0+2*sixy))+6)[1])) +
(((sctx->t + 9*(0+2*sixy))+6)[1])), ((Txp)+6)[2] = ((((coords
[1])))*((((sctx->t + 9*(1+2*sixy))+6)[2]) - (((sctx->t +
9*(0+2*sixy))+6)[2])) + (((sctx->t + 9*(0+2*sixy))+6)[2])
)))
565 sctx->t + 9*(1+2*sixy))((((Txp)+0)[0] = ((((coords[1])))*((((sctx->t + 9*(1+2*sixy
))+0)[0]) - (((sctx->t + 9*(0+2*sixy))+0)[0])) + (((sctx->
t + 9*(0+2*sixy))+0)[0])), ((Txp)+0)[1] = ((((coords[1])))*((
((sctx->t + 9*(1+2*sixy))+0)[1]) - (((sctx->t + 9*(0+2*
sixy))+0)[1])) + (((sctx->t + 9*(0+2*sixy))+0)[1])), ((Txp
)+0)[2] = ((((coords[1])))*((((sctx->t + 9*(1+2*sixy))+0)[
2]) - (((sctx->t + 9*(0+2*sixy))+0)[2])) + (((sctx->t +
9*(0+2*sixy))+0)[2]))), (((Txp)+3)[0] = ((((coords[1])))*(((
(sctx->t + 9*(1+2*sixy))+3)[0]) - (((sctx->t + 9*(0+2*sixy
))+3)[0])) + (((sctx->t + 9*(0+2*sixy))+3)[0])), ((Txp)+3)
[1] = ((((coords[1])))*((((sctx->t + 9*(1+2*sixy))+3)[1]) -
(((sctx->t + 9*(0+2*sixy))+3)[1])) + (((sctx->t + 9*(0
+2*sixy))+3)[1])), ((Txp)+3)[2] = ((((coords[1])))*((((sctx->
t + 9*(1+2*sixy))+3)[2]) - (((sctx->t + 9*(0+2*sixy))+3)[2
])) + (((sctx->t + 9*(0+2*sixy))+3)[2]))), (((Txp)+6)[0] =
((((coords[1])))*((((sctx->t + 9*(1+2*sixy))+6)[0]) - (((
sctx->t + 9*(0+2*sixy))+6)[0])) + (((sctx->t + 9*(0+2*sixy
))+6)[0])), ((Txp)+6)[1] = ((((coords[1])))*((((sctx->t + 9
*(1+2*sixy))+6)[1]) - (((sctx->t + 9*(0+2*sixy))+6)[1])) +
(((sctx->t + 9*(0+2*sixy))+6)[1])), ((Txp)+6)[2] = ((((coords
[1])))*((((sctx->t + 9*(1+2*sixy))+6)[2]) - (((sctx->t +
9*(0+2*sixy))+6)[2])) + (((sctx->t + 9*(0+2*sixy))+6)[2])
)))
;
566 ELL_3V_LERP(gxp, coords[1], sctx->grad + 3*(0+2*sixy),((gxp)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*sixy))[0
]) - ((sctx->grad + 3*(0+2*sixy))[0])) + ((sctx->grad +
3*(0+2*sixy))[0])), (gxp)[1] = (((coords[1]))*(((sctx->grad
+ 3*(1+2*sixy))[1]) - ((sctx->grad + 3*(0+2*sixy))[1])) +
((sctx->grad + 3*(0+2*sixy))[1])), (gxp)[2] = (((coords[1
]))*(((sctx->grad + 3*(1+2*sixy))[2]) - ((sctx->grad + 3
*(0+2*sixy))[2])) + ((sctx->grad + 3*(0+2*sixy))[2])))
567 sctx->grad + 3*(1+2*sixy))((gxp)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*sixy))[0
]) - ((sctx->grad + 3*(0+2*sixy))[0])) + ((sctx->grad +
3*(0+2*sixy))[0])), (gxp)[1] = (((coords[1]))*(((sctx->grad
+ 3*(1+2*sixy))[1]) - ((sctx->grad + 3*(0+2*sixy))[1])) +
((sctx->grad + 3*(0+2*sixy))[1])), (gxp)[2] = (((coords[1
]))*(((sctx->grad + 3*(1+2*sixy))[2]) - ((sctx->grad + 3
*(0+2*sixy))[2])) + ((sctx->grad + 3*(0+2*sixy))[2])))
;
568 ELL_3M_LERP(Typ, coords[0], Txm, Txp)((((Typ)+0)[0] = ((((coords[0])))*((((Txp)+0)[0]) - (((Txm)+0
)[0])) + (((Txm)+0)[0])), ((Typ)+0)[1] = ((((coords[0])))*(((
(Txp)+0)[1]) - (((Txm)+0)[1])) + (((Txm)+0)[1])), ((Typ)+0)[2
] = ((((coords[0])))*((((Txp)+0)[2]) - (((Txm)+0)[2])) + (((Txm
)+0)[2]))), (((Typ)+3)[0] = ((((coords[0])))*((((Txp)+3)[0]) -
(((Txm)+3)[0])) + (((Txm)+3)[0])), ((Typ)+3)[1] = ((((coords
[0])))*((((Txp)+3)[1]) - (((Txm)+3)[1])) + (((Txm)+3)[1])), (
(Typ)+3)[2] = ((((coords[0])))*((((Txp)+3)[2]) - (((Txm)+3)[2
])) + (((Txm)+3)[2]))), (((Typ)+6)[0] = ((((coords[0])))*((((
Txp)+6)[0]) - (((Txm)+6)[0])) + (((Txm)+6)[0])), ((Typ)+6)[1]
= ((((coords[0])))*((((Txp)+6)[1]) - (((Txm)+6)[1])) + (((Txm
)+6)[1])), ((Typ)+6)[2] = ((((coords[0])))*((((Txp)+6)[2]) - (
((Txm)+6)[2])) + (((Txm)+6)[2]))))
;
569 ELL_3V_LERP(gyp, coords[0], gxm, gxp)((gyp)[0] = (((coords[0]))*(((gxp)[0]) - ((gxm)[0])) + ((gxm)
[0])), (gyp)[1] = (((coords[0]))*(((gxp)[1]) - ((gxm)[1])) + (
(gxm)[1])), (gyp)[2] = (((coords[0]))*(((gxp)[2]) - ((gxm)[2]
)) + ((gxm)[2])))
;
570 } else {
571 ELL_3M_LERP(Txm, coords[1], sctx->t + 9*(0+2*siY), sctx->t + 9*(1+2*siY))((((Txm)+0)[0] = ((((coords[1])))*((((sctx->t + 9*(1+2*siY
))+0)[0]) - (((sctx->t + 9*(0+2*siY))+0)[0])) + (((sctx->
t + 9*(0+2*siY))+0)[0])), ((Txm)+0)[1] = ((((coords[1])))*(((
(sctx->t + 9*(1+2*siY))+0)[1]) - (((sctx->t + 9*(0+2*siY
))+0)[1])) + (((sctx->t + 9*(0+2*siY))+0)[1])), ((Txm)+0)[
2] = ((((coords[1])))*((((sctx->t + 9*(1+2*siY))+0)[2]) - (
((sctx->t + 9*(0+2*siY))+0)[2])) + (((sctx->t + 9*(0+2*
siY))+0)[2]))), (((Txm)+3)[0] = ((((coords[1])))*((((sctx->
t + 9*(1+2*siY))+3)[0]) - (((sctx->t + 9*(0+2*siY))+3)[0])
) + (((sctx->t + 9*(0+2*siY))+3)[0])), ((Txm)+3)[1] = ((((
coords[1])))*((((sctx->t + 9*(1+2*siY))+3)[1]) - (((sctx->
t + 9*(0+2*siY))+3)[1])) + (((sctx->t + 9*(0+2*siY))+3)[1]
)), ((Txm)+3)[2] = ((((coords[1])))*((((sctx->t + 9*(1+2*siY
))+3)[2]) - (((sctx->t + 9*(0+2*siY))+3)[2])) + (((sctx->
t + 9*(0+2*siY))+3)[2]))), (((Txm)+6)[0] = ((((coords[1])))*(
(((sctx->t + 9*(1+2*siY))+6)[0]) - (((sctx->t + 9*(0+2*
siY))+6)[0])) + (((sctx->t + 9*(0+2*siY))+6)[0])), ((Txm)+
6)[1] = ((((coords[1])))*((((sctx->t + 9*(1+2*siY))+6)[1])
- (((sctx->t + 9*(0+2*siY))+6)[1])) + (((sctx->t + 9*(
0+2*siY))+6)[1])), ((Txm)+6)[2] = ((((coords[1])))*((((sctx->
t + 9*(1+2*siY))+6)[2]) - (((sctx->t + 9*(0+2*siY))+6)[2])
) + (((sctx->t + 9*(0+2*siY))+6)[2]))))
;
572 ELL_3V_LERP(gxm, coords[1], sctx->grad + 3*(0+2*siY),((gxm)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*siY))[0]
) - ((sctx->grad + 3*(0+2*siY))[0])) + ((sctx->grad + 3
*(0+2*siY))[0])), (gxm)[1] = (((coords[1]))*(((sctx->grad +
3*(1+2*siY))[1]) - ((sctx->grad + 3*(0+2*siY))[1])) + ((sctx
->grad + 3*(0+2*siY))[1])), (gxm)[2] = (((coords[1]))*(((sctx
->grad + 3*(1+2*siY))[2]) - ((sctx->grad + 3*(0+2*siY))
[2])) + ((sctx->grad + 3*(0+2*siY))[2])))
573 sctx->grad + 3*(1+2*siY))((gxm)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*siY))[0]
) - ((sctx->grad + 3*(0+2*siY))[0])) + ((sctx->grad + 3
*(0+2*siY))[0])), (gxm)[1] = (((coords[1]))*(((sctx->grad +
3*(1+2*siY))[1]) - ((sctx->grad + 3*(0+2*siY))[1])) + ((sctx
->grad + 3*(0+2*siY))[1])), (gxm)[2] = (((coords[1]))*(((sctx
->grad + 3*(1+2*siY))[2]) - ((sctx->grad + 3*(0+2*siY))
[2])) + ((sctx->grad + 3*(0+2*siY))[2])))
;
574 ELL_3M_LERP(Txp, coords[1], sctx->t + 9*(0+2*sixY),((((Txp)+0)[0] = ((((coords[1])))*((((sctx->t + 9*(1+2*sixY
))+0)[0]) - (((sctx->t + 9*(0+2*sixY))+0)[0])) + (((sctx->
t + 9*(0+2*sixY))+0)[0])), ((Txp)+0)[1] = ((((coords[1])))*((
((sctx->t + 9*(1+2*sixY))+0)[1]) - (((sctx->t + 9*(0+2*
sixY))+0)[1])) + (((sctx->t + 9*(0+2*sixY))+0)[1])), ((Txp
)+0)[2] = ((((coords[1])))*((((sctx->t + 9*(1+2*sixY))+0)[
2]) - (((sctx->t + 9*(0+2*sixY))+0)[2])) + (((sctx->t +
9*(0+2*sixY))+0)[2]))), (((Txp)+3)[0] = ((((coords[1])))*(((
(sctx->t + 9*(1+2*sixY))+3)[0]) - (((sctx->t + 9*(0+2*sixY
))+3)[0])) + (((sctx->t + 9*(0+2*sixY))+3)[0])), ((Txp)+3)
[1] = ((((coords[1])))*((((sctx->t + 9*(1+2*sixY))+3)[1]) -
(((sctx->t + 9*(0+2*sixY))+3)[1])) + (((sctx->t + 9*(0
+2*sixY))+3)[1])), ((Txp)+3)[2] = ((((coords[1])))*((((sctx->
t + 9*(1+2*sixY))+3)[2]) - (((sctx->t + 9*(0+2*sixY))+3)[2
])) + (((sctx->t + 9*(0+2*sixY))+3)[2]))), (((Txp)+6)[0] =
((((coords[1])))*((((sctx->t + 9*(1+2*sixY))+6)[0]) - (((
sctx->t + 9*(0+2*sixY))+6)[0])) + (((sctx->t + 9*(0+2*sixY
))+6)[0])), ((Txp)+6)[1] = ((((coords[1])))*((((sctx->t + 9
*(1+2*sixY))+6)[1]) - (((sctx->t + 9*(0+2*sixY))+6)[1])) +
(((sctx->t + 9*(0+2*sixY))+6)[1])), ((Txp)+6)[2] = ((((coords
[1])))*((((sctx->t + 9*(1+2*sixY))+6)[2]) - (((sctx->t +
9*(0+2*sixY))+6)[2])) + (((sctx->t + 9*(0+2*sixY))+6)[2])
)))
575 sctx->t + 9*(1+2*sixY))((((Txp)+0)[0] = ((((coords[1])))*((((sctx->t + 9*(1+2*sixY
))+0)[0]) - (((sctx->t + 9*(0+2*sixY))+0)[0])) + (((sctx->
t + 9*(0+2*sixY))+0)[0])), ((Txp)+0)[1] = ((((coords[1])))*((
((sctx->t + 9*(1+2*sixY))+0)[1]) - (((sctx->t + 9*(0+2*
sixY))+0)[1])) + (((sctx->t + 9*(0+2*sixY))+0)[1])), ((Txp
)+0)[2] = ((((coords[1])))*((((sctx->t + 9*(1+2*sixY))+0)[
2]) - (((sctx->t + 9*(0+2*sixY))+0)[2])) + (((sctx->t +
9*(0+2*sixY))+0)[2]))), (((Txp)+3)[0] = ((((coords[1])))*(((
(sctx->t + 9*(1+2*sixY))+3)[0]) - (((sctx->t + 9*(0+2*sixY
))+3)[0])) + (((sctx->t + 9*(0+2*sixY))+3)[0])), ((Txp)+3)
[1] = ((((coords[1])))*((((sctx->t + 9*(1+2*sixY))+3)[1]) -
(((sctx->t + 9*(0+2*sixY))+3)[1])) + (((sctx->t + 9*(0
+2*sixY))+3)[1])), ((Txp)+3)[2] = ((((coords[1])))*((((sctx->
t + 9*(1+2*sixY))+3)[2]) - (((sctx->t + 9*(0+2*sixY))+3)[2
])) + (((sctx->t + 9*(0+2*sixY))+3)[2]))), (((Txp)+6)[0] =
((((coords[1])))*((((sctx->t + 9*(1+2*sixY))+6)[0]) - (((
sctx->t + 9*(0+2*sixY))+6)[0])) + (((sctx->t + 9*(0+2*sixY
))+6)[0])), ((Txp)+6)[1] = ((((coords[1])))*((((sctx->t + 9
*(1+2*sixY))+6)[1]) - (((sctx->t + 9*(0+2*sixY))+6)[1])) +
(((sctx->t + 9*(0+2*sixY))+6)[1])), ((Txp)+6)[2] = ((((coords
[1])))*((((sctx->t + 9*(1+2*sixY))+6)[2]) - (((sctx->t +
9*(0+2*sixY))+6)[2])) + (((sctx->t + 9*(0+2*sixY))+6)[2])
)))
;
576 ELL_3V_LERP(gxp, coords[1], sctx->grad + 3*(0+2*sixY),((gxp)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*sixY))[0
]) - ((sctx->grad + 3*(0+2*sixY))[0])) + ((sctx->grad +
3*(0+2*sixY))[0])), (gxp)[1] = (((coords[1]))*(((sctx->grad
+ 3*(1+2*sixY))[1]) - ((sctx->grad + 3*(0+2*sixY))[1])) +
((sctx->grad + 3*(0+2*sixY))[1])), (gxp)[2] = (((coords[1
]))*(((sctx->grad + 3*(1+2*sixY))[2]) - ((sctx->grad + 3
*(0+2*sixY))[2])) + ((sctx->grad + 3*(0+2*sixY))[2])))
577 sctx->grad + 3*(1+2*sixY))((gxp)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*sixY))[0
]) - ((sctx->grad + 3*(0+2*sixY))[0])) + ((sctx->grad +
3*(0+2*sixY))[0])), (gxp)[1] = (((coords[1]))*(((sctx->grad
+ 3*(1+2*sixY))[1]) - ((sctx->grad + 3*(0+2*sixY))[1])) +
((sctx->grad + 3*(0+2*sixY))[1])), (gxp)[2] = (((coords[1
]))*(((sctx->grad + 3*(1+2*sixY))[2]) - ((sctx->grad + 3
*(0+2*sixY))[2])) + ((sctx->grad + 3*(0+2*sixY))[2])))
;
578 ELL_3M_LERP(Tym, coords[0], Txm, Txp)((((Tym)+0)[0] = ((((coords[0])))*((((Txp)+0)[0]) - (((Txm)+0
)[0])) + (((Txm)+0)[0])), ((Tym)+0)[1] = ((((coords[0])))*(((
(Txp)+0)[1]) - (((Txm)+0)[1])) + (((Txm)+0)[1])), ((Tym)+0)[2
] = ((((coords[0])))*((((Txp)+0)[2]) - (((Txm)+0)[2])) + (((Txm
)+0)[2]))), (((Tym)+3)[0] = ((((coords[0])))*((((Txp)+3)[0]) -
(((Txm)+3)[0])) + (((Txm)+3)[0])), ((Tym)+3)[1] = ((((coords
[0])))*((((Txp)+3)[1]) - (((Txm)+3)[1])) + (((Txm)+3)[1])), (
(Tym)+3)[2] = ((((coords[0])))*((((Txp)+3)[2]) - (((Txm)+3)[2
])) + (((Txm)+3)[2]))), (((Tym)+6)[0] = ((((coords[0])))*((((
Txp)+6)[0]) - (((Txm)+6)[0])) + (((Txm)+6)[0])), ((Tym)+6)[1]
= ((((coords[0])))*((((Txp)+6)[1]) - (((Txm)+6)[1])) + (((Txm
)+6)[1])), ((Tym)+6)[2] = ((((coords[0])))*((((Txp)+6)[2]) - (
((Txm)+6)[2])) + (((Txm)+6)[2]))))
;
579 ELL_3V_LERP(gym, coords[0], gxm, gxp)((gym)[0] = (((coords[0]))*(((gxp)[0]) - ((gxm)[0])) + ((gxm)
[0])), (gym)[1] = (((coords[0]))*(((gxp)[1]) - ((gxm)[1])) + (
(gxm)[1])), (gym)[2] = (((coords[0]))*(((gxp)[2]) - ((gxm)[2]
)) + ((gxm)[2])))
;
580 }
581 /* now, compute remaining points */
582 ELL_3M_LERP(Txm, coords[1], sctx->t + 9*(0+2*si), sctx->t + 9*(1+2*si))((((Txm)+0)[0] = ((((coords[1])))*((((sctx->t + 9*(1+2*si)
)+0)[0]) - (((sctx->t + 9*(0+2*si))+0)[0])) + (((sctx->
t + 9*(0+2*si))+0)[0])), ((Txm)+0)[1] = ((((coords[1])))*((((
sctx->t + 9*(1+2*si))+0)[1]) - (((sctx->t + 9*(0+2*si))
+0)[1])) + (((sctx->t + 9*(0+2*si))+0)[1])), ((Txm)+0)[2] =
((((coords[1])))*((((sctx->t + 9*(1+2*si))+0)[2]) - (((sctx
->t + 9*(0+2*si))+0)[2])) + (((sctx->t + 9*(0+2*si))+0)
[2]))), (((Txm)+3)[0] = ((((coords[1])))*((((sctx->t + 9*(
1+2*si))+3)[0]) - (((sctx->t + 9*(0+2*si))+3)[0])) + (((sctx
->t + 9*(0+2*si))+3)[0])), ((Txm)+3)[1] = ((((coords[1])))
*((((sctx->t + 9*(1+2*si))+3)[1]) - (((sctx->t + 9*(0+2
*si))+3)[1])) + (((sctx->t + 9*(0+2*si))+3)[1])), ((Txm)+3
)[2] = ((((coords[1])))*((((sctx->t + 9*(1+2*si))+3)[2]) -
(((sctx->t + 9*(0+2*si))+3)[2])) + (((sctx->t + 9*(0+2
*si))+3)[2]))), (((Txm)+6)[0] = ((((coords[1])))*((((sctx->
t + 9*(1+2*si))+6)[0]) - (((sctx->t + 9*(0+2*si))+6)[0])) +
(((sctx->t + 9*(0+2*si))+6)[0])), ((Txm)+6)[1] = ((((coords
[1])))*((((sctx->t + 9*(1+2*si))+6)[1]) - (((sctx->t + 9
*(0+2*si))+6)[1])) + (((sctx->t + 9*(0+2*si))+6)[1])), ((Txm
)+6)[2] = ((((coords[1])))*((((sctx->t + 9*(1+2*si))+6)[2]
) - (((sctx->t + 9*(0+2*si))+6)[2])) + (((sctx->t + 9*(
0+2*si))+6)[2]))))
;
583 ELL_3V_LERP(gxm, coords[1], sctx->grad + 3*(0+2*si),((gxm)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*si))[0])
- ((sctx->grad + 3*(0+2*si))[0])) + ((sctx->grad + 3*(
0+2*si))[0])), (gxm)[1] = (((coords[1]))*(((sctx->grad + 3
*(1+2*si))[1]) - ((sctx->grad + 3*(0+2*si))[1])) + ((sctx->
grad + 3*(0+2*si))[1])), (gxm)[2] = (((coords[1]))*(((sctx->
grad + 3*(1+2*si))[2]) - ((sctx->grad + 3*(0+2*si))[2])) +
((sctx->grad + 3*(0+2*si))[2])))
584 sctx->grad + 3*(1+2*si))((gxm)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*si))[0])
- ((sctx->grad + 3*(0+2*si))[0])) + ((sctx->grad + 3*(
0+2*si))[0])), (gxm)[1] = (((coords[1]))*(((sctx->grad + 3
*(1+2*si))[1]) - ((sctx->grad + 3*(0+2*si))[1])) + ((sctx->
grad + 3*(0+2*si))[1])), (gxm)[2] = (((coords[1]))*(((sctx->
grad + 3*(1+2*si))[2]) - ((sctx->grad + 3*(0+2*si))[2])) +
((sctx->grad + 3*(0+2*si))[2])))
;
585 ELL_3M_LERP(Txp, coords[1], sctx->t + 9*(0+2*six), sctx->t + 9*(1+2*six))((((Txp)+0)[0] = ((((coords[1])))*((((sctx->t + 9*(1+2*six
))+0)[0]) - (((sctx->t + 9*(0+2*six))+0)[0])) + (((sctx->
t + 9*(0+2*six))+0)[0])), ((Txp)+0)[1] = ((((coords[1])))*(((
(sctx->t + 9*(1+2*six))+0)[1]) - (((sctx->t + 9*(0+2*six
))+0)[1])) + (((sctx->t + 9*(0+2*six))+0)[1])), ((Txp)+0)[
2] = ((((coords[1])))*((((sctx->t + 9*(1+2*six))+0)[2]) - (
((sctx->t + 9*(0+2*six))+0)[2])) + (((sctx->t + 9*(0+2*
six))+0)[2]))), (((Txp)+3)[0] = ((((coords[1])))*((((sctx->
t + 9*(1+2*six))+3)[0]) - (((sctx->t + 9*(0+2*six))+3)[0])
) + (((sctx->t + 9*(0+2*six))+3)[0])), ((Txp)+3)[1] = ((((
coords[1])))*((((sctx->t + 9*(1+2*six))+3)[1]) - (((sctx->
t + 9*(0+2*six))+3)[1])) + (((sctx->t + 9*(0+2*six))+3)[1]
)), ((Txp)+3)[2] = ((((coords[1])))*((((sctx->t + 9*(1+2*six
))+3)[2]) - (((sctx->t + 9*(0+2*six))+3)[2])) + (((sctx->
t + 9*(0+2*six))+3)[2]))), (((Txp)+6)[0] = ((((coords[1])))*(
(((sctx->t + 9*(1+2*six))+6)[0]) - (((sctx->t + 9*(0+2*
six))+6)[0])) + (((sctx->t + 9*(0+2*six))+6)[0])), ((Txp)+
6)[1] = ((((coords[1])))*((((sctx->t + 9*(1+2*six))+6)[1])
- (((sctx->t + 9*(0+2*six))+6)[1])) + (((sctx->t + 9*(
0+2*six))+6)[1])), ((Txp)+6)[2] = ((((coords[1])))*((((sctx->
t + 9*(1+2*six))+6)[2]) - (((sctx->t + 9*(0+2*six))+6)[2])
) + (((sctx->t + 9*(0+2*six))+6)[2]))))
;
586 ELL_3V_LERP(gxp, coords[1], sctx->grad + 3*(0+2*six),((gxp)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*six))[0]
) - ((sctx->grad + 3*(0+2*six))[0])) + ((sctx->grad + 3
*(0+2*six))[0])), (gxp)[1] = (((coords[1]))*(((sctx->grad +
3*(1+2*six))[1]) - ((sctx->grad + 3*(0+2*six))[1])) + ((sctx
->grad + 3*(0+2*six))[1])), (gxp)[2] = (((coords[1]))*(((sctx
->grad + 3*(1+2*six))[2]) - ((sctx->grad + 3*(0+2*six))
[2])) + ((sctx->grad + 3*(0+2*six))[2])))
587 sctx->grad + 3*(1+2*six))((gxp)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*six))[0]
) - ((sctx->grad + 3*(0+2*six))[0])) + ((sctx->grad + 3
*(0+2*six))[0])), (gxp)[1] = (((coords[1]))*(((sctx->grad +
3*(1+2*six))[1]) - ((sctx->grad + 3*(0+2*six))[1])) + ((sctx
->grad + 3*(0+2*six))[1])), (gxp)[2] = (((coords[1]))*(((sctx
->grad + 3*(1+2*six))[2]) - ((sctx->grad + 3*(0+2*six))
[2])) + ((sctx->grad + 3*(0+2*six))[2])))
;
588
589 ELL_3M_LERP(Tzm, coords[0], sctx->t + 9*(0+2*si), sctx->t + 9*(0+2*six))((((Tzm)+0)[0] = ((((coords[0])))*((((sctx->t + 9*(0+2*six
))+0)[0]) - (((sctx->t + 9*(0+2*si))+0)[0])) + (((sctx->
t + 9*(0+2*si))+0)[0])), ((Tzm)+0)[1] = ((((coords[0])))*((((
sctx->t + 9*(0+2*six))+0)[1]) - (((sctx->t + 9*(0+2*si)
)+0)[1])) + (((sctx->t + 9*(0+2*si))+0)[1])), ((Tzm)+0)[2]
= ((((coords[0])))*((((sctx->t + 9*(0+2*six))+0)[2]) - ((
(sctx->t + 9*(0+2*si))+0)[2])) + (((sctx->t + 9*(0+2*si
))+0)[2]))), (((Tzm)+3)[0] = ((((coords[0])))*((((sctx->t +
9*(0+2*six))+3)[0]) - (((sctx->t + 9*(0+2*si))+3)[0])) + (
((sctx->t + 9*(0+2*si))+3)[0])), ((Tzm)+3)[1] = ((((coords
[0])))*((((sctx->t + 9*(0+2*six))+3)[1]) - (((sctx->t +
9*(0+2*si))+3)[1])) + (((sctx->t + 9*(0+2*si))+3)[1])), (
(Tzm)+3)[2] = ((((coords[0])))*((((sctx->t + 9*(0+2*six))+
3)[2]) - (((sctx->t + 9*(0+2*si))+3)[2])) + (((sctx->t +
9*(0+2*si))+3)[2]))), (((Tzm)+6)[0] = ((((coords[0])))*((((sctx
->t + 9*(0+2*six))+6)[0]) - (((sctx->t + 9*(0+2*si))+6)
[0])) + (((sctx->t + 9*(0+2*si))+6)[0])), ((Tzm)+6)[1] = (
(((coords[0])))*((((sctx->t + 9*(0+2*six))+6)[1]) - (((sctx
->t + 9*(0+2*si))+6)[1])) + (((sctx->t + 9*(0+2*si))+6)
[1])), ((Tzm)+6)[2] = ((((coords[0])))*((((sctx->t + 9*(0+
2*six))+6)[2]) - (((sctx->t + 9*(0+2*si))+6)[2])) + (((sctx
->t + 9*(0+2*si))+6)[2]))))
;
590 ELL_3V_LERP(gzm, coords[0], sctx->grad + 3*(0+2*si),((gzm)[0] = (((coords[0]))*(((sctx->grad + 3*(0+2*six))[0]
) - ((sctx->grad + 3*(0+2*si))[0])) + ((sctx->grad + 3*
(0+2*si))[0])), (gzm)[1] = (((coords[0]))*(((sctx->grad + 3
*(0+2*six))[1]) - ((sctx->grad + 3*(0+2*si))[1])) + ((sctx
->grad + 3*(0+2*si))[1])), (gzm)[2] = (((coords[0]))*(((sctx
->grad + 3*(0+2*six))[2]) - ((sctx->grad + 3*(0+2*si))[
2])) + ((sctx->grad + 3*(0+2*si))[2])))
591 sctx->grad + 3*(0+2*six))((gzm)[0] = (((coords[0]))*(((sctx->grad + 3*(0+2*six))[0]
) - ((sctx->grad + 3*(0+2*si))[0])) + ((sctx->grad + 3*
(0+2*si))[0])), (gzm)[1] = (((coords[0]))*(((sctx->grad + 3
*(0+2*six))[1]) - ((sctx->grad + 3*(0+2*si))[1])) + ((sctx
->grad + 3*(0+2*si))[1])), (gzm)[2] = (((coords[0]))*(((sctx
->grad + 3*(0+2*six))[2]) - ((sctx->grad + 3*(0+2*si))[
2])) + ((sctx->grad + 3*(0+2*si))[2])))
;
592 ELL_3M_LERP(Tzp, coords[0], sctx->t + 9*(1+2*si), sctx->t + 9*(1+2*six))((((Tzp)+0)[0] = ((((coords[0])))*((((sctx->t + 9*(1+2*six
))+0)[0]) - (((sctx->t + 9*(1+2*si))+0)[0])) + (((sctx->
t + 9*(1+2*si))+0)[0])), ((Tzp)+0)[1] = ((((coords[0])))*((((
sctx->t + 9*(1+2*six))+0)[1]) - (((sctx->t + 9*(1+2*si)
)+0)[1])) + (((sctx->t + 9*(1+2*si))+0)[1])), ((Tzp)+0)[2]
= ((((coords[0])))*((((sctx->t + 9*(1+2*six))+0)[2]) - ((
(sctx->t + 9*(1+2*si))+0)[2])) + (((sctx->t + 9*(1+2*si
))+0)[2]))), (((Tzp)+3)[0] = ((((coords[0])))*((((sctx->t +
9*(1+2*six))+3)[0]) - (((sctx->t + 9*(1+2*si))+3)[0])) + (
((sctx->t + 9*(1+2*si))+3)[0])), ((Tzp)+3)[1] = ((((coords
[0])))*((((sctx->t + 9*(1+2*six))+3)[1]) - (((sctx->t +
9*(1+2*si))+3)[1])) + (((sctx->t + 9*(1+2*si))+3)[1])), (
(Tzp)+3)[2] = ((((coords[0])))*((((sctx->t + 9*(1+2*six))+
3)[2]) - (((sctx->t + 9*(1+2*si))+3)[2])) + (((sctx->t +
9*(1+2*si))+3)[2]))), (((Tzp)+6)[0] = ((((coords[0])))*((((sctx
->t + 9*(1+2*six))+6)[0]) - (((sctx->t + 9*(1+2*si))+6)
[0])) + (((sctx->t + 9*(1+2*si))+6)[0])), ((Tzp)+6)[1] = (
(((coords[0])))*((((sctx->t + 9*(1+2*six))+6)[1]) - (((sctx
->t + 9*(1+2*si))+6)[1])) + (((sctx->t + 9*(1+2*si))+6)
[1])), ((Tzp)+6)[2] = ((((coords[0])))*((((sctx->t + 9*(1+
2*six))+6)[2]) - (((sctx->t + 9*(1+2*si))+6)[2])) + (((sctx
->t + 9*(1+2*si))+6)[2]))))
;
593 ELL_3V_LERP(gzp, coords[0], sctx->grad + 3*(1+2*si),((gzp)[0] = (((coords[0]))*(((sctx->grad + 3*(1+2*six))[0]
) - ((sctx->grad + 3*(1+2*si))[0])) + ((sctx->grad + 3*
(1+2*si))[0])), (gzp)[1] = (((coords[0]))*(((sctx->grad + 3
*(1+2*six))[1]) - ((sctx->grad + 3*(1+2*si))[1])) + ((sctx
->grad + 3*(1+2*si))[1])), (gzp)[2] = (((coords[0]))*(((sctx
->grad + 3*(1+2*six))[2]) - ((sctx->grad + 3*(1+2*si))[
2])) + ((sctx->grad + 3*(1+2*si))[2])))
594 sctx->grad + 3*(1+2*six))((gzp)[0] = (((coords[0]))*(((sctx->grad + 3*(1+2*six))[0]
) - ((sctx->grad + 3*(1+2*si))[0])) + ((sctx->grad + 3*
(1+2*si))[0])), (gzp)[1] = (((coords[0]))*(((sctx->grad + 3
*(1+2*six))[1]) - ((sctx->grad + 3*(1+2*si))[1])) + ((sctx
->grad + 3*(1+2*si))[1])), (gzp)[2] = (((coords[0]))*(((sctx
->grad + 3*(1+2*six))[2]) - ((sctx->grad + 3*(1+2*si))[
2])) + ((sctx->grad + 3*(1+2*si))[2])))
;
595
596 ELL_3M_LERP(T, coords[0], Txm, Txp)((((T)+0)[0] = ((((coords[0])))*((((Txp)+0)[0]) - (((Txm)+0)[
0])) + (((Txm)+0)[0])), ((T)+0)[1] = ((((coords[0])))*((((Txp
)+0)[1]) - (((Txm)+0)[1])) + (((Txm)+0)[1])), ((T)+0)[2] = ((
((coords[0])))*((((Txp)+0)[2]) - (((Txm)+0)[2])) + (((Txm)+0)
[2]))), (((T)+3)[0] = ((((coords[0])))*((((Txp)+3)[0]) - (((Txm
)+3)[0])) + (((Txm)+3)[0])), ((T)+3)[1] = ((((coords[0])))*((
((Txp)+3)[1]) - (((Txm)+3)[1])) + (((Txm)+3)[1])), ((T)+3)[2]
= ((((coords[0])))*((((Txp)+3)[2]) - (((Txm)+3)[2])) + (((Txm
)+3)[2]))), (((T)+6)[0] = ((((coords[0])))*((((Txp)+6)[0]) - (
((Txm)+6)[0])) + (((Txm)+6)[0])), ((T)+6)[1] = ((((coords[0])
))*((((Txp)+6)[1]) - (((Txm)+6)[1])) + (((Txm)+6)[1])), ((T)+
6)[2] = ((((coords[0])))*((((Txp)+6)[2]) - (((Txm)+6)[2])) + (
((Txm)+6)[2]))))
;
597 ELL_3V_LERP(g, coords[0], gxm, gxp)((g)[0] = (((coords[0]))*(((gxp)[0]) - ((gxm)[0])) + ((gxm)[0
])), (g)[1] = (((coords[0]))*(((gxp)[1]) - ((gxm)[1])) + ((gxm
)[1])), (g)[2] = (((coords[0]))*(((gxp)[2]) - ((gxm)[2])) + (
(gxm)[2])))
;
598
599 if (yi!=sy-1) {
600 computeGradientLin(sctx->facenorm+3*(faceid+4*si), T, g,
601 Txm, gxm, Txp, gxp,
602 T, g, Typ, gyp,
603 Tzm, gzm, Tzp, gzp);
604 } else {
605 computeGradientLin(sctx->facenorm+3*(faceid+4*si), T, g,
606 Txm, gxm, Txp, gxp,
607 Tym, gym, T, g,
608 Tzm, gzm, Tzp, gzp);
609 }
610 break;
611 case 2:
612 /* bilinearly interpolate Txp/gxp first */
613 if (xi!=sx-1) {
614 ELL_3M_LERP(Tym, coords[1], sctx->t + 9*(0+2*six), sctx->t + 9*(1+2*six))((((Tym)+0)[0] = ((((coords[1])))*((((sctx->t + 9*(1+2*six
))+0)[0]) - (((sctx->t + 9*(0+2*six))+0)[0])) + (((sctx->
t + 9*(0+2*six))+0)[0])), ((Tym)+0)[1] = ((((coords[1])))*(((
(sctx->t + 9*(1+2*six))+0)[1]) - (((sctx->t + 9*(0+2*six
))+0)[1])) + (((sctx->t + 9*(0+2*six))+0)[1])), ((Tym)+0)[
2] = ((((coords[1])))*((((sctx->t + 9*(1+2*six))+0)[2]) - (
((sctx->t + 9*(0+2*six))+0)[2])) + (((sctx->t + 9*(0+2*
six))+0)[2]))), (((Tym)+3)[0] = ((((coords[1])))*((((sctx->
t + 9*(1+2*six))+3)[0]) - (((sctx->t + 9*(0+2*six))+3)[0])
) + (((sctx->t + 9*(0+2*six))+3)[0])), ((Tym)+3)[1] = ((((
coords[1])))*((((sctx->t + 9*(1+2*six))+3)[1]) - (((sctx->
t + 9*(0+2*six))+3)[1])) + (((sctx->t + 9*(0+2*six))+3)[1]
)), ((Tym)+3)[2] = ((((coords[1])))*((((sctx->t + 9*(1+2*six
))+3)[2]) - (((sctx->t + 9*(0+2*six))+3)[2])) + (((sctx->
t + 9*(0+2*six))+3)[2]))), (((Tym)+6)[0] = ((((coords[1])))*(
(((sctx->t + 9*(1+2*six))+6)[0]) - (((sctx->t + 9*(0+2*
six))+6)[0])) + (((sctx->t + 9*(0+2*six))+6)[0])), ((Tym)+
6)[1] = ((((coords[1])))*((((sctx->t + 9*(1+2*six))+6)[1])
- (((sctx->t + 9*(0+2*six))+6)[1])) + (((sctx->t + 9*(
0+2*six))+6)[1])), ((Tym)+6)[2] = ((((coords[1])))*((((sctx->
t + 9*(1+2*six))+6)[2]) - (((sctx->t + 9*(0+2*six))+6)[2])
) + (((sctx->t + 9*(0+2*six))+6)[2]))))
;
615 ELL_3V_LERP(gym, coords[1], sctx->grad + 3*(0+2*six),((gym)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*six))[0]
) - ((sctx->grad + 3*(0+2*six))[0])) + ((sctx->grad + 3
*(0+2*six))[0])), (gym)[1] = (((coords[1]))*(((sctx->grad +
3*(1+2*six))[1]) - ((sctx->grad + 3*(0+2*six))[1])) + ((sctx
->grad + 3*(0+2*six))[1])), (gym)[2] = (((coords[1]))*(((sctx
->grad + 3*(1+2*six))[2]) - ((sctx->grad + 3*(0+2*six))
[2])) + ((sctx->grad + 3*(0+2*six))[2])))
616 sctx->grad + 3*(1+2*six))((gym)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*six))[0]
) - ((sctx->grad + 3*(0+2*six))[0])) + ((sctx->grad + 3
*(0+2*six))[0])), (gym)[1] = (((coords[1]))*(((sctx->grad +
3*(1+2*six))[1]) - ((sctx->grad + 3*(0+2*six))[1])) + ((sctx
->grad + 3*(0+2*six))[1])), (gym)[2] = (((coords[1]))*(((sctx
->grad + 3*(1+2*six))[2]) - ((sctx->grad + 3*(0+2*six))
[2])) + ((sctx->grad + 3*(0+2*six))[2])))
;
617 ELL_3M_LERP(Typ, coords[1], sctx->t + 9*(0+2*sixy),((((Typ)+0)[0] = ((((coords[1])))*((((sctx->t + 9*(1+2*sixy
))+0)[0]) - (((sctx->t + 9*(0+2*sixy))+0)[0])) + (((sctx->
t + 9*(0+2*sixy))+0)[0])), ((Typ)+0)[1] = ((((coords[1])))*((
((sctx->t + 9*(1+2*sixy))+0)[1]) - (((sctx->t + 9*(0+2*
sixy))+0)[1])) + (((sctx->t + 9*(0+2*sixy))+0)[1])), ((Typ
)+0)[2] = ((((coords[1])))*((((sctx->t + 9*(1+2*sixy))+0)[
2]) - (((sctx->t + 9*(0+2*sixy))+0)[2])) + (((sctx->t +
9*(0+2*sixy))+0)[2]))), (((Typ)+3)[0] = ((((coords[1])))*(((
(sctx->t + 9*(1+2*sixy))+3)[0]) - (((sctx->t + 9*(0+2*sixy
))+3)[0])) + (((sctx->t + 9*(0+2*sixy))+3)[0])), ((Typ)+3)
[1] = ((((coords[1])))*((((sctx->t + 9*(1+2*sixy))+3)[1]) -
(((sctx->t + 9*(0+2*sixy))+3)[1])) + (((sctx->t + 9*(0
+2*sixy))+3)[1])), ((Typ)+3)[2] = ((((coords[1])))*((((sctx->
t + 9*(1+2*sixy))+3)[2]) - (((sctx->t + 9*(0+2*sixy))+3)[2
])) + (((sctx->t + 9*(0+2*sixy))+3)[2]))), (((Typ)+6)[0] =
((((coords[1])))*((((sctx->t + 9*(1+2*sixy))+6)[0]) - (((
sctx->t + 9*(0+2*sixy))+6)[0])) + (((sctx->t + 9*(0+2*sixy
))+6)[0])), ((Typ)+6)[1] = ((((coords[1])))*((((sctx->t + 9
*(1+2*sixy))+6)[1]) - (((sctx->t + 9*(0+2*sixy))+6)[1])) +
(((sctx->t + 9*(0+2*sixy))+6)[1])), ((Typ)+6)[2] = ((((coords
[1])))*((((sctx->t + 9*(1+2*sixy))+6)[2]) - (((sctx->t +
9*(0+2*sixy))+6)[2])) + (((sctx->t + 9*(0+2*sixy))+6)[2])
)))
618 sctx->t + 9*(1+2*sixy))((((Typ)+0)[0] = ((((coords[1])))*((((sctx->t + 9*(1+2*sixy
))+0)[0]) - (((sctx->t + 9*(0+2*sixy))+0)[0])) + (((sctx->
t + 9*(0+2*sixy))+0)[0])), ((Typ)+0)[1] = ((((coords[1])))*((
((sctx->t + 9*(1+2*sixy))+0)[1]) - (((sctx->t + 9*(0+2*
sixy))+0)[1])) + (((sctx->t + 9*(0+2*sixy))+0)[1])), ((Typ
)+0)[2] = ((((coords[1])))*((((sctx->t + 9*(1+2*sixy))+0)[
2]) - (((sctx->t + 9*(0+2*sixy))+0)[2])) + (((sctx->t +
9*(0+2*sixy))+0)[2]))), (((Typ)+3)[0] = ((((coords[1])))*(((
(sctx->t + 9*(1+2*sixy))+3)[0]) - (((sctx->t + 9*(0+2*sixy
))+3)[0])) + (((sctx->t + 9*(0+2*sixy))+3)[0])), ((Typ)+3)
[1] = ((((coords[1])))*((((sctx->t + 9*(1+2*sixy))+3)[1]) -
(((sctx->t + 9*(0+2*sixy))+3)[1])) + (((sctx->t + 9*(0
+2*sixy))+3)[1])), ((Typ)+3)[2] = ((((coords[1])))*((((sctx->
t + 9*(1+2*sixy))+3)[2]) - (((sctx->t + 9*(0+2*sixy))+3)[2
])) + (((sctx->t + 9*(0+2*sixy))+3)[2]))), (((Typ)+6)[0] =
((((coords[1])))*((((sctx->t + 9*(1+2*sixy))+6)[0]) - (((
sctx->t + 9*(0+2*sixy))+6)[0])) + (((sctx->t + 9*(0+2*sixy
))+6)[0])), ((Typ)+6)[1] = ((((coords[1])))*((((sctx->t + 9
*(1+2*sixy))+6)[1]) - (((sctx->t + 9*(0+2*sixy))+6)[1])) +
(((sctx->t + 9*(0+2*sixy))+6)[1])), ((Typ)+6)[2] = ((((coords
[1])))*((((sctx->t + 9*(1+2*sixy))+6)[2]) - (((sctx->t +
9*(0+2*sixy))+6)[2])) + (((sctx->t + 9*(0+2*sixy))+6)[2])
)))
;
619 ELL_3V_LERP(gyp, coords[1], sctx->grad + 3*(0+2*sixy),((gyp)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*sixy))[0
]) - ((sctx->grad + 3*(0+2*sixy))[0])) + ((sctx->grad +
3*(0+2*sixy))[0])), (gyp)[1] = (((coords[1]))*(((sctx->grad
+ 3*(1+2*sixy))[1]) - ((sctx->grad + 3*(0+2*sixy))[1])) +
((sctx->grad + 3*(0+2*sixy))[1])), (gyp)[2] = (((coords[1
]))*(((sctx->grad + 3*(1+2*sixy))[2]) - ((sctx->grad + 3
*(0+2*sixy))[2])) + ((sctx->grad + 3*(0+2*sixy))[2])))
620 sctx->grad + 3*(1+2*sixy))((gyp)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*sixy))[0
]) - ((sctx->grad + 3*(0+2*sixy))[0])) + ((sctx->grad +
3*(0+2*sixy))[0])), (gyp)[1] = (((coords[1]))*(((sctx->grad
+ 3*(1+2*sixy))[1]) - ((sctx->grad + 3*(0+2*sixy))[1])) +
((sctx->grad + 3*(0+2*sixy))[1])), (gyp)[2] = (((coords[1
]))*(((sctx->grad + 3*(1+2*sixy))[2]) - ((sctx->grad + 3
*(0+2*sixy))[2])) + ((sctx->grad + 3*(0+2*sixy))[2])))
;
621 ELL_3M_LERP(Txp, coords[0], Tym, Typ)((((Txp)+0)[0] = ((((coords[0])))*((((Typ)+0)[0]) - (((Tym)+0
)[0])) + (((Tym)+0)[0])), ((Txp)+0)[1] = ((((coords[0])))*(((
(Typ)+0)[1]) - (((Tym)+0)[1])) + (((Tym)+0)[1])), ((Txp)+0)[2
] = ((((coords[0])))*((((Typ)+0)[2]) - (((Tym)+0)[2])) + (((Tym
)+0)[2]))), (((Txp)+3)[0] = ((((coords[0])))*((((Typ)+3)[0]) -
(((Tym)+3)[0])) + (((Tym)+3)[0])), ((Txp)+3)[1] = ((((coords
[0])))*((((Typ)+3)[1]) - (((Tym)+3)[1])) + (((Tym)+3)[1])), (
(Txp)+3)[2] = ((((coords[0])))*((((Typ)+3)[2]) - (((Tym)+3)[2
])) + (((Tym)+3)[2]))), (((Txp)+6)[0] = ((((coords[0])))*((((
Typ)+6)[0]) - (((Tym)+6)[0])) + (((Tym)+6)[0])), ((Txp)+6)[1]
= ((((coords[0])))*((((Typ)+6)[1]) - (((Tym)+6)[1])) + (((Tym
)+6)[1])), ((Txp)+6)[2] = ((((coords[0])))*((((Typ)+6)[2]) - (
((Tym)+6)[2])) + (((Tym)+6)[2]))))
;
622 ELL_3V_LERP(gxp, coords[0], gym, gyp)((gxp)[0] = (((coords[0]))*(((gyp)[0]) - ((gym)[0])) + ((gym)
[0])), (gxp)[1] = (((coords[0]))*(((gyp)[1]) - ((gym)[1])) + (
(gym)[1])), (gxp)[2] = (((coords[0]))*(((gyp)[2]) - ((gym)[2]
)) + ((gym)[2])))
;
623 } else {
624 ELL_3M_LERP(Tym, coords[1], sctx->t + 9*(0+2*siX), sctx->t + 9*(1+2*siX))((((Tym)+0)[0] = ((((coords[1])))*((((sctx->t + 9*(1+2*siX
))+0)[0]) - (((sctx->t + 9*(0+2*siX))+0)[0])) + (((sctx->
t + 9*(0+2*siX))+0)[0])), ((Tym)+0)[1] = ((((coords[1])))*(((
(sctx->t + 9*(1+2*siX))+0)[1]) - (((sctx->t + 9*(0+2*siX
))+0)[1])) + (((sctx->t + 9*(0+2*siX))+0)[1])), ((Tym)+0)[
2] = ((((coords[1])))*((((sctx->t + 9*(1+2*siX))+0)[2]) - (
((sctx->t + 9*(0+2*siX))+0)[2])) + (((sctx->t + 9*(0+2*
siX))+0)[2]))), (((Tym)+3)[0] = ((((coords[1])))*((((sctx->
t + 9*(1+2*siX))+3)[0]) - (((sctx->t + 9*(0+2*siX))+3)[0])
) + (((sctx->t + 9*(0+2*siX))+3)[0])), ((Tym)+3)[1] = ((((
coords[1])))*((((sctx->t + 9*(1+2*siX))+3)[1]) - (((sctx->
t + 9*(0+2*siX))+3)[1])) + (((sctx->t + 9*(0+2*siX))+3)[1]
)), ((Tym)+3)[2] = ((((coords[1])))*((((sctx->t + 9*(1+2*siX
))+3)[2]) - (((sctx->t + 9*(0+2*siX))+3)[2])) + (((sctx->
t + 9*(0+2*siX))+3)[2]))), (((Tym)+6)[0] = ((((coords[1])))*(
(((sctx->t + 9*(1+2*siX))+6)[0]) - (((sctx->t + 9*(0+2*
siX))+6)[0])) + (((sctx->t + 9*(0+2*siX))+6)[0])), ((Tym)+
6)[1] = ((((coords[1])))*((((sctx->t + 9*(1+2*siX))+6)[1])
- (((sctx->t + 9*(0+2*siX))+6)[1])) + (((sctx->t + 9*(
0+2*siX))+6)[1])), ((Tym)+6)[2] = ((((coords[1])))*((((sctx->
t + 9*(1+2*siX))+6)[2]) - (((sctx->t + 9*(0+2*siX))+6)[2])
) + (((sctx->t + 9*(0+2*siX))+6)[2]))))
;
625 ELL_3V_LERP(gym, coords[1], sctx->grad + 3*(0+2*siX),((gym)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*siX))[0]
) - ((sctx->grad + 3*(0+2*siX))[0])) + ((sctx->grad + 3
*(0+2*siX))[0])), (gym)[1] = (((coords[1]))*(((sctx->grad +
3*(1+2*siX))[1]) - ((sctx->grad + 3*(0+2*siX))[1])) + ((sctx
->grad + 3*(0+2*siX))[1])), (gym)[2] = (((coords[1]))*(((sctx
->grad + 3*(1+2*siX))[2]) - ((sctx->grad + 3*(0+2*siX))
[2])) + ((sctx->grad + 3*(0+2*siX))[2])))
626 sctx->grad + 3*(1+2*siX))((gym)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*siX))[0]
) - ((sctx->grad + 3*(0+2*siX))[0])) + ((sctx->grad + 3
*(0+2*siX))[0])), (gym)[1] = (((coords[1]))*(((sctx->grad +
3*(1+2*siX))[1]) - ((sctx->grad + 3*(0+2*siX))[1])) + ((sctx
->grad + 3*(0+2*siX))[1])), (gym)[2] = (((coords[1]))*(((sctx
->grad + 3*(1+2*siX))[2]) - ((sctx->grad + 3*(0+2*siX))
[2])) + ((sctx->grad + 3*(0+2*siX))[2])))
;
627 ELL_3M_LERP(Typ, coords[1], sctx->t + 9*(0+2*siXy),((((Typ)+0)[0] = ((((coords[1])))*((((sctx->t + 9*(1+2*siXy
))+0)[0]) - (((sctx->t + 9*(0+2*siXy))+0)[0])) + (((sctx->
t + 9*(0+2*siXy))+0)[0])), ((Typ)+0)[1] = ((((coords[1])))*((
((sctx->t + 9*(1+2*siXy))+0)[1]) - (((sctx->t + 9*(0+2*
siXy))+0)[1])) + (((sctx->t + 9*(0+2*siXy))+0)[1])), ((Typ
)+0)[2] = ((((coords[1])))*((((sctx->t + 9*(1+2*siXy))+0)[
2]) - (((sctx->t + 9*(0+2*siXy))+0)[2])) + (((sctx->t +
9*(0+2*siXy))+0)[2]))), (((Typ)+3)[0] = ((((coords[1])))*(((
(sctx->t + 9*(1+2*siXy))+3)[0]) - (((sctx->t + 9*(0+2*siXy
))+3)[0])) + (((sctx->t + 9*(0+2*siXy))+3)[0])), ((Typ)+3)
[1] = ((((coords[1])))*((((sctx->t + 9*(1+2*siXy))+3)[1]) -
(((sctx->t + 9*(0+2*siXy))+3)[1])) + (((sctx->t + 9*(0
+2*siXy))+3)[1])), ((Typ)+3)[2] = ((((coords[1])))*((((sctx->
t + 9*(1+2*siXy))+3)[2]) - (((sctx->t + 9*(0+2*siXy))+3)[2
])) + (((sctx->t + 9*(0+2*siXy))+3)[2]))), (((Typ)+6)[0] =
((((coords[1])))*((((sctx->t + 9*(1+2*siXy))+6)[0]) - (((
sctx->t + 9*(0+2*siXy))+6)[0])) + (((sctx->t + 9*(0+2*siXy
))+6)[0])), ((Typ)+6)[1] = ((((coords[1])))*((((sctx->t + 9
*(1+2*siXy))+6)[1]) - (((sctx->t + 9*(0+2*siXy))+6)[1])) +
(((sctx->t + 9*(0+2*siXy))+6)[1])), ((Typ)+6)[2] = ((((coords
[1])))*((((sctx->t + 9*(1+2*siXy))+6)[2]) - (((sctx->t +
9*(0+2*siXy))+6)[2])) + (((sctx->t + 9*(0+2*siXy))+6)[2])
)))
628 sctx->t + 9*(1+2*siXy))((((Typ)+0)[0] = ((((coords[1])))*((((sctx->t + 9*(1+2*siXy
))+0)[0]) - (((sctx->t + 9*(0+2*siXy))+0)[0])) + (((sctx->
t + 9*(0+2*siXy))+0)[0])), ((Typ)+0)[1] = ((((coords[1])))*((
((sctx->t + 9*(1+2*siXy))+0)[1]) - (((sctx->t + 9*(0+2*
siXy))+0)[1])) + (((sctx->t + 9*(0+2*siXy))+0)[1])), ((Typ
)+0)[2] = ((((coords[1])))*((((sctx->t + 9*(1+2*siXy))+0)[
2]) - (((sctx->t + 9*(0+2*siXy))+0)[2])) + (((sctx->t +
9*(0+2*siXy))+0)[2]))), (((Typ)+3)[0] = ((((coords[1])))*(((
(sctx->t + 9*(1+2*siXy))+3)[0]) - (((sctx->t + 9*(0+2*siXy
))+3)[0])) + (((sctx->t + 9*(0+2*siXy))+3)[0])), ((Typ)+3)
[1] = ((((coords[1])))*((((sctx->t + 9*(1+2*siXy))+3)[1]) -
(((sctx->t + 9*(0+2*siXy))+3)[1])) + (((sctx->t + 9*(0
+2*siXy))+3)[1])), ((Typ)+3)[2] = ((((coords[1])))*((((sctx->
t + 9*(1+2*siXy))+3)[2]) - (((sctx->t + 9*(0+2*siXy))+3)[2
])) + (((sctx->t + 9*(0+2*siXy))+3)[2]))), (((Typ)+6)[0] =
((((coords[1])))*((((sctx->t + 9*(1+2*siXy))+6)[0]) - (((
sctx->t + 9*(0+2*siXy))+6)[0])) + (((sctx->t + 9*(0+2*siXy
))+6)[0])), ((Typ)+6)[1] = ((((coords[1])))*((((sctx->t + 9
*(1+2*siXy))+6)[1]) - (((sctx->t + 9*(0+2*siXy))+6)[1])) +
(((sctx->t + 9*(0+2*siXy))+6)[1])), ((Typ)+6)[2] = ((((coords
[1])))*((((sctx->t + 9*(1+2*siXy))+6)[2]) - (((sctx->t +
9*(0+2*siXy))+6)[2])) + (((sctx->t + 9*(0+2*siXy))+6)[2])
)))
;
629 ELL_3V_LERP(gyp, coords[1], sctx->grad + 3*(0+2*siXy),((gyp)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*siXy))[0
]) - ((sctx->grad + 3*(0+2*siXy))[0])) + ((sctx->grad +
3*(0+2*siXy))[0])), (gyp)[1] = (((coords[1]))*(((sctx->grad
+ 3*(1+2*siXy))[1]) - ((sctx->grad + 3*(0+2*siXy))[1])) +
((sctx->grad + 3*(0+2*siXy))[1])), (gyp)[2] = (((coords[1
]))*(((sctx->grad + 3*(1+2*siXy))[2]) - ((sctx->grad + 3
*(0+2*siXy))[2])) + ((sctx->grad + 3*(0+2*siXy))[2])))
630 sctx->grad + 3*(1+2*siXy))((gyp)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*siXy))[0
]) - ((sctx->grad + 3*(0+2*siXy))[0])) + ((sctx->grad +
3*(0+2*siXy))[0])), (gyp)[1] = (((coords[1]))*(((sctx->grad
+ 3*(1+2*siXy))[1]) - ((sctx->grad + 3*(0+2*siXy))[1])) +
((sctx->grad + 3*(0+2*siXy))[1])), (gyp)[2] = (((coords[1
]))*(((sctx->grad + 3*(1+2*siXy))[2]) - ((sctx->grad + 3
*(0+2*siXy))[2])) + ((sctx->grad + 3*(0+2*siXy))[2])))
;
631 ELL_3M_LERP(Txm, coords[0], Tym, Typ)((((Txm)+0)[0] = ((((coords[0])))*((((Typ)+0)[0]) - (((Tym)+0
)[0])) + (((Tym)+0)[0])), ((Txm)+0)[1] = ((((coords[0])))*(((
(Typ)+0)[1]) - (((Tym)+0)[1])) + (((Tym)+0)[1])), ((Txm)+0)[2
] = ((((coords[0])))*((((Typ)+0)[2]) - (((Tym)+0)[2])) + (((Tym
)+0)[2]))), (((Txm)+3)[0] = ((((coords[0])))*((((Typ)+3)[0]) -
(((Tym)+3)[0])) + (((Tym)+3)[0])), ((Txm)+3)[1] = ((((coords
[0])))*((((Typ)+3)[1]) - (((Tym)+3)[1])) + (((Tym)+3)[1])), (
(Txm)+3)[2] = ((((coords[0])))*((((Typ)+3)[2]) - (((Tym)+3)[2
])) + (((Tym)+3)[2]))), (((Txm)+6)[0] = ((((coords[0])))*((((
Typ)+6)[0]) - (((Tym)+6)[0])) + (((Tym)+6)[0])), ((Txm)+6)[1]
= ((((coords[0])))*((((Typ)+6)[1]) - (((Tym)+6)[1])) + (((Tym
)+6)[1])), ((Txm)+6)[2] = ((((coords[0])))*((((Typ)+6)[2]) - (
((Tym)+6)[2])) + (((Tym)+6)[2]))))
;
632 ELL_3V_LERP(gxm, coords[0], gym, gyp)((gxm)[0] = (((coords[0]))*(((gyp)[0]) - ((gym)[0])) + ((gym)
[0])), (gxm)[1] = (((coords[0]))*(((gyp)[1]) - ((gym)[1])) + (
(gym)[1])), (gxm)[2] = (((coords[0]))*(((gyp)[2]) - ((gym)[2]
)) + ((gym)[2])))
;
633 }
634 /* now, compute remaining points */
635 ELL_3M_LERP(Tym, coords[1], sctx->t + 9*(0+2*si), sctx->t + 9*(1+2*si))((((Tym)+0)[0] = ((((coords[1])))*((((sctx->t + 9*(1+2*si)
)+0)[0]) - (((sctx->t + 9*(0+2*si))+0)[0])) + (((sctx->
t + 9*(0+2*si))+0)[0])), ((Tym)+0)[1] = ((((coords[1])))*((((
sctx->t + 9*(1+2*si))+0)[1]) - (((sctx->t + 9*(0+2*si))
+0)[1])) + (((sctx->t + 9*(0+2*si))+0)[1])), ((Tym)+0)[2] =
((((coords[1])))*((((sctx->t + 9*(1+2*si))+0)[2]) - (((sctx
->t + 9*(0+2*si))+0)[2])) + (((sctx->t + 9*(0+2*si))+0)
[2]))), (((Tym)+3)[0] = ((((coords[1])))*((((sctx->t + 9*(
1+2*si))+3)[0]) - (((sctx->t + 9*(0+2*si))+3)[0])) + (((sctx
->t + 9*(0+2*si))+3)[0])), ((Tym)+3)[1] = ((((coords[1])))
*((((sctx->t + 9*(1+2*si))+3)[1]) - (((sctx->t + 9*(0+2
*si))+3)[1])) + (((sctx->t + 9*(0+2*si))+3)[1])), ((Tym)+3
)[2] = ((((coords[1])))*((((sctx->t + 9*(1+2*si))+3)[2]) -
(((sctx->t + 9*(0+2*si))+3)[2])) + (((sctx->t + 9*(0+2
*si))+3)[2]))), (((Tym)+6)[0] = ((((coords[1])))*((((sctx->
t + 9*(1+2*si))+6)[0]) - (((sctx->t + 9*(0+2*si))+6)[0])) +
(((sctx->t + 9*(0+2*si))+6)[0])), ((Tym)+6)[1] = ((((coords
[1])))*((((sctx->t + 9*(1+2*si))+6)[1]) - (((sctx->t + 9
*(0+2*si))+6)[1])) + (((sctx->t + 9*(0+2*si))+6)[1])), ((Tym
)+6)[2] = ((((coords[1])))*((((sctx->t + 9*(1+2*si))+6)[2]
) - (((sctx->t + 9*(0+2*si))+6)[2])) + (((sctx->t + 9*(
0+2*si))+6)[2]))))
;
636 ELL_3V_LERP(gym, coords[1], sctx->grad + 3*(0+2*si),((gym)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*si))[0])
- ((sctx->grad + 3*(0+2*si))[0])) + ((sctx->grad + 3*(
0+2*si))[0])), (gym)[1] = (((coords[1]))*(((sctx->grad + 3
*(1+2*si))[1]) - ((sctx->grad + 3*(0+2*si))[1])) + ((sctx->
grad + 3*(0+2*si))[1])), (gym)[2] = (((coords[1]))*(((sctx->
grad + 3*(1+2*si))[2]) - ((sctx->grad + 3*(0+2*si))[2])) +
((sctx->grad + 3*(0+2*si))[2])))
637 sctx->grad + 3*(1+2*si))((gym)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*si))[0])
- ((sctx->grad + 3*(0+2*si))[0])) + ((sctx->grad + 3*(
0+2*si))[0])), (gym)[1] = (((coords[1]))*(((sctx->grad + 3
*(1+2*si))[1]) - ((sctx->grad + 3*(0+2*si))[1])) + ((sctx->
grad + 3*(0+2*si))[1])), (gym)[2] = (((coords[1]))*(((sctx->
grad + 3*(1+2*si))[2]) - ((sctx->grad + 3*(0+2*si))[2])) +
((sctx->grad + 3*(0+2*si))[2])))
;
638 ELL_3M_LERP(Typ, coords[1], sctx->t + 9*(0+2*siy), sctx->t + 9*(1+2*siy))((((Typ)+0)[0] = ((((coords[1])))*((((sctx->t + 9*(1+2*siy
))+0)[0]) - (((sctx->t + 9*(0+2*siy))+0)[0])) + (((sctx->
t + 9*(0+2*siy))+0)[0])), ((Typ)+0)[1] = ((((coords[1])))*(((
(sctx->t + 9*(1+2*siy))+0)[1]) - (((sctx->t + 9*(0+2*siy
))+0)[1])) + (((sctx->t + 9*(0+2*siy))+0)[1])), ((Typ)+0)[
2] = ((((coords[1])))*((((sctx->t + 9*(1+2*siy))+0)[2]) - (
((sctx->t + 9*(0+2*siy))+0)[2])) + (((sctx->t + 9*(0+2*
siy))+0)[2]))), (((Typ)+3)[0] = ((((coords[1])))*((((sctx->
t + 9*(1+2*siy))+3)[0]) - (((sctx->t + 9*(0+2*siy))+3)[0])
) + (((sctx->t + 9*(0+2*siy))+3)[0])), ((Typ)+3)[1] = ((((
coords[1])))*((((sctx->t + 9*(1+2*siy))+3)[1]) - (((sctx->
t + 9*(0+2*siy))+3)[1])) + (((sctx->t + 9*(0+2*siy))+3)[1]
)), ((Typ)+3)[2] = ((((coords[1])))*((((sctx->t + 9*(1+2*siy
))+3)[2]) - (((sctx->t + 9*(0+2*siy))+3)[2])) + (((sctx->
t + 9*(0+2*siy))+3)[2]))), (((Typ)+6)[0] = ((((coords[1])))*(
(((sctx->t + 9*(1+2*siy))+6)[0]) - (((sctx->t + 9*(0+2*
siy))+6)[0])) + (((sctx->t + 9*(0+2*siy))+6)[0])), ((Typ)+
6)[1] = ((((coords[1])))*((((sctx->t + 9*(1+2*siy))+6)[1])
- (((sctx->t + 9*(0+2*siy))+6)[1])) + (((sctx->t + 9*(
0+2*siy))+6)[1])), ((Typ)+6)[2] = ((((coords[1])))*((((sctx->
t + 9*(1+2*siy))+6)[2]) - (((sctx->t + 9*(0+2*siy))+6)[2])
) + (((sctx->t + 9*(0+2*siy))+6)[2]))))
;
639 ELL_3V_LERP(gyp, coords[1], sctx->grad + 3*(0+2*siy),((gyp)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*siy))[0]
) - ((sctx->grad + 3*(0+2*siy))[0])) + ((sctx->grad + 3
*(0+2*siy))[0])), (gyp)[1] = (((coords[1]))*(((sctx->grad +
3*(1+2*siy))[1]) - ((sctx->grad + 3*(0+2*siy))[1])) + ((sctx
->grad + 3*(0+2*siy))[1])), (gyp)[2] = (((coords[1]))*(((sctx
->grad + 3*(1+2*siy))[2]) - ((sctx->grad + 3*(0+2*siy))
[2])) + ((sctx->grad + 3*(0+2*siy))[2])))
640 sctx->grad + 3*(1+2*siy))((gyp)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*siy))[0]
) - ((sctx->grad + 3*(0+2*siy))[0])) + ((sctx->grad + 3
*(0+2*siy))[0])), (gyp)[1] = (((coords[1]))*(((sctx->grad +
3*(1+2*siy))[1]) - ((sctx->grad + 3*(0+2*siy))[1])) + ((sctx
->grad + 3*(0+2*siy))[1])), (gyp)[2] = (((coords[1]))*(((sctx
->grad + 3*(1+2*siy))[2]) - ((sctx->grad + 3*(0+2*siy))
[2])) + ((sctx->grad + 3*(0+2*siy))[2])))
;
641
642 ELL_3M_LERP(Tzm, coords[0], sctx->t + 9*(0+2*si), sctx->t + 9*(0+2*siy))((((Tzm)+0)[0] = ((((coords[0])))*((((sctx->t + 9*(0+2*siy
))+0)[0]) - (((sctx->t + 9*(0+2*si))+0)[0])) + (((sctx->
t + 9*(0+2*si))+0)[0])), ((Tzm)+0)[1] = ((((coords[0])))*((((
sctx->t + 9*(0+2*siy))+0)[1]) - (((sctx->t + 9*(0+2*si)
)+0)[1])) + (((sctx->t + 9*(0+2*si))+0)[1])), ((Tzm)+0)[2]
= ((((coords[0])))*((((sctx->t + 9*(0+2*siy))+0)[2]) - ((
(sctx->t + 9*(0+2*si))+0)[2])) + (((sctx->t + 9*(0+2*si
))+0)[2]))), (((Tzm)+3)[0] = ((((coords[0])))*((((sctx->t +
9*(0+2*siy))+3)[0]) - (((sctx->t + 9*(0+2*si))+3)[0])) + (
((sctx->t + 9*(0+2*si))+3)[0])), ((Tzm)+3)[1] = ((((coords
[0])))*((((sctx->t + 9*(0+2*siy))+3)[1]) - (((sctx->t +
9*(0+2*si))+3)[1])) + (((sctx->t + 9*(0+2*si))+3)[1])), (
(Tzm)+3)[2] = ((((coords[0])))*((((sctx->t + 9*(0+2*siy))+
3)[2]) - (((sctx->t + 9*(0+2*si))+3)[2])) + (((sctx->t +
9*(0+2*si))+3)[2]))), (((Tzm)+6)[0] = ((((coords[0])))*((((sctx
->t + 9*(0+2*siy))+6)[0]) - (((sctx->t + 9*(0+2*si))+6)
[0])) + (((sctx->t + 9*(0+2*si))+6)[0])), ((Tzm)+6)[1] = (
(((coords[0])))*((((sctx->t + 9*(0+2*siy))+6)[1]) - (((sctx
->t + 9*(0+2*si))+6)[1])) + (((sctx->t + 9*(0+2*si))+6)
[1])), ((Tzm)+6)[2] = ((((coords[0])))*((((sctx->t + 9*(0+
2*siy))+6)[2]) - (((sctx->t + 9*(0+2*si))+6)[2])) + (((sctx
->t + 9*(0+2*si))+6)[2]))))
;
643 ELL_3V_LERP(gzm, coords[0], sctx->grad + 3*(0+2*si),((gzm)[0] = (((coords[0]))*(((sctx->grad + 3*(0+2*siy))[0]
) - ((sctx->grad + 3*(0+2*si))[0])) + ((sctx->grad + 3*
(0+2*si))[0])), (gzm)[1] = (((coords[0]))*(((sctx->grad + 3
*(0+2*siy))[1]) - ((sctx->grad + 3*(0+2*si))[1])) + ((sctx
->grad + 3*(0+2*si))[1])), (gzm)[2] = (((coords[0]))*(((sctx
->grad + 3*(0+2*siy))[2]) - ((sctx->grad + 3*(0+2*si))[
2])) + ((sctx->grad + 3*(0+2*si))[2])))
644 sctx->grad + 3*(0+2*siy))((gzm)[0] = (((coords[0]))*(((sctx->grad + 3*(0+2*siy))[0]
) - ((sctx->grad + 3*(0+2*si))[0])) + ((sctx->grad + 3*
(0+2*si))[0])), (gzm)[1] = (((coords[0]))*(((sctx->grad + 3
*(0+2*siy))[1]) - ((sctx->grad + 3*(0+2*si))[1])) + ((sctx
->grad + 3*(0+2*si))[1])), (gzm)[2] = (((coords[0]))*(((sctx
->grad + 3*(0+2*siy))[2]) - ((sctx->grad + 3*(0+2*si))[
2])) + ((sctx->grad + 3*(0+2*si))[2])))
;
645 ELL_3M_LERP(Tzp, coords[0], sctx->t + 9*(1+2*si), sctx->t + 9*(1+2*siy))((((Tzp)+0)[0] = ((((coords[0])))*((((sctx->t + 9*(1+2*siy
))+0)[0]) - (((sctx->t + 9*(1+2*si))+0)[0])) + (((sctx->
t + 9*(1+2*si))+0)[0])), ((Tzp)+0)[1] = ((((coords[0])))*((((
sctx->t + 9*(1+2*siy))+0)[1]) - (((sctx->t + 9*(1+2*si)
)+0)[1])) + (((sctx->t + 9*(1+2*si))+0)[1])), ((Tzp)+0)[2]
= ((((coords[0])))*((((sctx->t + 9*(1+2*siy))+0)[2]) - ((
(sctx->t + 9*(1+2*si))+0)[2])) + (((sctx->t + 9*(1+2*si
))+0)[2]))), (((Tzp)+3)[0] = ((((coords[0])))*((((sctx->t +
9*(1+2*siy))+3)[0]) - (((sctx->t + 9*(1+2*si))+3)[0])) + (
((sctx->t + 9*(1+2*si))+3)[0])), ((Tzp)+3)[1] = ((((coords
[0])))*((((sctx->t + 9*(1+2*siy))+3)[1]) - (((sctx->t +
9*(1+2*si))+3)[1])) + (((sctx->t + 9*(1+2*si))+3)[1])), (
(Tzp)+3)[2] = ((((coords[0])))*((((sctx->t + 9*(1+2*siy))+
3)[2]) - (((sctx->t + 9*(1+2*si))+3)[2])) + (((sctx->t +
9*(1+2*si))+3)[2]))), (((Tzp)+6)[0] = ((((coords[0])))*((((sctx
->t + 9*(1+2*siy))+6)[0]) - (((sctx->t + 9*(1+2*si))+6)
[0])) + (((sctx->t + 9*(1+2*si))+6)[0])), ((Tzp)+6)[1] = (
(((coords[0])))*((((sctx->t + 9*(1+2*siy))+6)[1]) - (((sctx
->t + 9*(1+2*si))+6)[1])) + (((sctx->t + 9*(1+2*si))+6)
[1])), ((Tzp)+6)[2] = ((((coords[0])))*((((sctx->t + 9*(1+
2*siy))+6)[2]) - (((sctx->t + 9*(1+2*si))+6)[2])) + (((sctx
->t + 9*(1+2*si))+6)[2]))))
;
646 ELL_3V_LERP(gzp, coords[0], sctx->grad + 3*(1+2*si),((gzp)[0] = (((coords[0]))*(((sctx->grad + 3*(1+2*siy))[0]
) - ((sctx->grad + 3*(1+2*si))[0])) + ((sctx->grad + 3*
(1+2*si))[0])), (gzp)[1] = (((coords[0]))*(((sctx->grad + 3
*(1+2*siy))[1]) - ((sctx->grad + 3*(1+2*si))[1])) + ((sctx
->grad + 3*(1+2*si))[1])), (gzp)[2] = (((coords[0]))*(((sctx
->grad + 3*(1+2*siy))[2]) - ((sctx->grad + 3*(1+2*si))[
2])) + ((sctx->grad + 3*(1+2*si))[2])))
647 sctx->grad + 3*(1+2*siy))((gzp)[0] = (((coords[0]))*(((sctx->grad + 3*(1+2*siy))[0]
) - ((sctx->grad + 3*(1+2*si))[0])) + ((sctx->grad + 3*
(1+2*si))[0])), (gzp)[1] = (((coords[0]))*(((sctx->grad + 3
*(1+2*siy))[1]) - ((sctx->grad + 3*(1+2*si))[1])) + ((sctx
->grad + 3*(1+2*si))[1])), (gzp)[2] = (((coords[0]))*(((sctx
->grad + 3*(1+2*siy))[2]) - ((sctx->grad + 3*(1+2*si))[
2])) + ((sctx->grad + 3*(1+2*si))[2])))
;
648
649 ELL_3M_LERP(T, coords[0], Tym, Typ)((((T)+0)[0] = ((((coords[0])))*((((Typ)+0)[0]) - (((Tym)+0)[
0])) + (((Tym)+0)[0])), ((T)+0)[1] = ((((coords[0])))*((((Typ
)+0)[1]) - (((Tym)+0)[1])) + (((Tym)+0)[1])), ((T)+0)[2] = ((
((coords[0])))*((((Typ)+0)[2]) - (((Tym)+0)[2])) + (((Tym)+0)
[2]))), (((T)+3)[0] = ((((coords[0])))*((((Typ)+3)[0]) - (((Tym
)+3)[0])) + (((Tym)+3)[0])), ((T)+3)[1] = ((((coords[0])))*((
((Typ)+3)[1]) - (((Tym)+3)[1])) + (((Tym)+3)[1])), ((T)+3)[2]
= ((((coords[0])))*((((Typ)+3)[2]) - (((Tym)+3)[2])) + (((Tym
)+3)[2]))), (((T)+6)[0] = ((((coords[0])))*((((Typ)+6)[0]) - (
((Tym)+6)[0])) + (((Tym)+6)[0])), ((T)+6)[1] = ((((coords[0])
))*((((Typ)+6)[1]) - (((Tym)+6)[1])) + (((Tym)+6)[1])), ((T)+
6)[2] = ((((coords[0])))*((((Typ)+6)[2]) - (((Tym)+6)[2])) + (
((Tym)+6)[2]))))
;
650 ELL_3V_LERP(g, coords[0], gym, gyp)((g)[0] = (((coords[0]))*(((gyp)[0]) - ((gym)[0])) + ((gym)[0
])), (g)[1] = (((coords[0]))*(((gyp)[1]) - ((gym)[1])) + ((gym
)[1])), (g)[2] = (((coords[0]))*(((gyp)[2]) - ((gym)[2])) + (
(gym)[2])))
;
651
652 if (xi!=sx-1) {
653 computeGradientLin(sctx->facenorm+3*(faceid+4*si), T, g,
654 T, g, Txp, gxp,
655 Tym, gym, Typ, gyp,
656 Tzm, gzm, Tzp, gzp);
657 } else {
658 computeGradientLin(sctx->facenorm+3*(faceid+4*si), T, g,
659 Txm, gxm, T, g,
660 Tym, gym, Typ, gyp,
661 Tzm, gzm, Tzp, gzp);
662 }
663 break;
664 case 3:
665 /* bilinearly interpolate Tzm/gzm first */
666 ELL_3M_LERP(Txm, coords[1], sctx->t + 9*(0+2*si), sctx->t + 9*(0+2*siy))((((Txm)+0)[0] = ((((coords[1])))*((((sctx->t + 9*(0+2*siy
))+0)[0]) - (((sctx->t + 9*(0+2*si))+0)[0])) + (((sctx->
t + 9*(0+2*si))+0)[0])), ((Txm)+0)[1] = ((((coords[1])))*((((
sctx->t + 9*(0+2*siy))+0)[1]) - (((sctx->t + 9*(0+2*si)
)+0)[1])) + (((sctx->t + 9*(0+2*si))+0)[1])), ((Txm)+0)[2]
= ((((coords[1])))*((((sctx->t + 9*(0+2*siy))+0)[2]) - ((
(sctx->t + 9*(0+2*si))+0)[2])) + (((sctx->t + 9*(0+2*si
))+0)[2]))), (((Txm)+3)[0] = ((((coords[1])))*((((sctx->t +
9*(0+2*siy))+3)[0]) - (((sctx->t + 9*(0+2*si))+3)[0])) + (
((sctx->t + 9*(0+2*si))+3)[0])), ((Txm)+3)[1] = ((((coords
[1])))*((((sctx->t + 9*(0+2*siy))+3)[1]) - (((sctx->t +
9*(0+2*si))+3)[1])) + (((sctx->t + 9*(0+2*si))+3)[1])), (
(Txm)+3)[2] = ((((coords[1])))*((((sctx->t + 9*(0+2*siy))+
3)[2]) - (((sctx->t + 9*(0+2*si))+3)[2])) + (((sctx->t +
9*(0+2*si))+3)[2]))), (((Txm)+6)[0] = ((((coords[1])))*((((sctx
->t + 9*(0+2*siy))+6)[0]) - (((sctx->t + 9*(0+2*si))+6)
[0])) + (((sctx->t + 9*(0+2*si))+6)[0])), ((Txm)+6)[1] = (
(((coords[1])))*((((sctx->t + 9*(0+2*siy))+6)[1]) - (((sctx
->t + 9*(0+2*si))+6)[1])) + (((sctx->t + 9*(0+2*si))+6)
[1])), ((Txm)+6)[2] = ((((coords[1])))*((((sctx->t + 9*(0+
2*siy))+6)[2]) - (((sctx->t + 9*(0+2*si))+6)[2])) + (((sctx
->t + 9*(0+2*si))+6)[2]))))
;
667 ELL_3V_LERP(gxm, coords[1], sctx->grad + 3*(0+2*si),((gxm)[0] = (((coords[1]))*(((sctx->grad + 3*(0+2*siy))[0]
) - ((sctx->grad + 3*(0+2*si))[0])) + ((sctx->grad + 3*
(0+2*si))[0])), (gxm)[1] = (((coords[1]))*(((sctx->grad + 3
*(0+2*siy))[1]) - ((sctx->grad + 3*(0+2*si))[1])) + ((sctx
->grad + 3*(0+2*si))[1])), (gxm)[2] = (((coords[1]))*(((sctx
->grad + 3*(0+2*siy))[2]) - ((sctx->grad + 3*(0+2*si))[
2])) + ((sctx->grad + 3*(0+2*si))[2])))
668 sctx->grad + 3*(0+2*siy))((gxm)[0] = (((coords[1]))*(((sctx->grad + 3*(0+2*siy))[0]
) - ((sctx->grad + 3*(0+2*si))[0])) + ((sctx->grad + 3*
(0+2*si))[0])), (gxm)[1] = (((coords[1]))*(((sctx->grad + 3
*(0+2*siy))[1]) - ((sctx->grad + 3*(0+2*si))[1])) + ((sctx
->grad + 3*(0+2*si))[1])), (gxm)[2] = (((coords[1]))*(((sctx
->grad + 3*(0+2*siy))[2]) - ((sctx->grad + 3*(0+2*si))[
2])) + ((sctx->grad + 3*(0+2*si))[2])))
;
669 ELL_3M_LERP(Txp, coords[1], sctx->t + 9*(0+2*six), sctx->t + 9*(0+2*sixy))((((Txp)+0)[0] = ((((coords[1])))*((((sctx->t + 9*(0+2*sixy
))+0)[0]) - (((sctx->t + 9*(0+2*six))+0)[0])) + (((sctx->
t + 9*(0+2*six))+0)[0])), ((Txp)+0)[1] = ((((coords[1])))*(((
(sctx->t + 9*(0+2*sixy))+0)[1]) - (((sctx->t + 9*(0+2*six
))+0)[1])) + (((sctx->t + 9*(0+2*six))+0)[1])), ((Txp)+0)[
2] = ((((coords[1])))*((((sctx->t + 9*(0+2*sixy))+0)[2]) -
(((sctx->t + 9*(0+2*six))+0)[2])) + (((sctx->t + 9*(0+
2*six))+0)[2]))), (((Txp)+3)[0] = ((((coords[1])))*((((sctx->
t + 9*(0+2*sixy))+3)[0]) - (((sctx->t + 9*(0+2*six))+3)[0]
)) + (((sctx->t + 9*(0+2*six))+3)[0])), ((Txp)+3)[1] = (((
(coords[1])))*((((sctx->t + 9*(0+2*sixy))+3)[1]) - (((sctx
->t + 9*(0+2*six))+3)[1])) + (((sctx->t + 9*(0+2*six))+
3)[1])), ((Txp)+3)[2] = ((((coords[1])))*((((sctx->t + 9*(
0+2*sixy))+3)[2]) - (((sctx->t + 9*(0+2*six))+3)[2])) + ((
(sctx->t + 9*(0+2*six))+3)[2]))), (((Txp)+6)[0] = ((((coords
[1])))*((((sctx->t + 9*(0+2*sixy))+6)[0]) - (((sctx->t +
9*(0+2*six))+6)[0])) + (((sctx->t + 9*(0+2*six))+6)[0])),
((Txp)+6)[1] = ((((coords[1])))*((((sctx->t + 9*(0+2*sixy
))+6)[1]) - (((sctx->t + 9*(0+2*six))+6)[1])) + (((sctx->
t + 9*(0+2*six))+6)[1])), ((Txp)+6)[2] = ((((coords[1])))*(((
(sctx->t + 9*(0+2*sixy))+6)[2]) - (((sctx->t + 9*(0+2*six
))+6)[2])) + (((sctx->t + 9*(0+2*six))+6)[2]))))
;
670 ELL_3V_LERP(gxp, coords[1], sctx->grad + 3*(0+2*six),((gxp)[0] = (((coords[1]))*(((sctx->grad + 3*(0+2*sixy))[0
]) - ((sctx->grad + 3*(0+2*six))[0])) + ((sctx->grad + 3
*(0+2*six))[0])), (gxp)[1] = (((coords[1]))*(((sctx->grad +
3*(0+2*sixy))[1]) - ((sctx->grad + 3*(0+2*six))[1])) + ((
sctx->grad + 3*(0+2*six))[1])), (gxp)[2] = (((coords[1]))*
(((sctx->grad + 3*(0+2*sixy))[2]) - ((sctx->grad + 3*(0
+2*six))[2])) + ((sctx->grad + 3*(0+2*six))[2])))
671 sctx->grad + 3*(0+2*sixy))((gxp)[0] = (((coords[1]))*(((sctx->grad + 3*(0+2*sixy))[0
]) - ((sctx->grad + 3*(0+2*six))[0])) + ((sctx->grad + 3
*(0+2*six))[0])), (gxp)[1] = (((coords[1]))*(((sctx->grad +
3*(0+2*sixy))[1]) - ((sctx->grad + 3*(0+2*six))[1])) + ((
sctx->grad + 3*(0+2*six))[1])), (gxp)[2] = (((coords[1]))*
(((sctx->grad + 3*(0+2*sixy))[2]) - ((sctx->grad + 3*(0
+2*six))[2])) + ((sctx->grad + 3*(0+2*six))[2])))
;
672 ELL_3M_LERP(Tzm, coords[0], Txm, Txp)((((Tzm)+0)[0] = ((((coords[0])))*((((Txp)+0)[0]) - (((Txm)+0
)[0])) + (((Txm)+0)[0])), ((Tzm)+0)[1] = ((((coords[0])))*(((
(Txp)+0)[1]) - (((Txm)+0)[1])) + (((Txm)+0)[1])), ((Tzm)+0)[2
] = ((((coords[0])))*((((Txp)+0)[2]) - (((Txm)+0)[2])) + (((Txm
)+0)[2]))), (((Tzm)+3)[0] = ((((coords[0])))*((((Txp)+3)[0]) -
(((Txm)+3)[0])) + (((Txm)+3)[0])), ((Tzm)+3)[1] = ((((coords
[0])))*((((Txp)+3)[1]) - (((Txm)+3)[1])) + (((Txm)+3)[1])), (
(Tzm)+3)[2] = ((((coords[0])))*((((Txp)+3)[2]) - (((Txm)+3)[2
])) + (((Txm)+3)[2]))), (((Tzm)+6)[0] = ((((coords[0])))*((((
Txp)+6)[0]) - (((Txm)+6)[0])) + (((Txm)+6)[0])), ((Tzm)+6)[1]
= ((((coords[0])))*((((Txp)+6)[1]) - (((Txm)+6)[1])) + (((Txm
)+6)[1])), ((Tzm)+6)[2] = ((((coords[0])))*((((Txp)+6)[2]) - (
((Txm)+6)[2])) + (((Txm)+6)[2]))))
;
673 ELL_3V_LERP(gzm, coords[0], gxm, gxp)((gzm)[0] = (((coords[0]))*(((gxp)[0]) - ((gxm)[0])) + ((gxm)
[0])), (gzm)[1] = (((coords[0]))*(((gxp)[1]) - ((gxm)[1])) + (
(gxm)[1])), (gzm)[2] = (((coords[0]))*(((gxp)[2]) - ((gxm)[2]
)) + ((gxm)[2])))
;
674 /* now, compute all required points on the top face */
675 ELL_3M_LERP(Txm, coords[1], sctx->t + 9*(1+2*si), sctx->t + 9*(1+2*siy))((((Txm)+0)[0] = ((((coords[1])))*((((sctx->t + 9*(1+2*siy
))+0)[0]) - (((sctx->t + 9*(1+2*si))+0)[0])) + (((sctx->
t + 9*(1+2*si))+0)[0])), ((Txm)+0)[1] = ((((coords[1])))*((((
sctx->t + 9*(1+2*siy))+0)[1]) - (((sctx->t + 9*(1+2*si)
)+0)[1])) + (((sctx->t + 9*(1+2*si))+0)[1])), ((Txm)+0)[2]
= ((((coords[1])))*((((sctx->t + 9*(1+2*siy))+0)[2]) - ((
(sctx->t + 9*(1+2*si))+0)[2])) + (((sctx->t + 9*(1+2*si
))+0)[2]))), (((Txm)+3)[0] = ((((coords[1])))*((((sctx->t +
9*(1+2*siy))+3)[0]) - (((sctx->t + 9*(1+2*si))+3)[0])) + (
((sctx->t + 9*(1+2*si))+3)[0])), ((Txm)+3)[1] = ((((coords
[1])))*((((sctx->t + 9*(1+2*siy))+3)[1]) - (((sctx->t +
9*(1+2*si))+3)[1])) + (((sctx->t + 9*(1+2*si))+3)[1])), (
(Txm)+3)[2] = ((((coords[1])))*((((sctx->t + 9*(1+2*siy))+
3)[2]) - (((sctx->t + 9*(1+2*si))+3)[2])) + (((sctx->t +
9*(1+2*si))+3)[2]))), (((Txm)+6)[0] = ((((coords[1])))*((((sctx
->t + 9*(1+2*siy))+6)[0]) - (((sctx->t + 9*(1+2*si))+6)
[0])) + (((sctx->t + 9*(1+2*si))+6)[0])), ((Txm)+6)[1] = (
(((coords[1])))*((((sctx->t + 9*(1+2*siy))+6)[1]) - (((sctx
->t + 9*(1+2*si))+6)[1])) + (((sctx->t + 9*(1+2*si))+6)
[1])), ((Txm)+6)[2] = ((((coords[1])))*((((sctx->t + 9*(1+
2*siy))+6)[2]) - (((sctx->t + 9*(1+2*si))+6)[2])) + (((sctx
->t + 9*(1+2*si))+6)[2]))))
;
676 ELL_3V_LERP(gxm, coords[1], sctx->grad + 3*(1+2*si),((gxm)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*siy))[0]
) - ((sctx->grad + 3*(1+2*si))[0])) + ((sctx->grad + 3*
(1+2*si))[0])), (gxm)[1] = (((coords[1]))*(((sctx->grad + 3
*(1+2*siy))[1]) - ((sctx->grad + 3*(1+2*si))[1])) + ((sctx
->grad + 3*(1+2*si))[1])), (gxm)[2] = (((coords[1]))*(((sctx
->grad + 3*(1+2*siy))[2]) - ((sctx->grad + 3*(1+2*si))[
2])) + ((sctx->grad + 3*(1+2*si))[2])))
677 sctx->grad + 3*(1+2*siy))((gxm)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*siy))[0]
) - ((sctx->grad + 3*(1+2*si))[0])) + ((sctx->grad + 3*
(1+2*si))[0])), (gxm)[1] = (((coords[1]))*(((sctx->grad + 3
*(1+2*siy))[1]) - ((sctx->grad + 3*(1+2*si))[1])) + ((sctx
->grad + 3*(1+2*si))[1])), (gxm)[2] = (((coords[1]))*(((sctx
->grad + 3*(1+2*siy))[2]) - ((sctx->grad + 3*(1+2*si))[
2])) + ((sctx->grad + 3*(1+2*si))[2])))
;
678 ELL_3M_LERP(Txp, coords[1], sctx->t + 9*(1+2*six), sctx->t + 9*(1+2*sixy))((((Txp)+0)[0] = ((((coords[1])))*((((sctx->t + 9*(1+2*sixy
))+0)[0]) - (((sctx->t + 9*(1+2*six))+0)[0])) + (((sctx->
t + 9*(1+2*six))+0)[0])), ((Txp)+0)[1] = ((((coords[1])))*(((
(sctx->t + 9*(1+2*sixy))+0)[1]) - (((sctx->t + 9*(1+2*six
))+0)[1])) + (((sctx->t + 9*(1+2*six))+0)[1])), ((Txp)+0)[
2] = ((((coords[1])))*((((sctx->t + 9*(1+2*sixy))+0)[2]) -
(((sctx->t + 9*(1+2*six))+0)[2])) + (((sctx->t + 9*(1+
2*six))+0)[2]))), (((Txp)+3)[0] = ((((coords[1])))*((((sctx->
t + 9*(1+2*sixy))+3)[0]) - (((sctx->t + 9*(1+2*six))+3)[0]
)) + (((sctx->t + 9*(1+2*six))+3)[0])), ((Txp)+3)[1] = (((
(coords[1])))*((((sctx->t + 9*(1+2*sixy))+3)[1]) - (((sctx
->t + 9*(1+2*six))+3)[1])) + (((sctx->t + 9*(1+2*six))+
3)[1])), ((Txp)+3)[2] = ((((coords[1])))*((((sctx->t + 9*(
1+2*sixy))+3)[2]) - (((sctx->t + 9*(1+2*six))+3)[2])) + ((
(sctx->t + 9*(1+2*six))+3)[2]))), (((Txp)+6)[0] = ((((coords
[1])))*((((sctx->t + 9*(1+2*sixy))+6)[0]) - (((sctx->t +
9*(1+2*six))+6)[0])) + (((sctx->t + 9*(1+2*six))+6)[0])),
((Txp)+6)[1] = ((((coords[1])))*((((sctx->t + 9*(1+2*sixy
))+6)[1]) - (((sctx->t + 9*(1+2*six))+6)[1])) + (((sctx->
t + 9*(1+2*six))+6)[1])), ((Txp)+6)[2] = ((((coords[1])))*(((
(sctx->t + 9*(1+2*sixy))+6)[2]) - (((sctx->t + 9*(1+2*six
))+6)[2])) + (((sctx->t + 9*(1+2*six))+6)[2]))))
;
679 ELL_3V_LERP(gxp, coords[1], sctx->grad + 3*(1+2*six),((gxp)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*sixy))[0
]) - ((sctx->grad + 3*(1+2*six))[0])) + ((sctx->grad + 3
*(1+2*six))[0])), (gxp)[1] = (((coords[1]))*(((sctx->grad +
3*(1+2*sixy))[1]) - ((sctx->grad + 3*(1+2*six))[1])) + ((
sctx->grad + 3*(1+2*six))[1])), (gxp)[2] = (((coords[1]))*
(((sctx->grad + 3*(1+2*sixy))[2]) - ((sctx->grad + 3*(1
+2*six))[2])) + ((sctx->grad + 3*(1+2*six))[2])))
680 sctx->grad + 3*(1+2*sixy))((gxp)[0] = (((coords[1]))*(((sctx->grad + 3*(1+2*sixy))[0
]) - ((sctx->grad + 3*(1+2*six))[0])) + ((sctx->grad + 3
*(1+2*six))[0])), (gxp)[1] = (((coords[1]))*(((sctx->grad +
3*(1+2*sixy))[1]) - ((sctx->grad + 3*(1+2*six))[1])) + ((
sctx->grad + 3*(1+2*six))[1])), (gxp)[2] = (((coords[1]))*
(((sctx->grad + 3*(1+2*sixy))[2]) - ((sctx->grad + 3*(1
+2*six))[2])) + ((sctx->grad + 3*(1+2*six))[2])))
;
681
682 ELL_3M_LERP(Tym, coords[0], sctx->t + 9*(1+2*si), sctx->t + 9*(1+2*six))((((Tym)+0)[0] = ((((coords[0])))*((((sctx->t + 9*(1+2*six
))+0)[0]) - (((sctx->t + 9*(1+2*si))+0)[0])) + (((sctx->
t + 9*(1+2*si))+0)[0])), ((Tym)+0)[1] = ((((coords[0])))*((((
sctx->t + 9*(1+2*six))+0)[1]) - (((sctx->t + 9*(1+2*si)
)+0)[1])) + (((sctx->t + 9*(1+2*si))+0)[1])), ((Tym)+0)[2]
= ((((coords[0])))*((((sctx->t + 9*(1+2*six))+0)[2]) - ((
(sctx->t + 9*(1+2*si))+0)[2])) + (((sctx->t + 9*(1+2*si
))+0)[2]))), (((Tym)+3)[0] = ((((coords[0])))*((((sctx->t +
9*(1+2*six))+3)[0]) - (((sctx->t + 9*(1+2*si))+3)[0])) + (
((sctx->t + 9*(1+2*si))+3)[0])), ((Tym)+3)[1] = ((((coords
[0])))*((((sctx->t + 9*(1+2*six))+3)[1]) - (((sctx->t +
9*(1+2*si))+3)[1])) + (((sctx->t + 9*(1+2*si))+3)[1])), (
(Tym)+3)[2] = ((((coords[0])))*((((sctx->t + 9*(1+2*six))+
3)[2]) - (((sctx->t + 9*(1+2*si))+3)[2])) + (((sctx->t +
9*(1+2*si))+3)[2]))), (((Tym)+6)[0] = ((((coords[0])))*((((sctx
->t + 9*(1+2*six))+6)[0]) - (((sctx->t + 9*(1+2*si))+6)
[0])) + (((sctx->t + 9*(1+2*si))+6)[0])), ((Tym)+6)[1] = (
(((coords[0])))*((((sctx->t + 9*(1+2*six))+6)[1]) - (((sctx
->t + 9*(1+2*si))+6)[1])) + (((sctx->t + 9*(1+2*si))+6)
[1])), ((Tym)+6)[2] = ((((coords[0])))*((((sctx->t + 9*(1+
2*six))+6)[2]) - (((sctx->t + 9*(1+2*si))+6)[2])) + (((sctx
->t + 9*(1+2*si))+6)[2]))))
;
683 ELL_3V_LERP(gym, coords[0], sctx->grad + 3*(1+2*si),((gym)[0] = (((coords[0]))*(((sctx->grad + 3*(1+2*six))[0]
) - ((sctx->grad + 3*(1+2*si))[0])) + ((sctx->grad + 3*
(1+2*si))[0])), (gym)[1] = (((coords[0]))*(((sctx->grad + 3
*(1+2*six))[1]) - ((sctx->grad + 3*(1+2*si))[1])) + ((sctx
->grad + 3*(1+2*si))[1])), (gym)[2] = (((coords[0]))*(((sctx
->grad + 3*(1+2*six))[2]) - ((sctx->grad + 3*(1+2*si))[
2])) + ((sctx->grad + 3*(1+2*si))[2])))
684 sctx->grad + 3*(1+2*six))((gym)[0] = (((coords[0]))*(((sctx->grad + 3*(1+2*six))[0]
) - ((sctx->grad + 3*(1+2*si))[0])) + ((sctx->grad + 3*
(1+2*si))[0])), (gym)[1] = (((coords[0]))*(((sctx->grad + 3
*(1+2*six))[1]) - ((sctx->grad + 3*(1+2*si))[1])) + ((sctx
->grad + 3*(1+2*si))[1])), (gym)[2] = (((coords[0]))*(((sctx
->grad + 3*(1+2*six))[2]) - ((sctx->grad + 3*(1+2*si))[
2])) + ((sctx->grad + 3*(1+2*si))[2])))
;
685 ELL_3M_LERP(Typ, coords[0], sctx->t + 9*(1+2*siy), sctx->t + 9*(1+2*sixy))((((Typ)+0)[0] = ((((coords[0])))*((((sctx->t + 9*(1+2*sixy
))+0)[0]) - (((sctx->t + 9*(1+2*siy))+0)[0])) + (((sctx->
t + 9*(1+2*siy))+0)[0])), ((Typ)+0)[1] = ((((coords[0])))*(((
(sctx->t + 9*(1+2*sixy))+0)[1]) - (((sctx->t + 9*(1+2*siy
))+0)[1])) + (((sctx->t + 9*(1+2*siy))+0)[1])), ((Typ)+0)[
2] = ((((coords[0])))*((((sctx->t + 9*(1+2*sixy))+0)[2]) -
(((sctx->t + 9*(1+2*siy))+0)[2])) + (((sctx->t + 9*(1+
2*siy))+0)[2]))), (((Typ)+3)[0] = ((((coords[0])))*((((sctx->
t + 9*(1+2*sixy))+3)[0]) - (((sctx->t + 9*(1+2*siy))+3)[0]
)) + (((sctx->t + 9*(1+2*siy))+3)[0])), ((Typ)+3)[1] = (((
(coords[0])))*((((sctx->t + 9*(1+2*sixy))+3)[1]) - (((sctx
->t + 9*(1+2*siy))+3)[1])) + (((sctx->t + 9*(1+2*siy))+
3)[1])), ((Typ)+3)[2] = ((((coords[0])))*((((sctx->t + 9*(
1+2*sixy))+3)[2]) - (((sctx->t + 9*(1+2*siy))+3)[2])) + ((
(sctx->t + 9*(1+2*siy))+3)[2]))), (((Typ)+6)[0] = ((((coords
[0])))*((((sctx->t + 9*(1+2*sixy))+6)[0]) - (((sctx->t +
9*(1+2*siy))+6)[0])) + (((sctx->t + 9*(1+2*siy))+6)[0])),
((Typ)+6)[1] = ((((coords[0])))*((((sctx->t + 9*(1+2*sixy
))+6)[1]) - (((sctx->t + 9*(1+2*siy))+6)[1])) + (((sctx->
t + 9*(1+2*siy))+6)[1])), ((Typ)+6)[2] = ((((coords[0])))*(((
(sctx->t + 9*(1+2*sixy))+6)[2]) - (((sctx->t + 9*(1+2*siy
))+6)[2])) + (((sctx->t + 9*(1+2*siy))+6)[2]))))
;
686 ELL_3V_LERP(gyp, coords[0], sctx->grad + 3*(1+2*siy),((gyp)[0] = (((coords[0]))*(((sctx->grad + 3*(1+2*sixy))[0
]) - ((sctx->grad + 3*(1+2*siy))[0])) + ((sctx->grad + 3
*(1+2*siy))[0])), (gyp)[1] = (((coords[0]))*(((sctx->grad +
3*(1+2*sixy))[1]) - ((sctx->grad + 3*(1+2*siy))[1])) + ((
sctx->grad + 3*(1+2*siy))[1])), (gyp)[2] = (((coords[0]))*
(((sctx->grad + 3*(1+2*sixy))[2]) - ((sctx->grad + 3*(1
+2*siy))[2])) + ((sctx->grad + 3*(1+2*siy))[2])))
687 sctx->grad + 3*(1+2*sixy))((gyp)[0] = (((coords[0]))*(((sctx->grad + 3*(1+2*sixy))[0
]) - ((sctx->grad + 3*(1+2*siy))[0])) + ((sctx->grad + 3
*(1+2*siy))[0])), (gyp)[1] = (((coords[0]))*(((sctx->grad +
3*(1+2*sixy))[1]) - ((sctx->grad + 3*(1+2*siy))[1])) + ((
sctx->grad + 3*(1+2*siy))[1])), (gyp)[2] = (((coords[0]))*
(((sctx->grad + 3*(1+2*sixy))[2]) - ((sctx->grad + 3*(1
+2*siy))[2])) + ((sctx->grad + 3*(1+2*siy))[2])))
;
688
689 ELL_3M_LERP(T, coords[0], Txm, Txp)((((T)+0)[0] = ((((coords[0])))*((((Txp)+0)[0]) - (((Txm)+0)[
0])) + (((Txm)+0)[0])), ((T)+0)[1] = ((((coords[0])))*((((Txp
)+0)[1]) - (((Txm)+0)[1])) + (((Txm)+0)[1])), ((T)+0)[2] = ((
((coords[0])))*((((Txp)+0)[2]) - (((Txm)+0)[2])) + (((Txm)+0)
[2]))), (((T)+3)[0] = ((((coords[0])))*((((Txp)+3)[0]) - (((Txm
)+3)[0])) + (((Txm)+3)[0])), ((T)+3)[1] = ((((coords[0])))*((
((Txp)+3)[1]) - (((Txm)+3)[1])) + (((Txm)+3)[1])), ((T)+3)[2]
= ((((coords[0])))*((((Txp)+3)[2]) - (((Txm)+3)[2])) + (((Txm
)+3)[2]))), (((T)+6)[0] = ((((coords[0])))*((((Txp)+6)[0]) - (
((Txm)+6)[0])) + (((Txm)+6)[0])), ((T)+6)[1] = ((((coords[0])
))*((((Txp)+6)[1]) - (((Txm)+6)[1])) + (((Txm)+6)[1])), ((T)+
6)[2] = ((((coords[0])))*((((Txp)+6)[2]) - (((Txm)+6)[2])) + (
((Txm)+6)[2]))))
;
690 ELL_3V_LERP(g, coords[0], gxm, gxp)((g)[0] = (((coords[0]))*(((gxp)[0]) - ((gxm)[0])) + ((gxm)[0
])), (g)[1] = (((coords[0]))*(((gxp)[1]) - ((gxm)[1])) + ((gxm
)[1])), (g)[2] = (((coords[0]))*(((gxp)[2]) - ((gxm)[2])) + (
(gxm)[2])))
;
691
692 computeGradientLin(sctx->facenorm+3*(faceid+4*si), T, g,
693 Txm, gxm, Txp, gxp,
694 Tym, gym, Typ, gyp,
695 Tzm, gzm, T, g);
696 break;
697 }
698 ELL_3V_COPY(res, sctx->facenorm+3*(faceid+4*si))((res)[0] = (sctx->facenorm+3*(faceid+4*si))[0], (res)[1] =
(sctx->facenorm+3*(faceid+4*si))[1], (res)[2] = (sctx->
facenorm+3*(faceid+4*si))[2])
;
699}
700
701/* small helper routines: intersection tests */
702
703/* check if a given 2D triangle is oriented clockwise (-1)
704 * or counter-clockwise (1).
705 * returns 0 if given points are collinear */
706static int
707checkTriOrientation (double *p1, double *p2, double *p3) {
708 double test = (((p2[0]-p1[0])*(p3[1]-p1[1])) - ((p3[0]-p1[0])*(p2[1]-p1[1])));
709 if (test > 0) return 1;
710 else if (test < 0) return -1;
711 else return 0;
712}
713
714/* check if two given 2D lines intersect */
715static int
716lineIntersectionTest (double *l1p1, double *l1p2, double *l2p1, double *l2p2) {
717 int or1 = checkTriOrientation(l1p1, l1p2, l2p1);
718 int or2 = checkTriOrientation(l1p1, l1p2, l2p2);
719 if (or1 != or2) {
720 or1 = checkTriOrientation(l2p1, l2p2, l1p1);
721 or2 = checkTriOrientation(l2p1, l2p2, l1p2);
722 if (or1 != or2)
723 return 1;
724 }
725 return 0;
726}
727
728/* check if two given 3D triangles intersect */
729static int
730triIntersectionTest (double *t1v1, double *t1v2, double *t1v3,
731 double *t2v1, double *t2v2, double *t2v3) {
732 double n1[3], n2[3], d1, d2;
733 double diff1[3], diff2[3];
734 double t2sd1, t2sd2, t2sd3;
735 ELL_3V_SUB(diff1, t1v2, t1v1)((diff1)[0] = (t1v2)[0] - (t1v1)[0], (diff1)[1] = (t1v2)[1] -
(t1v1)[1], (diff1)[2] = (t1v2)[2] - (t1v1)[2])
;
736 ELL_3V_SUB(diff2, t1v3, t1v1)((diff2)[0] = (t1v3)[0] - (t1v1)[0], (diff2)[1] = (t1v3)[1] -
(t1v1)[1], (diff2)[2] = (t1v3)[2] - (t1v1)[2])
;
737 ELL_3V_CROSS(n1,diff1,diff2)((n1)[0] = (diff1)[1]*(diff2)[2] - (diff1)[2]*(diff2)[1], (n1
)[1] = (diff1)[2]*(diff2)[0] - (diff1)[0]*(diff2)[2], (n1)[2]
= (diff1)[0]*(diff2)[1] - (diff1)[1]*(diff2)[0])
;
738 d1=-ELL_3V_DOT(n1,t1v1)((n1)[0]*(t1v1)[0] + (n1)[1]*(t1v1)[1] + (n1)[2]*(t1v1)[2]);
739
740 /* compute scaled signed distances of t2 to plane of t1 */
741 t2sd1 = ELL_3V_DOT(n1, t2v1)((n1)[0]*(t2v1)[0] + (n1)[1]*(t2v1)[1] + (n1)[2]*(t2v1)[2])+d1;
742 t2sd2 = ELL_3V_DOT(n1, t2v2)((n1)[0]*(t2v2)[0] + (n1)[1]*(t2v2)[1] + (n1)[2]*(t2v2)[2])+d1;
743 t2sd3 = ELL_3V_DOT(n1, t2v3)((n1)[0]*(t2v3)[0] + (n1)[1]*(t2v3)[1] + (n1)[2]*(t2v3)[2])+d1;
744
745 if (t2sd1==0 && t2sd2==0 && t2sd3==0) {
746 /* coplanar case: handle in 2D */
747 double t1v12d[2], t1v22d[2], t1v32d[2], t2v12d[2], t2v22d[2], t2v32d[2];
748 if (fabs(n1[0])>=fabs(n1[1]) && fabs(n1[0])>=fabs(n1[2])) {
749 t1v12d[0]=t1v1[1]; t1v12d[1]=t1v1[2];
750 t1v22d[0]=t1v2[1]; t1v22d[1]=t1v2[2];
751 t1v32d[0]=t1v3[1]; t1v32d[1]=t1v3[2];
752 t2v12d[0]=t2v1[1]; t2v12d[1]=t2v1[2];
753 t2v22d[0]=t2v2[1]; t2v22d[1]=t2v2[2];
754 t2v32d[0]=t2v3[1]; t2v32d[1]=t2v3[2];
755 } else if (fabs(n1[1])>=fabs(n1[0]) && fabs(n1[1])>=fabs(n1[2])) {
756 t1v12d[0]=t1v1[0]; t1v12d[1]=t1v1[2];
757 t1v22d[0]=t1v2[0]; t1v22d[1]=t1v2[2];
758 t1v32d[0]=t1v3[0]; t1v32d[1]=t1v3[2];
759 t2v12d[0]=t2v1[0]; t2v12d[1]=t2v1[2];
760 t2v22d[0]=t2v2[0]; t2v22d[1]=t2v2[2];
761 t2v32d[0]=t2v3[0]; t2v32d[1]=t2v3[2];
762 } else {
763 t1v12d[0]=t1v1[0]; t1v12d[1]=t1v1[1];
764 t1v22d[0]=t1v2[0]; t1v22d[1]=t1v2[1];
765 t1v32d[0]=t1v3[0]; t1v32d[1]=t1v3[1];
766 t2v12d[0]=t2v1[0]; t2v12d[1]=t2v1[1];
767 t2v22d[0]=t2v2[0]; t2v22d[1]=t2v2[1];
768 t2v32d[0]=t2v3[0]; t2v32d[1]=t2v3[1];
769 }
770 /* we may assume that none of the triangles is fully contained
771 * within the other. Thus, it suffices to do a lot of 2D line-line
772 * intersections */
773 if (lineIntersectionTest(t1v12d, t1v22d, t2v12d, t2v22d) ||
774 lineIntersectionTest(t1v22d, t1v32d, t2v12d, t2v22d) ||
775 lineIntersectionTest(t1v32d, t1v12d, t2v12d, t2v22d) ||
776 lineIntersectionTest(t1v12d, t1v22d, t2v22d, t2v32d) ||
777 lineIntersectionTest(t1v22d, t1v32d, t2v22d, t2v32d) ||
778 lineIntersectionTest(t1v32d, t1v12d, t2v22d, t2v32d) ||
779 lineIntersectionTest(t1v12d, t1v22d, t2v32d, t2v12d) ||
780 lineIntersectionTest(t1v22d, t1v32d, t2v32d, t2v12d) ||
781 lineIntersectionTest(t1v32d, t1v12d, t2v32d, t2v12d))
782 return 1;
783 return 0;
784 } else {
785 /* pointers to the vertices on the same side / opposite side of plane */
786 double *t2s11, *t2s12, *t2s2, t2s11sd, t2s12sd, t2s2sd;
787 double t1sd1, t1sd2, t1sd3;
788 double *t1s11, *t1s12, *t1s2, t1s11sd, t1s12sd, t1s2sd;
789 double t1p11, t1p12, t1p2, t2p11, t2p12, t2p2;
790 double D[3]; /* direction vector of line */
791 double t1t1, t1t2, t2t1, t2t2;
792 if (t2sd1*t2sd2>=0 && t2sd1*t2sd3<=0) {
793 t2s11=t2v1; t2s12=t2v2; t2s2=t2v3; t2s11sd=t2sd1;
794 t2s12sd=t2sd2; t2s2sd=t2sd3;
795 } else if (t2sd1*t2sd3>=0 && t2sd1*t2sd2<=0) {
796 t2s11=t2v1; t2s12=t2v3; t2s2=t2v2; t2s11sd=t2sd1;
797 t2s12sd=t2sd3; t2s2sd=t2sd2;
798 } else if (t2sd2*t2sd3>=0 && t2sd1*t2sd2<=0) {
799 t2s11=t2v2; t2s12=t2v3; t2s2=t2v1; t2s11sd=t2sd2;
800 t2s12sd=t2sd3; t2s2sd=t2sd1;
801 } else
802 return 0; /* all on the same side; no intersection */
803
804 /* same game for triangle 2 */
805 ELL_3V_SUB(diff1, t2v2, t2v1)((diff1)[0] = (t2v2)[0] - (t2v1)[0], (diff1)[1] = (t2v2)[1] -
(t2v1)[1], (diff1)[2] = (t2v2)[2] - (t2v1)[2])
;
806 ELL_3V_SUB(diff2, t2v3, t2v1)((diff2)[0] = (t2v3)[0] - (t2v1)[0], (diff2)[1] = (t2v3)[1] -
(t2v1)[1], (diff2)[2] = (t2v3)[2] - (t2v1)[2])
;
807 ELL_3V_CROSS(n2, diff1, diff2)((n2)[0] = (diff1)[1]*(diff2)[2] - (diff1)[2]*(diff2)[1], (n2
)[1] = (diff1)[2]*(diff2)[0] - (diff1)[0]*(diff2)[2], (n2)[2]
= (diff1)[0]*(diff2)[1] - (diff1)[1]*(diff2)[0])
;
808 d2=-ELL_3V_DOT(n2,t2v1)((n2)[0]*(t2v1)[0] + (n2)[1]*(t2v1)[1] + (n2)[2]*(t2v1)[2]);
809 t1sd1 = ELL_3V_DOT(n2, t1v1)((n2)[0]*(t1v1)[0] + (n2)[1]*(t1v1)[1] + (n2)[2]*(t1v1)[2])+d2;
810 t1sd2 = ELL_3V_DOT(n2, t1v2)((n2)[0]*(t1v2)[0] + (n2)[1]*(t1v2)[1] + (n2)[2]*(t1v2)[2])+d2;
811 t1sd3 = ELL_3V_DOT(n2, t1v3)((n2)[0]*(t1v3)[0] + (n2)[1]*(t1v3)[1] + (n2)[2]*(t1v3)[2])+d2;
812 if (t1sd1*t1sd2>=0 && t1sd1*t1sd3<=0) {
813 t1s11=t1v1; t1s12=t1v2; t1s2=t1v3; t1s11sd=t1sd1;
814 t1s12sd=t1sd2; t1s2sd=t1sd3;
815 } else if (t1sd1*t1sd3>=0 && t1sd1*t1sd2<=0) {
816 t1s11=t1v1; t1s12=t1v3; t1s2=t1v2; t1s11sd=t1sd1;
817 t1s12sd=t1sd3; t1s2sd=t1sd2;
818 } else if (t1sd2*t1sd3>=0 && t1sd1*t1sd2<=0) {
819 t1s11=t1v2; t1s12=t1v3; t1s2=t1v1; t1s11sd=t1sd2;
820 t1s12sd=t1sd3; t1s2sd=t1sd1;
821 } else
822 return 0; /* all on the same side; no intersection */
823
824 /* both planes intersect in a line; check if the intervals on that
825 * line intersect */
826 ELL_3V_CROSS(D,n1,n2)((D)[0] = (n1)[1]*(n2)[2] - (n1)[2]*(n2)[1], (D)[1] = (n1)[2]
*(n2)[0] - (n1)[0]*(n2)[2], (D)[2] = (n1)[0]*(n2)[1] - (n1)[1
]*(n2)[0])
;
827 /* we are only interested in component magnitudes */
828 D[0]=fabs(D[0]); D[1]=fabs(D[1]); D[2]=fabs(D[2]);
829 if (D[0]>=D[1] && D[0]>=D[2]) {
830 t1p11=t1s11[0]; t1p12=t1s12[0]; t1p2=t1s2[0];
831 t2p11=t2s11[0]; t2p12=t2s12[0]; t2p2=t2s2[0];
832 } else if (D[1]>=D[0] && D[1]>=D[2]) {
833 t1p11=t1s11[1]; t1p12=t1s12[1]; t1p2=t1s2[1];
834 t2p11=t2s11[1]; t2p12=t2s12[1]; t2p2=t2s2[1];
835 } else {
836 t1p11=t1s11[2]; t1p12=t1s12[2]; t1p2=t1s2[2];
837 t2p11=t2s11[2]; t2p12=t2s12[2]; t2p2=t2s2[2];
838 }
839 /* compute interval boundaries */
840 t1t1=t1p11+(t1p2-t1p11)*t1s11sd/(t1s11sd-t1s2sd);
841 t1t2=t1p12+(t1p2-t1p12)*t1s12sd/(t1s12sd-t1s2sd);
842 if (t1t1>t1t2) {
843 double help=t1t1;
844 t1t1=t1t2;
845 t1t2=help;
846 }
847 t2t1=t2p11+(t2p2-t2p11)*t2s11sd/(t2s11sd-t2s2sd);
848 t2t2=t2p12+(t2p2-t2p12)*t2s12sd/(t2s12sd-t2s2sd);
849 if (t2t1>t2t2) {
850 double help=t2t1;
851 t2t1=t2t2;
852 t2t2=help;
853 }
854 /* test for interval intersection */
855 if (t2t1>t1t2 || t1t1>t2t2) return 0;
856 return 1;
857 }
858}
859
860/* Score possible local topologies based on the agreement of
861 * connecting lines with normal directions. Lower scores are
862 * better. */
863
864/* Connections between degenerate points on cell faces; if only four
865 * degenerate points are present, set p31 to NULL */
866static double
867evaluateDegConnection(double *p11, double *p12, double *p13, double *p14,
868 double *p21, double *p22, double *p23, double *p24,
869 double *p31, double *p32, double *p33, double *p34,
870 double *n12, double *n13, double *n22, double *n23,
871 double *n32, double *n33) {
872 double diff1[3], diff2[3], diff3[3], ret;
873 /* first, perform intersection testing */
874 if (triIntersectionTest(p11, p12, p13, p21, p22, p23) ||
875 triIntersectionTest(p13, p14, p11, p21, p22, p23) ||
876 triIntersectionTest(p11, p12, p13, p23, p24, p21) ||
877 triIntersectionTest(p13, p14, p11, p23, p24, p21))
878 return 1e20;
879 if (p31 != NULL((void*)0)) { /* three pairs - some more to do */
880 if (triIntersectionTest(p11, p12, p13, p31, p32, p33) ||
881 triIntersectionTest(p11, p12, p13, p33, p34, p31) ||
882 triIntersectionTest(p13, p14, p11, p31, p32, p33) ||
883 triIntersectionTest(p13, p14, p11, p33, p34, p31) ||
884 triIntersectionTest(p21, p22, p23, p31, p32, p33) ||
885 triIntersectionTest(p21, p22, p23, p33, p34, p31) ||
886 triIntersectionTest(p23, p24, p21, p31, p32, p33) ||
887 triIntersectionTest(p23, p24, p21, p33, p34, p31))
888 return 1e20;
889 }
890 ELL_3V_SUB(diff1,p13,p12)((diff1)[0] = (p13)[0] - (p12)[0], (diff1)[1] = (p13)[1] - (p12
)[1], (diff1)[2] = (p13)[2] - (p12)[2])
;
891 ELL_3V_SUB(diff2,p23,p22)((diff2)[0] = (p23)[0] - (p22)[0], (diff2)[1] = (p23)[1] - (p22
)[1], (diff2)[2] = (p23)[2] - (p22)[2])
;
892 ret=fabs(ELL_3V_DOT(diff1,n12)((diff1)[0]*(n12)[0] + (diff1)[1]*(n12)[1] + (diff1)[2]*(n12)
[2])
)+fabs(ELL_3V_DOT(diff1,n13)((diff1)[0]*(n13)[0] + (diff1)[1]*(n13)[1] + (diff1)[2]*(n13)
[2])
)+
893 fabs(ELL_3V_DOT(diff2,n22)((diff2)[0]*(n22)[0] + (diff2)[1]*(n22)[1] + (diff2)[2]*(n22)
[2])
)+fabs(ELL_3V_DOT(diff2,n23)((diff2)[0]*(n23)[0] + (diff2)[1]*(n23)[1] + (diff2)[2]*(n23)
[2])
);
894 if (p31 != NULL((void*)0)) {
895 ELL_3V_SUB(diff3,p33,p32)((diff3)[0] = (p33)[0] - (p32)[0], (diff3)[1] = (p33)[1] - (p32
)[1], (diff3)[2] = (p33)[2] - (p32)[2])
;
896 ret+=fabs(ELL_3V_DOT(diff3,n32)((diff3)[0]*(n32)[0] + (diff3)[1]*(n32)[1] + (diff3)[2]*(n32)
[2])
)+fabs(ELL_3V_DOT(diff3,n33)((diff3)[0]*(n33)[0] + (diff3)[1]*(n33)[1] + (diff3)[2]*(n33)
[2])
);
897 }
898 return ret;
899}
900
901/* suggests a connectivity for a non-trivial combination of
902 * intersection points in the plane.
903 * pairs is output (permutation of idcs)
904 * bestval is input/output (best value so far, start with something big)
905 * ct is the number of points (currently assumed even)
906 * idcs is input (idcs that still need to be permuted)
907 * fixedct is input (number of idcs that are already fixed at this depth)
908 * coords is an array of 2D coordinates
909 * norms is an array of 2D vectors */
910static void
911findConnectivity(signed char *pairs, double *bestval, int ct, char *idcs,
912 int fixedct, double *coords, double *norms) {
913 int i,j;
914 if (fixedct==ct) {
915 double weight=0;
916 for (i=0; i<ct-1; i+=2) {
917 double diff[2];
918 ELL_2V_SUB(diff,coords+2*idcs[i],coords+2*idcs[i+1])((diff)[0] = (coords+2*idcs[i])[0] - (coords+2*idcs[i+1])[0],
(diff)[1] = (coords+2*idcs[i])[1] - (coords+2*idcs[i+1])[1])
;
919 weight+=fabs(ELL_2V_DOT(diff,norms+2*idcs[i])((diff)[0]*(norms+2*idcs[i])[0] + (diff)[1]*(norms+2*idcs[i])
[1])
)+
920 fabs(ELL_2V_DOT(diff,norms+2*idcs[i+1])((diff)[0]*(norms+2*idcs[i+1])[0] + (diff)[1]*(norms+2*idcs[i
+1])[1])
);
921 }
922 if (weight<*bestval) {
923 *bestval=weight;
924 memcpy(pairs,idcs,sizeof(char)*ct)__builtin___memcpy_chk (pairs, idcs, sizeof(char)*ct, __builtin_object_size
(pairs, 0))
;
925 }
926 return;
927 }
928 /* else: we need a recursion */
929 for (i=fixedct+1; i<ct; i++) {
930 int intersect=0;
931 char *idxnew;
932 if (NULL((void*)0) == (idxnew = (char*) malloc (sizeof(char)*ct)))
933 return;
934 memcpy(idxnew,idcs,sizeof(char)*ct)__builtin___memcpy_chk (idxnew, idcs, sizeof(char)*ct, __builtin_object_size
(idxnew, 0))
;
935 /* try any of the remaining indices as a pair */
936 idxnew[fixedct+1]=idcs[i];
937 idxnew[i]=idcs[fixedct+1];
938 /* check if the resulting line causes an intersection */
939 for (j=0;j<fixedct;j+=2) {
940 if (lineIntersectionTest(coords+2*idxnew[fixedct],
941 coords+2*idxnew[fixedct+1],
942 coords+2*idxnew[j],coords+2*idxnew[j+1])) {
943 intersect=1;
944 break;
945 }
946 }
947 if (!intersect) {
948 findConnectivity(pairs, bestval, ct, idxnew, fixedct+2, coords, norms);
949 }
950 free(idxnew);
951 }
952}
953
954#define _SEEK_TREATED_REQUEST0x01 0x01 /* this voxel has to be treated */
955#define _SEEK_TREATED_EDGE00x02 0x02 /* unique edge 0 has been treated */
956#define _SEEK_TREATED_EDGE10x04 0x04 /* unique edge 1 has been treated */
957#define _SEEK_TREATED_EDGE20x08 0x08 /* unique edge 2 has been treated */
958#define _SEEK_TREATED_EDGE30x10 0x10 /* unique edge 3 has been treated */
959#define _SEEK_TREATED_EDGE40x20 0x20 /* unique edge 4 has been treated */
960#define _SEEK_TREATED_FACE30x40 0x40 /* unique face 3 has been treated */
961
962/* find deg. points, normals, and connectivity on a given (unique) face
963 * now refines the search if it couldn't find a degenerate point */
964static void
965connectFace(seekContext *sctx, baggage *bag,
966 unsigned int xi, unsigned int yi, unsigned char faceid) {
967 int edgeid[4][4]={{0, 2, 3, 1}, /* which edges belong to which unique face? */
968 {0, 5, 8, 4},
969 {1, 6, 9, 4},
970 {8,10,11, 9}};
971 unsigned int sx = AIR_CAST(unsigned int, sctx->sx)((unsigned int)(sctx->sx));
972 unsigned int si = xi + sx*yi;
973 unsigned int six = xi + 1 + sx*yi;
974 unsigned int siy = xi + sx*(yi+1);
975 unsigned int sixy = xi + 1 + sx*(yi+1);
976 char inter[12]; /* indices of intersections */
977 int pass; /* allow multiple refined passes */
978 int i;
979 /* voxel in which treated information is stored for local edge i */
980 /* which vertices form which unique face? */
981 int verti[4][4];
982 int voxel[4][4];
983 /* mask for treated information in the above voxel */
984 char mask[4][4]={{_SEEK_TREATED_EDGE00x02, _SEEK_TREATED_EDGE10x04,
985 _SEEK_TREATED_EDGE00x02, _SEEK_TREATED_EDGE10x04},
986 {_SEEK_TREATED_EDGE00x02, _SEEK_TREATED_EDGE20x08,
987 _SEEK_TREATED_EDGE30x10, _SEEK_TREATED_EDGE20x08},
988 {_SEEK_TREATED_EDGE10x04, _SEEK_TREATED_EDGE20x08,
989 _SEEK_TREATED_EDGE40x20, _SEEK_TREATED_EDGE20x08},
990 {_SEEK_TREATED_EDGE30x10, _SEEK_TREATED_EDGE40x20,
991 _SEEK_TREATED_EDGE30x10, _SEEK_TREATED_EDGE40x20}};
992 /* start- and endpoints of the edges */
993 int verts[4][4], verte[4][4];
994 char treat[4]={0,0,0,0};
995 double dpthresh[3]={0.7,0.8,0.9};
996 /* candidates for degenerate points */
997 double candidates[18]={0.5,0.5, 0.25,0.25, 0.25,0.75,
998 0.75,0.25, 0.75,0.75, 0.5,0.25,
999 0.25,0.5, 0.75,0.5, 0.6,0.75};
1000 int cand_idx[4]={0, 1, 5, 9};
1001 int interct;
1002
1003 /* apparently, some C compilers cannot make these initializations in-place */
1004 ELL_4V_SET(verti[0], 0+2*si, 0+2*six, 0+2*siy, 0+2*sixy)((verti[0])[0] = (0+2*si), (verti[0])[1] = (0+2*six), (verti[
0])[2] = (0+2*siy), (verti[0])[3] = (0+2*sixy))
;
1005 ELL_4V_SET(verti[1], 0+2*si, 0+2*six, 1+2*si, 1+2*six)((verti[1])[0] = (0+2*si), (verti[1])[1] = (0+2*six), (verti[
1])[2] = (1+2*si), (verti[1])[3] = (1+2*six))
;
1006 ELL_4V_SET(verti[2], 0+2*si, 0+2*siy, 1+2*si, 1+2*siy)((verti[2])[0] = (0+2*si), (verti[2])[1] = (0+2*siy), (verti[
2])[2] = (1+2*si), (verti[2])[3] = (1+2*siy))
;
1007 ELL_4V_SET(verti[3], 1+2*si, 1+2*six, 1+2*siy, 1+2*sixy)((verti[3])[0] = (1+2*si), (verti[3])[1] = (1+2*six), (verti[
3])[2] = (1+2*siy), (verti[3])[3] = (1+2*sixy))
;
1008 ELL_4V_SET(voxel[0], si, six, siy, si)((voxel[0])[0] = (si), (voxel[0])[1] = (six), (voxel[0])[2] =
(siy), (voxel[0])[3] = (si))
;
1009 ELL_4V_SET(voxel[1], si, six, si, si)((voxel[1])[0] = (si), (voxel[1])[1] = (six), (voxel[1])[2] =
(si), (voxel[1])[3] = (si))
;
1010 ELL_4V_SET(voxel[2], si, siy, si, si)((voxel[2])[0] = (si), (voxel[2])[1] = (siy), (voxel[2])[2] =
(si), (voxel[2])[3] = (si))
;
1011 ELL_4V_SET(voxel[3], si, six, siy, si)((voxel[3])[0] = (si), (voxel[3])[1] = (six), (voxel[3])[2] =
(siy), (voxel[3])[3] = (si))
;
1012 ELL_4V_SET(verts[0], 0+2*si, 0+2*six, 0+2*siy, 0+2*si)((verts[0])[0] = (0+2*si), (verts[0])[1] = (0+2*six), (verts[
0])[2] = (0+2*siy), (verts[0])[3] = (0+2*si))
;
1013 ELL_4V_SET(verts[1], 0+2*si, 0+2*six, 1+2*si, 0+2*si)((verts[1])[0] = (0+2*si), (verts[1])[1] = (0+2*six), (verts[
1])[2] = (1+2*si), (verts[1])[3] = (0+2*si))
;
1014 ELL_4V_SET(verts[2], 0+2*si, 0+2*siy, 1+2*si, 0+2*si)((verts[2])[0] = (0+2*si), (verts[2])[1] = (0+2*siy), (verts[
2])[2] = (1+2*si), (verts[2])[3] = (0+2*si))
;
1015 ELL_4V_SET(verts[3], 1+2*si, 1+2*six, 1+2*siy, 1+2*si)((verts[3])[0] = (1+2*si), (verts[3])[1] = (1+2*six), (verts[
3])[2] = (1+2*siy), (verts[3])[3] = (1+2*si))
;
1016 ELL_4V_SET(verte[0], 0+2*six, 0+2*sixy, 0+2*sixy, 0+2*siy)((verte[0])[0] = (0+2*six), (verte[0])[1] = (0+2*sixy), (verte
[0])[2] = (0+2*sixy), (verte[0])[3] = (0+2*siy))
;
1017 ELL_4V_SET(verte[1], 0+2*six, 1+2*six, 1+2*six, 1+2*si)((verte[1])[0] = (0+2*six), (verte[1])[1] = (1+2*six), (verte
[1])[2] = (1+2*six), (verte[1])[3] = (1+2*si))
;
1018 ELL_4V_SET(verte[2], 0+2*siy, 1+2*siy, 1+2*siy, 1+2*si)((verte[2])[0] = (0+2*siy), (verte[2])[1] = (1+2*siy), (verte
[2])[2] = (1+2*siy), (verte[2])[3] = (1+2*si))
;
1019 ELL_4V_SET(verte[3], 1+2*six, 1+2*sixy, 1+2*sixy, 1+2*siy)((verte[3])[0] = (1+2*six), (verte[3])[1] = (1+2*sixy), (verte
[3])[2] = (1+2*sixy), (verte[3])[3] = (1+2*siy))
;
1020
1021 /* find out which edges have not yet been treated */
1022 for (i=0; i<4; i++) {
1023 if (!(sctx->treated[voxel[faceid][i]]&mask[faceid][i])) {
1024 treat[i]=1; /* we need to treat this */
1025 sctx->treated[voxel[faceid][i]] |= mask[faceid][i];
1026 }
1027 }
1028
1029 for (pass=0; pass<3; pass++) {
1030 /* first, find intersections for edges that need treatment */
1031 int j;
1032 for (j=0; j<4; j++) {
1033 double interpos[8];
1034 if (!treat[j]) continue;
1035 interct=findFeatureIntersection(interpos,
1036 sctx->t + 9*verts[faceid][j],
1037 sctx->hess + 9*verts[faceid][j],
1038 sctx->grad + 3*verts[faceid][j],
1039 sctx->t + 9*verte[faceid][j],
1040 sctx->hess + 9*verte[faceid][j],
1041 sctx->grad + 3*verte[faceid][j],
1042 0.0, 1.0, bag->esIdx==2,
1043 sctx->evalDiffThresh,
1044 dpthresh[pass]);
1045 if (interct>3) interct=3;
1046 for (i=0; i<interct; i++) {
1047 double x=0, y=0, z=0; unsigned int xb=0, yb=0, idb=0;
1048 sctx->edgealpha[3*(bag->evti[edgeid[faceid][j]]+5*si)+i] = interpos[i];
1049 switch (edgeid[faceid][j]) {
1050 case 0: x=xi+interpos[i]; y=yi; z=bag->zi;
1051 xb=xi; yb=yi; idb=0; break;
1052 case 1: x=xi; y=yi+interpos[i]; z=bag->zi;
1053 xb=xi; yb=yi; idb=1; break;
1054 case 2: x=xi+1; y=yi+interpos[i]; z=bag->zi;
1055 xb=xi+1; yb=yi; idb=1; break;
1056 case 3: x=xi+interpos[i]; y=yi+1; z=bag->zi;
1057 xb=xi; yb=yi+1; idb=0; break;
1058 case 4: x=xi; y=yi; z=bag->zi+interpos[i];
1059 xb=xi; yb=yi; idb=2; break;
1060 case 5: x=xi+1; y=yi; z=bag->zi+interpos[i];
1061 xb=xi+1; yb=yi; idb=2; break;
1062 case 6: x=xi; y=yi+1; z=bag->zi+interpos[i];
1063 xb=xi; yb=yi+1; idb=2; break;
1064 case 7: x=xi+1; y=yi+1; z=bag->zi+interpos[i];
1065 xb=xi+1; yb=yi+1; idb=2; break;
1066 case 8: x=xi+interpos[i]; y=yi; z=bag->zi+1;
1067 xb=xi; yb=yi; idb=3; break;
1068 case 9: x=xi; y=yi+interpos[i]; z=bag->zi+1;
1069 xb=xi; yb=yi; idb=4; break;
1070 case 10: x=xi+1; y=yi+interpos[i]; z=bag->zi+1;
1071 xb=xi+1; yb=yi; idb=4; break;
1072 case 11: x=xi+interpos[i]; y=yi+1; z=bag->zi+1;
1073 xb=xi; yb=yi+1; idb=3; break;
1074 }
1075 ELL_3V_SET(sctx->edgeicoord+9*(bag->evti[edgeid[faceid][j]]+5*si)+3*i,((sctx->edgeicoord+9*(bag->evti[edgeid[faceid][j]]+5*si
)+3*i)[0] = (x), (sctx->edgeicoord+9*(bag->evti[edgeid[
faceid][j]]+5*si)+3*i)[1] = (y), (sctx->edgeicoord+9*(bag->
evti[edgeid[faceid][j]]+5*si)+3*i)[2] = (z))
1076 x, y, z)((sctx->edgeicoord+9*(bag->evti[edgeid[faceid][j]]+5*si
)+3*i)[0] = (x), (sctx->edgeicoord+9*(bag->evti[edgeid[
faceid][j]]+5*si)+3*i)[1] = (y), (sctx->edgeicoord+9*(bag->
evti[edgeid[faceid][j]]+5*si)+3*i)[2] = (z))
;
1077 computeEdgeGradient(sctx, bag, sctx->edgenorm+
1078 9*(bag->evti[edgeid[faceid][j]]+5*si)+3*i,
1079 xb, yb, idb, interpos[i]);
1080 }
1081 }
1082
1083 interct=0; /* number of feature intersections */
1084 for (i=0; i<3; i++) {
1085 if (sctx->edgealpha[3*(bag->evti[edgeid[faceid][0]]+5*si)+i]>=0)
1086 inter[interct++]=i; /* numbering is local w.r.t. face */
1087 if (sctx->edgealpha[3*(bag->evti[edgeid[faceid][1]]+5*si)+i]>=0)
1088 inter[interct++]=3+i;
1089 if (sctx->edgealpha[3*(bag->evti[edgeid[faceid][2]]+5*si)+i]>=0)
1090 inter[interct++]=6+i;
1091 if (sctx->edgealpha[3*(bag->evti[edgeid[faceid][3]]+5*si)+i]>=0)
1092 inter[interct++]=9+i;
1093 }
1094 if (interct%2==1) { /* we need to look for a degeneracy */
1095 int k;
1096 for (k=cand_idx[pass]; k<cand_idx[pass+1]; k++) {
1097 ELL_2V_SET(sctx->facecoord+2*(faceid+4*si),((sctx->facecoord+2*(faceid+4*si))[0]=(candidates[2*k]), (
sctx->facecoord+2*(faceid+4*si))[1]=(candidates[2*k+1]))
1098 candidates[2*k], candidates[2*k+1])((sctx->facecoord+2*(faceid+4*si))[0]=(candidates[2*k]), (
sctx->facecoord+2*(faceid+4*si))[1]=(candidates[2*k+1]))
;
1099 if (!seekDescendToDeg(sctx->facecoord+2*(faceid+4*si),
1100 sctx->hess + 9*verti[faceid][0],
1101 sctx->hess + 9*verti[faceid][1],
1102 sctx->hess + 9*verti[faceid][2],
1103 sctx->hess + 9*verti[faceid][3],
1104 50, 1e-9, (bag->esIdx==2)?'l':'p')) {
1105 inter[interct++]=12; /* 12 means "deg. point on this face */
1106 break;
1107 }
1108 }
1109 if ((pass==2) && (inter[interct-1]!=12)) {
1110 /* nothing helped, so insert a dummy vertex */
1111 ELL_2V_SET(sctx->facecoord+2*(faceid+4*si), 0.5, 0.5)((sctx->facecoord+2*(faceid+4*si))[0]=(0.5), (sctx->facecoord
+2*(faceid+4*si))[1]=(0.5))
;
1112 inter[interct++]=12;
1113 }
1114 if (inter[interct-1]==12) {
1115 computeFaceGradient(sctx, sctx->facenorm+3*(faceid+4*si),
1116 xi, yi, faceid, sctx->facecoord+2*(faceid+4*si));
1117 switch (faceid) {
1118 case 0: ELL_3V_SET(sctx->faceicoord+3*(faceid+4*si),((sctx->faceicoord+3*(faceid+4*si))[0] = (xi+sctx->facecoord
[2*(faceid+4*si)]), (sctx->faceicoord+3*(faceid+4*si))[1] =
(yi+sctx->facecoord[2*(faceid+4*si)+1]), (sctx->faceicoord
+3*(faceid+4*si))[2] = (bag->zi))
1119 xi+sctx->facecoord[2*(faceid+4*si)],((sctx->faceicoord+3*(faceid+4*si))[0] = (xi+sctx->facecoord
[2*(faceid+4*si)]), (sctx->faceicoord+3*(faceid+4*si))[1] =
(yi+sctx->facecoord[2*(faceid+4*si)+1]), (sctx->faceicoord
+3*(faceid+4*si))[2] = (bag->zi))
1120 yi+sctx->facecoord[2*(faceid+4*si)+1], bag->zi)((sctx->faceicoord+3*(faceid+4*si))[0] = (xi+sctx->facecoord
[2*(faceid+4*si)]), (sctx->faceicoord+3*(faceid+4*si))[1] =
(yi+sctx->facecoord[2*(faceid+4*si)+1]), (sctx->faceicoord
+3*(faceid+4*si))[2] = (bag->zi))
;
1121 break;
1122 case 1: ELL_3V_SET(sctx->faceicoord+3*(faceid+4*si),((sctx->faceicoord+3*(faceid+4*si))[0] = (xi+sctx->facecoord
[2*(faceid+4*si)]), (sctx->faceicoord+3*(faceid+4*si))[1] =
(yi), (sctx->faceicoord+3*(faceid+4*si))[2] = (bag->zi
+sctx->facecoord[2*(faceid+4*si)+1]))
1123 xi+sctx->facecoord[2*(faceid+4*si)], yi,((sctx->faceicoord+3*(faceid+4*si))[0] = (xi+sctx->facecoord
[2*(faceid+4*si)]), (sctx->faceicoord+3*(faceid+4*si))[1] =
(yi), (sctx->faceicoord+3*(faceid+4*si))[2] = (bag->zi
+sctx->facecoord[2*(faceid+4*si)+1]))
1124 bag->zi+sctx->facecoord[2*(faceid+4*si)+1])((sctx->faceicoord+3*(faceid+4*si))[0] = (xi+sctx->facecoord
[2*(faceid+4*si)]), (sctx->faceicoord+3*(faceid+4*si))[1] =
(yi), (sctx->faceicoord+3*(faceid+4*si))[2] = (bag->zi
+sctx->facecoord[2*(faceid+4*si)+1]))
;
1125 break;
1126 case 2: ELL_3V_SET(sctx->faceicoord+3*(faceid+4*si), xi,((sctx->faceicoord+3*(faceid+4*si))[0] = (xi), (sctx->faceicoord
+3*(faceid+4*si))[1] = (yi+sctx->facecoord[2*(faceid+4*si)
]), (sctx->faceicoord+3*(faceid+4*si))[2] = (bag->zi+sctx
->facecoord[2*(faceid+4*si)+1]))
1127 yi+sctx->facecoord[2*(faceid+4*si)],((sctx->faceicoord+3*(faceid+4*si))[0] = (xi), (sctx->faceicoord
+3*(faceid+4*si))[1] = (yi+sctx->facecoord[2*(faceid+4*si)
]), (sctx->faceicoord+3*(faceid+4*si))[2] = (bag->zi+sctx
->facecoord[2*(faceid+4*si)+1]))
1128 bag->zi+sctx->facecoord[2*(faceid+4*si)+1])((sctx->faceicoord+3*(faceid+4*si))[0] = (xi), (sctx->faceicoord
+3*(faceid+4*si))[1] = (yi+sctx->facecoord[2*(faceid+4*si)
]), (sctx->faceicoord+3*(faceid+4*si))[2] = (bag->zi+sctx
->facecoord[2*(faceid+4*si)+1]))
;
1129 break;
1130 case 3: ELL_3V_SET(sctx->faceicoord+3*(faceid+4*si),((sctx->faceicoord+3*(faceid+4*si))[0] = (xi+sctx->facecoord
[2*(faceid+4*si)]), (sctx->faceicoord+3*(faceid+4*si))[1] =
(yi+sctx->facecoord[2*(faceid+4*si)+1]), (sctx->faceicoord
+3*(faceid+4*si))[2] = (bag->zi+1))
1131 xi+sctx->facecoord[2*(faceid+4*si)],((sctx->faceicoord+3*(faceid+4*si))[0] = (xi+sctx->facecoord
[2*(faceid+4*si)]), (sctx->faceicoord+3*(faceid+4*si))[1] =
(yi+sctx->facecoord[2*(faceid+4*si)+1]), (sctx->faceicoord
+3*(faceid+4*si))[2] = (bag->zi+1))
1132 yi+sctx->facecoord[2*(faceid+4*si)+1], bag->zi+1)((sctx->faceicoord+3*(faceid+4*si))[0] = (xi+sctx->facecoord
[2*(faceid+4*si)]), (sctx->faceicoord+3*(faceid+4*si))[1] =
(yi+sctx->facecoord[2*(faceid+4*si)+1]), (sctx->faceicoord
+3*(faceid+4*si))[2] = (bag->zi+1))
;
1133 break;
1134 }
1135 }
1136 }
1137 if (interct%2==0) { /* we can break out */
1138 break;
1139 }
1140 }
1141
1142 if (interct<=1) { /* there is no connectivity on this face */
1143 ELL_4V_SET(sctx->pairs+12*(faceid+4*si),-1,-1,-1,-1)((sctx->pairs+12*(faceid+4*si))[0] = (-1), (sctx->pairs
+12*(faceid+4*si))[1] = (-1), (sctx->pairs+12*(faceid+4*si
))[2] = (-1), (sctx->pairs+12*(faceid+4*si))[3] = (-1))
;
1144 } else if (interct==2) { /* connectivity is straightforward */
1145 ELL_4V_SET(sctx->pairs+12*(faceid+4*si),inter[0],inter[1],-1,-1)((sctx->pairs+12*(faceid+4*si))[0] = (inter[0]), (sctx->
pairs+12*(faceid+4*si))[1] = (inter[1]), (sctx->pairs+12*(
faceid+4*si))[2] = (-1), (sctx->pairs+12*(faceid+4*si))[3]
= (-1))
;
1146 } else { /* we need gradients and coordinates to make a decision */
1147 double interc[24]; /* 2D coordinates of intersection points */
1148 double intern[24]; /* 2D normals at intersection points */
1149 /* used to find the best pairing without self-intersection */
1150 double bestscore=1e20;
1151 char idcs[12]; /* consider if we need to restrict this */
1152 for (i=0; i<interct; i++) {
1153 if (inter[i]<12) { /* edge feature */
1154 int resolved=edgeid[faceid][inter[i]/3];
1155 int offset=inter[i]%3;
1156 switch (faceid) {
1157 case 0: case 3:
1158 ELL_2V_SET(interc+2*i,((interc+2*i)[0]=(sctx->edgeicoord[9*(bag->evti[resolved
]+5*si)+3*offset]), (interc+2*i)[1]=(sctx->edgeicoord[9*(bag
->evti[resolved]+5*si)+3*offset+1]))
1159 sctx->edgeicoord[9*(bag->evti[resolved]+5*si)+3*offset],((interc+2*i)[0]=(sctx->edgeicoord[9*(bag->evti[resolved
]+5*si)+3*offset]), (interc+2*i)[1]=(sctx->edgeicoord[9*(bag
->evti[resolved]+5*si)+3*offset+1]))
1160 sctx->edgeicoord[9*(bag->evti[resolved]+5*si)+3*offset+1])((interc+2*i)[0]=(sctx->edgeicoord[9*(bag->evti[resolved
]+5*si)+3*offset]), (interc+2*i)[1]=(sctx->edgeicoord[9*(bag
->evti[resolved]+5*si)+3*offset+1]))
;
1161 ELL_2V_SET(intern+2*i,((intern+2*i)[0]=(sctx->edgenorm[9*(bag->evti[resolved]
+5*si)+3*offset]), (intern+2*i)[1]=(sctx->edgenorm[9*(bag->
evti[resolved]+5*si)+3*offset+1]))
1162 sctx->edgenorm[9*(bag->evti[resolved]+5*si)+3*offset],((intern+2*i)[0]=(sctx->edgenorm[9*(bag->evti[resolved]
+5*si)+3*offset]), (intern+2*i)[1]=(sctx->edgenorm[9*(bag->
evti[resolved]+5*si)+3*offset+1]))
1163 sctx->edgenorm[9*(bag->evti[resolved]+5*si)+3*offset+1])((intern+2*i)[0]=(sctx->edgenorm[9*(bag->evti[resolved]
+5*si)+3*offset]), (intern+2*i)[1]=(sctx->edgenorm[9*(bag->
evti[resolved]+5*si)+3*offset+1]))
;
1164 break;
1165 case 1:
1166 ELL_2V_SET(interc+2*i,((interc+2*i)[0]=(sctx->edgeicoord[9*(bag->evti[resolved
]+5*si)+3*offset]), (interc+2*i)[1]=(sctx->edgeicoord[9*(bag
->evti[resolved]+5*si)+3*offset+2]))
1167 sctx->edgeicoord[9*(bag->evti[resolved]+5*si)+3*offset],((interc+2*i)[0]=(sctx->edgeicoord[9*(bag->evti[resolved
]+5*si)+3*offset]), (interc+2*i)[1]=(sctx->edgeicoord[9*(bag
->evti[resolved]+5*si)+3*offset+2]))
1168 sctx->edgeicoord[9*(bag->evti[resolved]+5*si)+3*offset+2])((interc+2*i)[0]=(sctx->edgeicoord[9*(bag->evti[resolved
]+5*si)+3*offset]), (interc+2*i)[1]=(sctx->edgeicoord[9*(bag
->evti[resolved]+5*si)+3*offset+2]))
;
1169 ELL_2V_SET(intern+2*i,((intern+2*i)[0]=(sctx->edgenorm[9*(bag->evti[resolved]
+5*si)+3*offset]), (intern+2*i)[1]=(sctx->edgenorm[9*(bag->
evti[resolved]+5*si)+3*offset+2]))
1170 sctx->edgenorm[9*(bag->evti[resolved]+5*si)+3*offset],((intern+2*i)[0]=(sctx->edgenorm[9*(bag->evti[resolved]
+5*si)+3*offset]), (intern+2*i)[1]=(sctx->edgenorm[9*(bag->
evti[resolved]+5*si)+3*offset+2]))
1171 sctx->edgenorm[9*(bag->evti[resolved]+5*si)+3*offset+2])((intern+2*i)[0]=(sctx->edgenorm[9*(bag->evti[resolved]
+5*si)+3*offset]), (intern+2*i)[1]=(sctx->edgenorm[9*(bag->
evti[resolved]+5*si)+3*offset+2]))
;
1172 break;
1173 case 2:
1174 ELL_2V_SET(interc+2*i,((interc+2*i)[0]=(sctx->edgeicoord[9*(bag->evti[resolved
]+5*si)+3*offset+1]), (interc+2*i)[1]=(sctx->edgeicoord[9*
(bag->evti[resolved]+5*si)+3*offset+2]))
1175 sctx->edgeicoord[9*(bag->evti[resolved]+5*si)+3*offset+1],((interc+2*i)[0]=(sctx->edgeicoord[9*(bag->evti[resolved
]+5*si)+3*offset+1]), (interc+2*i)[1]=(sctx->edgeicoord[9*
(bag->evti[resolved]+5*si)+3*offset+2]))
1176 sctx->edgeicoord[9*(bag->evti[resolved]+5*si)+3*offset+2])((interc+2*i)[0]=(sctx->edgeicoord[9*(bag->evti[resolved
]+5*si)+3*offset+1]), (interc+2*i)[1]=(sctx->edgeicoord[9*
(bag->evti[resolved]+5*si)+3*offset+2]))
;
1177 ELL_2V_SET(intern+2*i,((intern+2*i)[0]=(sctx->edgenorm[9*(bag->evti[resolved]
+5*si)+3*offset+1]), (intern+2*i)[1]=(sctx->edgenorm[9*(bag
->evti[resolved]+5*si)+3*offset+2]))
1178 sctx->edgenorm[9*(bag->evti[resolved]+5*si)+3*offset+1],((intern+2*i)[0]=(sctx->edgenorm[9*(bag->evti[resolved]
+5*si)+3*offset+1]), (intern+2*i)[1]=(sctx->edgenorm[9*(bag
->evti[resolved]+5*si)+3*offset+2]))
1179 sctx->edgenorm[9*(bag->evti[resolved]+5*si)+3*offset+2])((intern+2*i)[0]=(sctx->edgenorm[9*(bag->evti[resolved]
+5*si)+3*offset+1]), (intern+2*i)[1]=(sctx->edgenorm[9*(bag
->evti[resolved]+5*si)+3*offset+2]))
;
1180 break;
1181 }
1182 } else { /* face feature */
1183 switch (faceid) {
1184 case 0: case 3:
1185 ELL_2V_SET(interc+2*i, sctx->faceicoord[3*(faceid+4*si)],((interc+2*i)[0]=(sctx->faceicoord[3*(faceid+4*si)]), (interc
+2*i)[1]=(sctx->faceicoord[3*(faceid+4*si)+1]))
1186 sctx->faceicoord[3*(faceid+4*si)+1])((interc+2*i)[0]=(sctx->faceicoord[3*(faceid+4*si)]), (interc
+2*i)[1]=(sctx->faceicoord[3*(faceid+4*si)+1]))
;
1187 ELL_2V_SET(intern+2*i, sctx->facenorm[3*(faceid+4*si)],((intern+2*i)[0]=(sctx->facenorm[3*(faceid+4*si)]), (intern
+2*i)[1]=(sctx->facenorm[3*(faceid+4*si)+1]))
1188 sctx->facenorm[3*(faceid+4*si)+1])((intern+2*i)[0]=(sctx->facenorm[3*(faceid+4*si)]), (intern
+2*i)[1]=(sctx->facenorm[3*(faceid+4*si)+1]))
;
1189 break;
1190 case 1:
1191 ELL_2V_SET(interc+2*i, sctx->faceicoord[3*(faceid+4*si)],((interc+2*i)[0]=(sctx->faceicoord[3*(faceid+4*si)]), (interc
+2*i)[1]=(sctx->faceicoord[3*(faceid+4*si)+2]))
1192 sctx->faceicoord[3*(faceid+4*si)+2])((interc+2*i)[0]=(sctx->faceicoord[3*(faceid+4*si)]), (interc
+2*i)[1]=(sctx->faceicoord[3*(faceid+4*si)+2]))
;
1193 ELL_2V_SET(intern+2*i, sctx->facenorm[3*(faceid+4*si)],((intern+2*i)[0]=(sctx->facenorm[3*(faceid+4*si)]), (intern
+2*i)[1]=(sctx->facenorm[3*(faceid+4*si)+2]))
1194 sctx->facenorm[3*(faceid+4*si)+2])((intern+2*i)[0]=(sctx->facenorm[3*(faceid+4*si)]), (intern
+2*i)[1]=(sctx->facenorm[3*(faceid+4*si)+2]))
;
1195 break;
1196 case 2:
1197 ELL_2V_SET(interc+2*i, sctx->faceicoord[3*(faceid+4*si)+1],((interc+2*i)[0]=(sctx->faceicoord[3*(faceid+4*si)+1]), (interc
+2*i)[1]=(sctx->faceicoord[3*(faceid+4*si)+2]))
1198 sctx->faceicoord[3*(faceid+4*si)+2])((interc+2*i)[0]=(sctx->faceicoord[3*(faceid+4*si)+1]), (interc
+2*i)[1]=(sctx->faceicoord[3*(faceid+4*si)+2]))
;
1199 ELL_2V_SET(intern+2*i, sctx->facenorm[3*(faceid+4*si)+1],((intern+2*i)[0]=(sctx->facenorm[3*(faceid+4*si)+1]), (intern
+2*i)[1]=(sctx->facenorm[3*(faceid+4*si)+2]))
1200 sctx->facenorm[3*(faceid+4*si)+2])((intern+2*i)[0]=(sctx->facenorm[3*(faceid+4*si)+1]), (intern
+2*i)[1]=(sctx->facenorm[3*(faceid+4*si)+2]))
;
1201 break;
1202 }
1203 }
1204 }
1205 for (i=0; i<interct; i++) {
1206 sctx->pairs[12*(faceid+4*si)+i]=i;
1207 idcs[i]=i;
1208 }
1209 findConnectivity(sctx->pairs+12*(faceid+4*si), &bestscore, interct,
1210 idcs, 0, interc, intern);
1211 for (i=0; i<interct; i++)
1212 sctx->pairs[12*(faceid+4*si)+i]=inter[sctx->pairs[12*(faceid+4*si)+i]];
1213 for (i=interct; i<12; i++)
1214 sctx->pairs[12*(faceid+4*si)+i]=-1;
1215 }
1216}
1217
1218static void
1219intersectionShuffleProbe(seekContext *sctx, baggage *bag) {
1220 unsigned int xi, yi, sx, sy, si;
1221 int i;
1222
1223 sx = AIR_CAST(unsigned int, sctx->sx)((unsigned int)(sctx->sx));
1224 sy = AIR_CAST(unsigned int, sctx->sy)((unsigned int)(sctx->sy));
1225
1226 for (yi=0; yi<sy; yi++) {
1227 for (xi=0; xi<sx; xi++) {
1228 si = xi + sx*yi;
1229 /* take care of facevidx array */
1230 if (!bag->zi) { /* initialize, else copy over */
1231 sctx->facevidx[0 + 4*si] = -1;
1232 } else {
1233 sctx->facevidx[0 + 4*si] = sctx->facevidx[3 + 4*si];
1234 }
1235 sctx->facevidx[1 + 4*si] = sctx->facevidx[2 + 4*si] =
1236 sctx->facevidx[3 + 4*si] = -1;
1237
1238 /* copy or reset data on the 5 unique edges */
1239
1240 if (sctx->treated[si]&_SEEK_TREATED_EDGE30x10) {
1241 /* has been treated, just copy results */
1242 ELL_3V_COPY(sctx->edgealpha+3*(0+5*si), sctx->edgealpha+3*(3+5*si))((sctx->edgealpha+3*(0+5*si))[0] = (sctx->edgealpha+3*(
3+5*si))[0], (sctx->edgealpha+3*(0+5*si))[1] = (sctx->edgealpha
+3*(3+5*si))[1], (sctx->edgealpha+3*(0+5*si))[2] = (sctx->
edgealpha+3*(3+5*si))[2])
;
1243 ELL_3M_COPY(sctx->edgenorm+9*(0+5*si), sctx->edgenorm+9*(3+5*si))((((sctx->edgenorm+9*(0+5*si))+0)[0] = ((sctx->edgenorm
+9*(3+5*si))+0)[0], ((sctx->edgenorm+9*(0+5*si))+0)[1] = (
(sctx->edgenorm+9*(3+5*si))+0)[1], ((sctx->edgenorm+9*(
0+5*si))+0)[2] = ((sctx->edgenorm+9*(3+5*si))+0)[2]), (((sctx
->edgenorm+9*(0+5*si))+3)[0] = ((sctx->edgenorm+9*(3+5*
si))+3)[0], ((sctx->edgenorm+9*(0+5*si))+3)[1] = ((sctx->
edgenorm+9*(3+5*si))+3)[1], ((sctx->edgenorm+9*(0+5*si))+3
)[2] = ((sctx->edgenorm+9*(3+5*si))+3)[2]), (((sctx->edgenorm
+9*(0+5*si))+6)[0] = ((sctx->edgenorm+9*(3+5*si))+6)[0], (
(sctx->edgenorm+9*(0+5*si))+6)[1] = ((sctx->edgenorm+9*
(3+5*si))+6)[1], ((sctx->edgenorm+9*(0+5*si))+6)[2] = ((sctx
->edgenorm+9*(3+5*si))+6)[2]))
;
1244 ELL_3M_COPY(sctx->edgeicoord+9*(0+5*si), sctx->edgeicoord+9*(3+5*si))((((sctx->edgeicoord+9*(0+5*si))+0)[0] = ((sctx->edgeicoord
+9*(3+5*si))+0)[0], ((sctx->edgeicoord+9*(0+5*si))+0)[1] =
((sctx->edgeicoord+9*(3+5*si))+0)[1], ((sctx->edgeicoord
+9*(0+5*si))+0)[2] = ((sctx->edgeicoord+9*(3+5*si))+0)[2])
, (((sctx->edgeicoord+9*(0+5*si))+3)[0] = ((sctx->edgeicoord
+9*(3+5*si))+3)[0], ((sctx->edgeicoord+9*(0+5*si))+3)[1] =
((sctx->edgeicoord+9*(3+5*si))+3)[1], ((sctx->edgeicoord
+9*(0+5*si))+3)[2] = ((sctx->edgeicoord+9*(3+5*si))+3)[2])
, (((sctx->edgeicoord+9*(0+5*si))+6)[0] = ((sctx->edgeicoord
+9*(3+5*si))+6)[0], ((sctx->edgeicoord+9*(0+5*si))+6)[1] =
((sctx->edgeicoord+9*(3+5*si))+6)[1], ((sctx->edgeicoord
+9*(0+5*si))+6)[2] = ((sctx->edgeicoord+9*(3+5*si))+6)[2])
)
;
1245 sctx->treated[si]|=_SEEK_TREATED_EDGE00x02;
1246 } else if (xi!=sx-1) {
1247 ELL_3V_SET(sctx->edgealpha+3*(0+5*si),-1,-1,-1)((sctx->edgealpha+3*(0+5*si))[0] = (-1), (sctx->edgealpha
+3*(0+5*si))[1] = (-1), (sctx->edgealpha+3*(0+5*si))[2] = (
-1))
;
1248 sctx->treated[si]&=0xFF^_SEEK_TREATED_EDGE00x02;
1249 }
1250
1251 if (sctx->treated[si]&_SEEK_TREATED_EDGE40x20) {
1252 /* has been treated, just copy results */
1253 ELL_3V_COPY(sctx->edgealpha+3*(1+5*si), sctx->edgealpha+3*(4+5*si))((sctx->edgealpha+3*(1+5*si))[0] = (sctx->edgealpha+3*(
4+5*si))[0], (sctx->edgealpha+3*(1+5*si))[1] = (sctx->edgealpha
+3*(4+5*si))[1], (sctx->edgealpha+3*(1+5*si))[2] = (sctx->
edgealpha+3*(4+5*si))[2])
;
1254 ELL_3M_COPY(sctx->edgenorm+9*(1+5*si), sctx->edgenorm+9*(4+5*si))((((sctx->edgenorm+9*(1+5*si))+0)[0] = ((sctx->edgenorm
+9*(4+5*si))+0)[0], ((sctx->edgenorm+9*(1+5*si))+0)[1] = (
(sctx->edgenorm+9*(4+5*si))+0)[1], ((sctx->edgenorm+9*(
1+5*si))+0)[2] = ((sctx->edgenorm+9*(4+5*si))+0)[2]), (((sctx
->edgenorm+9*(1+5*si))+3)[0] = ((sctx->edgenorm+9*(4+5*
si))+3)[0], ((sctx->edgenorm+9*(1+5*si))+3)[1] = ((sctx->
edgenorm+9*(4+5*si))+3)[1], ((sctx->edgenorm+9*(1+5*si))+3
)[2] = ((sctx->edgenorm+9*(4+5*si))+3)[2]), (((sctx->edgenorm
+9*(1+5*si))+6)[0] = ((sctx->edgenorm+9*(4+5*si))+6)[0], (
(sctx->edgenorm+9*(1+5*si))+6)[1] = ((sctx->edgenorm+9*
(4+5*si))+6)[1], ((sctx->edgenorm+9*(1+5*si))+6)[2] = ((sctx
->edgenorm+9*(4+5*si))+6)[2]))
;
1255 ELL_3M_COPY(sctx->edgeicoord+9*(1+5*si), sctx->edgeicoord+9*(4+5*si))((((sctx->edgeicoord+9*(1+5*si))+0)[0] = ((sctx->edgeicoord
+9*(4+5*si))+0)[0], ((sctx->edgeicoord+9*(1+5*si))+0)[1] =
((sctx->edgeicoord+9*(4+5*si))+0)[1], ((sctx->edgeicoord
+9*(1+5*si))+0)[2] = ((sctx->edgeicoord+9*(4+5*si))+0)[2])
, (((sctx->edgeicoord+9*(1+5*si))+3)[0] = ((sctx->edgeicoord
+9*(4+5*si))+3)[0], ((sctx->edgeicoord+9*(1+5*si))+3)[1] =
((sctx->edgeicoord+9*(4+5*si))+3)[1], ((sctx->edgeicoord
+9*(1+5*si))+3)[2] = ((sctx->edgeicoord+9*(4+5*si))+3)[2])
, (((sctx->edgeicoord+9*(1+5*si))+6)[0] = ((sctx->edgeicoord
+9*(4+5*si))+6)[0], ((sctx->edgeicoord+9*(1+5*si))+6)[1] =
((sctx->edgeicoord+9*(4+5*si))+6)[1], ((sctx->edgeicoord
+9*(1+5*si))+6)[2] = ((sctx->edgeicoord+9*(4+5*si))+6)[2])
)
;
1256 sctx->treated[si]|=_SEEK_TREATED_EDGE10x04;
1257 } else if (yi!=sy-1) {
1258 ELL_3V_SET(sctx->edgealpha+3*(1+5*si),-1,-1,-1)((sctx->edgealpha+3*(1+5*si))[0] = (-1), (sctx->edgealpha
+3*(1+5*si))[1] = (-1), (sctx->edgealpha+3*(1+5*si))[2] = (
-1))
;
1259 sctx->treated[si]&=0xFF^_SEEK_TREATED_EDGE10x04;
1260 }
1261
1262 /* edges within and at top of the slab are new */
1263 ELL_3V_SET(sctx->edgealpha+3*(2+5*si),-1,-1,-1)((sctx->edgealpha+3*(2+5*si))[0] = (-1), (sctx->edgealpha
+3*(2+5*si))[1] = (-1), (sctx->edgealpha+3*(2+5*si))[2] = (
-1))
;
1264 sctx->treated[si]&=0xFF^_SEEK_TREATED_EDGE20x08;
1265
1266 ELL_3V_SET(sctx->edgealpha+3*(3+5*si),-1,-1,-1)((sctx->edgealpha+3*(3+5*si))[0] = (-1), (sctx->edgealpha
+3*(3+5*si))[1] = (-1), (sctx->edgealpha+3*(3+5*si))[2] = (
-1))
;
1267 sctx->treated[si]&=0xFF^_SEEK_TREATED_EDGE30x10;
1268
1269 ELL_3V_SET(sctx->edgealpha+3*(4+5*si),-1,-1,-1)((sctx->edgealpha+3*(4+5*si))[0] = (-1), (sctx->edgealpha
+3*(4+5*si))[1] = (-1), (sctx->edgealpha+3*(4+5*si))[2] = (
-1))
;
1270 sctx->treated[si]&=0xFF^_SEEK_TREATED_EDGE40x20;
1271 }
1272 }
1273
1274 /* find missing deg. points, edge intersections, normals, and
1275 * connectivity on the four unique faces
1276 * this is done in a separate pass to make sure that all edge information
1277 * has been updated */
1278 for (yi=0; yi<sy; yi++) {
1279 for (xi=0; xi<sx; xi++) {
1280 si = xi + sx*yi;
1281 if (sctx->treated[si]&_SEEK_TREATED_FACE30x40) {
1282 /* we can copy previous results */
1283 ELL_2V_COPY(sctx->facecoord+2*(0+4*si), sctx->facecoord+2*(3+4*si))((sctx->facecoord+2*(0+4*si))[0] = (sctx->facecoord+2*(
3+4*si))[0], (sctx->facecoord+2*(0+4*si))[1] = (sctx->facecoord
+2*(3+4*si))[1])
;
1284 ELL_3V_COPY(sctx->faceicoord+3*(0+4*si), sctx->faceicoord+3*(3+4*si))((sctx->faceicoord+3*(0+4*si))[0] = (sctx->faceicoord+3
*(3+4*si))[0], (sctx->faceicoord+3*(0+4*si))[1] = (sctx->
faceicoord+3*(3+4*si))[1], (sctx->faceicoord+3*(0+4*si))[2
] = (sctx->faceicoord+3*(3+4*si))[2])
;
1285 ELL_3V_COPY(sctx->facenorm+3*(0+4*si), sctx->facenorm+3*(3+4*si))((sctx->facenorm+3*(0+4*si))[0] = (sctx->facenorm+3*(3+
4*si))[0], (sctx->facenorm+3*(0+4*si))[1] = (sctx->facenorm
+3*(3+4*si))[1], (sctx->facenorm+3*(0+4*si))[2] = (sctx->
facenorm+3*(3+4*si))[2])
;
1286 for (i=0; i<3; i++)
1287 ELL_4V_COPY(sctx->pairs+12*(0+4*si)+4*i, sctx->pairs+12*(3+4*si)+4*i)((sctx->pairs+12*(0+4*si)+4*i)[0] = (sctx->pairs+12*(3+
4*si)+4*i)[0], (sctx->pairs+12*(0+4*si)+4*i)[1] = (sctx->
pairs+12*(3+4*si)+4*i)[1], (sctx->pairs+12*(0+4*si)+4*i)[2
] = (sctx->pairs+12*(3+4*si)+4*i)[2], (sctx->pairs+12*(
0+4*si)+4*i)[3] = (sctx->pairs+12*(3+4*si)+4*i)[3])
;
1288 } else if (xi!=sx-1 && yi!=sy-1) {
1289 if (sctx->treated[si]&_SEEK_TREATED_REQUEST0x01)
1290 connectFace(sctx, bag, xi, yi, 0);
1291 else
1292 ELL_4V_SET(sctx->pairs+12*(0+4*si),-1,-1,-1,-1)((sctx->pairs+12*(0+4*si))[0] = (-1), (sctx->pairs+12*(
0+4*si))[1] = (-1), (sctx->pairs+12*(0+4*si))[2] = (-1), (
sctx->pairs+12*(0+4*si))[3] = (-1))
;
1293 }
1294 if (xi!=sx-1) {
1295 if (sctx->treated[si]&_SEEK_TREATED_REQUEST0x01 ||
1296 (yi!=0 && sctx->treated[xi+sx*(yi-1)]&_SEEK_TREATED_REQUEST0x01))
1297 connectFace(sctx, bag, xi, yi, 1);
1298 else ELL_4V_SET(sctx->pairs+12*(1+4*si),-1,-1,-1,-1)((sctx->pairs+12*(1+4*si))[0] = (-1), (sctx->pairs+12*(
1+4*si))[1] = (-1), (sctx->pairs+12*(1+4*si))[2] = (-1), (
sctx->pairs+12*(1+4*si))[3] = (-1))
;
1299 }
1300 if (yi!=sy-1) {
1301 if (sctx->treated[si]&_SEEK_TREATED_REQUEST0x01 ||
1302 (xi!=0 && sctx->treated[xi-1+sx*yi]&_SEEK_TREATED_REQUEST0x01))
1303 connectFace(sctx, bag, xi, yi, 2);
1304 else ELL_4V_SET(sctx->pairs+12*(2+4*si),-1,-1,-1,-1)((sctx->pairs+12*(2+4*si))[0] = (-1), (sctx->pairs+12*(
2+4*si))[1] = (-1), (sctx->pairs+12*(2+4*si))[2] = (-1), (
sctx->pairs+12*(2+4*si))[3] = (-1))
;
1305 if (xi!=sx-1) {
1306 if (sctx->treated[si]&_SEEK_TREATED_REQUEST0x01) {
1307 connectFace(sctx, bag, xi, yi, 3);
1308 sctx->treated[si]|=_SEEK_TREATED_FACE30x40;
1309 } else {
1310 ELL_4V_SET(sctx->pairs+12*(3+4*si),-1,-1,-1,-1)((sctx->pairs+12*(3+4*si))[0] = (-1), (sctx->pairs+12*(
3+4*si))[1] = (-1), (sctx->pairs+12*(3+4*si))[2] = (-1), (
sctx->pairs+12*(3+4*si))[3] = (-1))
;
1311 sctx->treated[si]&=0xFF^_SEEK_TREATED_FACE30x40;
1312 }
1313 }
1314 }
1315 }
1316 }
1317}
1318
1319/* special triangulation routine for use with T-based extraction */
1320int
1321_seekTriangulateT(seekContext *sctx, baggage *bag, limnPolyData *lpld) {
1322 unsigned xi, yi, sx, sy, si, i;
1323
1324 /* map edge indices w.r.t. faces (as used in sctx->pairs) back to
1325 * edge indices w.r.t. voxel */
1326 char edges[6][5]={{0, 2, 3, 1,12},
1327 {0, 5, 8, 4,13},
1328 {2, 7,10, 5,14},
1329 {3, 7,11, 6,15},
1330 {1, 6, 9, 4,16},
1331 {8,10,11, 9,17}};
1332
1333 sx = AIR_CAST(unsigned int, sctx->sx)((unsigned int)(sctx->sx));
1334 sy = AIR_CAST(unsigned int, sctx->sy)((unsigned int)(sctx->sy));
1335
1336 for (yi=0; yi<sy-1; yi++) {
1337 for (xi=0; xi<sx-1; xi++) {
1338 int fvti[6]; /* indices into unique face array */
1339 char connections[84];/* (12 edges * 3 possible intersections+6 faces)*2 */
1340 char degeneracies[6];
1341 int degct=0;
1342
1343 unsigned int face;
1344
1345 if (sctx->strengthUse && sctx->stng[0+2*(xi+sx*yi)] < sctx->strength &&
1346 sctx->stng[1+2*(xi+sx*yi)] < sctx->strength &&
1347 sctx->stng[0+2*(xi+1+sx*yi)] < sctx->strength &&
1348 sctx->stng[1+2*(xi+1+sx*yi)] < sctx->strength &&
1349 sctx->stng[0+2*(xi+sx*(yi+1))] < sctx->strength &&
1350 sctx->stng[1+2*(xi+sx*(yi+1))] < sctx->strength &&
1351 sctx->stng[0+2*(xi+1+sx*(yi+1))] < sctx->strength &&
1352 sctx->stng[1+2*(xi+1+sx*(yi+1))] < sctx->strength)
1353 continue;/* all vertices below strength limit, do not create geometry */
1354
1355 si = xi + sx*yi;
1356 ELL_3V_SET(fvti, 0 + 4*si, 1 + 4*si, 2 + 4*(xi+1 + sx*yi))((fvti)[0] = (0 + 4*si), (fvti)[1] = (1 + 4*si), (fvti)[2] = (
2 + 4*(xi+1 + sx*yi)))
;
1357 ELL_3V_SET(fvti+3, 1 + 4*(xi + sx*(yi+1)), 2 + 4*si, 3 + 4*si)((fvti+3)[0] = (1 + 4*(xi + sx*(yi+1))), (fvti+3)[1] = (2 + 4
*si), (fvti+3)[2] = (3 + 4*si))
;
1358
1359 /* collect all intersection + connectivity info for this voxel */
1360 memset(connections,-1,sizeof(connections))__builtin___memset_chk (connections, -1, sizeof(connections),
__builtin_object_size (connections, 0))
;
1361 for (face=0; face<6; face++) {
1362 for (i=0; i<6; i++) {
1363 int idx1, offset1, idx2, offset2, idxmap1, idxmap2;
1364 if (sctx->pairs[12*fvti[face]+2*i]==-1) break;
1365 idx1=edges[face][sctx->pairs[12*fvti[face]+2*i]/3];
1366 offset1=sctx->pairs[12*fvti[face]+2*i]%3;
1367 idx2=edges[face][sctx->pairs[12*fvti[face]+2*i+1]/3];
1368 offset2=sctx->pairs[12*fvti[face]+2*i+1]%3;
1369 idxmap1=3*idx1+offset1;
1370 idxmap2=3*idx2+offset2;
1371 if (idx1>11) {
1372 idxmap1=idx1+24; /* +36-12 */
1373 degeneracies[degct++] = idxmap1;
1374 }
1375 if (idx2>11) {
1376 idxmap2=idx2+24;
1377 degeneracies[degct++] = idxmap2;
1378 }
1379
1380 if (connections[2*idxmap1]==-1)
1381 connections[2*idxmap1]=idxmap2;
1382 else
1383 connections[2*idxmap1+1]=idxmap2;
1384 if (connections[2*idxmap2]==-1)
1385 connections[2*idxmap2]=idxmap1;
1386 else
1387 connections[2*idxmap2+1]=idxmap1;
1388 }
1389 }
1390
1391 /* connect the degenerate points */
1392 if (degct==2) {
1393 connections[2*degeneracies[0]+1]=degeneracies[1];
1394 connections[2*degeneracies[1]+1]=degeneracies[0];
1395 } else if (degct==4) {
1396 int bestchoice=0;
1397 int eidcs[4], fidcs[4];
1398 int k;
1399 double bestscore, score;
1400 for (k=0; k<4; ++k) {
1401 eidcs[k]=3*(bag->evti[connections[2*degeneracies[k]]/3]+5*si)+
1402 connections[2*degeneracies[k]]%3;
1403 fidcs[k]=fvti[degeneracies[k]-36];
1404 }
1405 bestscore=evaluateDegConnection(sctx->edgeicoord+3*eidcs[0],
1406 sctx->faceicoord+3*fidcs[0],
1407 sctx->faceicoord+3*fidcs[1],
1408 sctx->edgeicoord+3*eidcs[1],
1409 sctx->edgeicoord+3*eidcs[2],
1410 sctx->faceicoord+3*fidcs[2],
1411 sctx->faceicoord+3*fidcs[3],
1412 sctx->edgeicoord+3*eidcs[3],
1413 NULL((void*)0), NULL((void*)0), NULL((void*)0), NULL((void*)0),
1414 sctx->facenorm+3*fidcs[0],
1415 sctx->facenorm+3*fidcs[1],
1416 sctx->facenorm+3*fidcs[2],
1417 sctx->facenorm+3*fidcs[3],
1418 NULL((void*)0), NULL((void*)0));
1419 score=evaluateDegConnection(sctx->edgeicoord+3*eidcs[0],
1420 sctx->faceicoord+3*fidcs[0],
1421 sctx->faceicoord+3*fidcs[2],
1422 sctx->edgeicoord+3*eidcs[2],
1423 sctx->edgeicoord+3*eidcs[1],
1424 sctx->faceicoord+3*fidcs[1],
1425 sctx->faceicoord+3*fidcs[3],
1426 sctx->edgeicoord+3*eidcs[3],
1427 NULL((void*)0), NULL((void*)0), NULL((void*)0), NULL((void*)0),
1428 sctx->facenorm+3*fidcs[0],
1429 sctx->facenorm+3*fidcs[2],
1430 sctx->facenorm+3*fidcs[1],
1431 sctx->facenorm+3*fidcs[3],
1432 NULL((void*)0), NULL((void*)0));
1433 if (score<bestscore) {
1434 bestscore=score;
1435 bestchoice=1;
1436 }
1437 score=evaluateDegConnection(sctx->edgeicoord+3*eidcs[0],
1438 sctx->faceicoord+3*fidcs[0],
1439 sctx->faceicoord+3*fidcs[3],
1440 sctx->edgeicoord+3*eidcs[3],
1441 sctx->edgeicoord+3*eidcs[1],
1442 sctx->faceicoord+3*fidcs[1],
1443 sctx->faceicoord+3*fidcs[2],
1444 sctx->edgeicoord+3*eidcs[2],
1445 NULL((void*)0), NULL((void*)0), NULL((void*)0), NULL((void*)0),
1446 sctx->facenorm+3*fidcs[0],
1447 sctx->facenorm+3*fidcs[3],
1448 sctx->facenorm+3*fidcs[1],
1449 sctx->facenorm+3*fidcs[2],
1450 NULL((void*)0), NULL((void*)0));
1451 if (score<bestscore) {
1452 bestscore=score;
Value stored to 'bestscore' is never read
1453 bestchoice=2;
1454 }
1455 switch (bestchoice) {
1456 case 0: connections[2*degeneracies[0]+1]=degeneracies[1];
1457 connections[2*degeneracies[1]+1]=degeneracies[0];
1458 connections[2*degeneracies[2]+1]=degeneracies[3];
1459 connections[2*degeneracies[3]+1]=degeneracies[2];
1460 break;
1461 case 1: connections[2*degeneracies[0]+1]=degeneracies[2];
1462 connections[2*degeneracies[2]+1]=degeneracies[0];
1463 connections[2*degeneracies[1]+1]=degeneracies[3];
1464 connections[2*degeneracies[3]+1]=degeneracies[1];
1465 break;
1466 case 2: connections[2*degeneracies[0]+1]=degeneracies[3];
1467 connections[2*degeneracies[3]+1]=degeneracies[0];
1468 connections[2*degeneracies[1]+1]=degeneracies[2];
1469 connections[2*degeneracies[2]+1]=degeneracies[1];
1470 break;
1471 }
1472 } else if (degct==6) {
1473 int bestchoice=0;
1474 int eidcs[6], fidcs[6];
1475 int k;
1476 double bestscore;
1477 int pairings[15][6]={{0,1,2,3,4,5},{0,1,2,4,3,5},{0,1,2,5,3,4},
1478 {0,2,1,3,4,5},{0,2,1,4,3,5},{0,2,1,5,3,4},
1479 {0,3,1,2,4,5},{0,3,1,4,2,5},{0,3,1,5,2,4},
1480 {0,4,1,2,3,5},{0,4,1,3,2,5},{0,4,1,5,2,3},
1481 {0,5,1,2,3,4},{0,5,1,3,2,4},{0,5,1,4,2,3}};
1482 for (k=0; k<6; ++k) {
1483 eidcs[k]=3*(bag->evti[connections[2*degeneracies[k]]/3]+5*si)+
1484 connections[2*degeneracies[k]]%3;
1485 fidcs[k]=fvti[degeneracies[k]-36];
1486 }
1487 bestscore=evaluateDegConnection(sctx->edgeicoord+3*eidcs[0],
1488 sctx->faceicoord+3*fidcs[0],
1489 sctx->faceicoord+3*fidcs[1],
1490 sctx->edgeicoord+3*eidcs[1],
1491 sctx->edgeicoord+3*eidcs[2],
1492 sctx->faceicoord+3*fidcs[2],
1493 sctx->faceicoord+3*fidcs[3],
1494 sctx->edgeicoord+3*eidcs[3],
1495 sctx->edgeicoord+3*eidcs[4],
1496 sctx->faceicoord+3*fidcs[4],
1497 sctx->faceicoord+3*fidcs[5],
1498 sctx->edgeicoord+3*eidcs[5],
1499 sctx->facenorm+3*fidcs[0],
1500 sctx->facenorm+3*fidcs[1],
1501 sctx->facenorm+3*fidcs[2],
1502 sctx->facenorm+3*fidcs[3],
1503 sctx->facenorm+3*fidcs[4],
1504 sctx->facenorm+3*fidcs[5]);
1505 for (k=1; k<15; ++k) {
1506 double score=evaluateDegConnection
1507 (sctx->edgeicoord+3*eidcs[pairings[k][0]],
1508 sctx->faceicoord+3*fidcs[pairings[k][0]],
1509 sctx->faceicoord+3*fidcs[pairings[k][1]],
1510 sctx->edgeicoord+3*eidcs[pairings[k][1]],
1511 sctx->edgeicoord+3*eidcs[pairings[k][2]],
1512 sctx->faceicoord+3*fidcs[pairings[k][2]],
1513 sctx->faceicoord+3*fidcs[pairings[k][3]],
1514 sctx->edgeicoord+3*eidcs[pairings[k][3]],
1515 sctx->edgeicoord+3*eidcs[pairings[k][4]],
1516 sctx->faceicoord+3*fidcs[pairings[k][4]],
1517 sctx->faceicoord+3*fidcs[pairings[k][5]],
1518 sctx->edgeicoord+3*eidcs[pairings[k][5]],
1519 sctx->facenorm+3*fidcs[pairings[k][0]],
1520 sctx->facenorm+3*fidcs[pairings[k][1]],
1521 sctx->facenorm+3*fidcs[pairings[k][2]],
1522 sctx->facenorm+3*fidcs[pairings[k][3]],
1523 sctx->facenorm+3*fidcs[pairings[k][4]],
1524 sctx->facenorm+3*fidcs[pairings[k][5]]);
1525 if (score<bestscore) {
1526 bestscore=score; bestchoice=k;
1527 }
1528 }
1529 connections[2*degeneracies[pairings[bestchoice][0]]+1]=
1530 degeneracies[pairings[bestchoice][1]];
1531 connections[2*degeneracies[pairings[bestchoice][1]]+1]=
1532 degeneracies[pairings[bestchoice][0]];
1533 connections[2*degeneracies[pairings[bestchoice][2]]+1]=
1534 degeneracies[pairings[bestchoice][3]];
1535 connections[2*degeneracies[pairings[bestchoice][3]]+1]=
1536 degeneracies[pairings[bestchoice][2]];
1537 connections[2*degeneracies[pairings[bestchoice][4]]+1]=
1538 degeneracies[pairings[bestchoice][5]];
1539 connections[2*degeneracies[pairings[bestchoice][5]]+1]=
1540 degeneracies[pairings[bestchoice][4]];
1541 }
1542
1543 /* sufficient to run to 36: each polygon will contain at least
1544 * one edge vertex */
1545 for (i=0; i<36; i++) {
1546 if (connections[2*i]!=-1) {
1547 /* extract polygon from connections array */
1548 signed char polygon[42];
1549 unsigned char polyct=0;
1550 char thiz=i;
1551 char next=connections[2*i];
1552 polygon[polyct++]=i;
1553 connections[2*i]=-1;
1554 while (next!=-1) {
1555 char helpnext;
1556 polygon[polyct++]=next;
1557 if (connections[2*next]==thiz) {
1558 helpnext=connections[2*next+1];
1559 } else {
1560 helpnext=connections[2*next];
1561 }
1562 connections[2*next]=connections[2*next+1]=-1;
1563 thiz = next; next = helpnext;
1564 if (next==polygon[0])
1565 break; /* polygon is closed */
1566 }
1567 if (next!=-1) { /* else: discard unclosed polygon */
1568 /* make sure all required vertices are there */
1569 int j;
1570 for (j=0; j<polyct; ++j) {
1571 double tvertA[4], tvertB[4];
1572 if (polygon[j]<36) { /* we may need to insert an edge vertex */
1573 int eidx=3*(bag->evti[polygon[j]/3] + 5*si)+polygon[j]%3;
1574 if (-1 == sctx->vidx[eidx]) {
1575 int ovi;
1576 ELL_3V_COPY(tvertA, sctx->edgeicoord+3*eidx)((tvertA)[0] = (sctx->edgeicoord+3*eidx)[0], (tvertA)[1] =
(sctx->edgeicoord+3*eidx)[1], (tvertA)[2] = (sctx->edgeicoord
+3*eidx)[2])
;
1577 tvertA[3]=1.0;
1578
1579 /* tvertB in input index space */
1580 ELL_4MV_MUL(tvertB, sctx->txfIdx, tvertA)((tvertB)[0]=(sctx->txfIdx)[ 0]*(tvertA)[0]+(sctx->txfIdx
)[ 1]*(tvertA)[1]+(sctx->txfIdx)[ 2]*(tvertA)[2]+(sctx->
txfIdx)[ 3]*(tvertA)[3], (tvertB)[1]=(sctx->txfIdx)[ 4]*(tvertA
)[0]+(sctx->txfIdx)[ 5]*(tvertA)[1]+(sctx->txfIdx)[ 6]*
(tvertA)[2]+(sctx->txfIdx)[ 7]*(tvertA)[3], (tvertB)[2]=(sctx
->txfIdx)[ 8]*(tvertA)[0]+(sctx->txfIdx)[ 9]*(tvertA)[1
]+(sctx->txfIdx)[10]*(tvertA)[2]+(sctx->txfIdx)[11]*(tvertA
)[3], (tvertB)[3]=(sctx->txfIdx)[12]*(tvertA)[0]+(sctx->
txfIdx)[13]*(tvertA)[1]+(sctx->txfIdx)[14]*(tvertA)[2]+(sctx
->txfIdx)[15]*(tvertA)[3])
;
1581 /* tvertA in world space */
1582 ELL_4MV_MUL(tvertA, sctx->shape->ItoW, tvertB)((tvertA)[0]=(sctx->shape->ItoW)[ 0]*(tvertB)[0]+(sctx->
shape->ItoW)[ 1]*(tvertB)[1]+(sctx->shape->ItoW)[ 2]
*(tvertB)[2]+(sctx->shape->ItoW)[ 3]*(tvertB)[3], (tvertA
)[1]=(sctx->shape->ItoW)[ 4]*(tvertB)[0]+(sctx->shape
->ItoW)[ 5]*(tvertB)[1]+(sctx->shape->ItoW)[ 6]*(tvertB
)[2]+(sctx->shape->ItoW)[ 7]*(tvertB)[3], (tvertA)[2]=(
sctx->shape->ItoW)[ 8]*(tvertB)[0]+(sctx->shape->
ItoW)[ 9]*(tvertB)[1]+(sctx->shape->ItoW)[10]*(tvertB)[
2]+(sctx->shape->ItoW)[11]*(tvertB)[3], (tvertA)[3]=(sctx
->shape->ItoW)[12]*(tvertB)[0]+(sctx->shape->ItoW
)[13]*(tvertB)[1]+(sctx->shape->ItoW)[14]*(tvertB)[2]+(
sctx->shape->ItoW)[15]*(tvertB)[3])
;
1583 ELL_4V_HOMOG(tvertA, tvertA)((tvertA)[0] = (tvertA)[0]/(tvertA)[3], (tvertA)[1] = (tvertA
)[1]/(tvertA)[3], (tvertA)[2] = (tvertA)[2]/(tvertA)[3], (tvertA
)[3] = 1.0)
;
1584
1585 ovi = sctx->vidx[eidx] =
1586 airArrayLenIncr(bag->xyzwArr, 1);
1587 ELL_4V_SET_TT(lpld->xyzw + 4*ovi, float,((lpld->xyzw + 4*ovi)[0] = ((float)((tvertA[0]))), (lpld->
xyzw + 4*ovi)[1] = ((float)((tvertA[1]))), (lpld->xyzw + 4
*ovi)[2] = ((float)((tvertA[2]))), (lpld->xyzw + 4*ovi)[3]
= ((float)((1.0))))
1588 tvertA[0], tvertA[1], tvertA[2], 1.0)((lpld->xyzw + 4*ovi)[0] = ((float)((tvertA[0]))), (lpld->
xyzw + 4*ovi)[1] = ((float)((tvertA[1]))), (lpld->xyzw + 4
*ovi)[2] = ((float)((tvertA[2]))), (lpld->xyzw + 4*ovi)[3]
= ((float)((1.0))))
;
1589
1590 if (sctx->normalsFind) {
1591 double len=ELL_3V_LEN(sctx->edgenorm+3*eidx)(sqrt((((sctx->edgenorm+3*eidx))[0]*((sctx->edgenorm+3*
eidx))[0] + ((sctx->edgenorm+3*eidx))[1]*((sctx->edgenorm
+3*eidx))[1] + ((sctx->edgenorm+3*eidx))[2]*((sctx->edgenorm
+3*eidx))[2])))
;
1592 airArrayLenIncr(bag->normArr, 1);
1593 ELL_3V_SCALE_TT(lpld->norm + 3*ovi, float, 1.0/len,((lpld->norm + 3*ovi)[0] = ((float)((1.0/len)*(sctx->edgenorm
+3*eidx)[0])), (lpld->norm + 3*ovi)[1] = ((float)((1.0/len
)*(sctx->edgenorm+3*eidx)[1])), (lpld->norm + 3*ovi)[2]
= ((float)((1.0/len)*(sctx->edgenorm+3*eidx)[2])))
1594 sctx->edgenorm+3*eidx)((lpld->norm + 3*ovi)[0] = ((float)((1.0/len)*(sctx->edgenorm
+3*eidx)[0])), (lpld->norm + 3*ovi)[1] = ((float)((1.0/len
)*(sctx->edgenorm+3*eidx)[1])), (lpld->norm + 3*ovi)[2]
= ((float)((1.0/len)*(sctx->edgenorm+3*eidx)[2])))
;
1595 }
1596
1597 sctx->vertNum++;
1598 }
1599 } else { /* we may need to insert a face vertex */
1600 int fidx=fvti[polygon[j]-36];
1601 if (-1 == sctx->facevidx[fidx]) {
1602 int ovi;
1603 ELL_3V_COPY(tvertA, sctx->faceicoord+3*fidx)((tvertA)[0] = (sctx->faceicoord+3*fidx)[0], (tvertA)[1] =
(sctx->faceicoord+3*fidx)[1], (tvertA)[2] = (sctx->faceicoord
+3*fidx)[2])
;
1604 tvertA[3]=1.0;
1605 /* tvertB in input index space */
1606 ELL_4MV_MUL(tvertB, sctx->txfIdx, tvertA)((tvertB)[0]=(sctx->txfIdx)[ 0]*(tvertA)[0]+(sctx->txfIdx
)[ 1]*(tvertA)[1]+(sctx->txfIdx)[ 2]*(tvertA)[2]+(sctx->
txfIdx)[ 3]*(tvertA)[3], (tvertB)[1]=(sctx->txfIdx)[ 4]*(tvertA
)[0]+(sctx->txfIdx)[ 5]*(tvertA)[1]+(sctx->txfIdx)[ 6]*
(tvertA)[2]+(sctx->txfIdx)[ 7]*(tvertA)[3], (tvertB)[2]=(sctx
->txfIdx)[ 8]*(tvertA)[0]+(sctx->txfIdx)[ 9]*(tvertA)[1
]+(sctx->txfIdx)[10]*(tvertA)[2]+(sctx->txfIdx)[11]*(tvertA
)[3], (tvertB)[3]=(sctx->txfIdx)[12]*(tvertA)[0]+(sctx->
txfIdx)[13]*(tvertA)[1]+(sctx->txfIdx)[14]*(tvertA)[2]+(sctx
->txfIdx)[15]*(tvertA)[3])
;
1607 /* tvertA in world space */
1608 ELL_4MV_MUL(tvertA, sctx->shape->ItoW, tvertB)((tvertA)[0]=(sctx->shape->ItoW)[ 0]*(tvertB)[0]+(sctx->
shape->ItoW)[ 1]*(tvertB)[1]+(sctx->shape->ItoW)[ 2]
*(tvertB)[2]+(sctx->shape->ItoW)[ 3]*(tvertB)[3], (tvertA
)[1]=(sctx->shape->ItoW)[ 4]*(tvertB)[0]+(sctx->shape
->ItoW)[ 5]*(tvertB)[1]+(sctx->shape->ItoW)[ 6]*(tvertB
)[2]+(sctx->shape->ItoW)[ 7]*(tvertB)[3], (tvertA)[2]=(
sctx->shape->ItoW)[ 8]*(tvertB)[0]+(sctx->shape->
ItoW)[ 9]*(tvertB)[1]+(sctx->shape->ItoW)[10]*(tvertB)[
2]+(sctx->shape->ItoW)[11]*(tvertB)[3], (tvertA)[3]=(sctx
->shape->ItoW)[12]*(tvertB)[0]+(sctx->shape->ItoW
)[13]*(tvertB)[1]+(sctx->shape->ItoW)[14]*(tvertB)[2]+(
sctx->shape->ItoW)[15]*(tvertB)[3])
;
1609 ELL_4V_HOMOG(tvertA, tvertA)((tvertA)[0] = (tvertA)[0]/(tvertA)[3], (tvertA)[1] = (tvertA
)[1]/(tvertA)[3], (tvertA)[2] = (tvertA)[2]/(tvertA)[3], (tvertA
)[3] = 1.0)
;
1610
1611 ovi = sctx->facevidx[fidx] =
1612 airArrayLenIncr(bag->xyzwArr, 1);
1613 ELL_4V_SET_TT(lpld->xyzw + 4*ovi, float,((lpld->xyzw + 4*ovi)[0] = ((float)((tvertA[0]))), (lpld->
xyzw + 4*ovi)[1] = ((float)((tvertA[1]))), (lpld->xyzw + 4
*ovi)[2] = ((float)((tvertA[2]))), (lpld->xyzw + 4*ovi)[3]
= ((float)((1.0))))
1614 tvertA[0], tvertA[1], tvertA[2], 1.0)((lpld->xyzw + 4*ovi)[0] = ((float)((tvertA[0]))), (lpld->
xyzw + 4*ovi)[1] = ((float)((tvertA[1]))), (lpld->xyzw + 4
*ovi)[2] = ((float)((tvertA[2]))), (lpld->xyzw + 4*ovi)[3]
= ((float)((1.0))))
;
1615
1616 if (sctx->normalsFind) {
1617 double len=ELL_3V_LEN(sctx->facenorm+3*fidx)(sqrt((((sctx->facenorm+3*fidx))[0]*((sctx->facenorm+3*
fidx))[0] + ((sctx->facenorm+3*fidx))[1]*((sctx->facenorm
+3*fidx))[1] + ((sctx->facenorm+3*fidx))[2]*((sctx->facenorm
+3*fidx))[2])))
;
1618 airArrayLenIncr(bag->normArr, 1);
1619 ELL_3V_SCALE_TT(lpld->norm + 3*ovi, float, 1.0/len,((lpld->norm + 3*ovi)[0] = ((float)((1.0/len)*(sctx->facenorm
+3*fidx)[0])), (lpld->norm + 3*ovi)[1] = ((float)((1.0/len
)*(sctx->facenorm+3*fidx)[1])), (lpld->norm + 3*ovi)[2]
= ((float)((1.0/len)*(sctx->facenorm+3*fidx)[2])))
1620 sctx->facenorm+3*fidx)((lpld->norm + 3*ovi)[0] = ((float)((1.0/len)*(sctx->facenorm
+3*fidx)[0])), (lpld->norm + 3*ovi)[1] = ((float)((1.0/len
)*(sctx->facenorm+3*fidx)[1])), (lpld->norm + 3*ovi)[2]
= ((float)((1.0/len)*(sctx->facenorm+3*fidx)[2])))
;
1621 }
1622
1623 sctx->vertNum++;
1624 }
1625 }
1626 }
1627 if (polyct>4) { /* we need to insert a helper vertex */
1628 double tvertA[4], tvertB[4], tvertAsum[4]={0,0,0,0},
1629 normsum[3]={0,0,0};
1630 int ovi;
1631 unsigned int vii[3];
1632
1633 for (j=0; j<polyct; j++) {
1634 if (polygon[j]<36) {
1635 int eidx=3*(bag->evti[polygon[j]/3] + 5*si)+polygon[j]%3;
1636 ELL_3V_COPY(tvertA, sctx->edgeicoord+3*eidx)((tvertA)[0] = (sctx->edgeicoord+3*eidx)[0], (tvertA)[1] =
(sctx->edgeicoord+3*eidx)[1], (tvertA)[2] = (sctx->edgeicoord
+3*eidx)[2])
;
1637 tvertA[3]=1.0;
1638 ELL_4V_INCR(tvertAsum,tvertA)((tvertAsum)[0] += (tvertA)[0], (tvertAsum)[1] += (tvertA)[1]
, (tvertAsum)[2] += (tvertA)[2], (tvertAsum)[3] += (tvertA)[3
])
;
1639 if (ELL_3V_DOT(normsum,sctx->edgenorm+3*eidx)((normsum)[0]*(sctx->edgenorm+3*eidx)[0] + (normsum)[1]*(sctx
->edgenorm+3*eidx)[1] + (normsum)[2]*(sctx->edgenorm+3*
eidx)[2])
<0)
1640 ELL_3V_SUB(normsum,normsum,sctx->edgenorm+3*eidx)((normsum)[0] = (normsum)[0] - (sctx->edgenorm+3*eidx)[0],
(normsum)[1] = (normsum)[1] - (sctx->edgenorm+3*eidx)[1],
(normsum)[2] = (normsum)[2] - (sctx->edgenorm+3*eidx)[2])
;
1641 else
1642 ELL_3V_INCR(normsum,sctx->edgenorm+3*eidx)((normsum)[0] += (sctx->edgenorm+3*eidx)[0], (normsum)[1] +=
(sctx->edgenorm+3*eidx)[1], (normsum)[2] += (sctx->edgenorm
+3*eidx)[2])
;
1643 } else {
1644 int fidx=fvti[polygon[j]-36];
1645 ELL_3V_COPY(tvertA, sctx->faceicoord+3*fidx)((tvertA)[0] = (sctx->faceicoord+3*fidx)[0], (tvertA)[1] =
(sctx->faceicoord+3*fidx)[1], (tvertA)[2] = (sctx->faceicoord
+3*fidx)[2])
;
1646 tvertA[3]=1.0;
1647 ELL_4V_INCR(tvertAsum,tvertA)((tvertAsum)[0] += (tvertA)[0], (tvertAsum)[1] += (tvertA)[1]
, (tvertAsum)[2] += (tvertA)[2], (tvertAsum)[3] += (tvertA)[3
])
;
1648 if (ELL_3V_DOT(normsum,sctx->facenorm+3*fidx)((normsum)[0]*(sctx->facenorm+3*fidx)[0] + (normsum)[1]*(sctx
->facenorm+3*fidx)[1] + (normsum)[2]*(sctx->facenorm+3*
fidx)[2])
<0)
1649 ELL_3V_SUB(normsum,normsum,sctx->facenorm+3*fidx)((normsum)[0] = (normsum)[0] - (sctx->facenorm+3*fidx)[0],
(normsum)[1] = (normsum)[1] - (sctx->facenorm+3*fidx)[1],
(normsum)[2] = (normsum)[2] - (sctx->facenorm+3*fidx)[2])
;
1650 else
1651 ELL_3V_INCR(normsum,sctx->facenorm+3*fidx)((normsum)[0] += (sctx->facenorm+3*fidx)[0], (normsum)[1] +=
(sctx->facenorm+3*fidx)[1], (normsum)[2] += (sctx->facenorm
+3*fidx)[2])
;
1652 }
1653 }
1654 /* tvertB in input index space */
1655 ELL_4MV_MUL(tvertB, sctx->txfIdx, tvertAsum)((tvertB)[0]=(sctx->txfIdx)[ 0]*(tvertAsum)[0]+(sctx->txfIdx
)[ 1]*(tvertAsum)[1]+(sctx->txfIdx)[ 2]*(tvertAsum)[2]+(sctx
->txfIdx)[ 3]*(tvertAsum)[3], (tvertB)[1]=(sctx->txfIdx
)[ 4]*(tvertAsum)[0]+(sctx->txfIdx)[ 5]*(tvertAsum)[1]+(sctx
->txfIdx)[ 6]*(tvertAsum)[2]+(sctx->txfIdx)[ 7]*(tvertAsum
)[3], (tvertB)[2]=(sctx->txfIdx)[ 8]*(tvertAsum)[0]+(sctx->
txfIdx)[ 9]*(tvertAsum)[1]+(sctx->txfIdx)[10]*(tvertAsum)[
2]+(sctx->txfIdx)[11]*(tvertAsum)[3], (tvertB)[3]=(sctx->
txfIdx)[12]*(tvertAsum)[0]+(sctx->txfIdx)[13]*(tvertAsum)[
1]+(sctx->txfIdx)[14]*(tvertAsum)[2]+(sctx->txfIdx)[15]
*(tvertAsum)[3])
;
1656 /* tvertA in world space */
1657 ELL_4MV_MUL(tvertA, sctx->shape->ItoW, tvertB)((tvertA)[0]=(sctx->shape->ItoW)[ 0]*(tvertB)[0]+(sctx->
shape->ItoW)[ 1]*(tvertB)[1]+(sctx->shape->ItoW)[ 2]
*(tvertB)[2]+(sctx->shape->ItoW)[ 3]*(tvertB)[3], (tvertA
)[1]=(sctx->shape->ItoW)[ 4]*(tvertB)[0]+(sctx->shape
->ItoW)[ 5]*(tvertB)[1]+(sctx->shape->ItoW)[ 6]*(tvertB
)[2]+(sctx->shape->ItoW)[ 7]*(tvertB)[3], (tvertA)[2]=(
sctx->shape->ItoW)[ 8]*(tvertB)[0]+(sctx->shape->
ItoW)[ 9]*(tvertB)[1]+(sctx->shape->ItoW)[10]*(tvertB)[
2]+(sctx->shape->ItoW)[11]*(tvertB)[3], (tvertA)[3]=(sctx
->shape->ItoW)[12]*(tvertB)[0]+(sctx->shape->ItoW
)[13]*(tvertB)[1]+(sctx->shape->ItoW)[14]*(tvertB)[2]+(
sctx->shape->ItoW)[15]*(tvertB)[3])
;
1658 ELL_4V_HOMOG(tvertA, tvertA)((tvertA)[0] = (tvertA)[0]/(tvertA)[3], (tvertA)[1] = (tvertA
)[1]/(tvertA)[3], (tvertA)[2] = (tvertA)[2]/(tvertA)[3], (tvertA
)[3] = 1.0)
;
1659
1660 ovi = airArrayLenIncr(bag->xyzwArr, 1);
1661 ELL_4V_SET_TT(lpld->xyzw + 4*ovi, float,((lpld->xyzw + 4*ovi)[0] = ((float)((tvertA[0]))), (lpld->
xyzw + 4*ovi)[1] = ((float)((tvertA[1]))), (lpld->xyzw + 4
*ovi)[2] = ((float)((tvertA[2]))), (lpld->xyzw + 4*ovi)[3]
= ((float)((1.0))))
1662 tvertA[0], tvertA[1], tvertA[2], 1.0)((lpld->xyzw + 4*ovi)[0] = ((float)((tvertA[0]))), (lpld->
xyzw + 4*ovi)[1] = ((float)((tvertA[1]))), (lpld->xyzw + 4
*ovi)[2] = ((float)((tvertA[2]))), (lpld->xyzw + 4*ovi)[3]
= ((float)((1.0))))
;
1663 if (sctx->normalsFind) {
1664 double len=ELL_3V_LEN(normsum)(sqrt((((normsum))[0]*((normsum))[0] + ((normsum))[1]*((normsum
))[1] + ((normsum))[2]*((normsum))[2])))
;
1665 airArrayLenIncr(bag->normArr, 1);
1666 ELL_3V_SCALE_TT(lpld->norm + 3*ovi, float, 1.0/len, normsum)((lpld->norm + 3*ovi)[0] = ((float)((1.0/len)*(normsum)[0]
)), (lpld->norm + 3*ovi)[1] = ((float)((1.0/len)*(normsum)
[1])), (lpld->norm + 3*ovi)[2] = ((float)((1.0/len)*(normsum
)[2])))
;
1667 }
1668 sctx->vertNum++;
1669
1670 vii[0]=ovi;
1671 vii[1]=sctx->vidx[3*(bag->evti[polygon[0]/3]+5*si)+polygon[0]%3];
1672 for (j=0; j<polyct; ++j) {
1673 double edgeA[3], edgeB[3];
1674 double norm[3];
1675 vii[2]=vii[1];
1676 if (j==polyct-1) {
1677 if (polygon[0]<36)
1678 vii[1]=sctx->vidx[3*(bag->evti[polygon[0]/3] + 5*si)+
1679 polygon[0]%3];
1680 else vii[1]=sctx->facevidx[fvti[polygon[0]-36]];
1681 } else {
1682 if (polygon[j+1]<36)
1683 vii[1]=sctx->vidx[3*(bag->evti[polygon[j+1]/3] + 5*si)+
1684 polygon[j+1]%3];
1685 else vii[1]=sctx->facevidx[fvti[polygon[j+1]-36]];
1686 }
1687
1688 /* check for degenerate tris */
1689 ELL_3V_SUB(edgeA, lpld->xyzw+4*vii[1], lpld->xyzw+4*vii[0])((edgeA)[0] = (lpld->xyzw+4*vii[1])[0] - (lpld->xyzw+4*
vii[0])[0], (edgeA)[1] = (lpld->xyzw+4*vii[1])[1] - (lpld->
xyzw+4*vii[0])[1], (edgeA)[2] = (lpld->xyzw+4*vii[1])[2] -
(lpld->xyzw+4*vii[0])[2])
;
1690 ELL_3V_SUB(edgeB, lpld->xyzw+4*vii[2], lpld->xyzw+4*vii[0])((edgeB)[0] = (lpld->xyzw+4*vii[2])[0] - (lpld->xyzw+4*
vii[0])[0], (edgeB)[1] = (lpld->xyzw+4*vii[2])[1] - (lpld->
xyzw+4*vii[0])[1], (edgeB)[2] = (lpld->xyzw+4*vii[2])[2] -
(lpld->xyzw+4*vii[0])[2])
;
1691 ELL_3V_CROSS(norm, edgeA, edgeB)((norm)[0] = (edgeA)[1]*(edgeB)[2] - (edgeA)[2]*(edgeB)[1], (
norm)[1] = (edgeA)[2]*(edgeB)[0] - (edgeA)[0]*(edgeB)[2], (norm
)[2] = (edgeA)[0]*(edgeB)[1] - (edgeA)[1]*(edgeB)[0])
;
1692 if (ELL_3V_DOT(norm,norm)((norm)[0]*(norm)[0] + (norm)[1]*(norm)[1] + (norm)[2]*(norm)
[2])
!=0) {
1693 unsigned iii = airArrayLenIncr(bag->indxArr, 3);
1694 ELL_3V_COPY(lpld->indx + iii, vii)((lpld->indx + iii)[0] = (vii)[0], (lpld->indx + iii)[1
] = (vii)[1], (lpld->indx + iii)[2] = (vii)[2])
;
1695 lpld->icnt[0] += 3;
1696 sctx->faceNum++;
1697 }
1698 /* else: degeneracies are caused by intersections that
1699 * more or less coincide with a grid vertex. They
1700 * should be harmless, so just don't create
1701 * deg. triangles in this case */
1702 }
1703 } else if (polyct>2) {
1704 /* insert the actual triangles */
1705 unsigned int vii[3], iii;
1706 if (polygon[0]<36)
1707 vii[0]=sctx->vidx[3*(bag->evti[polygon[0]/3] + 5*si)+
1708 polygon[0]%3];
1709 else vii[0]=sctx->facevidx[fvti[polygon[0]-36]];
1710 if (polygon[1]<36)
1711 vii[1]=sctx->vidx[3*(bag->evti[polygon[1]/3] + 5*si)+
1712 polygon[1]%3];
1713 else vii[1]=sctx->facevidx[fvti[polygon[1]-36]];
1714 if (polygon[2]<36)
1715 vii[2]=sctx->vidx[3*(bag->evti[polygon[2]/3] + 5*si)+
1716 polygon[2]%3];
1717 else vii[2]=sctx->facevidx[fvti[polygon[2]-36]];
1718 iii = airArrayLenIncr(bag->indxArr, 3);
1719 ELL_3V_COPY(lpld->indx + iii, vii)((lpld->indx + iii)[0] = (vii)[0], (lpld->indx + iii)[1
] = (vii)[1], (lpld->indx + iii)[2] = (vii)[2])
;
1720 lpld->icnt[0] += 3;
1721 sctx->faceNum++;
1722
1723 if (polyct==4) {
1724 vii[1]=vii[2];
1725 if (polygon[3]<36)
1726 vii[2]=sctx->vidx[3*(bag->evti[polygon[3]/3] + 5*si)+
1727 polygon[3]%3];
1728 else vii[2]=sctx->facevidx[fvti[polygon[3]-36]];
1729 iii = airArrayLenIncr(bag->indxArr, 3);
1730 ELL_3V_COPY(lpld->indx + iii, vii)((lpld->indx + iii)[0] = (vii)[0], (lpld->indx + iii)[1
] = (vii)[1], (lpld->indx + iii)[2] = (vii)[2])
;
1731 lpld->icnt[0] += 3;
1732 sctx->faceNum++;
1733 }
1734 }
1735 }
1736 }
1737 }
1738 }
1739 }
1740 return 0;
1741}
1742
1743static void
1744shuffleT(seekContext *sctx, baggage *bag) {
1745 unsigned int xi, yi, sx, sy, si;
1746
1747 sx = AIR_CAST(unsigned int, sctx->sx)((unsigned int)(sctx->sx));
1748 sy = AIR_CAST(unsigned int, sctx->sy)((unsigned int)(sctx->sy));
1749
1750 if (sctx->strengthUse) { /* requests need to be cleared initially */
1751 for (yi=0; yi<sy; yi++) {
1752 for (xi=0; xi<sx; xi++) {
1753 sctx->treated[xi+sx*yi] &= 0xFF^_SEEK_TREATED_REQUEST0x01;
1754 }
1755 }
1756 } /* else, the request bits are always on */
1757
1758 for (yi=0; yi<sy; yi++) {
1759 for (xi=0; xi<sx; xi++) {
1760 si = xi + sx*yi;
1761
1762 /* vidx neither needs past nor future context */
1763 if (!bag->zi) {
1764 ELL_3V_SET(sctx->vidx+3*(0+5*si), -1, -1, -1)((sctx->vidx+3*(0+5*si))[0] = (-1), (sctx->vidx+3*(0+5*
si))[1] = (-1), (sctx->vidx+3*(0+5*si))[2] = (-1))
;
1765 ELL_3V_SET(sctx->vidx+3*(1+5*si), -1, -1, -1)((sctx->vidx+3*(1+5*si))[0] = (-1), (sctx->vidx+3*(1+5*
si))[1] = (-1), (sctx->vidx+3*(1+5*si))[2] = (-1))
;
1766 } else {
1767 ELL_3V_COPY(sctx->vidx+3*(0+5*si), sctx->vidx+3*(3+5*si))((sctx->vidx+3*(0+5*si))[0] = (sctx->vidx+3*(3+5*si))[0
], (sctx->vidx+3*(0+5*si))[1] = (sctx->vidx+3*(3+5*si))
[1], (sctx->vidx+3*(0+5*si))[2] = (sctx->vidx+3*(3+5*si
))[2])
;
1768 ELL_3V_COPY(sctx->vidx+3*(1+5*si), sctx->vidx+3*(4+5*si))((sctx->vidx+3*(1+5*si))[0] = (sctx->vidx+3*(4+5*si))[0
], (sctx->vidx+3*(1+5*si))[1] = (sctx->vidx+3*(4+5*si))
[1], (sctx->vidx+3*(1+5*si))[2] = (sctx->vidx+3*(4+5*si
))[2])
;
1769 }
1770 ELL_3V_SET(sctx->vidx+3*(2+5*si),-1,-1,-1)((sctx->vidx+3*(2+5*si))[0] = (-1), (sctx->vidx+3*(2+5*
si))[1] = (-1), (sctx->vidx+3*(2+5*si))[2] = (-1))
;
1771 ELL_3V_SET(sctx->vidx+3*(3+5*si),-1,-1,-1)((sctx->vidx+3*(3+5*si))[0] = (-1), (sctx->vidx+3*(3+5*
si))[1] = (-1), (sctx->vidx+3*(3+5*si))[2] = (-1))
;
1772 ELL_3V_SET(sctx->vidx+3*(4+5*si),-1,-1,-1)((sctx->vidx+3*(4+5*si))[0] = (-1), (sctx->vidx+3*(4+5*
si))[1] = (-1), (sctx->vidx+3*(4+5*si))[2] = (-1))
;
1773
1774 /* strength only has future context */
1775 if (sctx->strengthUse) {
1776 sctx->stng[0 + 2*si] = sctx->stng[1 + 2*si];
1777 sctx->stng[1 + 2*si] = sctx->stngcontext[si];
1778 if (sctx->stng[0+2*si]>sctx->strength ||
1779 sctx->stng[1+2*si]>sctx->strength) {
1780 /* set up to four request bits */
1781 sctx->treated[si] |= _SEEK_TREATED_REQUEST0x01;
1782 if (xi!=0) sctx->treated[xi-1+sx*yi] |= _SEEK_TREATED_REQUEST0x01;
1783 if (yi!=0) sctx->treated[xi+sx*(yi-1)] |= _SEEK_TREATED_REQUEST0x01;
1784 if (xi!=0 && yi!=0)
1785 sctx->treated[xi-1+sx*(yi-1)] |= _SEEK_TREATED_REQUEST0x01;
1786 }
1787 }
1788
1789 /* shuffle grad, hess and t in three steps: move to past context,
1790 * shuffle in slab itself, move from future context */
1791
1792 ELL_3V_COPY(sctx->gradcontext + 3*(0+2*si), sctx->grad + 3*(0+2*si))((sctx->gradcontext + 3*(0+2*si))[0] = (sctx->grad + 3*
(0+2*si))[0], (sctx->gradcontext + 3*(0+2*si))[1] = (sctx->
grad + 3*(0+2*si))[1], (sctx->gradcontext + 3*(0+2*si))[2]
= (sctx->grad + 3*(0+2*si))[2])
;
1793 ELL_3V_COPY(sctx->grad + 3*(0+2*si), sctx->grad + 3*(1+2*si))((sctx->grad + 3*(0+2*si))[0] = (sctx->grad + 3*(1+2*si
))[0], (sctx->grad + 3*(0+2*si))[1] = (sctx->grad + 3*(
1+2*si))[1], (sctx->grad + 3*(0+2*si))[2] = (sctx->grad
+ 3*(1+2*si))[2])
;
1794 ELL_3V_COPY(sctx->grad + 3*(1+2*si), sctx->gradcontext + 3*(1+2*si))((sctx->grad + 3*(1+2*si))[0] = (sctx->gradcontext + 3*
(1+2*si))[0], (sctx->grad + 3*(1+2*si))[1] = (sctx->gradcontext
+ 3*(1+2*si))[1], (sctx->grad + 3*(1+2*si))[2] = (sctx->
gradcontext + 3*(1+2*si))[2])
;
1795
1796 ELL_3M_COPY(sctx->hesscontext + 9*(0+2*si), sctx->hess + 9*(0+2*si))((((sctx->hesscontext + 9*(0+2*si))+0)[0] = ((sctx->hess
+ 9*(0+2*si))+0)[0], ((sctx->hesscontext + 9*(0+2*si))+0)
[1] = ((sctx->hess + 9*(0+2*si))+0)[1], ((sctx->hesscontext
+ 9*(0+2*si))+0)[2] = ((sctx->hess + 9*(0+2*si))+0)[2]), (
((sctx->hesscontext + 9*(0+2*si))+3)[0] = ((sctx->hess +
9*(0+2*si))+3)[0], ((sctx->hesscontext + 9*(0+2*si))+3)[1
] = ((sctx->hess + 9*(0+2*si))+3)[1], ((sctx->hesscontext
+ 9*(0+2*si))+3)[2] = ((sctx->hess + 9*(0+2*si))+3)[2]), (
((sctx->hesscontext + 9*(0+2*si))+6)[0] = ((sctx->hess +
9*(0+2*si))+6)[0], ((sctx->hesscontext + 9*(0+2*si))+6)[1
] = ((sctx->hess + 9*(0+2*si))+6)[1], ((sctx->hesscontext
+ 9*(0+2*si))+6)[2] = ((sctx->hess + 9*(0+2*si))+6)[2]))
;
1797 ELL_3M_COPY(sctx->hess + 9*(0+2*si), sctx->hess + 9*(1+2*si))((((sctx->hess + 9*(0+2*si))+0)[0] = ((sctx->hess + 9*(
1+2*si))+0)[0], ((sctx->hess + 9*(0+2*si))+0)[1] = ((sctx->
hess + 9*(1+2*si))+0)[1], ((sctx->hess + 9*(0+2*si))+0)[2]
= ((sctx->hess + 9*(1+2*si))+0)[2]), (((sctx->hess + 9
*(0+2*si))+3)[0] = ((sctx->hess + 9*(1+2*si))+3)[0], ((sctx
->hess + 9*(0+2*si))+3)[1] = ((sctx->hess + 9*(1+2*si))
+3)[1], ((sctx->hess + 9*(0+2*si))+3)[2] = ((sctx->hess
+ 9*(1+2*si))+3)[2]), (((sctx->hess + 9*(0+2*si))+6)[0] =
((sctx->hess + 9*(1+2*si))+6)[0], ((sctx->hess + 9*(0+
2*si))+6)[1] = ((sctx->hess + 9*(1+2*si))+6)[1], ((sctx->
hess + 9*(0+2*si))+6)[2] = ((sctx->hess + 9*(1+2*si))+6)[2
]))
;
1798 ELL_3M_COPY(sctx->hess + 9*(1+2*si), sctx->hesscontext + 9*(1+2*si))((((sctx->hess + 9*(1+2*si))+0)[0] = ((sctx->hesscontext
+ 9*(1+2*si))+0)[0], ((sctx->hess + 9*(1+2*si))+0)[1] = (
(sctx->hesscontext + 9*(1+2*si))+0)[1], ((sctx->hess + 9
*(1+2*si))+0)[2] = ((sctx->hesscontext + 9*(1+2*si))+0)[2]
), (((sctx->hess + 9*(1+2*si))+3)[0] = ((sctx->hesscontext
+ 9*(1+2*si))+3)[0], ((sctx->hess + 9*(1+2*si))+3)[1] = (
(sctx->hesscontext + 9*(1+2*si))+3)[1], ((sctx->hess + 9
*(1+2*si))+3)[2] = ((sctx->hesscontext + 9*(1+2*si))+3)[2]
), (((sctx->hess + 9*(1+2*si))+6)[0] = ((sctx->hesscontext
+ 9*(1+2*si))+6)[0], ((sctx->hess + 9*(1+2*si))+6)[1] = (
(sctx->hesscontext + 9*(1+2*si))+6)[1], ((sctx->hess + 9
*(1+2*si))+6)[2] = ((sctx->hesscontext + 9*(1+2*si))+6)[2]
))
;
1799
1800 ELL_3M_COPY(sctx->tcontext + 9*(0+2*si), sctx->t + 9*(0+2*si))((((sctx->tcontext + 9*(0+2*si))+0)[0] = ((sctx->t + 9*
(0+2*si))+0)[0], ((sctx->tcontext + 9*(0+2*si))+0)[1] = ((
sctx->t + 9*(0+2*si))+0)[1], ((sctx->tcontext + 9*(0+2*
si))+0)[2] = ((sctx->t + 9*(0+2*si))+0)[2]), (((sctx->tcontext
+ 9*(0+2*si))+3)[0] = ((sctx->t + 9*(0+2*si))+3)[0], ((sctx
->tcontext + 9*(0+2*si))+3)[1] = ((sctx->t + 9*(0+2*si)
)+3)[1], ((sctx->tcontext + 9*(0+2*si))+3)[2] = ((sctx->
t + 9*(0+2*si))+3)[2]), (((sctx->tcontext + 9*(0+2*si))+6)
[0] = ((sctx->t + 9*(0+2*si))+6)[0], ((sctx->tcontext +
9*(0+2*si))+6)[1] = ((sctx->t + 9*(0+2*si))+6)[1], ((sctx
->tcontext + 9*(0+2*si))+6)[2] = ((sctx->t + 9*(0+2*si)
)+6)[2]))
;
1801 ELL_3M_COPY(sctx->t + 9*(0+2*si), sctx->t + 9*(1+2*si))((((sctx->t + 9*(0+2*si))+0)[0] = ((sctx->t + 9*(1+2*si
))+0)[0], ((sctx->t + 9*(0+2*si))+0)[1] = ((sctx->t + 9
*(1+2*si))+0)[1], ((sctx->t + 9*(0+2*si))+0)[2] = ((sctx->
t + 9*(1+2*si))+0)[2]), (((sctx->t + 9*(0+2*si))+3)[0] = (
(sctx->t + 9*(1+2*si))+3)[0], ((sctx->t + 9*(0+2*si))+3
)[1] = ((sctx->t + 9*(1+2*si))+3)[1], ((sctx->t + 9*(0+
2*si))+3)[2] = ((sctx->t + 9*(1+2*si))+3)[2]), (((sctx->
t + 9*(0+2*si))+6)[0] = ((sctx->t + 9*(1+2*si))+6)[0], ((sctx
->t + 9*(0+2*si))+6)[1] = ((sctx->t + 9*(1+2*si))+6)[1]
, ((sctx->t + 9*(0+2*si))+6)[2] = ((sctx->t + 9*(1+2*si
))+6)[2]))
;
1802 ELL_3M_COPY(sctx->t + 9*(1+2*si), sctx->tcontext + 9*(1+2*si))((((sctx->t + 9*(1+2*si))+0)[0] = ((sctx->tcontext + 9*
(1+2*si))+0)[0], ((sctx->t + 9*(1+2*si))+0)[1] = ((sctx->
tcontext + 9*(1+2*si))+0)[1], ((sctx->t + 9*(1+2*si))+0)[2
] = ((sctx->tcontext + 9*(1+2*si))+0)[2]), (((sctx->t +
9*(1+2*si))+3)[0] = ((sctx->tcontext + 9*(1+2*si))+3)[0],
((sctx->t + 9*(1+2*si))+3)[1] = ((sctx->tcontext + 9*(
1+2*si))+3)[1], ((sctx->t + 9*(1+2*si))+3)[2] = ((sctx->
tcontext + 9*(1+2*si))+3)[2]), (((sctx->t + 9*(1+2*si))+6)
[0] = ((sctx->tcontext + 9*(1+2*si))+6)[0], ((sctx->t +
9*(1+2*si))+6)[1] = ((sctx->tcontext + 9*(1+2*si))+6)[1],
((sctx->t + 9*(1+2*si))+6)[2] = ((sctx->tcontext + 9*(
1+2*si))+6)[2]))
;
1803 }
1804 }
1805}
1806
1807static void
1808probeT(seekContext *sctx, baggage *bag, double zi) {
1809 unsigned int xi, yi, sx, sy, si;
1810
1811 sx = AIR_CAST(unsigned int, sctx->sx)((unsigned int)(sctx->sx));
1812 sy = AIR_CAST(unsigned int, sctx->sy)((unsigned int)(sctx->sy));
1813
1814 for (yi=0; yi<sy; yi++) {
1815 for (xi=0; xi<sx; xi++) {
1816 si = xi + sx*yi;
1817
1818 if (sctx->gctx) { /* HEY: need this check, what's the right way? */
1819 _seekIdxProbe(sctx, bag, xi, yi, zi);
1820 }
1821 if (sctx->strengthUse) {
1822 sctx->stngcontext[si] = sctx->strengthSign*sctx->stngAns[0];
1823 if (sctx->strengthSeenMax==AIR_NAN(airFloatQNaN.f)) {
1824 sctx->strengthSeenMax = sctx->stngcontext[si];
1825 }
1826 sctx->strengthSeenMax = AIR_MAX(sctx->strengthSeenMax,((sctx->strengthSeenMax) > (sctx->stngcontext[si]) ?
(sctx->strengthSeenMax) : (sctx->stngcontext[si]))
1827 sctx->stngcontext[si])((sctx->strengthSeenMax) > (sctx->stngcontext[si]) ?
(sctx->strengthSeenMax) : (sctx->stngcontext[si]))
;
1828 }
1829 ELL_3V_COPY(sctx->gradcontext + 3*(1 + 2*si), sctx->gradAns)((sctx->gradcontext + 3*(1 + 2*si))[0] = (sctx->gradAns
)[0], (sctx->gradcontext + 3*(1 + 2*si))[1] = (sctx->gradAns
)[1], (sctx->gradcontext + 3*(1 + 2*si))[2] = (sctx->gradAns
)[2])
;
1830 ELL_3M_COPY(sctx->hesscontext + 9*(1 + 2*si), sctx->hessAns)((((sctx->hesscontext + 9*(1 + 2*si))+0)[0] = ((sctx->hessAns
)+0)[0], ((sctx->hesscontext + 9*(1 + 2*si))+0)[1] = ((sctx
->hessAns)+0)[1], ((sctx->hesscontext + 9*(1 + 2*si))+0
)[2] = ((sctx->hessAns)+0)[2]), (((sctx->hesscontext + 9
*(1 + 2*si))+3)[0] = ((sctx->hessAns)+3)[0], ((sctx->hesscontext
+ 9*(1 + 2*si))+3)[1] = ((sctx->hessAns)+3)[1], ((sctx->
hesscontext + 9*(1 + 2*si))+3)[2] = ((sctx->hessAns)+3)[2]
), (((sctx->hesscontext + 9*(1 + 2*si))+6)[0] = ((sctx->
hessAns)+6)[0], ((sctx->hesscontext + 9*(1 + 2*si))+6)[1] =
((sctx->hessAns)+6)[1], ((sctx->hesscontext + 9*(1 + 2
*si))+6)[2] = ((sctx->hessAns)+6)[2]))
;
1831 _seekHess2T(sctx->tcontext + 9*(1 + 2*si), sctx->evalAns, sctx->evecAns,
1832 sctx->evalDiffThresh, (sctx->type==seekTypeRidgeSurfaceT));
1833 }
1834 }
1835}
1836
1837/* it has now become much easier to make this its own routine
1838 * (vs. adding many more case distinctions to shuffleProbe)
1839 * this only duplicates little (and trivial) code */
1840int
1841_seekShuffleProbeT(seekContext *sctx, baggage *bag) {
1842 /* for high-quality normal estimation, we need two slices of data
1843 * context; to keep the code simple, separate shuffle and probe
1844 * operations - let's hope this doesn't destroy cache performance */
1845
1846 if (!bag->zi) {
1847 if (sctx->strengthUse)
1848 /* before the first round, initialize treated to zero */
1849 memset(sctx->treated, 0, sizeof(char)*sctx->sx*sctx->sy)__builtin___memset_chk (sctx->treated, 0, sizeof(char)*sctx
->sx*sctx->sy, __builtin_object_size (sctx->treated,
0))
;
1850 else /* request all edges */
1851 memset(sctx->treated, _SEEK_TREATED_REQUEST,__builtin___memset_chk (sctx->treated, 0x01, sizeof(char)*
sctx->sx*sctx->sy, __builtin_object_size (sctx->treated
, 0))
1852 sizeof(char)*sctx->sx*sctx->sy)__builtin___memset_chk (sctx->treated, 0x01, sizeof(char)*
sctx->sx*sctx->sy, __builtin_object_size (sctx->treated
, 0))
;
1853 probeT(sctx, bag, 0);
1854 shuffleT(sctx, bag);
1855 probeT(sctx, bag, 1);
1856 }
1857 shuffleT(sctx, bag);
1858 if (bag->zi!=sctx->sz-2)
1859 probeT(sctx, bag, bag->zi+2);
1860
1861 intersectionShuffleProbe(sctx, bag);
1862
1863 return 0;
1864}
1865
1866/* For all vertices in pld, use sctx to probe the strength measure,
1867 * and return the answer (times strengthSign) in nval. The intended
1868 * use is postfiltering (with limnPolyDataClip), which is obligatory
1869 * when using seekType*SurfaceT
1870 *
1871 * Returns 1 and adds a message to biff upon error
1872 * Returns 0 on success, -n when probing n vertices failed (strength
1873 * is set to AIR_NAN for those); note that positions outside the field
1874 * are clamped to lie on its boundary.
1875 *
1876 * This routine assumes that a strength has been set in sctx and
1877 * seekUpdate() has been run.
1878 * This routine does not modify sctx->strengthSeenMax.
1879 */
1880int
1881seekVertexStrength(Nrrd *nval, seekContext *sctx, limnPolyData *pld) {
1882 static const char me[]="seekVertexStrength";
1883 unsigned int i;
1884 double *data;
1885 int E=0;
1886
1887 if (!(nval && sctx && pld)) {
1888 biffAddf(SEEKseekBiffKey, "%s: got NULL pointer", me);
1889 return 1;
1890 }
1891 if (!(sctx->gctx && sctx->pvl)) {
1892 biffAddf(SEEKseekBiffKey, "%s: need sctx with attached gageContext", me);
1893 return 1;
1894 }
1895 if (!sctx->stngAns) {
1896 biffAddf(SEEKseekBiffKey, "%s: no strength item found. Did you enable strengthUse?",
1897 me);
1898 return 1;
1899 }
1900 if (nrrdAlloc_va(nval, nrrdTypeDouble, 1, (size_t) pld->xyzwNum)) {
1901 biffAddf(SEEKseekBiffKey, "%s: could not allocate output", me);
1902 return 1;
1903 }
1904
1905 data = (double*) nval->data;
1906 for (i=0; i<pld->xyzwNum; i++) {
1907 float homog[4];
1908 ELL_4V_HOMOG(homog, pld->xyzw+4*i)((homog)[0] = (pld->xyzw+4*i)[0]/(pld->xyzw+4*i)[3], (homog
)[1] = (pld->xyzw+4*i)[1]/(pld->xyzw+4*i)[3], (homog)[2
] = (pld->xyzw+4*i)[2]/(pld->xyzw+4*i)[3], (homog)[3] =
1.0)
;
1909 if (!gageProbeSpace(sctx->gctx,homog[0],homog[1],homog[2],0,1)) {
1910 *(data++)=*(sctx->stngAns)*sctx->strengthSign;
1911 } else {
1912 *(data++)=AIR_NAN(airFloatQNaN.f);
1913 E--;
1914 }
1915 }
1916 return E;
1917}