| 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 | } |