X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvGlyph2D.cxx;h=594996011266e8b19df3f6ddd071611f71727f37;hb=5a7da4aedae5c204bc55c187717193e5950f9a44;hp=dfb64e031a09d74de65ade2a7a1f39d647013ef1;hpb=931a42358442f4ee4f314613c991c838d4b4e3b7;p=clitk.git diff --git a/vv/vvGlyph2D.cxx b/vv/vvGlyph2D.cxx index dfb64e0..5949960 100644 --- a/vv/vvGlyph2D.cxx +++ b/vv/vvGlyph2D.cxx @@ -1,29 +1,20 @@ /*========================================================================= + Program: vv http://www.creatis.insa-lyon.fr/rio/vv - Program: vv - Module: $RCSfile: vvGlyph2D.cxx,v $ - Language: C++ - Date: $Date: 2010/01/06 13:31:57 $ - Version: $Revision: 1.1 $ - Author : Pierre Seroul (pierre.seroul@gmail.com) + Authors belong to: + - University of LYON http://www.universite-lyon.fr/ + - Léon Bérard cancer center http://www.centreleonberard.fr + - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr -Copyright (C) 2008 -Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr -CREATIS-LRMN http://www.creatis.insa-lyon.fr + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the copyright notices for more information. -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, version 3 of the License. + It is distributed under dual licence -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . - -=========================================================================*/ + - BSD See included LICENSE.txt file + - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html +===========================================================================**/ #include "vvGlyph2D.h" #include "vtkCell.h" @@ -41,607 +32,508 @@ along with this program. If not, see . #include "vtkTransform.h" #include "vtkUnsignedCharArray.h" -vtkCxxRevisionMacro(vvGlyph2D, "$Revision: 1.1 $"); +vtkCxxRevisionMacro(vvGlyph2D, "DummyRevision"); vtkStandardNewMacro(vvGlyph2D); vvGlyph2D::vvGlyph2D() { - mOrientation[0] = 1; - mOrientation[1] = 1; - mOrientation[2] = 1; - mUseLog = 0; + mOrientation[0] = 1; + mOrientation[1] = 1; + mOrientation[2] = 1; + mUseLog = 0; } //---------------------------------------------------------------------------- int vvGlyph2D::RequestData( - vtkInformation *vtkNotUsed(request), - vtkInformationVector **inputVector, - vtkInformationVector *outputVector) + vtkInformation *vtkNotUsed(request), + vtkInformationVector **inputVector, + vtkInformationVector *outputVector) { - // get the info objects - vtkInformation *inInfo = inputVector[0]->GetInformationObject(0); - vtkInformation *outInfo = outputVector->GetInformationObject(0); - - // get the input and ouptut - vtkDataSet *input = vtkDataSet::SafeDownCast( - inInfo->Get(vtkDataObject::DATA_OBJECT())); - vtkPolyData *output = vtkPolyData::SafeDownCast( - outInfo->Get(vtkDataObject::DATA_OBJECT())); - - vtkPointData *pd; - vtkDataArray *inSScalars; // Scalars for Scaling - vtkDataArray *inCScalars; // Scalars for Coloring - vtkDataArray *inVectors; - int requestedGhostLevel; - unsigned char* inGhostLevels=0; - vtkDataArray *inNormals, *sourceNormals = NULL; - vtkDataArray *sourceTCoords = NULL; - vtkIdType numPts, numSourcePts, numSourceCells, inPtId, i; - int index; - vtkPoints *sourcePts = NULL; - vtkPoints *newPts; - vtkDataArray *newScalars=NULL; - vtkDataArray *newVectors=NULL; - vtkDataArray *newNormals=NULL; - vtkDataArray *newTCoords = NULL; - double x[3], v[3], vNew[3], s = 0.0, vMag = 0.0, value, tc[3]; - vtkTransform *trans = vtkTransform::New(); - vtkCell *cell; - vtkIdList *cellPts; - int npts; - vtkIdList *pts; - vtkIdType ptIncr, cellId; - int haveVectors, haveNormals, haveTCoords = 0; - double scalex,scaley,scalez, den; - vtkPointData *outputPD = output->GetPointData(); - int numberOfSources = this->GetNumberOfInputConnections(1); - vtkPolyData *defaultSource = NULL; - vtkIdTypeArray *pointIds=0; - vtkPolyData *source = 0; - - vtkDebugMacro(<<"Generating glyphs"); - - pts = vtkIdList::New(); - pts->Allocate(VTK_CELL_SIZE); - - pd = input->GetPointData(); - inSScalars = this->GetInputArrayToProcess(0,inputVector); - inVectors = this->GetInputArrayToProcess(1,inputVector); - inNormals = this->GetInputArrayToProcess(2,inputVector); - inCScalars = this->GetInputArrayToProcess(3,inputVector); - if (inCScalars == NULL) - { - inCScalars = inSScalars; - } - - vtkDataArray* temp = 0; - if (pd) - { - temp = pd->GetArray("vtkGhostLevels"); + // get the info objects + vtkInformation *inInfo = inputVector[0]->GetInformationObject(0); + vtkInformation *outInfo = outputVector->GetInformationObject(0); + + // get the input and ouptut + vtkDataSet *input = vtkDataSet::SafeDownCast( + inInfo->Get(vtkDataObject::DATA_OBJECT())); + vtkPolyData *output = vtkPolyData::SafeDownCast( + outInfo->Get(vtkDataObject::DATA_OBJECT())); + + vtkPointData *pd; + vtkDataArray *inSScalars; // Scalars for Scaling + vtkDataArray *inCScalars; // Scalars for Coloring + vtkDataArray *inVectors; + int requestedGhostLevel; + unsigned char* inGhostLevels=0; + vtkDataArray *inNormals, *sourceNormals = NULL; + vtkDataArray *sourceTCoords = NULL; + vtkIdType numPts, numSourcePts, numSourceCells, inPtId, i; + int index; + vtkPoints *sourcePts = NULL; + vtkPoints *newPts; + vtkDataArray *newScalars=NULL; + vtkDataArray *newVectors=NULL; + vtkDataArray *newNormals=NULL; + vtkDataArray *newTCoords = NULL; + double x[3], v[3], vNew[3], s = 0.0, vMag = 0.0, value, tc[3]; + vtkTransform *trans = vtkTransform::New(); + vtkCell *cell; + vtkIdList *cellPts; + int npts; + vtkIdList *pts; + vtkIdType ptIncr, cellId; + int haveVectors, haveNormals, haveTCoords = 0; + double scalex,scaley,scalez, den; + vtkPointData *outputPD = output->GetPointData(); + int numberOfSources = this->GetNumberOfInputConnections(1); + vtkPolyData *defaultSource = NULL; + vtkIdTypeArray *pointIds=0; + vtkPolyData *source = 0; + + vtkDebugMacro(<<"Generating glyphs"); + + pts = vtkIdList::New(); + pts->Allocate(VTK_CELL_SIZE); + + pd = input->GetPointData(); + inSScalars = this->GetInputArrayToProcess(0,inputVector); + inVectors = this->GetInputArrayToProcess(1,inputVector); + inNormals = this->GetInputArrayToProcess(2,inputVector); + inCScalars = this->GetInputArrayToProcess(3,inputVector); + if (inCScalars == NULL) { + inCScalars = inSScalars; + } + + vtkDataArray* temp = 0; + if (pd) { + temp = pd->GetArray("vtkGhostLevels"); + } + if ( (!temp) || (temp->GetDataType() != VTK_UNSIGNED_CHAR) + || (temp->GetNumberOfComponents() != 1)) { + vtkDebugMacro("No appropriate ghost levels field available."); + } else { + inGhostLevels = ((vtkUnsignedCharArray*)temp)->GetPointer(0); + } + + requestedGhostLevel = + outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_GHOST_LEVELS()); + + numPts = input->GetNumberOfPoints(); + if (numPts < 1) { + vtkDebugMacro(<<"No points to glyph!"); + pts->Delete(); + trans->Delete(); + return 1; + } + + // Check input for consistency + // + if ( (den = this->Range[1] - this->Range[0]) == 0.0 ) { + den = 1.0; + } + if ( this->VectorMode != VTK_VECTOR_ROTATION_OFF && + ((this->VectorMode == VTK_USE_VECTOR && inVectors != NULL) || + (this->VectorMode == VTK_USE_NORMAL && inNormals != NULL)) ) { + haveVectors = 1; + } else { + haveVectors = 0; + } + + if ( (this->IndexMode == VTK_INDEXING_BY_SCALAR && !inSScalars) || + (this->IndexMode == VTK_INDEXING_BY_VECTOR && + ((!inVectors && this->VectorMode == VTK_USE_VECTOR) || + (!inNormals && this->VectorMode == VTK_USE_NORMAL))) ) { + if ( this->GetSource(0, inputVector[1]) == NULL ) { + vtkErrorMacro(<<"Indexing on but don't have data to index with"); + pts->Delete(); + trans->Delete(); + return 1; + } else { + vtkWarningMacro(<<"Turning indexing off: no data to index with"); + this->IndexMode = VTK_INDEXING_OFF; } - if ( (!temp) || (temp->GetDataType() != VTK_UNSIGNED_CHAR) - || (temp->GetNumberOfComponents() != 1)) - { - vtkDebugMacro("No appropriate ghost levels field available."); + } + + // Allocate storage for output PolyData + // + outputPD->CopyVectorsOff(); + outputPD->CopyNormalsOff(); + outputPD->CopyTCoordsOff(); + + if (!this->GetSource(0, inputVector[1])) { + defaultSource = vtkPolyData::New(); + defaultSource->Allocate(); + vtkPoints *defaultPoints = vtkPoints::New(); + defaultPoints->Allocate(6); + defaultPoints->InsertNextPoint(0, 0, 0); + defaultPoints->InsertNextPoint(1, 0, 0); + vtkIdType defaultPointIds[2]; + defaultPointIds[0] = 0; + defaultPointIds[1] = 1; + defaultSource->SetPoints(defaultPoints); + defaultSource->InsertNextCell(VTK_LINE, 2, defaultPointIds); + defaultSource->SetUpdateExtent(0, 1, 0); + this->SetSource(defaultSource); + defaultSource->Delete(); + defaultSource = NULL; + defaultPoints->Delete(); + defaultPoints = NULL; + } + + if ( this->IndexMode != VTK_INDEXING_OFF ) { + pd = NULL; + haveNormals = 1; + for (numSourcePts=numSourceCells=i=0; i < numberOfSources; i++) { + source = this->GetSource(i, inputVector[1]); + if ( source != NULL ) { + if (source->GetNumberOfPoints() > numSourcePts) { + numSourcePts = source->GetNumberOfPoints(); + } + if (source->GetNumberOfCells() > numSourceCells) { + numSourceCells = source->GetNumberOfCells(); + } + if ( !(sourceNormals = source->GetPointData()->GetNormals()) ) { + haveNormals = 0; + } + } } - else - { - inGhostLevels = ((vtkUnsignedCharArray*)temp)->GetPointer(0); + } else { + source = this->GetSource(0, inputVector[1]); + sourcePts = source->GetPoints(); + numSourcePts = sourcePts->GetNumberOfPoints(); + numSourceCells = source->GetNumberOfCells(); + + sourceNormals = source->GetPointData()->GetNormals(); + if ( sourceNormals ) { + haveNormals = 1; + } else { + haveNormals = 0; } - requestedGhostLevel = - outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_GHOST_LEVELS()); - - numPts = input->GetNumberOfPoints(); - if (numPts < 1) - { - vtkDebugMacro(<<"No points to glyph!"); - pts->Delete(); - trans->Delete(); - return 1; + sourceTCoords = source->GetPointData()->GetTCoords(); + if (sourceTCoords) { + haveTCoords = 1; + } else { + haveTCoords = 0; } - // Check input for consistency - // - if ( (den = this->Range[1] - this->Range[0]) == 0.0 ) - { - den = 1.0; - } - if ( this->VectorMode != VTK_VECTOR_ROTATION_OFF && - ((this->VectorMode == VTK_USE_VECTOR && inVectors != NULL) || - (this->VectorMode == VTK_USE_NORMAL && inNormals != NULL)) ) - { - haveVectors = 1; + // Prepare to copy output. + pd = input->GetPointData(); + outputPD->CopyAllocate(pd,numPts*numSourcePts); + } + + newPts = vtkPoints::New(); + newPts->Allocate(numPts*numSourcePts); + if ( this->GeneratePointIds ) { + pointIds = vtkIdTypeArray::New(); + pointIds->SetName(this->PointIdsName); + pointIds->Allocate(numPts*numSourcePts); + outputPD->AddArray(pointIds); + pointIds->Delete(); + } + if ( this->ColorMode == VTK_COLOR_BY_SCALAR && inCScalars ) { + newScalars = inCScalars->NewInstance(); + newScalars->SetNumberOfComponents(inCScalars->GetNumberOfComponents()); + newScalars->Allocate(inCScalars->GetNumberOfComponents()*numPts*numSourcePts); + newScalars->SetName(inCScalars->GetName()); + } else if ( (this->ColorMode == VTK_COLOR_BY_SCALE) && inSScalars) { + newScalars = vtkFloatArray::New(); + newScalars->Allocate(numPts*numSourcePts); + newScalars->SetName("GlyphScale"); + if (this->ScaleMode == VTK_SCALE_BY_SCALAR) { + newScalars->SetName(inSScalars->GetName()); } - else - { - haveVectors = 0; + } else if ( (this->ColorMode == VTK_COLOR_BY_VECTOR) && haveVectors) { + newScalars = vtkFloatArray::New(); + newScalars->Allocate(numPts*numSourcePts); + newScalars->SetName("VectorMagnitude"); + } + if ( haveVectors ) { + newVectors = vtkFloatArray::New(); + newVectors->SetNumberOfComponents(3); + newVectors->Allocate(3*numPts*numSourcePts); + newVectors->SetName("GlyphVector"); + } + if ( haveNormals ) { + newNormals = vtkFloatArray::New(); + newNormals->SetNumberOfComponents(3); + newNormals->Allocate(3*numPts*numSourcePts); + newNormals->SetName("Normals"); + } + if (haveTCoords) { + newTCoords = vtkFloatArray::New(); + int numComps = sourceTCoords->GetNumberOfComponents(); + newTCoords->SetNumberOfComponents(numComps); + newTCoords->Allocate(numComps*numPts*numSourcePts); + newTCoords->SetName("TCoords"); + } + + // Setting up for calls to PolyData::InsertNextCell() + if (this->IndexMode != VTK_INDEXING_OFF ) { + output->Allocate(3*numPts*numSourceCells,numPts*numSourceCells); + } else { + output->Allocate(this->GetSource(0, inputVector[1]), + 3*numPts*numSourceCells, numPts*numSourceCells); + } + + // Traverse all Input points, transforming Source points and copying + // point attributes. + // + ptIncr=0; + for (inPtId=0; inPtId < numPts; inPtId++) { + scalex = scaley = scalez = 1.0; + if ( ! (inPtId % 10000) ) { + this->UpdateProgress ((double)inPtId/numPts); + if (this->GetAbortExecute()) { + break; + } } - if ( (this->IndexMode == VTK_INDEXING_BY_SCALAR && !inSScalars) || - (this->IndexMode == VTK_INDEXING_BY_VECTOR && - ((!inVectors && this->VectorMode == VTK_USE_VECTOR) || - (!inNormals && this->VectorMode == VTK_USE_NORMAL))) ) - { - if ( this->GetSource(0, inputVector[1]) == NULL ) - { - vtkErrorMacro(<<"Indexing on but don't have data to index with"); - pts->Delete(); - trans->Delete(); - return 1; - } - else - { - vtkWarningMacro(<<"Turning indexing off: no data to index with"); - this->IndexMode = VTK_INDEXING_OFF; - } + // Get the scalar and vector data + if ( inSScalars ) { + s = inSScalars->GetComponent(inPtId, 0); + if ( this->ScaleMode == VTK_SCALE_BY_SCALAR || + this->ScaleMode == VTK_DATA_SCALING_OFF ) { + scalex = scaley = scalez = s; + } } - // Allocate storage for output PolyData - // - outputPD->CopyVectorsOff(); - outputPD->CopyNormalsOff(); - outputPD->CopyTCoordsOff(); - - if (!this->GetSource(0, inputVector[1])) - { - defaultSource = vtkPolyData::New(); - defaultSource->Allocate(); - vtkPoints *defaultPoints = vtkPoints::New(); - defaultPoints->Allocate(6); - defaultPoints->InsertNextPoint(0, 0, 0); - defaultPoints->InsertNextPoint(1, 0, 0); - vtkIdType defaultPointIds[2]; - defaultPointIds[0] = 0; - defaultPointIds[1] = 1; - defaultSource->SetPoints(defaultPoints); - defaultSource->InsertNextCell(VTK_LINE, 2, defaultPointIds); - defaultSource->SetUpdateExtent(0, 1, 0); - this->SetSource(defaultSource); - defaultSource->Delete(); - defaultSource = NULL; - defaultPoints->Delete(); - defaultPoints = NULL; + if ( haveVectors ) { + if ( this->VectorMode == VTK_USE_NORMAL ) { + inNormals->GetTuple(inPtId, v); + } else { + inVectors->GetTuple(inPtId, v); + } + + vMag = vtkMath::Norm(v); + if ( this->ScaleMode == VTK_SCALE_BY_VECTORCOMPONENTS ) { + scalex = v[0]; + scaley = v[1]; + scalez = v[2]; + } else if ( this->ScaleMode == VTK_SCALE_BY_VECTOR ) { + scalex = scaley = scalez = vMag; + } } - if ( this->IndexMode != VTK_INDEXING_OFF ) - { - pd = NULL; - haveNormals = 1; - for (numSourcePts=numSourceCells=i=0; i < numberOfSources; i++) - { - source = this->GetSource(i, inputVector[1]); - if ( source != NULL ) - { - if (source->GetNumberOfPoints() > numSourcePts) - { - numSourcePts = source->GetNumberOfPoints(); - } - if (source->GetNumberOfCells() > numSourceCells) - { - numSourceCells = source->GetNumberOfCells(); - } - if ( !(sourceNormals = source->GetPointData()->GetNormals()) ) - { - haveNormals = 0; - } - } - } + // Clamp data scale if enabled + if ( this->Clamping ) { + scalex = (scalex < this->Range[0] ? this->Range[0] : + (scalex > this->Range[1] ? this->Range[1] : scalex)); + scalex = (scalex - this->Range[0]) / den; + scaley = (scaley < this->Range[0] ? this->Range[0] : + (scaley > this->Range[1] ? this->Range[1] : scaley)); + scaley = (scaley - this->Range[0]) / den; + scalez = (scalez < this->Range[0] ? this->Range[0] : + (scalez > this->Range[1] ? this->Range[1] : scalez)); + scalez = (scalez - this->Range[0]) / den; } - else - { - source = this->GetSource(0, inputVector[1]); + + // Compute index into table of glyphs + if ( this->IndexMode == VTK_INDEXING_OFF ) { + index = 0; + } else { + if ( this->IndexMode == VTK_INDEXING_BY_SCALAR ) { + value = s; + } else { + value = vMag; + } + + index = (int) ((double)(value - this->Range[0]) * numberOfSources / den); + index = (index < 0 ? 0 : + (index >= numberOfSources ? (numberOfSources-1) : index)); + + source = this->GetSource(index, inputVector[1]); + if ( source != NULL ) { sourcePts = source->GetPoints(); + sourceNormals = source->GetPointData()->GetNormals(); numSourcePts = sourcePts->GetNumberOfPoints(); numSourceCells = source->GetNumberOfCells(); + } + } - sourceNormals = source->GetPointData()->GetNormals(); - if ( sourceNormals ) - { - haveNormals = 1; - } - else - { - haveNormals = 0; - } - - sourceTCoords = source->GetPointData()->GetTCoords(); - if (sourceTCoords) - { - haveTCoords = 1; - } - else - { - haveTCoords = 0; - } + // Make sure we're not indexing into empty glyph + if ( this->GetSource(index, inputVector[1]) == NULL ) { + continue; + } - // Prepare to copy output. - pd = input->GetPointData(); - outputPD->CopyAllocate(pd,numPts*numSourcePts); + // Check ghost points. + // If we are processing a piece, we do not want to duplicate + // glyphs on the borders. The corrct check here is: + // ghostLevel > 0. I am leaving this over glyphing here because + // it make a nice example (sphereGhost.tcl) to show the + // point ghost levels with the glyph filter. I am not certain + // of the usefullness of point ghost levels over 1, but I will have + // to think about it. + if (inGhostLevels && inGhostLevels[inPtId] > requestedGhostLevel) { + continue; } - newPts = vtkPoints::New(); - newPts->Allocate(numPts*numSourcePts); - if ( this->GeneratePointIds ) - { - pointIds = vtkIdTypeArray::New(); - pointIds->SetName(this->PointIdsName); - pointIds->Allocate(numPts*numSourcePts); - outputPD->AddArray(pointIds); - pointIds->Delete(); + if (!this->IsPointVisible(input, inPtId)) { + continue; } - if ( this->ColorMode == VTK_COLOR_BY_SCALAR && inCScalars ) - { - newScalars = inCScalars->NewInstance(); - newScalars->SetNumberOfComponents(inCScalars->GetNumberOfComponents()); - newScalars->Allocate(inCScalars->GetNumberOfComponents()*numPts*numSourcePts); - newScalars->SetName(inCScalars->GetName()); + + // Now begin copying/transforming glyph + trans->Identity(); + + // Copy all topology (transformation independent) + for (cellId=0; cellId < numSourceCells; cellId++) { + cell = this->GetSource(index, inputVector[1])->GetCell(cellId); + cellPts = cell->GetPointIds(); + npts = cellPts->GetNumberOfIds(); + for (pts->Reset(), i=0; i < npts; i++) { + pts->InsertId(i,cellPts->GetId(i) + ptIncr); + } + output->InsertNextCell(cell->GetCellType(),pts); } - else if ( (this->ColorMode == VTK_COLOR_BY_SCALE) && inSScalars) - { - newScalars = vtkFloatArray::New(); - newScalars->Allocate(numPts*numSourcePts); - newScalars->SetName("GlyphScale"); - if (this->ScaleMode == VTK_SCALE_BY_SCALAR) - { - newScalars->SetName(inSScalars->GetName()); + + // translate Source to Input point + input->GetPoint(inPtId, x); + + //projection on the plane orthogonale to the camera + trans->Scale(mOrientation[0],mOrientation[1],mOrientation[2]); + + trans->Translate(x[0], x[1], x[2]); + + if ( haveVectors ) { + // Copy Input vector + for (i=0; i < numSourcePts; i++) { + newVectors->InsertTuple(i+ptIncr, v); + } + if (this->Orient && (vMag > 0.0)) { + // if there is no y or z component + if ( v[1] == 0.0 && v[2] == 0.0 ) { + if (v[0] < 0) { //just flip x if we need to + trans->RotateWXYZ(180.0,0,1,0); + } + } else { + vNew[0] = (v[0]+vMag) / 2.0; + vNew[1] = v[1] / 2.0; + vNew[2] = v[2] / 2.0; + trans->RotateWXYZ((double)180.0,vNew[0],vNew[1],vNew[2]); } + } } - else if ( (this->ColorMode == VTK_COLOR_BY_VECTOR) && haveVectors) - { - newScalars = vtkFloatArray::New(); - newScalars->Allocate(numPts*numSourcePts); - newScalars->SetName("VectorMagnitude"); - } - if ( haveVectors ) - { - newVectors = vtkFloatArray::New(); - newVectors->SetNumberOfComponents(3); - newVectors->Allocate(3*numPts*numSourcePts); - newVectors->SetName("GlyphVector"); - } - if ( haveNormals ) - { - newNormals = vtkFloatArray::New(); - newNormals->SetNumberOfComponents(3); - newNormals->Allocate(3*numPts*numSourcePts); - newNormals->SetName("Normals"); - } - if (haveTCoords) - { - newTCoords = vtkFloatArray::New(); - int numComps = sourceTCoords->GetNumberOfComponents(); - newTCoords->SetNumberOfComponents(numComps); - newTCoords->Allocate(numComps*numPts*numSourcePts); - newTCoords->SetName("TCoords"); + + if (haveTCoords) { + for (i = 0; i < numSourcePts; i++) { + sourceTCoords->GetTuple(i, tc); + newTCoords->InsertTuple(i+ptIncr, tc); + } } - // Setting up for calls to PolyData::InsertNextCell() - if (this->IndexMode != VTK_INDEXING_OFF ) - { - output->Allocate(3*numPts*numSourceCells,numPts*numSourceCells); + // determine scale factor from scalars if appropriate + // Copy scalar value + if (inSScalars && (this->ColorMode == VTK_COLOR_BY_SCALE)) { + for (i=0; i < numSourcePts; i++) { + newScalars->InsertTuple(i+ptIncr, &scalex); // = scaley = scalez + } + } else if (inCScalars && (this->ColorMode == VTK_COLOR_BY_SCALAR)) { + for (i=0; i < numSourcePts; i++) { + outputPD->CopyTuple(inCScalars, newScalars, inPtId, ptIncr+i); + } } - else - { - output->Allocate(this->GetSource(0, inputVector[1]), - 3*numPts*numSourceCells, numPts*numSourceCells); + if (haveVectors && this->ColorMode == VTK_COLOR_BY_VECTOR) { + double color = 1; + for (i=0; i < numSourcePts; i++) { + newScalars->InsertTuple(i+ptIncr, &color); + } } - // Traverse all Input points, transforming Source points and copying - // point attributes. - // - ptIncr=0; - for (inPtId=0; inPtId < numPts; inPtId++) - { - scalex = scaley = scalez = 1.0; - if ( ! (inPtId % 10000) ) - { - this->UpdateProgress ((double)inPtId/numPts); - if (this->GetAbortExecute()) - { - break; - } - } - - // Get the scalar and vector data - if ( inSScalars ) - { - s = inSScalars->GetComponent(inPtId, 0); - if ( this->ScaleMode == VTK_SCALE_BY_SCALAR || - this->ScaleMode == VTK_DATA_SCALING_OFF ) - { - scalex = scaley = scalez = s; - } - } - - if ( haveVectors ) - { - if ( this->VectorMode == VTK_USE_NORMAL ) - { - inNormals->GetTuple(inPtId, v); - } - else - { - inVectors->GetTuple(inPtId, v); - } - - vMag = vtkMath::Norm(v); - if ( this->ScaleMode == VTK_SCALE_BY_VECTORCOMPONENTS ) - { - scalex = v[0]; - scaley = v[1]; - scalez = v[2]; - } - else if ( this->ScaleMode == VTK_SCALE_BY_VECTOR ) - { - scalex = scaley = scalez = vMag; - } - } - - // Clamp data scale if enabled - if ( this->Clamping ) - { - scalex = (scalex < this->Range[0] ? this->Range[0] : - (scalex > this->Range[1] ? this->Range[1] : scalex)); - scalex = (scalex - this->Range[0]) / den; - scaley = (scaley < this->Range[0] ? this->Range[0] : - (scaley > this->Range[1] ? this->Range[1] : scaley)); - scaley = (scaley - this->Range[0]) / den; - scalez = (scalez < this->Range[0] ? this->Range[0] : - (scalez > this->Range[1] ? this->Range[1] : scalez)); - scalez = (scalez - this->Range[0]) / den; - } - - // Compute index into table of glyphs - if ( this->IndexMode == VTK_INDEXING_OFF ) - { - index = 0; - } - else - { - if ( this->IndexMode == VTK_INDEXING_BY_SCALAR ) - { - value = s; - } - else - { - value = vMag; - } - - index = (int) ((double)(value - this->Range[0]) * numberOfSources / den); - index = (index < 0 ? 0 : - (index >= numberOfSources ? (numberOfSources-1) : index)); - - source = this->GetSource(index, inputVector[1]); - if ( source != NULL ) - { - sourcePts = source->GetPoints(); - sourceNormals = source->GetPointData()->GetNormals(); - numSourcePts = sourcePts->GetNumberOfPoints(); - numSourceCells = source->GetNumberOfCells(); - } - } - - // Make sure we're not indexing into empty glyph - if ( this->GetSource(index, inputVector[1]) == NULL ) - { - continue; - } - - // Check ghost points. - // If we are processing a piece, we do not want to duplicate - // glyphs on the borders. The corrct check here is: - // ghostLevel > 0. I am leaving this over glyphing here because - // it make a nice example (sphereGhost.tcl) to show the - // point ghost levels with the glyph filter. I am not certain - // of the usefullness of point ghost levels over 1, but I will have - // to think about it. - if (inGhostLevels && inGhostLevels[inPtId] > requestedGhostLevel) - { - continue; - } - - if (!this->IsPointVisible(input, inPtId)) - { - continue; - } - - // Now begin copying/transforming glyph - trans->Identity(); - - // Copy all topology (transformation independent) - for (cellId=0; cellId < numSourceCells; cellId++) - { - cell = this->GetSource(index, inputVector[1])->GetCell(cellId); - cellPts = cell->GetPointIds(); - npts = cellPts->GetNumberOfIds(); - for (pts->Reset(), i=0; i < npts; i++) - { - pts->InsertId(i,cellPts->GetId(i) + ptIncr); - } - output->InsertNextCell(cell->GetCellType(),pts); - } - - // translate Source to Input point - input->GetPoint(inPtId, x); - - //projection on the plane orthogonale to the camera - trans->Scale(mOrientation[0],mOrientation[1],mOrientation[2]); - - trans->Translate(x[0], x[1], x[2]); - - if ( haveVectors ) - { - // Copy Input vector - for (i=0; i < numSourcePts; i++) - { - newVectors->InsertTuple(i+ptIncr, v); - } - if (this->Orient && (vMag > 0.0)) - { - // if there is no y or z component - if ( v[1] == 0.0 && v[2] == 0.0 ) - { - if (v[0] < 0) //just flip x if we need to - { - trans->RotateWXYZ(180.0,0,1,0); - } - } - else - { - vNew[0] = (v[0]+vMag) / 2.0; - vNew[1] = v[1] / 2.0; - vNew[2] = v[2] / 2.0; - trans->RotateWXYZ((double)180.0,vNew[0],vNew[1],vNew[2]); - } - } - } - - if (haveTCoords) - { - for (i = 0; i < numSourcePts; i++) - { - sourceTCoords->GetTuple(i, tc); - newTCoords->InsertTuple(i+ptIncr, tc); - } - } - - // determine scale factor from scalars if appropriate - // Copy scalar value - if (inSScalars && (this->ColorMode == VTK_COLOR_BY_SCALE)) - { - for (i=0; i < numSourcePts; i++) - { - newScalars->InsertTuple(i+ptIncr, &scalex); // = scaley = scalez - } - } - else if (inCScalars && (this->ColorMode == VTK_COLOR_BY_SCALAR)) - { - for (i=0; i < numSourcePts; i++) - { - outputPD->CopyTuple(inCScalars, newScalars, inPtId, ptIncr+i); - } - } - if (haveVectors && this->ColorMode == VTK_COLOR_BY_VECTOR) - { - double color = 1; - for (i=0; i < numSourcePts; i++) - { - newScalars->InsertTuple(i+ptIncr, &color); - } - } - - // scale data if appropriate - if ( this->Scaling ) - { - if ( this->ScaleMode == VTK_DATA_SCALING_OFF ) - { - scalex = scaley = scalez = this->ScaleFactor; - } - else - { - scalex *= this->ScaleFactor; - scaley *= this->ScaleFactor; - scalez *= this->ScaleFactor; - } - - if ( scalex == 0.0 ) - { - scalex = 1.0e-10; - } - if ( scaley == 0.0 ) - { - scaley = 1.0e-10; - } - if ( scalez == 0.0 ) - { - scalez = 1.0e-10; - } - trans->Scale(scalex,scaley,scalez); - } - // multiply points and normals by resulting matrix - trans->TransformPoints(sourcePts,newPts); - - if ( haveNormals ) - { - trans->TransformNormals(sourceNormals,newNormals); - } + // scale data if appropriate + if ( this->Scaling ) { + if ( this->ScaleMode == VTK_DATA_SCALING_OFF ) { + scalex = scaley = scalez = this->ScaleFactor; + } else { + scalex *= this->ScaleFactor; + scaley *= this->ScaleFactor; + scalez *= this->ScaleFactor; + } + + if ( scalex == 0.0 ) { + scalex = 1.0e-10; + } + if ( scaley == 0.0 ) { + scaley = 1.0e-10; + } + if ( scalez == 0.0 ) { + scalez = 1.0e-10; + } + trans->Scale(scalex,scaley,scalez); + } + // multiply points and normals by resulting matrix + trans->TransformPoints(sourcePts,newPts); - // Copy point data from source (if possible) - if ( pd ) - { - for (i=0; i < numSourcePts; i++) - { - outputPD->CopyData(pd,inPtId,ptIncr+i); - } - } + if ( haveNormals ) { + trans->TransformNormals(sourceNormals,newNormals); + } - // If point ids are to be generated, do it here - if ( this->GeneratePointIds ) - { - for (i=0; i < numSourcePts; i++) - { - pointIds->InsertNextValue(inPtId); - } - } + // Copy point data from source (if possible) + if ( pd ) { + for (i=0; i < numSourcePts; i++) { + outputPD->CopyData(pd,inPtId,ptIncr+i); + } + } - ptIncr += numSourcePts; + // If point ids are to be generated, do it here + if ( this->GeneratePointIds ) { + for (i=0; i < numSourcePts; i++) { + pointIds->InsertNextValue(inPtId); + } } - // Update ourselves and release memory - // - output->SetPoints(newPts); - newPts->Delete(); + ptIncr += numSourcePts; + } - if (newScalars) - { - int idx = outputPD->AddArray(newScalars); - outputPD->SetActiveAttribute(idx, vtkDataSetAttributes::SCALARS); - newScalars->Delete(); - } + // Update ourselves and release memory + // + output->SetPoints(newPts); + newPts->Delete(); - if (newVectors) - { - outputPD->SetVectors(newVectors); - newVectors->Delete(); - } + if (newScalars) { + int idx = outputPD->AddArray(newScalars); + outputPD->SetActiveAttribute(idx, vtkDataSetAttributes::SCALARS); + newScalars->Delete(); + } - if (newNormals) - { - outputPD->SetNormals(newNormals); - newNormals->Delete(); - } + if (newVectors) { + outputPD->SetVectors(newVectors); + newVectors->Delete(); + } - if (newTCoords) - { - outputPD->SetTCoords(newTCoords); - newTCoords->Delete(); - } + if (newNormals) { + outputPD->SetNormals(newNormals); + newNormals->Delete(); + } - output->Squeeze(); - trans->Delete(); - pts->Delete(); + if (newTCoords) { + outputPD->SetTCoords(newTCoords); + newTCoords->Delete(); + } - return 1; + output->Squeeze(); + trans->Delete(); + pts->Delete(); + + return 1; } void vvGlyph2D::PrintSelf(ostream& os, vtkIndent indent) { - this->Superclass::PrintSelf(os,indent); + this->Superclass::PrintSelf(os,indent); } void vvGlyph2D::SetOrientation(int x, int y, int z) { - if (x == 0) - mOrientation[0] = 1.0e-10; - else - mOrientation[0] = 1.0; - if (y == 0) - mOrientation[1] = 1.0e-10; - else - mOrientation[1] = 1.0; - if (z == 0) - mOrientation[2] = 1.0e-10; - else - mOrientation[2] = 1.0; + if (x == 0) + mOrientation[0] = 1.0e-10; + else + mOrientation[0] = 1.0; + if (y == 0) + mOrientation[1] = 1.0e-10; + else + mOrientation[1] = 1.0; + if (z == 0) + mOrientation[2] = 1.0e-10; + else + mOrientation[2] = 1.0; }