File: | src/limn/polyfilter.c |
Location: | line 434, column 22 |
Description: | Call to 'malloc' has an allocation size of 0 bytes |
1 | /* | |||
2 | Teem: Tools to process and visualize scientific data and images . | |||
3 | Copyright (C) 2013, 2012, 2011, 2010, 2009 University of Chicago | |||
4 | Copyright (C) 2008, 2007, 2006, 2005 Gordon Kindlmann | |||
5 | Copyright (C) 2004, 2003, 2002, 2001, 2000, 1999, 1998 University of Utah | |||
6 | Copyright (C) 2011 Thomas Schultz | |||
7 | ||||
8 | This library is free software; you can redistribute it and/or | |||
9 | modify it under the terms of the GNU Lesser General Public License | |||
10 | (LGPL) as published by the Free Software Foundation; either | |||
11 | version 2.1 of the License, or (at your option) any later version. | |||
12 | The terms of redistributing and/or modifying this software also | |||
13 | include exceptions to the LGPL that facilitate static linking. | |||
14 | ||||
15 | This library is distributed in the hope that it will be useful, | |||
16 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
17 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
18 | Lesser General Public License for more details. | |||
19 | ||||
20 | You should have received a copy of the GNU Lesser General Public License | |||
21 | along with this library; if not, write to Free Software Foundation, Inc., | |||
22 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
23 | */ | |||
24 | ||||
25 | ||||
26 | #include "limn.h" | |||
27 | ||||
28 | int | |||
29 | limnPolyDataSpiralTubeWrap(limnPolyData *pldOut, const limnPolyData *pldIn, | |||
30 | unsigned int infoBitFlag, Nrrd *nvertmap, | |||
31 | unsigned int tubeFacet, unsigned int endFacet, | |||
32 | double radius) { | |||
33 | static const char me[]="limnPolyDataSpiralTubeWrap"; | |||
34 | double *cost, *sint; | |||
35 | unsigned int tubeVertNum = 0, tubeIndxNum = 0, primIdx, pi, *vertmap; | |||
36 | unsigned int inVertTotalIdx = 0, outVertTotalIdx = 0, outIndxIdx = 0; | |||
37 | int color; | |||
38 | airArray *mop; | |||
39 | ||||
40 | if (!( pldOut && pldIn )) { | |||
41 | biffAddf(LIMNlimnBiffKey, "%s: got NULL pointer", me); | |||
42 | return 1; | |||
43 | } | |||
44 | if ((1 << limnPrimitiveLineStrip) != limnPolyDataPrimitiveTypes(pldIn)) { | |||
45 | biffAddf(LIMNlimnBiffKey, "%s: sorry, can only handle %s primitives", me, | |||
46 | airEnumStr(limnPrimitive, limnPrimitiveLineStrip)); | |||
47 | return 1; | |||
48 | } | |||
49 | for (primIdx=0; primIdx<pldIn->primNum; primIdx++) { | |||
50 | unsigned int tvni, tini; | |||
51 | if (endFacet) { | |||
52 | tvni = tubeFacet*(2*endFacet + pldIn->icnt[primIdx]) + 1; | |||
53 | tini = 2*tubeFacet*(2*endFacet + pldIn->icnt[primIdx] + 1) -2; | |||
54 | } else { | |||
55 | tvni = tubeFacet*(2 + pldIn->icnt[primIdx]); | |||
56 | tini = 2*tubeFacet*(1 + pldIn->icnt[primIdx]); | |||
57 | } | |||
58 | tubeVertNum += tvni; | |||
59 | tubeIndxNum += tini; | |||
60 | } | |||
61 | if (limnPolyDataAlloc(pldOut, | |||
62 | /* sorry have to have normals, even if they weren't | |||
63 | asked for, because currently they're used as part | |||
64 | of vertex position calc */ | |||
65 | (infoBitFlag | (1 << limnPolyDataInfoNorm)), | |||
66 | tubeVertNum, tubeIndxNum, pldIn->primNum)) { | |||
67 | biffAddf(LIMNlimnBiffKey, "%s: trouble allocating output", me); | |||
68 | return 1; | |||
69 | } | |||
70 | if (nvertmap) { | |||
71 | if (nrrdMaybeAlloc_va(nvertmap, nrrdTypeUInt, 1, | |||
72 | AIR_CAST(size_t, tubeVertNum)((size_t)(tubeVertNum)))) { | |||
73 | biffMovef(LIMNlimnBiffKey, NRRDnrrdBiffKey, "%s: trouble allocating vert map", me); | |||
74 | return 1; | |||
75 | } | |||
76 | vertmap = AIR_CAST(unsigned int *, nvertmap->data)((unsigned int *)(nvertmap->data)); | |||
77 | } else { | |||
78 | vertmap = NULL((void*)0); | |||
79 | } | |||
80 | color = ((infoBitFlag & (1 << limnPolyDataInfoRGBA)) | |||
81 | && (limnPolyDataInfoBitFlag(pldIn) & (1 << limnPolyDataInfoRGBA))); | |||
82 | ||||
83 | mop = airMopNew(); | |||
84 | cost = AIR_CAST(double *, calloc(tubeFacet, sizeof(double)))((double *)(calloc(tubeFacet, sizeof(double)))); | |||
85 | sint = AIR_CAST(double *, calloc(tubeFacet, sizeof(double)))((double *)(calloc(tubeFacet, sizeof(double)))); | |||
86 | airMopAdd(mop, cost, airFree, airMopAlways); | |||
87 | airMopAdd(mop, sint, airFree, airMopAlways); | |||
88 | if (!(cost && sint)) { | |||
89 | biffAddf(LIMNlimnBiffKey, "%s: couldn't allocate lookup tables", me); | |||
90 | airMopError(mop); return 1; | |||
91 | } | |||
92 | for (pi=0; pi<tubeFacet; pi++) { | |||
93 | double angle; | |||
94 | angle = AIR_AFFINE(0, pi, tubeFacet, 0, 2*AIR_PI)( ((double)(2*3.14159265358979323846)-(0))*((double)(pi)-(0)) / ((double)(tubeFacet)-(0)) + (0)); | |||
95 | cost[pi] = cos(angle); | |||
96 | sint[pi] = sin(angle); | |||
97 | } | |||
98 | for (primIdx=0; primIdx<pldIn->primNum; primIdx++) { | |||
99 | unsigned int inVertIdx; | |||
100 | pldOut->type[primIdx] = limnPrimitiveTriangleStrip; | |||
101 | if (endFacet) { | |||
102 | pldOut->icnt[primIdx] = | |||
103 | 2*tubeFacet*(2*endFacet + pldIn->icnt[primIdx] + 1) - 2; | |||
104 | } else { | |||
105 | pldOut->icnt[primIdx] = | |||
106 | 2*tubeFacet*(1 + pldIn->icnt[primIdx]); | |||
107 | } | |||
108 | ||||
109 | for (inVertIdx=0; | |||
110 | inVertIdx<pldIn->icnt[primIdx]; | |||
111 | inVertIdx++) { | |||
112 | unsigned int forwIdx, backIdx, tubeEndIdx; | |||
113 | double tang[3], tmp, scl, step, perp[3], pimp[3]; | |||
114 | /* inVrt = pldIn->vert + pldIn->indx[inVertTotalIdx]; */ | |||
115 | if (0 == inVertIdx) { | |||
116 | forwIdx = inVertTotalIdx+1; | |||
117 | backIdx = inVertTotalIdx; | |||
118 | scl = 1; | |||
119 | } else if (pldIn->icnt[primIdx]-1 == inVertIdx) { | |||
120 | forwIdx = inVertTotalIdx; | |||
121 | backIdx = inVertTotalIdx-1; | |||
122 | scl = 1; | |||
123 | } else { | |||
124 | forwIdx = inVertTotalIdx+1; | |||
125 | backIdx = inVertTotalIdx-1; | |||
126 | scl = 0.5; | |||
127 | } | |||
128 | if (1 == pldIn->icnt[primIdx]) { | |||
129 | ELL_3V_SET(tang, 0, 0, 1)((tang)[0] = (0), (tang)[1] = (0), (tang)[2] = (1)); /* completely arbitrary, as it must be */ | |||
130 | step = 0; | |||
131 | } else { | |||
132 | ELL_3V_SUB(tang,((tang)[0] = (pldIn->xyzw + 4*forwIdx)[0] - (pldIn->xyzw + 4*backIdx)[0], (tang)[1] = (pldIn->xyzw + 4*forwIdx)[1] - (pldIn->xyzw + 4*backIdx)[1], (tang)[2] = (pldIn->xyzw + 4*forwIdx)[2] - (pldIn->xyzw + 4*backIdx)[2]) | |||
133 | pldIn->xyzw + 4*forwIdx,((tang)[0] = (pldIn->xyzw + 4*forwIdx)[0] - (pldIn->xyzw + 4*backIdx)[0], (tang)[1] = (pldIn->xyzw + 4*forwIdx)[1] - (pldIn->xyzw + 4*backIdx)[1], (tang)[2] = (pldIn->xyzw + 4*forwIdx)[2] - (pldIn->xyzw + 4*backIdx)[2]) | |||
134 | pldIn->xyzw + 4*backIdx)((tang)[0] = (pldIn->xyzw + 4*forwIdx)[0] - (pldIn->xyzw + 4*backIdx)[0], (tang)[1] = (pldIn->xyzw + 4*forwIdx)[1] - (pldIn->xyzw + 4*backIdx)[1], (tang)[2] = (pldIn->xyzw + 4*forwIdx)[2] - (pldIn->xyzw + 4*backIdx)[2]); | |||
135 | ELL_3V_NORM(tang, tang, step)(step = (sqrt((((tang))[0]*((tang))[0] + ((tang))[1]*((tang)) [1] + ((tang))[2]*((tang))[2]))), ((tang)[0] = (1.0/step)*(tang )[0], (tang)[1] = (1.0/step)*(tang)[1], (tang)[2] = (1.0/step )*(tang)[2])); | |||
136 | step *= scl; | |||
137 | } | |||
138 | if (0 == inVertIdx || 1 == pldIn->icnt[primIdx]) { | |||
139 | ell_3v_perp_d(perp, tang); | |||
140 | } else { | |||
141 | /* transport last perp forwards */ | |||
142 | double dot; | |||
143 | dot = ELL_3V_DOT(perp, tang)((perp)[0]*(tang)[0] + (perp)[1]*(tang)[1] + (perp)[2]*(tang) [2]); | |||
144 | ELL_3V_SCALE_ADD2(perp, 1.0, perp, -dot, tang)((perp)[0] = (1.0)*(perp)[0] + (-dot)*(tang)[0], (perp)[1] = ( 1.0)*(perp)[1] + (-dot)*(tang)[1], (perp)[2] = (1.0)*(perp)[2 ] + (-dot)*(tang)[2]); | |||
145 | } | |||
146 | ELL_3V_NORM(perp, perp, tmp)(tmp = (sqrt((((perp))[0]*((perp))[0] + ((perp))[1]*((perp))[ 1] + ((perp))[2]*((perp))[2]))), ((perp)[0] = (1.0/tmp)*(perp )[0], (perp)[1] = (1.0/tmp)*(perp)[1], (perp)[2] = (1.0/tmp)* (perp)[2])); | |||
147 | ELL_3V_CROSS(pimp, perp, tang)((pimp)[0] = (perp)[1]*(tang)[2] - (perp)[2]*(tang)[1], (pimp )[1] = (perp)[2]*(tang)[0] - (perp)[0]*(tang)[2], (pimp)[2] = (perp)[0]*(tang)[1] - (perp)[1]*(tang)[0]); | |||
148 | /* (perp, pimp, tang) is a left-handed frame, on purpose */ | |||
149 | /* limnVrt *outVrt; */ | |||
150 | /* -------------------------------------- BEGIN initial endcap */ | |||
151 | if (0 == inVertIdx) { | |||
152 | unsigned int startIdx, ei; | |||
153 | startIdx = outVertTotalIdx; | |||
154 | if (endFacet) { | |||
155 | for (ei=0; ei<endFacet; ei++) { | |||
156 | for (pi=0; pi<tubeFacet; pi++) { | |||
157 | double costh, sinth, cosph, sinph, phi, theta; | |||
158 | phi = (AIR_AFFINE(0, ei, endFacet, 0, AIR_PI/2)( ((double)(3.14159265358979323846/2)-(0))*((double)(ei)-(0)) / ((double)(endFacet)-(0)) + (0)) | |||
159 | + AIR_AFFINE(0, pi, tubeFacet,( ((double)(3.14159265358979323846/2)-(0))*((double)(pi)-(0)) / ((double)(tubeFacet)-(0)) + (0)) | |||
160 | 0, AIR_PI/2)( ((double)(3.14159265358979323846/2)-(0))*((double)(pi)-(0)) / ((double)(tubeFacet)-(0)) + (0))/endFacet); | |||
161 | theta = AIR_AFFINE(0, pi, tubeFacet, 0.0, 2*AIR_PI)( ((double)(2*3.14159265358979323846)-(0.0))*((double)(pi)-(0 )) / ((double)(tubeFacet)-(0)) + (0.0)); | |||
162 | cosph = cos(phi); | |||
163 | sinph = sin(phi); | |||
164 | costh = cos(theta); | |||
165 | sinth = sin(theta); | |||
166 | ELL_3V_SCALE_ADD3_TT(pldOut->norm + 3*outVertTotalIdx, float,((pldOut->norm + 3*outVertTotalIdx)[0] = ((float)((-cosph) *(tang)[0] + (costh*sinph)*(perp)[0] + (sinth*sinph)*(pimp)[0 ])), (pldOut->norm + 3*outVertTotalIdx)[1] = ((float)((-cosph )*(tang)[1] + (costh*sinph)*(perp)[1] + (sinth*sinph)*(pimp)[ 1])), (pldOut->norm + 3*outVertTotalIdx)[2] = ((float)((-cosph )*(tang)[2] + (costh*sinph)*(perp)[2] + (sinth*sinph)*(pimp)[ 2]))) | |||
167 | -cosph, tang,((pldOut->norm + 3*outVertTotalIdx)[0] = ((float)((-cosph) *(tang)[0] + (costh*sinph)*(perp)[0] + (sinth*sinph)*(pimp)[0 ])), (pldOut->norm + 3*outVertTotalIdx)[1] = ((float)((-cosph )*(tang)[1] + (costh*sinph)*(perp)[1] + (sinth*sinph)*(pimp)[ 1])), (pldOut->norm + 3*outVertTotalIdx)[2] = ((float)((-cosph )*(tang)[2] + (costh*sinph)*(perp)[2] + (sinth*sinph)*(pimp)[ 2]))) | |||
168 | costh*sinph, perp,((pldOut->norm + 3*outVertTotalIdx)[0] = ((float)((-cosph) *(tang)[0] + (costh*sinph)*(perp)[0] + (sinth*sinph)*(pimp)[0 ])), (pldOut->norm + 3*outVertTotalIdx)[1] = ((float)((-cosph )*(tang)[1] + (costh*sinph)*(perp)[1] + (sinth*sinph)*(pimp)[ 1])), (pldOut->norm + 3*outVertTotalIdx)[2] = ((float)((-cosph )*(tang)[2] + (costh*sinph)*(perp)[2] + (sinth*sinph)*(pimp)[ 2]))) | |||
169 | sinth*sinph, pimp)((pldOut->norm + 3*outVertTotalIdx)[0] = ((float)((-cosph) *(tang)[0] + (costh*sinph)*(perp)[0] + (sinth*sinph)*(pimp)[0 ])), (pldOut->norm + 3*outVertTotalIdx)[1] = ((float)((-cosph )*(tang)[1] + (costh*sinph)*(perp)[1] + (sinth*sinph)*(pimp)[ 1])), (pldOut->norm + 3*outVertTotalIdx)[2] = ((float)((-cosph )*(tang)[2] + (costh*sinph)*(perp)[2] + (sinth*sinph)*(pimp)[ 2]))); | |||
170 | ELL_3V_SCALE_ADD3_TT(pldOut->xyzw + 4*outVertTotalIdx, float,((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (-step/2)*(tang)[0] + (radius )*(pldOut->norm + 3*outVertTotalIdx)[0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1)*(pldIn->xyzw + 4*inVertTotalIdx )[1] + (-step/2)*(tang)[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float)(( 1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (-step/2)*(tang)[ 2] + (radius)*(pldOut->norm + 3*outVertTotalIdx)[2]))) | |||
171 | 1, pldIn->xyzw + 4*inVertTotalIdx,((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (-step/2)*(tang)[0] + (radius )*(pldOut->norm + 3*outVertTotalIdx)[0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1)*(pldIn->xyzw + 4*inVertTotalIdx )[1] + (-step/2)*(tang)[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float)(( 1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (-step/2)*(tang)[ 2] + (radius)*(pldOut->norm + 3*outVertTotalIdx)[2]))) | |||
172 | -step/2, tang,((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (-step/2)*(tang)[0] + (radius )*(pldOut->norm + 3*outVertTotalIdx)[0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1)*(pldIn->xyzw + 4*inVertTotalIdx )[1] + (-step/2)*(tang)[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float)(( 1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (-step/2)*(tang)[ 2] + (radius)*(pldOut->norm + 3*outVertTotalIdx)[2]))) | |||
173 | radius,((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (-step/2)*(tang)[0] + (radius )*(pldOut->norm + 3*outVertTotalIdx)[0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1)*(pldIn->xyzw + 4*inVertTotalIdx )[1] + (-step/2)*(tang)[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float)(( 1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (-step/2)*(tang)[ 2] + (radius)*(pldOut->norm + 3*outVertTotalIdx)[2]))) | |||
174 | pldOut->norm + 3*outVertTotalIdx)((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (-step/2)*(tang)[0] + (radius )*(pldOut->norm + 3*outVertTotalIdx)[0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1)*(pldIn->xyzw + 4*inVertTotalIdx )[1] + (-step/2)*(tang)[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float)(( 1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (-step/2)*(tang)[ 2] + (radius)*(pldOut->norm + 3*outVertTotalIdx)[2]))); | |||
175 | (pldOut->xyzw + 4*outVertTotalIdx)[3] = 1.0; | |||
176 | if (vertmap) { | |||
177 | vertmap[outVertTotalIdx] = inVertTotalIdx; | |||
178 | } | |||
179 | if (color) { | |||
180 | ELL_4V_COPY(pldOut->rgba + 4*outVertTotalIdx,((pldOut->rgba + 4*outVertTotalIdx)[0] = (pldIn->rgba + 4*inVertTotalIdx)[0], (pldOut->rgba + 4*outVertTotalIdx)[ 1] = (pldIn->rgba + 4*inVertTotalIdx)[1], (pldOut->rgba + 4*outVertTotalIdx)[2] = (pldIn->rgba + 4*inVertTotalIdx )[2], (pldOut->rgba + 4*outVertTotalIdx)[3] = (pldIn->rgba + 4*inVertTotalIdx)[3]) | |||
181 | pldIn->rgba + 4*inVertTotalIdx)((pldOut->rgba + 4*outVertTotalIdx)[0] = (pldIn->rgba + 4*inVertTotalIdx)[0], (pldOut->rgba + 4*outVertTotalIdx)[ 1] = (pldIn->rgba + 4*inVertTotalIdx)[1], (pldOut->rgba + 4*outVertTotalIdx)[2] = (pldIn->rgba + 4*inVertTotalIdx )[2], (pldOut->rgba + 4*outVertTotalIdx)[3] = (pldIn->rgba + 4*inVertTotalIdx)[3]); | |||
182 | ||||
183 | } | |||
184 | outVertTotalIdx++; | |||
185 | } | |||
186 | } | |||
187 | for (pi=1; pi<tubeFacet; pi++) { | |||
188 | pldOut->indx[outIndxIdx++] = startIdx; | |||
189 | pldOut->indx[outIndxIdx++] = startIdx + pi; | |||
190 | } | |||
191 | for (ei=0; ei<endFacet; ei++) { | |||
192 | /* at the highest ei we're actually linking with the first | |||
193 | row of vertices at the start of the tube */ | |||
194 | for (pi=0; pi<tubeFacet; pi++) { | |||
195 | pldOut->indx[outIndxIdx++] = (startIdx + pi | |||
196 | + (ei + 0)*tubeFacet); | |||
197 | pldOut->indx[outIndxIdx++] = (startIdx + pi | |||
198 | + (ei + 1)*tubeFacet); | |||
199 | } | |||
200 | } | |||
201 | } else { | |||
202 | /* no endcap, open tube */ | |||
203 | for (pi=0; pi<tubeFacet; pi++) { | |||
204 | double costh, sinth, theta; | |||
205 | theta = AIR_AFFINE(0, pi, tubeFacet, 0.0, 2*AIR_PI)( ((double)(2*3.14159265358979323846)-(0.0))*((double)(pi)-(0 )) / ((double)(tubeFacet)-(0)) + (0.0)); | |||
206 | costh = cos(theta); | |||
207 | sinth = sin(theta); | |||
208 | ELL_3V_SCALE_ADD2_TT(pldOut->norm + 3*outVertTotalIdx, float,((pldOut->norm + 3*outVertTotalIdx)[0] = ((float)((costh)* (perp)[0] + (sinth)*(pimp)[0])), (pldOut->norm + 3*outVertTotalIdx )[1] = ((float)((costh)*(perp)[1] + (sinth)*(pimp)[1])), (pldOut ->norm + 3*outVertTotalIdx)[2] = ((float)((costh)*(perp)[2 ] + (sinth)*(pimp)[2]))) | |||
209 | costh, perp,((pldOut->norm + 3*outVertTotalIdx)[0] = ((float)((costh)* (perp)[0] + (sinth)*(pimp)[0])), (pldOut->norm + 3*outVertTotalIdx )[1] = ((float)((costh)*(perp)[1] + (sinth)*(pimp)[1])), (pldOut ->norm + 3*outVertTotalIdx)[2] = ((float)((costh)*(perp)[2 ] + (sinth)*(pimp)[2]))) | |||
210 | sinth, pimp)((pldOut->norm + 3*outVertTotalIdx)[0] = ((float)((costh)* (perp)[0] + (sinth)*(pimp)[0])), (pldOut->norm + 3*outVertTotalIdx )[1] = ((float)((costh)*(perp)[1] + (sinth)*(pimp)[1])), (pldOut ->norm + 3*outVertTotalIdx)[2] = ((float)((costh)*(perp)[2 ] + (sinth)*(pimp)[2]))); | |||
211 | ELL_3V_SCALE_ADD3_TT(pldOut->xyzw + 4*outVertTotalIdx, float,((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (-step/2 + step/(2*tubeFacet ))*(tang)[0] + (radius)*(pldOut->norm + 3*outVertTotalIdx) [0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1 )*(pldIn->xyzw + 4*inVertTotalIdx)[1] + (-step/2 + step/(2 *tubeFacet))*(tang)[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float)(( 1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (-step/2 + step/( 2*tubeFacet))*(tang)[2] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[2]))) | |||
212 | 1, pldIn->xyzw + 4*inVertTotalIdx,((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (-step/2 + step/(2*tubeFacet ))*(tang)[0] + (radius)*(pldOut->norm + 3*outVertTotalIdx) [0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1 )*(pldIn->xyzw + 4*inVertTotalIdx)[1] + (-step/2 + step/(2 *tubeFacet))*(tang)[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float)(( 1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (-step/2 + step/( 2*tubeFacet))*(tang)[2] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[2]))) | |||
213 | -step/2 + step/(2*tubeFacet), tang,((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (-step/2 + step/(2*tubeFacet ))*(tang)[0] + (radius)*(pldOut->norm + 3*outVertTotalIdx) [0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1 )*(pldIn->xyzw + 4*inVertTotalIdx)[1] + (-step/2 + step/(2 *tubeFacet))*(tang)[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float)(( 1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (-step/2 + step/( 2*tubeFacet))*(tang)[2] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[2]))) | |||
214 | radius, pldOut->norm + 3*outVertTotalIdx)((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (-step/2 + step/(2*tubeFacet ))*(tang)[0] + (radius)*(pldOut->norm + 3*outVertTotalIdx) [0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1 )*(pldIn->xyzw + 4*inVertTotalIdx)[1] + (-step/2 + step/(2 *tubeFacet))*(tang)[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float)(( 1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (-step/2 + step/( 2*tubeFacet))*(tang)[2] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[2]))); | |||
215 | (pldOut->xyzw + 4*outVertTotalIdx)[3] = 1.0; | |||
216 | if (vertmap) { | |||
217 | vertmap[outVertTotalIdx] = inVertTotalIdx; | |||
218 | } | |||
219 | if (color) { | |||
220 | ELL_4V_COPY(pldOut->rgba + 4*outVertTotalIdx,((pldOut->rgba + 4*outVertTotalIdx)[0] = (pldIn->rgba + 4*inVertTotalIdx)[0], (pldOut->rgba + 4*outVertTotalIdx)[ 1] = (pldIn->rgba + 4*inVertTotalIdx)[1], (pldOut->rgba + 4*outVertTotalIdx)[2] = (pldIn->rgba + 4*inVertTotalIdx )[2], (pldOut->rgba + 4*outVertTotalIdx)[3] = (pldIn->rgba + 4*inVertTotalIdx)[3]) | |||
221 | pldIn->rgba + 4*inVertTotalIdx)((pldOut->rgba + 4*outVertTotalIdx)[0] = (pldIn->rgba + 4*inVertTotalIdx)[0], (pldOut->rgba + 4*outVertTotalIdx)[ 1] = (pldIn->rgba + 4*inVertTotalIdx)[1], (pldOut->rgba + 4*outVertTotalIdx)[2] = (pldIn->rgba + 4*inVertTotalIdx )[2], (pldOut->rgba + 4*outVertTotalIdx)[3] = (pldIn->rgba + 4*inVertTotalIdx)[3]); | |||
222 | ||||
223 | } | |||
224 | outVertTotalIdx++; | |||
225 | } | |||
226 | for (pi=0; pi<tubeFacet; pi++) { | |||
227 | pldOut->indx[outIndxIdx++] = (startIdx + pi + 0*tubeFacet); | |||
228 | pldOut->indx[outIndxIdx++] = (startIdx + pi + 1*tubeFacet); | |||
229 | } | |||
230 | } | |||
231 | } /* if (0 == inVertIdx) */ | |||
232 | /* -------------------------------------- END initial endcap */ | |||
233 | for (pi=0; pi<tubeFacet; pi++) { | |||
234 | double shift, cosa, sina; | |||
235 | shift = AIR_AFFINE(-0.5, pi, tubeFacet-0.5, -step/2, step/2)( ((double)(step/2)-(-step/2))*((double)(pi)-(-0.5)) / ((double )(tubeFacet-0.5)-(-0.5)) + (-step/2)); | |||
236 | cosa = cost[pi]; | |||
237 | sina = sint[pi]; | |||
238 | /* outVrt = pldOut->vert + outVertTotalIdx; */ | |||
239 | ELL_3V_SCALE_ADD2_TT(pldOut->norm + 3*outVertTotalIdx, float,((pldOut->norm + 3*outVertTotalIdx)[0] = ((float)((cosa)*( perp)[0] + (sina)*(pimp)[0])), (pldOut->norm + 3*outVertTotalIdx )[1] = ((float)((cosa)*(perp)[1] + (sina)*(pimp)[1])), (pldOut ->norm + 3*outVertTotalIdx)[2] = ((float)((cosa)*(perp)[2] + (sina)*(pimp)[2]))) | |||
240 | cosa, perp, sina, pimp)((pldOut->norm + 3*outVertTotalIdx)[0] = ((float)((cosa)*( perp)[0] + (sina)*(pimp)[0])), (pldOut->norm + 3*outVertTotalIdx )[1] = ((float)((cosa)*(perp)[1] + (sina)*(pimp)[1])), (pldOut ->norm + 3*outVertTotalIdx)[2] = ((float)((cosa)*(perp)[2] + (sina)*(pimp)[2]))); | |||
241 | ELL_3V_SCALE_ADD3_TT(pldOut->xyzw + 4*outVertTotalIdx, float,((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (radius)*(pldOut->norm + 3*outVertTotalIdx)[0] + (shift)*(tang)[0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1)*(pldIn->xyzw + 4*inVertTotalIdx )[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx)[1] + (shift )*(tang)[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float )((1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (radius)*(pldOut ->norm + 3*outVertTotalIdx)[2] + (shift)*(tang)[2]))) | |||
242 | 1, pldIn->xyzw + 4*inVertTotalIdx,((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (radius)*(pldOut->norm + 3*outVertTotalIdx)[0] + (shift)*(tang)[0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1)*(pldIn->xyzw + 4*inVertTotalIdx )[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx)[1] + (shift )*(tang)[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float )((1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (radius)*(pldOut ->norm + 3*outVertTotalIdx)[2] + (shift)*(tang)[2]))) | |||
243 | radius,((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (radius)*(pldOut->norm + 3*outVertTotalIdx)[0] + (shift)*(tang)[0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1)*(pldIn->xyzw + 4*inVertTotalIdx )[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx)[1] + (shift )*(tang)[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float )((1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (radius)*(pldOut ->norm + 3*outVertTotalIdx)[2] + (shift)*(tang)[2]))) | |||
244 | pldOut->norm + 3*outVertTotalIdx,((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (radius)*(pldOut->norm + 3*outVertTotalIdx)[0] + (shift)*(tang)[0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1)*(pldIn->xyzw + 4*inVertTotalIdx )[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx)[1] + (shift )*(tang)[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float )((1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (radius)*(pldOut ->norm + 3*outVertTotalIdx)[2] + (shift)*(tang)[2]))) | |||
245 | shift, tang)((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (radius)*(pldOut->norm + 3*outVertTotalIdx)[0] + (shift)*(tang)[0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1)*(pldIn->xyzw + 4*inVertTotalIdx )[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx)[1] + (shift )*(tang)[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float )((1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (radius)*(pldOut ->norm + 3*outVertTotalIdx)[2] + (shift)*(tang)[2]))); | |||
246 | (pldOut->xyzw + 4*outVertTotalIdx)[3] = 1.0; | |||
247 | pldOut->indx[outIndxIdx++] = outVertTotalIdx; | |||
248 | pldOut->indx[outIndxIdx++] = outVertTotalIdx + tubeFacet; | |||
249 | if (vertmap) { | |||
250 | vertmap[outVertTotalIdx] = inVertTotalIdx; | |||
251 | } | |||
252 | if (color) { | |||
253 | ELL_4V_COPY(pldOut->rgba + 4*outVertTotalIdx,((pldOut->rgba + 4*outVertTotalIdx)[0] = (pldIn->rgba + 4*inVertTotalIdx)[0], (pldOut->rgba + 4*outVertTotalIdx)[ 1] = (pldIn->rgba + 4*inVertTotalIdx)[1], (pldOut->rgba + 4*outVertTotalIdx)[2] = (pldIn->rgba + 4*inVertTotalIdx )[2], (pldOut->rgba + 4*outVertTotalIdx)[3] = (pldIn->rgba + 4*inVertTotalIdx)[3]) | |||
254 | pldIn->rgba + 4*inVertTotalIdx)((pldOut->rgba + 4*outVertTotalIdx)[0] = (pldIn->rgba + 4*inVertTotalIdx)[0], (pldOut->rgba + 4*outVertTotalIdx)[ 1] = (pldIn->rgba + 4*inVertTotalIdx)[1], (pldOut->rgba + 4*outVertTotalIdx)[2] = (pldIn->rgba + 4*inVertTotalIdx )[2], (pldOut->rgba + 4*outVertTotalIdx)[3] = (pldIn->rgba + 4*inVertTotalIdx)[3]); | |||
255 | ||||
256 | } | |||
257 | outVertTotalIdx++; | |||
258 | } | |||
259 | tubeEndIdx = outVertTotalIdx; | |||
260 | /* -------------------------------------- BEGIN final endcap */ | |||
261 | if (inVertIdx == pldIn->icnt[primIdx]-1) { | |||
262 | unsigned int ei; | |||
263 | if (endFacet) { | |||
264 | for (ei=0; ei<endFacet; ei++) { | |||
265 | for (pi=0; pi<tubeFacet; pi++) { | |||
266 | double costh, sinth, cosph, sinph, phi, theta; | |||
267 | phi = (AIR_AFFINE(0, ei, endFacet, AIR_PI/2, AIR_PI)( ((double)(3.14159265358979323846)-(3.14159265358979323846/2 ))*((double)(ei)-(0)) / ((double)(endFacet)-(0)) + (3.14159265358979323846 /2)) | |||
268 | + AIR_AFFINE(0, pi, tubeFacet,( ((double)(3.14159265358979323846/2)-(0))*((double)(pi)-(0)) / ((double)(tubeFacet)-(0)) + (0)) | |||
269 | 0, AIR_PI/2)( ((double)(3.14159265358979323846/2)-(0))*((double)(pi)-(0)) / ((double)(tubeFacet)-(0)) + (0))/endFacet); | |||
270 | theta = AIR_AFFINE(0, pi, tubeFacet, 0.0, 2*AIR_PI)( ((double)(2*3.14159265358979323846)-(0.0))*((double)(pi)-(0 )) / ((double)(tubeFacet)-(0)) + (0.0)); | |||
271 | cosph = cos(phi); | |||
272 | sinph = sin(phi); | |||
273 | costh = cos(theta); | |||
274 | sinth = sin(theta); | |||
275 | /* outVrt = pldOut->vert + outVertTotalIdx; */ | |||
276 | ELL_3V_SCALE_ADD3_TT(pldOut->norm + 3*outVertTotalIdx, float,((pldOut->norm + 3*outVertTotalIdx)[0] = ((float)((-cosph) *(tang)[0] + (costh*sinph)*(perp)[0] + (sinth*sinph)*(pimp)[0 ])), (pldOut->norm + 3*outVertTotalIdx)[1] = ((float)((-cosph )*(tang)[1] + (costh*sinph)*(perp)[1] + (sinth*sinph)*(pimp)[ 1])), (pldOut->norm + 3*outVertTotalIdx)[2] = ((float)((-cosph )*(tang)[2] + (costh*sinph)*(perp)[2] + (sinth*sinph)*(pimp)[ 2]))) | |||
277 | -cosph, tang,((pldOut->norm + 3*outVertTotalIdx)[0] = ((float)((-cosph) *(tang)[0] + (costh*sinph)*(perp)[0] + (sinth*sinph)*(pimp)[0 ])), (pldOut->norm + 3*outVertTotalIdx)[1] = ((float)((-cosph )*(tang)[1] + (costh*sinph)*(perp)[1] + (sinth*sinph)*(pimp)[ 1])), (pldOut->norm + 3*outVertTotalIdx)[2] = ((float)((-cosph )*(tang)[2] + (costh*sinph)*(perp)[2] + (sinth*sinph)*(pimp)[ 2]))) | |||
278 | costh*sinph, perp,((pldOut->norm + 3*outVertTotalIdx)[0] = ((float)((-cosph) *(tang)[0] + (costh*sinph)*(perp)[0] + (sinth*sinph)*(pimp)[0 ])), (pldOut->norm + 3*outVertTotalIdx)[1] = ((float)((-cosph )*(tang)[1] + (costh*sinph)*(perp)[1] + (sinth*sinph)*(pimp)[ 1])), (pldOut->norm + 3*outVertTotalIdx)[2] = ((float)((-cosph )*(tang)[2] + (costh*sinph)*(perp)[2] + (sinth*sinph)*(pimp)[ 2]))) | |||
279 | sinth*sinph, pimp)((pldOut->norm + 3*outVertTotalIdx)[0] = ((float)((-cosph) *(tang)[0] + (costh*sinph)*(perp)[0] + (sinth*sinph)*(pimp)[0 ])), (pldOut->norm + 3*outVertTotalIdx)[1] = ((float)((-cosph )*(tang)[1] + (costh*sinph)*(perp)[1] + (sinth*sinph)*(pimp)[ 1])), (pldOut->norm + 3*outVertTotalIdx)[2] = ((float)((-cosph )*(tang)[2] + (costh*sinph)*(perp)[2] + (sinth*sinph)*(pimp)[ 2]))); | |||
280 | ELL_3V_SCALE_ADD3_TT(pldOut->xyzw + 4*outVertTotalIdx, float,((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (step/2)*(tang)[0] + (radius )*(pldOut->norm + 3*outVertTotalIdx)[0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1)*(pldIn->xyzw + 4*inVertTotalIdx )[1] + (step/2)*(tang)[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float)(( 1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (step/2)*(tang)[2 ] + (radius)*(pldOut->norm + 3*outVertTotalIdx)[2]))) | |||
281 | 1, pldIn->xyzw + 4*inVertTotalIdx,((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (step/2)*(tang)[0] + (radius )*(pldOut->norm + 3*outVertTotalIdx)[0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1)*(pldIn->xyzw + 4*inVertTotalIdx )[1] + (step/2)*(tang)[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float)(( 1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (step/2)*(tang)[2 ] + (radius)*(pldOut->norm + 3*outVertTotalIdx)[2]))) | |||
282 | step/2, tang,((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (step/2)*(tang)[0] + (radius )*(pldOut->norm + 3*outVertTotalIdx)[0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1)*(pldIn->xyzw + 4*inVertTotalIdx )[1] + (step/2)*(tang)[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float)(( 1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (step/2)*(tang)[2 ] + (radius)*(pldOut->norm + 3*outVertTotalIdx)[2]))) | |||
283 | radius,((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (step/2)*(tang)[0] + (radius )*(pldOut->norm + 3*outVertTotalIdx)[0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1)*(pldIn->xyzw + 4*inVertTotalIdx )[1] + (step/2)*(tang)[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float)(( 1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (step/2)*(tang)[2 ] + (radius)*(pldOut->norm + 3*outVertTotalIdx)[2]))) | |||
284 | pldOut->norm + 3*outVertTotalIdx)((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (step/2)*(tang)[0] + (radius )*(pldOut->norm + 3*outVertTotalIdx)[0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1)*(pldIn->xyzw + 4*inVertTotalIdx )[1] + (step/2)*(tang)[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float)(( 1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (step/2)*(tang)[2 ] + (radius)*(pldOut->norm + 3*outVertTotalIdx)[2]))); | |||
285 | (pldOut->xyzw + 4*outVertTotalIdx)[3] = 1.0; | |||
286 | if (vertmap) { | |||
287 | vertmap[outVertTotalIdx] = inVertTotalIdx; | |||
288 | } | |||
289 | if (color) { | |||
290 | ELL_4V_COPY(pldOut->rgba + 4*outVertTotalIdx,((pldOut->rgba + 4*outVertTotalIdx)[0] = (pldIn->rgba + 4*inVertTotalIdx)[0], (pldOut->rgba + 4*outVertTotalIdx)[ 1] = (pldIn->rgba + 4*inVertTotalIdx)[1], (pldOut->rgba + 4*outVertTotalIdx)[2] = (pldIn->rgba + 4*inVertTotalIdx )[2], (pldOut->rgba + 4*outVertTotalIdx)[3] = (pldIn->rgba + 4*inVertTotalIdx)[3]) | |||
291 | pldIn->rgba + 4*inVertTotalIdx)((pldOut->rgba + 4*outVertTotalIdx)[0] = (pldIn->rgba + 4*inVertTotalIdx)[0], (pldOut->rgba + 4*outVertTotalIdx)[ 1] = (pldIn->rgba + 4*inVertTotalIdx)[1], (pldOut->rgba + 4*outVertTotalIdx)[2] = (pldIn->rgba + 4*inVertTotalIdx )[2], (pldOut->rgba + 4*outVertTotalIdx)[3] = (pldIn->rgba + 4*inVertTotalIdx)[3]); | |||
292 | ||||
293 | } | |||
294 | outVertTotalIdx++; | |||
295 | } | |||
296 | } | |||
297 | /* outVrt = pldOut->vert + outVertTotalIdx; */ | |||
298 | ELL_3V_COPY_TT(pldOut->norm + 3*outVertTotalIdx, float, tang)((pldOut->norm + 3*outVertTotalIdx)[0] = ((float)((tang)[0 ])), (pldOut->norm + 3*outVertTotalIdx)[1] = ((float)((tang )[1])), (pldOut->norm + 3*outVertTotalIdx)[2] = ((float)(( tang)[2]))); | |||
299 | ELL_3V_SCALE_ADD3_TT(pldOut->xyzw + 4*outVertTotalIdx, float,((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (step/2)*(tang)[0] + (radius )*(pldOut->norm + 3*outVertTotalIdx)[0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1)*(pldIn->xyzw + 4*inVertTotalIdx )[1] + (step/2)*(tang)[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float)(( 1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (step/2)*(tang)[2 ] + (radius)*(pldOut->norm + 3*outVertTotalIdx)[2]))) | |||
300 | 1, pldIn->xyzw + 4*inVertTotalIdx,((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (step/2)*(tang)[0] + (radius )*(pldOut->norm + 3*outVertTotalIdx)[0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1)*(pldIn->xyzw + 4*inVertTotalIdx )[1] + (step/2)*(tang)[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float)(( 1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (step/2)*(tang)[2 ] + (radius)*(pldOut->norm + 3*outVertTotalIdx)[2]))) | |||
301 | step/2, tang,((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (step/2)*(tang)[0] + (radius )*(pldOut->norm + 3*outVertTotalIdx)[0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1)*(pldIn->xyzw + 4*inVertTotalIdx )[1] + (step/2)*(tang)[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float)(( 1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (step/2)*(tang)[2 ] + (radius)*(pldOut->norm + 3*outVertTotalIdx)[2]))) | |||
302 | radius,((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (step/2)*(tang)[0] + (radius )*(pldOut->norm + 3*outVertTotalIdx)[0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1)*(pldIn->xyzw + 4*inVertTotalIdx )[1] + (step/2)*(tang)[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float)(( 1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (step/2)*(tang)[2 ] + (radius)*(pldOut->norm + 3*outVertTotalIdx)[2]))) | |||
303 | pldOut->norm + 3*outVertTotalIdx)((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (step/2)*(tang)[0] + (radius )*(pldOut->norm + 3*outVertTotalIdx)[0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1)*(pldIn->xyzw + 4*inVertTotalIdx )[1] + (step/2)*(tang)[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float)(( 1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (step/2)*(tang)[2 ] + (radius)*(pldOut->norm + 3*outVertTotalIdx)[2]))); | |||
304 | (pldOut->xyzw + 4*outVertTotalIdx)[3] = 1.0; | |||
305 | if (vertmap) { | |||
306 | vertmap[outVertTotalIdx] = inVertTotalIdx; | |||
307 | } | |||
308 | outVertTotalIdx++; | |||
309 | for (ei=0; ei<endFacet-1; ei++) { | |||
310 | for (pi=0; pi<tubeFacet; pi++) { | |||
311 | pldOut->indx[outIndxIdx++] = (tubeEndIdx + pi | |||
312 | + (ei + 0)*tubeFacet); | |||
313 | pldOut->indx[outIndxIdx++] = (tubeEndIdx + pi | |||
314 | + (ei + 1)*tubeFacet); | |||
315 | } | |||
316 | } | |||
317 | for (pi=0; pi<tubeFacet; pi++) { | |||
318 | pldOut->indx[outIndxIdx++] = (tubeEndIdx + pi | |||
319 | + (endFacet - 1)*tubeFacet); | |||
320 | pldOut->indx[outIndxIdx++] = (tubeEndIdx | |||
321 | + (endFacet - 0)*tubeFacet); | |||
322 | } | |||
323 | } else { | |||
324 | /* no endcap, open tube */ | |||
325 | for (pi=0; pi<tubeFacet; pi++) { | |||
326 | double costh, sinth, theta; | |||
327 | theta = AIR_AFFINE(0, pi, tubeFacet, 0.0, 2*AIR_PI)( ((double)(2*3.14159265358979323846)-(0.0))*((double)(pi)-(0 )) / ((double)(tubeFacet)-(0)) + (0.0)); | |||
328 | costh = cos(theta); | |||
329 | sinth = sin(theta); | |||
330 | ELL_3V_SCALE_ADD2_TT(pldOut->norm + 3*outVertTotalIdx, float,((pldOut->norm + 3*outVertTotalIdx)[0] = ((float)((costh)* (perp)[0] + (sinth)*(pimp)[0])), (pldOut->norm + 3*outVertTotalIdx )[1] = ((float)((costh)*(perp)[1] + (sinth)*(pimp)[1])), (pldOut ->norm + 3*outVertTotalIdx)[2] = ((float)((costh)*(perp)[2 ] + (sinth)*(pimp)[2]))) | |||
331 | costh, perp,((pldOut->norm + 3*outVertTotalIdx)[0] = ((float)((costh)* (perp)[0] + (sinth)*(pimp)[0])), (pldOut->norm + 3*outVertTotalIdx )[1] = ((float)((costh)*(perp)[1] + (sinth)*(pimp)[1])), (pldOut ->norm + 3*outVertTotalIdx)[2] = ((float)((costh)*(perp)[2 ] + (sinth)*(pimp)[2]))) | |||
332 | sinth, pimp)((pldOut->norm + 3*outVertTotalIdx)[0] = ((float)((costh)* (perp)[0] + (sinth)*(pimp)[0])), (pldOut->norm + 3*outVertTotalIdx )[1] = ((float)((costh)*(perp)[1] + (sinth)*(pimp)[1])), (pldOut ->norm + 3*outVertTotalIdx)[2] = ((float)((costh)*(perp)[2 ] + (sinth)*(pimp)[2]))); | |||
333 | ELL_3V_SCALE_ADD3_TT(pldOut->xyzw + 4*outVertTotalIdx, float,((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (step/2 - step/(2*tubeFacet ))*(tang)[0] + (radius)*(pldOut->norm + 3*outVertTotalIdx) [0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1 )*(pldIn->xyzw + 4*inVertTotalIdx)[1] + (step/2 - step/(2* tubeFacet))*(tang)[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float)(( 1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (step/2 - step/(2 *tubeFacet))*(tang)[2] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[2]))) | |||
334 | 1, pldIn->xyzw + 4*inVertTotalIdx,((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (step/2 - step/(2*tubeFacet ))*(tang)[0] + (radius)*(pldOut->norm + 3*outVertTotalIdx) [0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1 )*(pldIn->xyzw + 4*inVertTotalIdx)[1] + (step/2 - step/(2* tubeFacet))*(tang)[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float)(( 1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (step/2 - step/(2 *tubeFacet))*(tang)[2] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[2]))) | |||
335 | step/2 - step/(2*tubeFacet), tang,((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (step/2 - step/(2*tubeFacet ))*(tang)[0] + (radius)*(pldOut->norm + 3*outVertTotalIdx) [0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1 )*(pldIn->xyzw + 4*inVertTotalIdx)[1] + (step/2 - step/(2* tubeFacet))*(tang)[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float)(( 1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (step/2 - step/(2 *tubeFacet))*(tang)[2] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[2]))) | |||
336 | radius, pldOut->norm + 3*outVertTotalIdx)((pldOut->xyzw + 4*outVertTotalIdx)[0] = ((float)((1)*(pldIn ->xyzw + 4*inVertTotalIdx)[0] + (step/2 - step/(2*tubeFacet ))*(tang)[0] + (radius)*(pldOut->norm + 3*outVertTotalIdx) [0])), (pldOut->xyzw + 4*outVertTotalIdx)[1] = ((float)((1 )*(pldIn->xyzw + 4*inVertTotalIdx)[1] + (step/2 - step/(2* tubeFacet))*(tang)[1] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[1])), (pldOut->xyzw + 4*outVertTotalIdx)[2] = ((float)(( 1)*(pldIn->xyzw + 4*inVertTotalIdx)[2] + (step/2 - step/(2 *tubeFacet))*(tang)[2] + (radius)*(pldOut->norm + 3*outVertTotalIdx )[2]))); | |||
337 | (pldOut->xyzw + 4*outVertTotalIdx)[3] = 1.0; | |||
338 | if (vertmap) { | |||
339 | vertmap[outVertTotalIdx] = inVertTotalIdx; | |||
340 | } | |||
341 | if (color) { | |||
342 | ELL_4V_COPY(pldOut->rgba + 4*outVertTotalIdx,((pldOut->rgba + 4*outVertTotalIdx)[0] = (pldIn->rgba + 4*inVertTotalIdx)[0], (pldOut->rgba + 4*outVertTotalIdx)[ 1] = (pldIn->rgba + 4*inVertTotalIdx)[1], (pldOut->rgba + 4*outVertTotalIdx)[2] = (pldIn->rgba + 4*inVertTotalIdx )[2], (pldOut->rgba + 4*outVertTotalIdx)[3] = (pldIn->rgba + 4*inVertTotalIdx)[3]) | |||
343 | pldIn->rgba + 4*inVertTotalIdx)((pldOut->rgba + 4*outVertTotalIdx)[0] = (pldIn->rgba + 4*inVertTotalIdx)[0], (pldOut->rgba + 4*outVertTotalIdx)[ 1] = (pldIn->rgba + 4*inVertTotalIdx)[1], (pldOut->rgba + 4*outVertTotalIdx)[2] = (pldIn->rgba + 4*inVertTotalIdx )[2], (pldOut->rgba + 4*outVertTotalIdx)[3] = (pldIn->rgba + 4*inVertTotalIdx)[3]); | |||
344 | ||||
345 | } | |||
346 | outVertTotalIdx++; | |||
347 | } | |||
348 | } | |||
349 | } /* if (inVertIdx == pldIn->icnt[primIdx]-1) */ | |||
350 | /* -------------------------------------- END final endcap */ | |||
351 | inVertTotalIdx++; | |||
352 | } | |||
353 | } | |||
354 | ||||
355 | airMopOkay(mop); | |||
356 | return 0; | |||
357 | } | |||
358 | ||||
359 | /* Straightforward implementation of Laplacian+HC mesh smoothing, as | |||
360 | * described by Vollmer et al., Improved Laplacian Smoothing of Noisy | |||
361 | * Surface Meshes, Eurographics/CGF 18(3), 1999 | |||
362 | * | |||
363 | * pld is the polydata you want smoothed | |||
364 | * neighbors / idx is from limnPolyDataNeighborArrayComp | |||
365 | * alpha / beta are parameters of the smoothing (try a=0,b=0.5) | |||
366 | * iter is the number of iterations you want to run (try iter=10) | |||
367 | * | |||
368 | * Returns -1 and leaves a message on biff upon error. | |||
369 | */ | |||
370 | int | |||
371 | limnPolyDataSmoothHC(limnPolyData *pld, int *neighbors, int *idx, | |||
372 | double alpha, double beta, int iter) { | |||
373 | static const char me[]="limnPolyDataSmoothHC"; | |||
374 | float *orig, *in, *out, *b; | |||
375 | unsigned int v; | |||
376 | int i, nb; | |||
377 | airArray *mop; | |||
378 | mop=airMopNew(); | |||
379 | if (pld==NULL((void*)0) || neighbors==NULL((void*)0) || idx==NULL((void*)0)) { | |||
| ||||
380 | biffAddf(LIMNlimnBiffKey, "%s: got NULL pointer", me); | |||
381 | airMopError(mop); return -1; | |||
382 | } | |||
383 | if (alpha<0 || alpha>1 || beta<0 || beta>1) { | |||
384 | biffAddf(LIMNlimnBiffKey, "%s: alpha/beta outside parameter range [0,1]", me); | |||
385 | airMopError(mop); return -1; | |||
386 | } | |||
387 | orig = in = pld->xyzw; | |||
388 | out = (float*) malloc(sizeof(float)*4*pld->xyzwNum); | |||
389 | if (out==NULL((void*)0)) { | |||
390 | biffAddf(LIMNlimnBiffKey, "%s: couldn't allocate output buffer", me); | |||
391 | airMopError(mop); return -1; | |||
392 | } | |||
393 | airMopAdd(mop, out, airFree, airMopOnError); | |||
394 | b = (float*) malloc(sizeof(float)*4*pld->xyzwNum); | |||
395 | if (b==NULL((void*)0)) { | |||
396 | biffAddf(LIMNlimnBiffKey, "%s: couldn't allocate buffer b", me); | |||
397 | airMopError(mop); return -1; | |||
398 | } | |||
399 | airMopAdd(mop, b, airFree, airMopAlways); | |||
400 | ||||
401 | for (i=0; i<iter; i++) { | |||
402 | /* Laplacian smoothing / compute bs */ | |||
403 | for (v=0; v<pld->xyzwNum; v++) { | |||
404 | int p=4*v; | |||
405 | if (idx[v]==idx[v+1]) { | |||
406 | ELL_4V_COPY(out+p, in+p)((out+p)[0] = (in+p)[0], (out+p)[1] = (in+p)[1], (out+p)[2] = (in+p)[2], (out+p)[3] = (in+p)[3]); | |||
407 | } else { | |||
408 | ELL_4V_SET(out+p,0,0,0,0)((out+p)[0] = (0), (out+p)[1] = (0), (out+p)[2] = (0), (out+p )[3] = (0)); | |||
409 | for (nb=idx[v]; nb<idx[v+1]; nb++) { | |||
410 | ELL_4V_INCR(out+p, in+4*neighbors[nb])((out+p)[0] += (in+4*neighbors[nb])[0], (out+p)[1] += (in+4*neighbors [nb])[1], (out+p)[2] += (in+4*neighbors[nb])[2], (out+p)[3] += (in+4*neighbors[nb])[3]); | |||
411 | } | |||
412 | ELL_4V_SCALE_TT(out+p, float, 1.0/(idx[v+1]-idx[v]), out+p)((out+p)[0] = ((float)((out+p)[0]*(1.0/(idx[v+1]-idx[v])))), ( out+p)[1] = ((float)((out+p)[1]*(1.0/(idx[v+1]-idx[v])))), (out +p)[2] = ((float)((out+p)[2]*(1.0/(idx[v+1]-idx[v])))), (out+ p)[3] = ((float)((out+p)[3]*(1.0/(idx[v+1]-idx[v]))))); | |||
413 | } | |||
414 | ELL_4V_SET_TT(b+p, float, out[p]-(alpha*orig[p]+(1-alpha)*in[p]),((b+p)[0] = ((float)((out[p]-(alpha*orig[p]+(1-alpha)*in[p])) )), (b+p)[1] = ((float)((out[p+1]-(alpha*orig[p+1]+(1-alpha)* in[p+1])))), (b+p)[2] = ((float)((out[p+2]-(alpha*orig[p+2]+( 1-alpha)*in[p+2])))), (b+p)[3] = ((float)((out[p+3]-(alpha*orig [p+3]+(1-alpha)*in[p+3]))))) | |||
415 | out[p+1]-(alpha*orig[p+1]+(1-alpha)*in[p+1]),((b+p)[0] = ((float)((out[p]-(alpha*orig[p]+(1-alpha)*in[p])) )), (b+p)[1] = ((float)((out[p+1]-(alpha*orig[p+1]+(1-alpha)* in[p+1])))), (b+p)[2] = ((float)((out[p+2]-(alpha*orig[p+2]+( 1-alpha)*in[p+2])))), (b+p)[3] = ((float)((out[p+3]-(alpha*orig [p+3]+(1-alpha)*in[p+3]))))) | |||
416 | out[p+2]-(alpha*orig[p+2]+(1-alpha)*in[p+2]),((b+p)[0] = ((float)((out[p]-(alpha*orig[p]+(1-alpha)*in[p])) )), (b+p)[1] = ((float)((out[p+1]-(alpha*orig[p+1]+(1-alpha)* in[p+1])))), (b+p)[2] = ((float)((out[p+2]-(alpha*orig[p+2]+( 1-alpha)*in[p+2])))), (b+p)[3] = ((float)((out[p+3]-(alpha*orig [p+3]+(1-alpha)*in[p+3]))))) | |||
417 | out[p+3]-(alpha*orig[p+3]+(1-alpha)*in[p+3]))((b+p)[0] = ((float)((out[p]-(alpha*orig[p]+(1-alpha)*in[p])) )), (b+p)[1] = ((float)((out[p+1]-(alpha*orig[p+1]+(1-alpha)* in[p+1])))), (b+p)[2] = ((float)((out[p+2]-(alpha*orig[p+2]+( 1-alpha)*in[p+2])))), (b+p)[3] = ((float)((out[p+3]-(alpha*orig [p+3]+(1-alpha)*in[p+3]))))); | |||
418 | } | |||
419 | /* HC correction step */ | |||
420 | for (v=0; v<pld->xyzwNum; v++) { | |||
421 | int p=4*v; | |||
422 | if (idx[v]<idx[v+1]) { | |||
423 | float avgb[4]={0,0,0,0}; | |||
424 | for (nb=idx[v]; nb<idx[v+1]; nb++) { | |||
425 | ELL_4V_INCR(avgb, b+4*neighbors[nb])((avgb)[0] += (b+4*neighbors[nb])[0], (avgb)[1] += (b+4*neighbors [nb])[1], (avgb)[2] += (b+4*neighbors[nb])[2], (avgb)[3] += ( b+4*neighbors[nb])[3]); | |||
426 | } | |||
427 | ELL_4V_SCALE_TT(avgb, float, 1.0/(idx[v+1]-idx[v]), avgb)((avgb)[0] = ((float)((avgb)[0]*(1.0/(idx[v+1]-idx[v])))), (avgb )[1] = ((float)((avgb)[1]*(1.0/(idx[v+1]-idx[v])))), (avgb)[2 ] = ((float)((avgb)[2]*(1.0/(idx[v+1]-idx[v])))), (avgb)[3] = ((float)((avgb)[3]*(1.0/(idx[v+1]-idx[v]))))); | |||
428 | ELL_4V_LERP_TT(avgb, float, beta, b+p, avgb)((avgb)[0] = ((float)((((beta))*(((avgb)[0]) - ((b+p)[0])) + ( (b+p)[0])))), (avgb)[1] = ((float)((((beta))*(((avgb)[1]) - ( (b+p)[1])) + ((b+p)[1])))), (avgb)[2] = ((float)((((beta))*(( (avgb)[2]) - ((b+p)[2])) + ((b+p)[2])))), (avgb)[3] = ((float )((((beta))*(((avgb)[3]) - ((b+p)[3])) + ((b+p)[3]))))); | |||
429 | ELL_4V_SUB(out+p,out+p,avgb)((out+p)[0] = (out+p)[0] - (avgb)[0], (out+p)[1] = (out+p)[1] - (avgb)[1], (out+p)[2] = (out+p)[2] - (avgb)[2], (out+p)[3] = (out+p)[3] - (avgb)[3]); | |||
430 | } | |||
431 | } | |||
432 | if (i==0 && iter>1) { | |||
433 | in = out; | |||
434 | out = (float*) malloc(sizeof(float)*4*pld->xyzwNum); | |||
| ||||
435 | } else { /* swap */ | |||
436 | float *tmp = in; in = out; out = tmp; | |||
437 | } | |||
438 | } | |||
439 | ||||
440 | if (iter>1) | |||
441 | airFree(out); | |||
442 | airFree(pld->xyzw); | |||
443 | pld->xyzw = in; | |||
444 | airMopOkay(mop); | |||
445 | return 0; | |||
446 | } |