diff --git a/src/fileFormats/vtk/part/foamVtuCells.C b/src/fileFormats/vtk/part/foamVtuCells.C index ca134c23c733240d8dd2b8810bec161ce3c52a73..f23278f4a52d3ccae582514a2b784ce0e26b117f 100644 --- a/src/fileFormats/vtk/part/foamVtuCells.C +++ b/src/fileFormats/vtk/part/foamVtuCells.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2016-2018 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -62,13 +62,13 @@ Foam::vtk::vtuCells::vtuCells Foam::vtk::vtuCells::vtuCells ( - const vtk::outputOptions outOpts, + const vtk::outputOptions opts, const bool decompose ) : vtuCells ( - (outOpts.legacy() ? contentType::LEGACY : contentType::XML), + (opts.legacy() ? contentType::LEGACY : contentType::XML), decompose ) {} @@ -77,22 +77,16 @@ Foam::vtk::vtuCells::vtuCells Foam::vtk::vtuCells::vtuCells ( const polyMesh& mesh, - const vtk::outputOptions outOpts, + const vtk::outputOptions opts, const bool decompose ) : - vtuCells(outOpts, decompose) + vtuCells(opts, decompose) { reset(mesh); } -// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // - -Foam::vtk::vtuCells::~vtuCells() -{} - - // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // void Foam::vtk::vtuCells::clear() @@ -108,9 +102,9 @@ void Foam::vtk::vtuCells::clear() } -void Foam::vtk::vtuCells::reset(const polyMesh& mesh) +void Foam::vtk::vtuCells::repopulate(const polyMesh& mesh) { - vtuSizing::reset(mesh, decomposeRequest_); + // vtuSizing::reset() called prior to this method cellTypes_.setSize(nFieldCells()); vertLabels_.setSize(sizeOf(output_, slotType::CELLS)); @@ -157,6 +151,13 @@ void Foam::vtk::vtuCells::reset(const polyMesh& mesh) } +void Foam::vtk::vtuCells::reset(const polyMesh& mesh) +{ + vtuSizing::reset(mesh, decomposeRequest_); + repopulate(mesh); +} + + void Foam::vtk::vtuCells::reset ( const polyMesh& mesh, diff --git a/src/fileFormats/vtk/part/foamVtuCells.H b/src/fileFormats/vtk/part/foamVtuCells.H index 67381ed60e7cc1a7d93b0f3c06208f135d042623..97cb36398acf070fdf9ec7a3c2dcc1fcc04a85cb 100644 --- a/src/fileFormats/vtk/part/foamVtuCells.H +++ b/src/fileFormats/vtk/part/foamVtuCells.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2017 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2011-2018 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -58,13 +58,13 @@ SourceFiles namespace Foam { -// Forward declaration of classes +// Forward declarations class polyMesh; namespace vtk { -// Forward declaration of classes - class outputOptions; +// Forward declarations +class outputOptions; /*---------------------------------------------------------------------------*\ Class Foam::vtk::vtuCells Declaration @@ -76,7 +76,7 @@ class vtuCells { // Private Member Data - // Requested output types + // Requested output types //- Output content type contentType output_; @@ -84,7 +84,8 @@ class vtuCells //- Bookkeeping for polyhedral cell decomposition bool decomposeRequest_; - // Storage of output + + // Storage of output //- Cell types (including added cells) in vtk numbering // Range is 1-255 @@ -108,6 +109,10 @@ class vtuCells // Private Member Functions + //- Create the geometry using the previously requested output and + // decomposition types. + void repopulate(const polyMesh& mesh); + //- No copy construct vtuCells(const vtuCells&) = delete; @@ -128,7 +133,7 @@ public: ); //- Construct from components and create the output information - // immediately + //- immediately vtuCells ( const polyMesh& mesh, @@ -140,27 +145,27 @@ public: // Optionally with polyhedral decomposition. vtuCells ( - const vtk::outputOptions outOpts, + const vtk::outputOptions opts, const bool decompose = false ); - //- Construct from components and create the output information - // immediately + //- Construct from components, and create the output information + //- immediately vtuCells ( const polyMesh& mesh, - const vtk::outputOptions outOpts, + const vtk::outputOptions opts, const bool decompose = false ); //- Destructor - ~vtuCells(); + ~vtuCells() = default; // Member Functions - // Access + // Access //- The output content type inline enum contentType content() const; @@ -175,17 +180,17 @@ public: inline label size() const; - // Edit + // Edit //- Reset all sizes to zero. void clear(); //- Create the geometry using the previously requested output and - // decomposition types. + //- decomposition types. void reset(const polyMesh& mesh); //- Respecify requested output and decomposition type prior to - // creating the geometry + //- creating the geometry void reset ( const polyMesh& mesh, @@ -200,7 +205,7 @@ public: void renumberPoints(const labelUList& mapping); - // Storage Access + // Storage Access //- Values for "types" (XML) and "CELL_TYPES" (legacy) inline const List<uint8_t>& cellTypes() const; diff --git a/src/fileFormats/vtk/part/foamVtuSizing.C b/src/fileFormats/vtk/part/foamVtuSizing.C index 417d19e854d084bbcd1aea8cb62eafe85a7f17d6..47084495515fe75a3387419b09016735cede63a6 100644 --- a/src/fileFormats/vtk/part/foamVtuSizing.C +++ b/src/fileFormats/vtk/part/foamVtuSizing.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2016-2018 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -42,6 +42,12 @@ void Foam::vtk::vtuSizing::presizeMaps(foamVtkMeshMaps& maps) const // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // +Foam::vtk::vtuSizing::vtuSizing() +{ + clear(); +} + + Foam::vtk::vtuSizing::vtuSizing ( const polyMesh& mesh, @@ -53,13 +59,24 @@ Foam::vtk::vtuSizing::vtuSizing } -Foam::vtk::vtuSizing::vtuSizing() +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::vtk::vtuSizing::clear() { - clear(); -} + decompose_ = false; + nCells_ = 0; + nPoints_ = 0; + nVertLabels_ = 0; + + nFaceLabels_ = 0; + nCellsPoly_ = 0; + nVertPoly_ = 0; + nAddCells_ = 0; + nAddPoints_ = 0; + nAddVerts_ = 0; +} -// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // void Foam::vtk::vtuSizing::reset ( @@ -90,7 +107,9 @@ void Foam::vtk::vtuSizing::reset nFaceLabels_ = 0; nVertPoly_ = 0; - forAll(shapes, celli) + const label len = mesh.nCells(); + + for (label celli=0; celli < len; ++celli) { const cellShape& shape = shapes[celli]; const cellModel& model = shape.model(); @@ -177,7 +196,7 @@ void Foam::vtk::vtuSizing::reset } } - // decompose requested and needed + // Requested and actually required decompose_ = (decompose && nCellsPoly_); } @@ -262,6 +281,8 @@ Foam::label Foam::vtk::vtuSizing::sizeOf } +// * * * * * * * * * * * * * * Populate Lists * * * * * * * * * * * * * * * // + void Foam::vtk::vtuSizing::populateLegacy ( const polyMesh& mesh, @@ -491,30 +512,235 @@ void Foam::vtk::vtuSizing::populateInternal } -void Foam::vtk::vtuSizing::clear() +// * * * * * * * * * * * * * * Renumber vertices * * * * * * * * * * * * * * // + +Foam::labelList Foam::vtk::vtuSizing::copyVertLabelsLegacy +( + const labelUList& vertLabels, + const label globalPointOffset +) { - decompose_ = false; - nCells_ = 0; - nPoints_ = 0; - nVertLabels_ = 0; + if (!globalPointOffset) + { + return vertLabels; + } - nFaceLabels_ = 0; - nCellsPoly_ = 0; - nVertPoly_ = 0; + labelList output(vertLabels); + renumberVertLabelsLegacy(output, globalPointOffset); - nAddCells_ = 0; - nAddPoints_ = 0; - nAddVerts_ = 0; + return output; +} + + +void Foam::vtk::vtuSizing::renumberVertLabelsLegacy +( + labelUList& vertLabels, + const label globalPointOffset +) +{ + if (!globalPointOffset) + { + return; + } + + // LEGACY vertLabels = "cells" contains + // - connectivity + // [nLabels, vertex labels...] + // - face-stream + // [nLabels nFaces, nFace0Pts, id1,id2,..., nFace1Pts, id1,id2,...] + + // Note the simplest volume cell is a tet (4 points, 4 faces) + // As a poly-face stream this would have + // 2 for nLabels, nFaces + // 4 labels (size + ids) per face * 4 == 16 labels + // + // Therefore anything with 18 labels or more must be a poly + + auto iter = vertLabels.begin(); + auto last = vertLabels.end(); + + while (iter < last) + { + label nLabels = *iter; // nLabels (for this cell) + ++iter; + + if (nLabels < 18) + { + // Normal primitive type + + while (nLabels--) + { + *iter += globalPointOffset; + ++iter; + } + } + else + { + // Polyhedral face-stream (explained above) + + label nFaces = *iter; + ++iter; + + while (nFaces--) + { + nLabels = *iter; // nLabels (for this face) + ++iter; + + while (nLabels--) + { + *iter += globalPointOffset; + ++iter; + } + } + } + } } +Foam::labelList Foam::vtk::vtuSizing::copyVertLabelsXml +( + const labelUList& vertLabels, + const label globalPointOffset +) +{ + if (!globalPointOffset) + { + return vertLabels; + } + + labelList output(vertLabels); + renumberVertLabelsXml(output, globalPointOffset); + + return output; +} + + +void Foam::vtk::vtuSizing::renumberVertLabelsXml +( + labelUList& vertLabels, + const label globalPointOffset +) +{ + if (!globalPointOffset) + { + return; + } + + // XML vertLabels = "connectivity" contains + // [cell1-verts, cell2-verts, ...] + + for (label& vertId : vertLabels) + { + vertId += globalPointOffset; + } +} + + +Foam::labelList Foam::vtk::vtuSizing::copyFaceLabelsXml +( + const labelUList& faceLabels, + const label globalPointOffset +) +{ + if (!globalPointOffset) + { + return faceLabels; + } + + labelList output(faceLabels); + renumberFaceLabelsXml(output, globalPointOffset); + + return output; +} + + +void Foam::vtk::vtuSizing::renumberFaceLabelsXml +( + labelUList& faceLabels, + const label globalPointOffset +) +{ + if (!globalPointOffset) + { + return; + } + + // XML face-stream + // [nFaces, nFace0Pts, id1,id2,..., nFace1Pts, id1,id2,...] + + auto iter = faceLabels.begin(); + auto last = faceLabels.end(); + + while (iter < last) + { + label nFaces = *iter; + ++iter; + + while (nFaces--) + { + label nLabels = *iter; + ++iter; + + while (nLabels--) + { + *iter += globalPointOffset; + ++iter; + } + } + } +} + + +Foam::labelList Foam::vtk::vtuSizing::copyFaceOffsetsXml +( + const labelUList& faceOffsets, + const label prevOffset +) +{ + if (!prevOffset) + { + return faceOffsets; + } + + labelList output(faceOffsets); + renumberFaceOffsetsXml(output, prevOffset); + + return output; +} + + +void Foam::vtk::vtuSizing::renumberFaceOffsetsXml +( + labelUList& faceOffsets, + const label prevOffset +) +{ + if (!prevOffset) + { + return; + } + + // offsets + // [-1, off1, off2, ... -1, ..] + + for (label& val : faceOffsets) + { + if (val != -1) + { + val += prevOffset; + } + } +} + + +// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // + void Foam::vtk::vtuSizing::info(Ostream& os) const { os << "nFieldCells:" << nFieldCells(); if (nAddCells_) { - os << " (" << nCells_ - << "+" << nAddCells_ << ")"; + os << " (" << nCells_ << "+" << nAddCells_ << ")"; } else { @@ -549,6 +775,7 @@ bool Foam::vtk::vtuSizing::operator==(const vtuSizing& rhs) const return ( decompose() == rhs.decompose() + // required? && pointOffset() == rhs.pointOffset() && nCells() == rhs.nCells() && nPoints() == rhs.nPoints() && nVertLabels() == rhs.nVertLabels() diff --git a/src/fileFormats/vtk/part/foamVtuSizing.H b/src/fileFormats/vtk/part/foamVtuSizing.H index be2f6e405a4799a2c354bcc11ec6a15658d07fe7..8b892d1e329a3de8835337930ebd31e59ad7682e 100644 --- a/src/fileFormats/vtk/part/foamVtuSizing.H +++ b/src/fileFormats/vtk/part/foamVtuSizing.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2016-2018 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -76,6 +76,13 @@ Description The VTK storage concept for "connectivity" and "faces" somewhat resemble a CompactListList. +Note + It is possible to specify a global point offset (via the globalIndex) + so that the cell point labels will use global numbering. + There is no support for point renumbering with merged mesh points, + since it likely more efficient to use VTK point-blanking to mark duplicate + points instead of merging points ourselves. + SourceFiles foamVtuSizing.C foamVtuSizingI.H @@ -94,7 +101,7 @@ SourceFiles namespace Foam { -// Forward declaration of classes +// Forward declarations class polyMesh; namespace vtk @@ -144,7 +151,7 @@ private: //- Number of vertex labels to represent the mesh label nVertLabels_; - // Polyhedrals + // Polyhedrals //- Number of polyhedral face labels for the mesh label nFaceLabels_; @@ -155,7 +162,7 @@ private: //- Number of vertex labels used by polyhedrals label nVertPoly_; - // Decomposed polyhedrals + // Decomposed polyhedrals //- Number of additional (decomposed) cells for the mesh label nAddCells_; @@ -172,7 +179,7 @@ private: //- set-size for cellMap and additionalIds void presizeMaps(foamVtkMeshMaps& maps) const; - //- Populate lists for internal VTK representation + //- Populate lists. For (legacy | xml | internal) VTK representations template<class LabelType, class LabelType2> static void populateArrays ( @@ -188,7 +195,6 @@ private: UList<LabelType2>& addPointsIds ); - // Allow default bitwise copy/assignment public: @@ -197,9 +203,13 @@ public: //- Construct null. vtuSizing(); - //- Construct sizes by analyzing the mesh, - // optionally with polyhedral decomposition. - vtuSizing(const polyMesh& mesh, const bool decompose=false); + //- Construct sizing by analyzing the mesh. + // No polyhedral decomposition. + explicit vtuSizing(const polyMesh& mesh); + + //- Construct sizing by analyzing the mesh. + // Optionally with polyhedral decomposition. + vtuSizing(const polyMesh& mesh, const bool decompose); //- Destructor @@ -208,19 +218,19 @@ public: // Member Functions - // Edit + // Edit - //- Construct sizes by analyzing the mesh, - // optionally with polyhedral decomposition. + //- Reset sizing by analyzing the mesh. + // Optionally with polyhedral decomposition. void reset(const polyMesh& mesh, const bool decompose=false); //- Reset all sizes to zero. void clear(); - // Access + // Access - //- Query the decompose flag + //- Query the decompose flag (normally off) inline bool decompose() const; //- Number of cells for the mesh @@ -258,7 +268,7 @@ public: inline label nFieldPoints() const; - // Derived sizes + // Derived sizes //- Return the required size for the storage slot label sizeOf @@ -281,7 +291,7 @@ public: inline label sizeInternal(const enum slotType slot) const; - // Utility routines + // Routines for populating the output lists //- Populate lists for Legacy output void populateLegacy @@ -380,13 +390,73 @@ public: ) const; - // Write + // Routines for renumber vertices with a global point offset + // Legacy and xml only, internal version less likely to be needed + + //- Copy vertex labels with a global point offset - legacy format + static labelList copyVertLabelsLegacy + ( + const labelUList& connectivity, + const label globalPointOffset + ); + + //- Copy vertex labels with a global point offset - XML format + static labelList copyVertLabelsXml + ( + const labelUList& connectivity, + const label globalPointOffset + ); + + //- Copy faces stream labels with a global point offset - XML format + static labelList copyFaceLabelsXml + ( + const labelUList& faceLabels, + const label globalPointOffset + ); + + //- Copy face offsets with an offset from previous - XML format + static labelList copyFaceOffsetsXml + ( + const labelUList& faceOffsets, + const label prevOffset + ); + + //- Renumber vertex labels by global point offset - legacy format + static void renumberVertLabelsLegacy + ( + labelUList& connectivity, + const label globalPointOffset + ); + + //- Renumber vertex labels by global point offset - XML format + static void renumberVertLabelsXml + ( + labelUList& connectivity, + const label globalPointOffset + ); + + //- Renumber faces stream labels by global point offset - XML format + static void renumberFaceLabelsXml + ( + labelUList& faceLabels, + const label globalPointOffset + ); + + //- Renumber face offsets with an offset from previous - XML format + static void renumberFaceOffsetsXml + ( + labelUList& faceOffsets, + const label prevOffset + ); + + + // Write //- Report some information void info(Ostream& os) const; - // Member Operators + // Member Operators //- Test equality bool operator==(const vtuSizing& rhs) const; diff --git a/src/fileFormats/vtk/part/foamVtuSizingI.H b/src/fileFormats/vtk/part/foamVtuSizingI.H index 6777ce7e7a91fac943560487ffe0169d9023ebc2..a00bf8ac483597f62c6cf80a73f72eb0367e9419 100644 --- a/src/fileFormats/vtk/part/foamVtuSizingI.H +++ b/src/fileFormats/vtk/part/foamVtuSizingI.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2017-2018 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License diff --git a/src/fileFormats/vtk/part/foamVtuSizingTemplates.C b/src/fileFormats/vtk/part/foamVtuSizingTemplates.C index 40df139d2c7a0a235d2bd3fd372f257966c4d206..f5253f04b373c31661312f73b3d20cd545c8551f 100644 --- a/src/fileFormats/vtk/part/foamVtuSizingTemplates.C +++ b/src/fileFormats/vtk/part/foamVtuSizingTemplates.C @@ -263,7 +263,9 @@ void Foam::vtk::vtuSizing::populateArrays // the per-cell vertLabels entries, and the faceOffset contains the *size* // associated with the per-cell faceLabels. - forAll(shapes, celli) + const label len = shapes.size(); + + for (label celli=0; celli < len; ++celli) { const cellShape& shape = shapes[celli]; const cellModel& model = shape.model(); @@ -282,9 +284,9 @@ void Foam::vtk::vtuSizing::populateArrays vertLabels[nVertLabels++] = shape.size(); } - forAll(shape, i) + for (const label cpi : shape) { - vertLabels[nVertLabels++] = shape[i]; + vertLabels[nVertLabels++] = cpi; } } else if (model == pyr) @@ -299,9 +301,9 @@ void Foam::vtk::vtuSizing::populateArrays vertLabels[nVertLabels++] = shape.size(); } - forAll(shape, i) + for (const label cpi : shape) { - vertLabels[nVertLabels++] = shape[i]; + vertLabels[nVertLabels++] = cpi; } } else if (model == hex) @@ -316,9 +318,9 @@ void Foam::vtk::vtuSizing::populateArrays vertLabels[nVertLabels++] = shape.size(); } - forAll(shape, i) + for (const label cpi : shape) { - vertLabels[nVertLabels++] = shape[i]; + vertLabels[nVertLabels++] = cpi; } } else if (model == prism) @@ -403,10 +405,11 @@ void Foam::vtk::vtuSizing::populateArrays bool first = true; const labelList& cFaces = mesh.cells()[celli]; - forAll(cFaces, cFaceI) + + for (const label facei : cFaces) { - const face& f = mesh.faces()[cFaces[cFaceI]]; - const bool isOwner = (owner[cFaces[cFaceI]] == celli); + const face& f = mesh.faces()[facei]; + const bool isOwner = (owner[facei] == celli); // Count triangles/quads in decomposition label nTria = 0, nQuad = 0; @@ -418,10 +421,10 @@ void Foam::vtk::vtuSizing::populateArrays nTria = 0, nQuad = 0; f.trianglesQuads(mesh.points(), nTria, nQuad, faces3, faces4); - forAll(faces4, fci) + for (const face& quad : faces4) { // Quad becomes a pyramid - const face& quad = faces4[fci]; + const label nShapePoints = 5; // pyr (5 vertices) label celLoc, vrtLoc; @@ -466,13 +469,14 @@ void Foam::vtk::vtuSizing::populateArrays vertLabels[vrtLoc++] = quad[3]; } - vertLabels[vrtLoc++] = newVertexLabel; // apex + // The apex + vertLabels[vrtLoc++] = newVertexLabel; } - forAll(faces3, fci) + for (const face& tria : faces3) { // Triangle becomes a tetrahedral - const face& tria = faces3[fci]; + const label nShapePoints = 4; // tet (4 vertices) label celLoc, vrtLoc; @@ -516,7 +520,9 @@ void Foam::vtk::vtuSizing::populateArrays vertLabels[vrtLoc++] = tria[1]; vertLabels[vrtLoc++] = tria[2]; } - vertLabels[vrtLoc++] = newVertexLabel; // apex + + // The apex + vertLabels[vrtLoc++] = newVertexLabel; } } } @@ -540,14 +546,14 @@ void Foam::vtk::vtuSizing::populateArrays faceOutput[faceIndexer++] = cFaces.size(); - forAll(cFaces, cFaceI) + for (const label facei : cFaces) { - const face& f = mesh.faces()[cFaces[cFaceI]]; - const bool isOwner = (owner[cFaces[cFaceI]] == celli); + const face& f = mesh.faces()[facei]; + const bool isOwner = (owner[facei] == celli); hashUniqId.insert(f); - // number of labels for this face + // The number of labels for this face faceOutput[faceIndexer++] = f.size(); if (isOwner) @@ -586,9 +592,9 @@ void Foam::vtk::vtuSizing::populateArrays } const labelList uniq = hashUniqId.sortedToc(); - forAll(uniq, i) + for (const label fpi : uniq) { - vertLabels[nVertLabels++] = uniq[i]; + vertLabels[nVertLabels++] = fpi; } } } @@ -662,4 +668,32 @@ void Foam::vtk::vtuSizing::populateArrays } +//unused template<class LabelType, class LabelType2> +//unused void Foam::vtk::vtuSizing::renumberVertLabelsInternalImpl +//unused ( +//unused UList<uint8_t>& cellTypes, +//unused UList<LabelType>& vertLabels, +//unused const LabelType2 globalPointOffset +//unused ) +//unused { +//unused // INTERNAL vertLabels = "connectivity" contain +//unused // [nLabels, vertex labels...] +//unused +//unused auto iter = vertLabels.begin(); +//unused const auto last = vertLabels.end(); +//unused +//unused while (iter < last) +//unused { +//unused LabelType nLabels = *iter; +//unused ++iter; +//unused +//unused while (nLabels--) +//unused { +//unused *iter += globalPointOffset; +//unused ++iter; +//unused } +//unused } +//unused } + + // ************************************************************************* //