How to import a transfer function exported from ParaView into VTK?

Dear all,

here is how I import a ParaView exported transfer function into VTK:

class transfer_function
{
public:
  explicit transfer_function  (const std::string& filepath)
  {
    std::ifstream   file_stream(filepath);
    vtkJson::Reader reader;
    vtkJson::Value  root;
    reader.parse(file_stream, root);

    std::vector<double> points    ;
    std::vector<double> rgb_points;
    for (auto& iteratee : root["Points"   ]) points    .push_back(iteratee.asFloat());
    for (auto& iteratee : root["RGBPoints"]) rgb_points.push_back(iteratee.asFloat());
    opacity_function->FillFromDataPointer(points    .size(), points    .data());
    color_function  ->FillFromDataPointer(rgb_points.size(), rgb_points.data());
    color_function  ->SetColorSpace      (root["ColorSpace"].asInt());
  }
  transfer_function           (const transfer_function&  that) = default;
  transfer_function           (      transfer_function&& temp) = default;
 ~transfer_function           ()                               = default;
  transfer_function& operator=(const transfer_function&  that) = default;
  transfer_function& operator=(      transfer_function&& temp) = default; 

  vtkSmartPointer<vtkPiecewiseFunction>     opacity_function = vtkSmartPointer<vtkPiecewiseFunction>    ::New();
  vtkSmartPointer<vtkColorTransferFunction> color_function   = vtkSmartPointer<vtkColorTransferFunction>::New();
};

I then load up an unstructured volume exported from ParaView and set its color and opacity transfer functions.

  ug_volume->GetProperty()->SetColor        (transfer_function.color_function  );
  ug_volume->GetProperty()->SetScalarOpacity(transfer_function.opacity_function);

Which makes the volume completely disappear. If I remove these two lines, the volume renders and is semi-transparent gray, meaning the default transfer function works.

Any ideas on what I’m doing wrong?

Answering myself for future people:

Read as:

  explicit transfer_function  (const std::string& filepath)
  {
    std::ifstream   file_stream(filepath);
    vtkJson::Reader reader;
    vtkJson::Value  root;
    reader.parse(file_stream, root);

    auto& opacity = root["Points"   ];
    auto& color   = root["RGBPoints"];

    for (auto i = 0; i < opacity.size(); i += 4)
      opacity_function->AddPoint(
        opacity[i    ].asFloat(), 
        opacity[i + 1].asFloat());
    for (auto i = 0; i < color.size(); i += 4)
      color_function->AddRGBPoint(
        color  [i    ].asFloat(), 
        color  [i + 1].asFloat(), 
        color  [i + 2].asFloat(), 
        color  [i + 3].asFloat());

    color_function->SetColorSpace(root["ColorSpace"].asInt());
  }