Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 37 additions & 13 deletions Filters/Geometry/vtkGeometryFilter.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
#include "vtkStructuredData.h"
#include "vtkStructuredGrid.h"
#include "vtkTetra.h"
#include "vtkTypeInt32Array.h" // fvtk: width-relaxed int32 OriginalPointIds storage
#include "vtkUniformGrid.h"
#include "vtkUnsignedCharArray.h"
#include "vtkUnstructuredGrid.h"
Expand Down Expand Up @@ -2808,32 +2809,55 @@ struct CharacterizeGrid
};

//------------------------------------------------------------------------------
// Threaded creation to generate array of originating point ids.
template <typename TInputIdType>
void PassPointIds(const char* name, vtkIdType numInputPts, vtkIdType numOutputPts,
TInputIdType* ptMap, vtkPointData* outPD)
// Threaded populate of the originating-point-id array (templated on the output
// container's value type so the same scatter drives int32 or int64 storage).
template <typename TOutId, typename TInputIdType>
void PassPointIdsFill(TOutId* origIds, vtkIdType numInputPts, TInputIdType* ptMap)
{
vtkNew<vtkIdTypeArray> origPtIds;
origPtIds->SetName(name);
origPtIds->SetNumberOfComponents(1);
origPtIds->SetNumberOfTuples(numOutputPts);
outPD->AddArray(origPtIds);
vtkIdType* origIds = origPtIds->GetPointer(0);

// Now threaded populate the array
vtkSMPTools::For(0, numInputPts,
[&origIds, &ptMap](vtkIdType ptId, vtkIdType endPtId)
{
for (; ptId < endPtId; ++ptId)
{
if (ptMap[ptId] >= 0)
{
origIds[ptMap[ptId]] = ptId;
origIds[ptMap[ptId]] = static_cast<TOutId>(ptId);
}
}
});
}

//------------------------------------------------------------------------------
// Threaded creation to generate array of originating point ids.
template <typename TInputIdType>
void PassPointIds(const char* name, vtkIdType numInputPts, vtkIdType numOutputPts,
TInputIdType* ptMap, vtkPointData* outPD)
{
// fvtk: width-relaxed storage. The values are input point ids (sacred); the
// CONTAINER is int32 when every id fits in 0x7FFFFFFF, else int64. Halves the
// array footprint on large extracted surfaces. The bitexact gate width-
// normalizes integer arrays, and the render hardware-selection path reads this
// passthrough array width-agnostically (vtkOpenGL*PolyDataMapper).
if (numInputPts <= static_cast<vtkIdType>(0x7FFFFFFF))
{
vtkNew<vtkTypeInt32Array> origPtIds;
origPtIds->SetName(name);
origPtIds->SetNumberOfComponents(1);
origPtIds->SetNumberOfTuples(numOutputPts);
outPD->AddArray(origPtIds);
PassPointIdsFill(origPtIds->GetPointer(0), numInputPts, ptMap);
}
else
{
vtkNew<vtkIdTypeArray> origPtIds;
origPtIds->SetName(name);
origPtIds->SetNumberOfComponents(1);
origPtIds->SetNumberOfTuples(numOutputPts);
outPD->AddArray(origPtIds);
PassPointIdsFill(origPtIds->GetPointer(0), numInputPts, ptMap);
}
}

//------------------------------------------------------------------------------
// Threaded compositing of originating cell ids.
template <typename TInputIdType, typename TOutputIdType>
Expand Down
30 changes: 18 additions & 12 deletions Rendering/OpenGL2/vtkOpenGLBatchedPolyDataMapper.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -489,8 +489,10 @@ void vtkOpenGLBatchedPolyDataMapper::ProcessCompositePixelBuffers(vtkHardwareSel
// do we need to do anything to the point id data?
if (currPass == vtkHardwareSelector::POINT_ID_LOW24)
{
vtkIdTypeArray* pointArrayId = this->PointIdArrayName
? vtkArrayDownCast<vtkIdTypeArray>(pd->GetArray(this->PointIdArrayName))
// fvtk: width-agnostic id read (int32-or-int64 passthrough array); see
// vtkOpenGLPolyDataMapper for the bit-exactness argument.
vtkDataArray* pointArrayId = this->PointIdArrayName
? vtkDataArray::SafeDownCast(pd->GetArray(this->PointIdArrayName))
: nullptr;

// do we need to do anything to the point id data?
Expand Down Expand Up @@ -521,7 +523,7 @@ void vtkOpenGLBatchedPolyDataMapper::ProcessCompositePixelBuffers(vtkHardwareSel
vtkIdType outval = inval;
if (pointArrayId && static_cast<vtkIdType>(inval) <= pointArrayId->GetMaxId())
{
outval = pointArrayId->GetValue(inval);
outval = static_cast<vtkIdType>(pointArrayId->GetComponent(inval, 0));
}
plowdata[pos] = outval & 0xff;
plowdata[pos + 1] = (outval & 0xff00) >> 8;
Expand All @@ -533,8 +535,10 @@ void vtkOpenGLBatchedPolyDataMapper::ProcessCompositePixelBuffers(vtkHardwareSel

if (currPass == vtkHardwareSelector::POINT_ID_HIGH24)
{
vtkIdTypeArray* pointArrayId = this->PointIdArrayName
? vtkArrayDownCast<vtkIdTypeArray>(pd->GetArray(this->PointIdArrayName))
// fvtk: width-agnostic id read (int32-or-int64 passthrough array); see
// vtkOpenGLPolyDataMapper for the bit-exactness argument.
vtkDataArray* pointArrayId = this->PointIdArrayName
? vtkDataArray::SafeDownCast(pd->GetArray(this->PointIdArrayName))
: nullptr;

// do we need to do anything to the point id data?
Expand All @@ -557,7 +561,7 @@ void vtkOpenGLBatchedPolyDataMapper::ProcessCompositePixelBuffers(vtkHardwareSel
vtkIdType outval = inval;
if (pointArrayId)
{
outval = pointArrayId->GetValue(inval);
outval = static_cast<vtkIdType>(pointArrayId->GetComponent(inval, 0));
}
phighdata[pos] = (outval & 0xff000000) >> 24;
phighdata[pos + 1] = (outval & 0xff00000000) >> 32;
Expand Down Expand Up @@ -606,8 +610,9 @@ void vtkOpenGLBatchedPolyDataMapper::ProcessCompositePixelBuffers(vtkHardwareSel

if (currPass == vtkHardwareSelector::CELL_ID_LOW24)
{
vtkIdTypeArray* cellArrayId = this->CellIdArrayName
? vtkArrayDownCast<vtkIdTypeArray>(cd->GetArray(this->CellIdArrayName))
// fvtk: width-agnostic id read (see point-id note above).
vtkDataArray* cellArrayId = this->CellIdArrayName
? vtkDataArray::SafeDownCast(cd->GetArray(this->CellIdArrayName))
: nullptr;
unsigned char* clowdata = sel->GetPixelBuffer(vtkHardwareSelector::CELL_ID_LOW24);
bool hasHighCellIds = sel->HasHighCellIds();
Expand Down Expand Up @@ -639,7 +644,7 @@ void vtkOpenGLBatchedPolyDataMapper::ProcessCompositePixelBuffers(vtkHardwareSel
glBatchElement->CellCellMap->ConvertOpenGLCellIdToVTKCellId(pointPicking, inval);
if (cellArrayId && outval <= cellArrayId->GetMaxId())
{
outval = cellArrayId->GetValue(outval);
outval = static_cast<vtkIdType>(cellArrayId->GetComponent(outval, 0));
}
clowdata[pos] = outval & 0xff;
clowdata[pos + 1] = (outval & 0xff00) >> 8;
Expand All @@ -651,8 +656,9 @@ void vtkOpenGLBatchedPolyDataMapper::ProcessCompositePixelBuffers(vtkHardwareSel

if (currPass == vtkHardwareSelector::CELL_ID_HIGH24)
{
vtkIdTypeArray* cellArrayId = this->CellIdArrayName
? vtkArrayDownCast<vtkIdTypeArray>(cd->GetArray(this->CellIdArrayName))
// fvtk: width-agnostic id read (see point-id note above).
vtkDataArray* cellArrayId = this->CellIdArrayName
? vtkDataArray::SafeDownCast(cd->GetArray(this->CellIdArrayName))
: nullptr;
unsigned char* chighdata = sel->GetPixelBuffer(vtkHardwareSelector::CELL_ID_HIGH24);

Expand All @@ -675,7 +681,7 @@ void vtkOpenGLBatchedPolyDataMapper::ProcessCompositePixelBuffers(vtkHardwareSel
glBatchElement->CellCellMap->ConvertOpenGLCellIdToVTKCellId(pointPicking, inval);
if (cellArrayId)
{
outval = cellArrayId->GetValue(outval);
outval = static_cast<vtkIdType>(cellArrayId->GetComponent(outval, 0));
}
chighdata[pos] = (outval & 0xff000000) >> 24;
chighdata[pos + 1] = (outval & 0xff00000000) >> 32;
Expand Down
30 changes: 18 additions & 12 deletions Rendering/OpenGL2/vtkOpenGLLowMemoryBatchedPolyDataMapper.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -514,8 +514,10 @@ void vtkOpenGLLowMemoryBatchedPolyDataMapper::ProcessCompositePixelBuffers(vtkHa
// do we need to do anything to the point id data?
if (currPass == vtkHardwareSelector::POINT_ID_LOW24)
{
vtkIdTypeArray* pointArrayId = this->PointIdArrayName
? vtkArrayDownCast<vtkIdTypeArray>(pd->GetArray(this->PointIdArrayName))
// fvtk: width-agnostic id read (int32-or-int64 passthrough array); see
// vtkOpenGLPolyDataMapper for the bit-exactness argument.
vtkDataArray* pointArrayId = this->PointIdArrayName
? vtkDataArray::SafeDownCast(pd->GetArray(this->PointIdArrayName))
: nullptr;

// do we need to do anything to the point id data?
Expand Down Expand Up @@ -545,7 +547,7 @@ void vtkOpenGLLowMemoryBatchedPolyDataMapper::ProcessCompositePixelBuffers(vtkHa
vtkIdType outval = inval;
if (pointArrayId && static_cast<vtkIdType>(inval) <= pointArrayId->GetMaxId())
{
outval = pointArrayId->GetValue(inval);
outval = static_cast<vtkIdType>(pointArrayId->GetComponent(inval, 0));
}
plowdata[pos] = outval & 0xff;
plowdata[pos + 1] = (outval & 0xff00) >> 8;
Expand All @@ -557,8 +559,10 @@ void vtkOpenGLLowMemoryBatchedPolyDataMapper::ProcessCompositePixelBuffers(vtkHa

if (currPass == vtkHardwareSelector::POINT_ID_HIGH24)
{
vtkIdTypeArray* pointArrayId = this->PointIdArrayName
? vtkArrayDownCast<vtkIdTypeArray>(pd->GetArray(this->PointIdArrayName))
// fvtk: width-agnostic id read (int32-or-int64 passthrough array); see
// vtkOpenGLPolyDataMapper for the bit-exactness argument.
vtkDataArray* pointArrayId = this->PointIdArrayName
? vtkDataArray::SafeDownCast(pd->GetArray(this->PointIdArrayName))
: nullptr;

// do we need to do anything to the point id data?
Expand All @@ -580,7 +584,7 @@ void vtkOpenGLLowMemoryBatchedPolyDataMapper::ProcessCompositePixelBuffers(vtkHa
vtkIdType outval = inval;
if (pointArrayId)
{
outval = pointArrayId->GetValue(inval);
outval = static_cast<vtkIdType>(pointArrayId->GetComponent(inval, 0));
}
phighdata[pos] = (outval & 0xff000000) >> 24;
phighdata[pos + 1] = (outval & 0xff00000000) >> 32;
Expand Down Expand Up @@ -617,8 +621,9 @@ void vtkOpenGLLowMemoryBatchedPolyDataMapper::ProcessCompositePixelBuffers(vtkHa

if (currPass == vtkHardwareSelector::CELL_ID_LOW24)
{
vtkIdTypeArray* cellArrayId = this->CellIdArrayName
? vtkArrayDownCast<vtkIdTypeArray>(cd->GetArray(this->CellIdArrayName))
// fvtk: width-agnostic id read (see point-id note above).
vtkDataArray* cellArrayId = this->CellIdArrayName
? vtkDataArray::SafeDownCast(cd->GetArray(this->CellIdArrayName))
: nullptr;
unsigned char* clowdata = sel->GetPixelBuffer(vtkHardwareSelector::CELL_ID_LOW24);
bool hasHighCellIds = sel->HasHighCellIds();
Expand Down Expand Up @@ -647,7 +652,7 @@ void vtkOpenGLLowMemoryBatchedPolyDataMapper::ProcessCompositePixelBuffers(vtkHa
vtkIdType outval = inval;
if (cellArrayId && outval <= cellArrayId->GetMaxId())
{
outval = cellArrayId->GetValue(outval);
outval = static_cast<vtkIdType>(cellArrayId->GetComponent(outval, 0));
}
clowdata[pos] = outval & 0xff;
clowdata[pos + 1] = (outval & 0xff00) >> 8;
Expand All @@ -659,8 +664,9 @@ void vtkOpenGLLowMemoryBatchedPolyDataMapper::ProcessCompositePixelBuffers(vtkHa

if (currPass == vtkHardwareSelector::CELL_ID_HIGH24)
{
vtkIdTypeArray* cellArrayId = this->CellIdArrayName
? vtkArrayDownCast<vtkIdTypeArray>(cd->GetArray(this->CellIdArrayName))
// fvtk: width-agnostic id read (see point-id note above).
vtkDataArray* cellArrayId = this->CellIdArrayName
? vtkDataArray::SafeDownCast(cd->GetArray(this->CellIdArrayName))
: nullptr;
unsigned char* chighdata = sel->GetPixelBuffer(vtkHardwareSelector::CELL_ID_HIGH24);

Expand All @@ -680,7 +686,7 @@ void vtkOpenGLLowMemoryBatchedPolyDataMapper::ProcessCompositePixelBuffers(vtkHa
vtkIdType outval = inval;
if (cellArrayId)
{
outval = cellArrayId->GetValue(outval);
outval = static_cast<vtkIdType>(cellArrayId->GetComponent(outval, 0));
}
chighdata[pos] = (outval & 0xff000000) >> 24;
chighdata[pos + 1] = (outval & 0xff00000000) >> 32;
Expand Down
40 changes: 24 additions & 16 deletions Rendering/OpenGL2/vtkOpenGLLowMemoryPolyDataMapper.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -3268,8 +3268,10 @@ void vtkOpenGLLowMemoryPolyDataMapper::ProcessSelectorPixelBuffers(

if (currPass == vtkHardwareSelector::POINT_ID_LOW24)
{
vtkIdTypeArray* pointArrayId = this->PointIdArrayName
? vtkArrayDownCast<vtkIdTypeArray>(pd->GetArray(this->PointIdArrayName))
// fvtk: width-agnostic id read (int32-or-int64 passthrough array); see
// vtkOpenGLPolyDataMapper for the bit-exactness argument.
vtkDataArray* pointArrayId = this->PointIdArrayName
? vtkDataArray::SafeDownCast(pd->GetArray(this->PointIdArrayName))
: nullptr;

// do we need to do anything to the point id data?
Expand All @@ -3290,7 +3292,7 @@ void vtkOpenGLLowMemoryPolyDataMapper::ProcessSelectorPixelBuffers(
inval |= rawplowdata[pos + 1];
inval = inval << 8;
inval |= rawplowdata[pos];
vtkIdType outval = pointArrayId->GetValue(inval);
vtkIdType outval = static_cast<vtkIdType>(pointArrayId->GetComponent(inval, 0));
plowdata[pos] = outval & 0xff;
plowdata[pos + 1] = (outval & 0xff00) >> 8;
plowdata[pos + 2] = (outval & 0xff0000) >> 16;
Expand All @@ -3300,8 +3302,10 @@ void vtkOpenGLLowMemoryPolyDataMapper::ProcessSelectorPixelBuffers(

if (currPass == vtkHardwareSelector::POINT_ID_HIGH24)
{
vtkIdTypeArray* pointArrayId = this->PointIdArrayName
? vtkArrayDownCast<vtkIdTypeArray>(pd->GetArray(this->PointIdArrayName))
// fvtk: width-agnostic id read (int32-or-int64 passthrough array); see
// vtkOpenGLPolyDataMapper for the bit-exactness argument.
vtkDataArray* pointArrayId = this->PointIdArrayName
? vtkDataArray::SafeDownCast(pd->GetArray(this->PointIdArrayName))
: nullptr;

// do we need to do anything to the point id data?
Expand All @@ -3319,7 +3323,7 @@ void vtkOpenGLLowMemoryPolyDataMapper::ProcessSelectorPixelBuffers(
inval |= rawplowdata[pos + 1];
inval = inval << 8;
inval |= rawplowdata[pos];
vtkIdType outval = pointArrayId->GetValue(inval);
vtkIdType outval = static_cast<vtkIdType>(pointArrayId->GetComponent(inval, 0));
phighdata[pos] = (outval & 0xff000000) >> 24;
phighdata[pos + 1] = (outval & 0xff00000000) >> 32;
phighdata[pos + 2] = (outval & 0xff0000000000) >> 40;
Expand Down Expand Up @@ -3356,8 +3360,9 @@ void vtkOpenGLLowMemoryPolyDataMapper::ProcessSelectorPixelBuffers(
// process the cellid array?
if (currPass == vtkHardwareSelector::CELL_ID_LOW24)
{
vtkIdTypeArray* cellArrayId = this->CellIdArrayName
? vtkArrayDownCast<vtkIdTypeArray>(cd->GetArray(this->CellIdArrayName))
// fvtk: width-agnostic id read (see point-id note above).
vtkDataArray* cellArrayId = this->CellIdArrayName
? vtkDataArray::SafeDownCast(cd->GetArray(this->CellIdArrayName))
: nullptr;
unsigned char* clowdata = sel->GetPixelBuffer(vtkHardwareSelector::CELL_ID_LOW24);

Expand All @@ -3379,7 +3384,7 @@ void vtkOpenGLLowMemoryPolyDataMapper::ProcessSelectorPixelBuffers(
vtkIdType outval = inval;
if (cellArrayId)
{
outval = cellArrayId->GetValue(outval);
outval = static_cast<vtkIdType>(cellArrayId->GetComponent(outval, 0));
}
clowdata[pos] = outval & 0xff;
clowdata[pos + 1] = (outval & 0xff00) >> 8;
Expand All @@ -3390,8 +3395,9 @@ void vtkOpenGLLowMemoryPolyDataMapper::ProcessSelectorPixelBuffers(

if (currPass == vtkHardwareSelector::CELL_ID_HIGH24)
{
vtkIdTypeArray* cellArrayId = this->CellIdArrayName
? vtkArrayDownCast<vtkIdTypeArray>(cd->GetArray(this->CellIdArrayName))
// fvtk: width-agnostic id read (see point-id note above).
vtkDataArray* cellArrayId = this->CellIdArrayName
? vtkDataArray::SafeDownCast(cd->GetArray(this->CellIdArrayName))
: nullptr;
unsigned char* chighdata = sel->GetPixelBuffer(vtkHardwareSelector::CELL_ID_HIGH24);

Expand All @@ -3410,7 +3416,7 @@ void vtkOpenGLLowMemoryPolyDataMapper::ProcessSelectorPixelBuffers(
vtkIdType outval = inval;
if (cellArrayId)
{
outval = cellArrayId->GetValue(outval);
outval = static_cast<vtkIdType>(cellArrayId->GetComponent(outval, 0));
}
chighdata[pos] = (outval & 0xff000000) >> 24;
chighdata[pos + 1] = (outval & 0xff00000000) >> 32;
Expand All @@ -3434,8 +3440,9 @@ void vtkOpenGLLowMemoryPolyDataMapper::UpdateMaximumPointCellIds(vtkRenderer* re
vtkIdType maxPointId = mesh->GetPoints()->GetNumberOfPoints() - 1;
if (mesh && mesh->GetPointData())
{
vtkIdTypeArray* pointArrayId = this->PointIdArrayName
? vtkArrayDownCast<vtkIdTypeArray>(mesh->GetPointData()->GetArray(this->PointIdArrayName))
// fvtk: width-agnostic id read (GetRange works on any vtkDataArray).
vtkDataArray* pointArrayId = this->PointIdArrayName
? vtkDataArray::SafeDownCast(mesh->GetPointData()->GetArray(this->PointIdArrayName))
: nullptr;
if (pointArrayId)
{
Expand All @@ -3451,8 +3458,9 @@ void vtkOpenGLLowMemoryPolyDataMapper::UpdateMaximumPointCellIds(vtkRenderer* re
vtkIdType maxCellId = mesh->GetNumberOfCells() - 1;
if (mesh && mesh->GetCellData())
{
vtkIdTypeArray* cellArrayId = this->CellIdArrayName
? vtkArrayDownCast<vtkIdTypeArray>(mesh->GetCellData()->GetArray(this->CellIdArrayName))
// fvtk: width-agnostic id read (GetRange works on any vtkDataArray).
vtkDataArray* cellArrayId = this->CellIdArrayName
? vtkDataArray::SafeDownCast(mesh->GetCellData()->GetArray(this->CellIdArrayName))
: nullptr;
if (cellArrayId)
{
Expand Down
Loading
Loading