1 // SMESH OBJECT : interactive object for SMESH visualization
3 // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
24 // File : SMESH_DeviceActor.cxx
30 #include "SMESH_DeviceActor.h"
31 #include "SMESH_ExtractGeometry.h"
32 #include "SMESH_ControlsDef.hxx"
33 #include "SMESH_ActorUtils.h"
35 #include <VTKViewer_Transform.h>
36 #include <VTKViewer_TransformFilter.h>
37 #include <VTKViewer_PassThroughFilter.h>
38 #include <VTKViewer_ExtractUnstructuredGrid.h>
41 #include <vtkObjectFactory.h>
42 #include <vtkShrinkFilter.h>
43 #include <vtkShrinkPolyData.h>
45 #include <vtkProperty.h>
46 #include <vtkPolyData.h>
47 #include <vtkMergeFilter.h>
48 #include <vtkPolyDataMapper.h>
49 #include <vtkUnstructuredGrid.h>
51 #include <vtkScalarBarActor.h>
52 #include <vtkLookupTable.h>
53 #include <vtkDoubleArray.h>
54 #include <vtkCellData.h>
57 #include <vtkIdList.h>
58 #include <vtkIdTypeArray.h>
59 #include <vtkCellArray.h>
60 #include <vtkUnsignedCharArray.h>
62 #include <vtkImplicitBoolean.h>
64 #include "utilities.h"
67 static int MYDEBUG = 0;
69 static int MYDEBUG = 0;
75 vtkStandardNewMacro(SMESH_DeviceActor);
81 if(MYDEBUG) MESSAGE("SMESH_DeviceActor - "<<this);
84 myIsShrinkable = false;
85 myRepresentation = eSurface;
87 myProperty = vtkProperty::New();
88 myMapper = vtkPolyDataMapper::New();
90 vtkMapper::GetResolveCoincidentTopologyPolygonOffsetParameters(myPolygonOffsetFactor,
91 myPolygonOffsetUnits);
93 myMapper->UseLookupTableScalarRangeOn();
94 myMapper->SetColorModeToMapScalars();
96 myShrinkFilter = vtkShrinkFilter::New();
98 myStoreClippingMapping = false;
100 myExtractGeometry = SMESH_ExtractGeometry::New();
101 myExtractGeometry->SetReleaseDataFlag(true);
102 myIsImplicitFunctionUsed = false;
104 myExtractUnstructuredGrid = VTKViewer_ExtractUnstructuredGrid::New();
106 myMergeFilter = vtkMergeFilter::New();
108 myGeomFilter = VTKViewer_GeometryFilter::New();
110 myTransformFilter = VTKViewer_TransformFilter::New();
112 for(int i = 0; i < 6; i++)
113 myPassFilter.push_back(VTKViewer_PassThroughFilter::New());
118 ::~SMESH_DeviceActor()
120 if(MYDEBUG) MESSAGE("~SMESH_DeviceActor - "<<this);
122 myProperty->Delete();
126 myShrinkFilter->Delete();
128 myExtractUnstructuredGrid->Delete();
130 myMergeFilter->Delete();
132 myGeomFilter->Delete();
134 myExtractGeometry->Delete();
136 myTransformFilter->Delete();
138 for(int i = 0, iEnd = myPassFilter.size(); i < iEnd; i++){
139 myPassFilter[i]->Delete();
146 ::SetStoreGemetryMapping(bool theStoreMapping)
148 myGeomFilter->SetStoreMapping(theStoreMapping);
149 SetStoreClippingMapping(theStoreMapping);
155 ::SetStoreClippingMapping(bool theStoreMapping)
157 myStoreClippingMapping = theStoreMapping;
158 myExtractGeometry->SetStoreMapping(theStoreMapping && myIsImplicitFunctionUsed);
159 SetStoreIDMapping(theStoreMapping);
165 ::SetStoreIDMapping(bool theStoreMapping)
167 myExtractUnstructuredGrid->SetStoreMapping(theStoreMapping);
173 ::Init(TVisualObjPtr theVisualObj,
174 vtkImplicitBoolean* theImplicitBoolean)
176 myVisualObj = theVisualObj;
177 myExtractGeometry->SetImplicitFunction(theImplicitBoolean);
178 SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid());
184 ::SetImplicitFunctionUsed(bool theIsImplicitFunctionUsed)
187 if(theIsImplicitFunctionUsed)
188 myPassFilter[ anId ]->SetInput( myExtractGeometry->GetOutput() );
190 myPassFilter[ anId ]->SetInput( myMergeFilter->GetOutput() );
192 myIsImplicitFunctionUsed = theIsImplicitFunctionUsed;
193 SetStoreClippingMapping(myStoreClippingMapping);
199 ::SetUnstructuredGrid(vtkUnstructuredGrid* theGrid)
202 //myIsShrinkable = theGrid->GetNumberOfCells() > 10;
203 myIsShrinkable = true;
205 myExtractUnstructuredGrid->SetInput(theGrid);
207 myMergeFilter->SetGeometry(myExtractUnstructuredGrid->GetOutput());
209 myExtractGeometry->SetInput(myMergeFilter->GetOutput());
212 SetImplicitFunctionUsed(myIsImplicitFunctionUsed);
213 myPassFilter[ anId + 1]->SetInput( myPassFilter[ anId ]->GetOutput() );
216 myGeomFilter->SetInput( myPassFilter[ anId ]->GetOutput() );
219 myPassFilter[ anId ]->SetInput( myGeomFilter->GetOutput() );
220 myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() );
223 myTransformFilter->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() );
224 myTransformFilter->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() );
227 myPassFilter[ anId ]->SetInput( myTransformFilter->GetOutput() );
228 myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() );
229 myPassFilter[ anId ]->SetInput( myTransformFilter->GetOutput() );
230 myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() );
233 myMapper->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() );
234 myMapper->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() );
236 vtkLODActor::SetMapper( myMapper );
242 VTKViewer_ExtractUnstructuredGrid*
244 ::GetExtractUnstructuredGrid()
246 return myExtractUnstructuredGrid;
252 ::GetUnstructuredGrid()
254 myExtractUnstructuredGrid->Update();
255 return myExtractUnstructuredGrid->GetOutput();
261 ::SetControlMode(SMESH::Controls::FunctorPtr theFunctor,
262 vtkScalarBarActor* theScalarBarActor,
263 vtkLookupTable* theLookupTable)
265 bool anIsInitialized = theFunctor;
267 vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New();
269 SetStoreIDMapping(true);
270 myExtractUnstructuredGrid->Update();
271 vtkUnstructuredGrid* aGrid = myExtractUnstructuredGrid->GetOutput();
273 aDataSet->ShallowCopy(aGrid);
275 vtkDoubleArray *aScalars = vtkDoubleArray::New();
276 vtkIdType aNbCells = aGrid->GetNumberOfCells();
277 aScalars->SetNumberOfComponents(1);
278 aScalars->SetNumberOfTuples(aNbCells);
280 myVisualObj->UpdateFunctor(theFunctor);
282 using namespace SMESH::Controls;
283 if(NumericalFunctor* aNumericalFunctor = dynamic_cast<NumericalFunctor*>(theFunctor.get())){
284 for(vtkIdType i = 0; i < aNbCells; i++){
285 vtkIdType anId = myExtractUnstructuredGrid->GetInputId(i);
286 vtkIdType anObjId = myVisualObj->GetElemObjId(anId);
287 double aValue = aNumericalFunctor->GetValue(anObjId);
288 aScalars->SetValue(i,aValue);
290 }else if(Predicate* aPredicate = dynamic_cast<Predicate*>(theFunctor.get())){
291 for(vtkIdType i = 0; i < aNbCells; i++){
292 vtkIdType anId = myExtractUnstructuredGrid->GetInputId(i);
293 vtkIdType anObjId = myVisualObj->GetElemObjId(anId);
294 bool aValue = aPredicate->IsSatisfy(anObjId);
295 aScalars->SetValue(i,aValue);
299 aDataSet->GetCellData()->SetScalars(aScalars);
302 theLookupTable->SetRange(aScalars->GetRange());
303 theLookupTable->Build();
305 myMergeFilter->SetScalars(aDataSet);
308 GetMapper()->SetScalarVisibility(anIsInitialized);
309 theScalarBarActor->SetVisibility(anIsInitialized);
314 ::SetExtControlMode(SMESH::Controls::FunctorPtr theFunctor,
315 vtkScalarBarActor* theScalarBarActor,
316 vtkLookupTable* theLookupTable)
318 bool anIsInitialized = theFunctor;
319 myExtractUnstructuredGrid->ClearRegisteredCells();
320 myExtractUnstructuredGrid->ClearRegisteredCellsWithType();
321 myExtractUnstructuredGrid->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::ePassAll);
322 myVisualObj->UpdateFunctor(theFunctor);
324 using namespace SMESH::Controls;
325 if (anIsInitialized){
326 if (Length2D* aLength2D = dynamic_cast<Length2D*>(theFunctor.get())){
327 SMESH::Controls::Length2D::TValues aValues;
329 aLength2D->GetValues(aValues);
330 vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New();
331 vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid();
333 aDataSet->SetPoints(aGrid->GetPoints());
335 vtkIdType aNbCells = aValues.size();
337 vtkDoubleArray *aScalars = vtkDoubleArray::New();
338 aScalars->SetNumberOfComponents(1);
339 aScalars->SetNumberOfTuples(aNbCells);
341 vtkIdType aCellsSize = 3*aNbCells;
342 vtkCellArray* aConnectivity = vtkCellArray::New();
343 aConnectivity->Allocate( aCellsSize, 0 );
345 vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New();
346 aCellTypesArray->SetNumberOfComponents( 1 );
347 aCellTypesArray->Allocate( aNbCells * aCellTypesArray->GetNumberOfComponents() );
349 vtkIdList *anIdList = vtkIdList::New();
350 anIdList->SetNumberOfIds(2);
352 Length2D::TValues::const_iterator anIter = aValues.begin();
353 for(vtkIdType aVtkId = 0; anIter != aValues.end(); anIter++,aVtkId++){
354 const Length2D::Value& aValue = *anIter;
356 myVisualObj->GetNodeVTKId(aValue.myPntId[0]),
357 myVisualObj->GetNodeVTKId(aValue.myPntId[1])
359 if(aNode[0] >= 0 && aNode[1] >= 0){
360 anIdList->SetId( 0, aNode[0] );
361 anIdList->SetId( 1, aNode[1] );
362 aConnectivity->InsertNextCell( anIdList );
363 aCellTypesArray->InsertNextValue( VTK_LINE );
364 aScalars->SetValue(aVtkId,aValue.myLength);
368 vtkIdTypeArray* aCellLocationsArray = vtkIdTypeArray::New();
369 aCellLocationsArray->SetNumberOfComponents( 1 );
370 aCellLocationsArray->SetNumberOfTuples( aNbCells );
372 aConnectivity->InitTraversal();
373 for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ )
374 aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) );
376 aDataSet->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity );
377 SetUnstructuredGrid(aDataSet);
379 aDataSet->GetCellData()->SetScalars(aScalars);
382 theLookupTable->SetRange(aScalars->GetRange());
383 theLookupTable->Build();
385 myMergeFilter->SetScalars(aDataSet);
388 else if (MultiConnection2D* aMultiConnection2D = dynamic_cast<MultiConnection2D*>(theFunctor.get())){
389 SMESH::Controls::MultiConnection2D::MValues aValues;
391 aMultiConnection2D->GetValues(aValues);
392 vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New();
393 vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid();
394 aDataSet->SetPoints(aGrid->GetPoints());
396 vtkIdType aNbCells = aValues.size();
397 vtkDoubleArray *aScalars = vtkDoubleArray::New();
398 aScalars->SetNumberOfComponents(1);
399 aScalars->SetNumberOfTuples(aNbCells);
401 vtkIdType aCellsSize = 3*aNbCells;
402 vtkCellArray* aConnectivity = vtkCellArray::New();
403 aConnectivity->Allocate( aCellsSize, 0 );
405 vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New();
406 aCellTypesArray->SetNumberOfComponents( 1 );
407 aCellTypesArray->Allocate( aNbCells * aCellTypesArray->GetNumberOfComponents() );
409 vtkIdList *anIdList = vtkIdList::New();
410 anIdList->SetNumberOfIds(2);
412 MultiConnection2D::MValues::const_iterator anIter = aValues.begin();
413 for(vtkIdType aVtkId = 0; anIter != aValues.end(); anIter++,aVtkId++){
414 const MultiConnection2D::Value& aValue = (*anIter).first;
416 myVisualObj->GetNodeVTKId(aValue.myPntId[0]),
417 myVisualObj->GetNodeVTKId(aValue.myPntId[1])
419 if(aNode[0] >= 0 && aNode[1] >= 0){
420 anIdList->SetId( 0, aNode[0] );
421 anIdList->SetId( 1, aNode[1] );
422 aConnectivity->InsertNextCell( anIdList );
423 aCellTypesArray->InsertNextValue( VTK_LINE );
424 aScalars->SetValue(aVtkId,(*anIter).second);
428 vtkIdTypeArray* aCellLocationsArray = vtkIdTypeArray::New();
429 aCellLocationsArray->SetNumberOfComponents( 1 );
430 aCellLocationsArray->SetNumberOfTuples( aNbCells );
432 aConnectivity->InitTraversal();
433 for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ )
434 aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) );
436 aDataSet->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity );
437 SetUnstructuredGrid(aDataSet);
439 aDataSet->GetCellData()->SetScalars(aScalars);
442 theLookupTable->SetRange(aScalars->GetRange());
443 theLookupTable->Build();
445 myMergeFilter->SetScalars(aDataSet);
449 GetMapper()->SetScalarVisibility(anIsInitialized);
450 theScalarBarActor->SetVisibility(anIsInitialized);
455 ::SetExtControlMode(SMESH::Controls::FunctorPtr theFunctor)
457 myExtractUnstructuredGrid->ClearRegisteredCells();
458 myExtractUnstructuredGrid->ClearRegisteredCellsWithType();
459 myExtractUnstructuredGrid->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::ePassAll);
460 myVisualObj->UpdateFunctor(theFunctor);
462 using namespace SMESH::Controls;
463 if(FreeBorders* aFreeBorders = dynamic_cast<FreeBorders*>(theFunctor.get())){
464 myExtractUnstructuredGrid->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding);
465 vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid();
466 vtkIdType aNbCells = aGrid->GetNumberOfCells();
467 for( vtkIdType i = 0; i < aNbCells; i++ ){
468 vtkIdType anObjId = myVisualObj->GetElemObjId(i);
469 if(aFreeBorders->IsSatisfy(anObjId))
470 myExtractUnstructuredGrid->RegisterCell(i);
472 if(!myExtractUnstructuredGrid->IsCellsRegistered())
473 myExtractUnstructuredGrid->RegisterCell(-1);
474 SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid());
475 }else if(FreeEdges* aFreeEdges = dynamic_cast<FreeEdges*>(theFunctor.get())){
476 SMESH::Controls::FreeEdges::TBorders aBorders;
477 aFreeEdges->GetBoreders(aBorders);
478 vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New();
479 vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid();
480 aDataSet->SetPoints(aGrid->GetPoints());
482 vtkIdType aNbCells = aBorders.size();
483 vtkIdType aCellsSize = 3*aNbCells;
484 vtkCellArray* aConnectivity = vtkCellArray::New();
485 aConnectivity->Allocate( aCellsSize, 0 );
487 vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New();
488 aCellTypesArray->SetNumberOfComponents( 1 );
489 aCellTypesArray->Allocate( aNbCells * aCellTypesArray->GetNumberOfComponents() );
491 vtkIdList *anIdList = vtkIdList::New();
492 anIdList->SetNumberOfIds(2);
494 FreeEdges::TBorders::const_iterator anIter = aBorders.begin();
495 for(; anIter != aBorders.end(); anIter++){
496 const FreeEdges::Border& aBorder = *anIter;
498 myVisualObj->GetNodeVTKId(aBorder.myPntId[0]),
499 myVisualObj->GetNodeVTKId(aBorder.myPntId[1])
501 //cout<<"aNode = "<<aBorder.myPntId[0]<<"; "<<aBorder.myPntId[1]<<endl;
502 if(aNode[0] >= 0 && aNode[1] >= 0){
503 anIdList->SetId( 0, aNode[0] );
504 anIdList->SetId( 1, aNode[1] );
505 aConnectivity->InsertNextCell( anIdList );
506 aCellTypesArray->InsertNextValue( VTK_LINE );
510 vtkIdTypeArray* aCellLocationsArray = vtkIdTypeArray::New();
511 aCellLocationsArray->SetNumberOfComponents( 1 );
512 aCellLocationsArray->SetNumberOfTuples( aNbCells );
514 aConnectivity->InitTraversal();
515 for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ )
516 aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) );
518 aDataSet->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity );
520 SetUnstructuredGrid(aDataSet);
532 unsigned long mTime = this->Superclass::GetMTime();
533 mTime = max(mTime,myExtractGeometry->GetMTime());
534 mTime = max(mTime,myExtractUnstructuredGrid->GetMTime());
535 mTime = max(mTime,myMergeFilter->GetMTime());
536 mTime = max(mTime,myGeomFilter->GetMTime());
537 mTime = max(mTime,myTransformFilter->GetMTime());
544 ::SetTransform(VTKViewer_Transform* theTransform)
546 myTransformFilter->SetTransform(theTransform);
554 if ( !myIsShrinkable ) return;
555 if ( vtkDataSet* aDataSet = myPassFilter[ 0 ]->GetOutput() )
557 myShrinkFilter->SetInput( aDataSet );
558 myPassFilter[ 1 ]->SetInput( myShrinkFilter->GetOutput() );
567 if ( !myIsShrunk ) return;
568 if ( vtkDataSet* aDataSet = myPassFilter[ 0 ]->GetOutput() )
570 myPassFilter[ 1 ]->SetInput( aDataSet );
571 myPassFilter[ 1 ]->Modified();
580 ::SetRepresentation(EReperesent theMode)
584 myGeomFilter->SetInside(true);
585 myGeomFilter->SetWireframeMode(false);
586 GetProperty()->SetRepresentation(0);
589 myGeomFilter->SetInside(false);
590 myGeomFilter->SetWireframeMode(true);
591 GetProperty()->SetRepresentation(theMode);
594 myGeomFilter->SetInside(true);
595 myGeomFilter->SetWireframeMode(true);
596 GetProperty()->SetRepresentation(1);
599 myGeomFilter->SetInside(false);
600 myGeomFilter->SetWireframeMode(false);
601 GetProperty()->SetRepresentation(theMode);
603 myRepresentation = theMode;
604 GetProperty()->Modified();
605 myMapper->Modified();
612 ::SetVisibility(int theMode)
614 if(!myExtractUnstructuredGrid->GetInput() ||
615 GetUnstructuredGrid()->GetNumberOfCells())
617 vtkLODActor::SetVisibility(theMode);
619 vtkLODActor::SetVisibility(false);
628 if(!GetUnstructuredGrid()->GetNumberOfCells()){
629 vtkLODActor::SetVisibility(false);
631 return vtkLODActor::GetVisibility();
637 ::GetNodeObjId(int theVtkID)
639 vtkIdType anID = theVtkID;
641 if(IsImplicitFunctionUsed())
642 anID = myExtractGeometry->GetNodeObjId(theVtkID);
644 vtkIdType aRetID = myVisualObj->GetNodeObjId(anID);
645 if(MYDEBUG) MESSAGE("GetNodeObjId - theVtkID = "<<theVtkID<<"; anID = "<<anID<<"; aRetID = "<<aRetID);
649 vtkFloatingPointType*
651 ::GetNodeCoord(int theObjID)
653 vtkDataSet* aDataSet = myMergeFilter->GetOutput();
654 vtkIdType anID = myVisualObj->GetNodeVTKId(theObjID);
655 vtkFloatingPointType* aCoord = aDataSet->GetPoint(anID);
656 if(MYDEBUG) MESSAGE("GetNodeCoord - theObjID = "<<theObjID<<"; anID = "<<anID);
663 ::GetElemObjId(int theVtkID)
665 vtkIdType anId = myGeomFilter->GetElemObjId(theVtkID);
669 vtkIdType anId2 = anId;
670 if(IsImplicitFunctionUsed())
671 anId2 = myExtractGeometry->GetElemObjId(anId);
675 vtkIdType anId3 = myExtractUnstructuredGrid->GetInputId(anId2);
679 vtkIdType aRetID = myVisualObj->GetElemObjId(anId3);
681 MESSAGE("GetElemObjId - theVtkID = "<<theVtkID<<"; anId2 = "<<anId2<<"; anId3 = "<<anId3<<"; aRetID = "<<aRetID);
687 ::GetElemCell(int theObjID)
689 vtkDataSet* aDataSet = myVisualObj->GetUnstructuredGrid();
690 vtkIdType aGridID = myVisualObj->GetElemVTKId(theObjID);
691 vtkCell* aCell = aDataSet->GetCell(aGridID);
693 MESSAGE("GetElemCell - theObjID = "<<theObjID<<"; aGridID = "<<aGridID);
702 return myShrinkFilter->GetShrinkFactor();
707 ::SetShrinkFactor(vtkFloatingPointType theValue)
709 theValue = theValue > 0.1? theValue: 0.8;
710 myShrinkFilter->SetShrinkFactor(theValue);
717 ::SetHighlited(bool theIsHighlited)
719 if ( myIsHighlited == theIsHighlited )
721 myIsHighlited = theIsHighlited;
727 ::Render(vtkRenderer *ren, vtkMapper* m)
729 int aResolveCoincidentTopology = vtkMapper::GetResolveCoincidentTopology();
730 vtkFloatingPointType aStoredFactor, aStoredUnit;
731 vtkMapper::GetResolveCoincidentTopologyPolygonOffsetParameters(aStoredFactor,aStoredUnit);
733 vtkMapper::SetResolveCoincidentTopologyToPolygonOffset();
734 vtkFloatingPointType aFactor = myPolygonOffsetFactor, aUnits = myPolygonOffsetUnits;
736 static vtkFloatingPointType EPS = .01;
739 vtkMapper::SetResolveCoincidentTopologyPolygonOffsetParameters(aFactor,aUnits);
740 vtkLODActor::Render(ren,m);
742 vtkMapper::SetResolveCoincidentTopologyPolygonOffsetParameters(aStoredFactor,aStoredUnit);
743 vtkMapper::SetResolveCoincidentTopology(aResolveCoincidentTopology);
749 ::SetPolygonOffsetParameters(vtkFloatingPointType factor,
750 vtkFloatingPointType units)
752 myPolygonOffsetFactor = factor;
753 myPolygonOffsetUnits = units;