File: | src/seek/textract.c |
Location: | line 204, column 3 |
Description: | The left operand of '-' is a garbage value |
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 | */ | |||||
40 | void | |||||
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 | */ | |||||
73 | void | |||||
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 | ||||||
128 | static int | |||||
129 | findFeatureIntersection(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. */ | |||||
195 | static void | |||||
196 | computeGradientLin(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 */ | |||||
239 | static void | |||||
240 | computeEdgeGradient(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 */ | |||||
509 | static void | |||||
510 | computeFaceGradient(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 */ | |||||
706 | static int | |||||
707 | checkTriOrientation (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 */ | |||||
715 | static int | |||||
716 | lineIntersectionTest (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 */ | |||||
729 | static int | |||||
730 | triIntersectionTest (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 */ | |||||
866 | static double | |||||
867 | evaluateDegConnection(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 */ | |||||
910 | static void | |||||
911 | findConnectivity(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 */ | |||||
964 | static void | |||||
965 | connectFace(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 | ||||||
1218 | static void | |||||
1219 | intersectionShuffleProbe(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 */ | |||||
1320 | int | |||||
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; | |||||
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 | ||||||
1743 | static void | |||||
1744 | shuffleT(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 | ||||||
1807 | static void | |||||
1808 | probeT(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 */ | |||||
1840 | int | |||||
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 | */ | |||||
1880 | int | |||||
1881 | seekVertexStrength(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 | } |