How to specify colors for leaf nodes of a nested vtkMultiBlockDataSet

Hi vtk developers,

I have a use case that my data is a composite nested vtkMultiBlockDatasets and I want to specify colors for its subblocks.

Ex.
Root node: 1 vtkMultiblockDataset(node 0)
First level node: 1 vtkMultiblockDataset(node 1)
Second level nodes; 9 vtkPolyDatas(node 2~ node 10)

The input for the mapper is node 0, and I want to use the vtkCompositeDatDisplayAttributes to set colors for node 2 ~10. However, I cannot find a clear way to specify colors for leaf nodes of a nested vtkMultiBlockDataSet without flatting all subblocks.

Any suggestions and ideas?

Thanks in advance!

Since new users are not allowed to upload a file, I copied my simple example here:

#include "vtkRenderWindow.h"
#include "vtkRenderer.h"
#include "vtkSphereSource.h"
#include "vtkCubeSource.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkSmartPointer.h"
#include "vtkMultiBlockDataSet.h"
#include "vtkCompositePolyDataMapper2.h"
#include "vtkCompositeDataDisplayAttributes.h"
#include "vtkRegressionTestImage.h"
#include "vtkLookupTable.h"
#include "vtkActor.h"
#include "vtkMath.h"
#include "vtkPointData.h"
#include "vtkPolyData.h"
#include "vtkDataArray.h"

#include <set>

static vtkSmartPointer<vtkMultiBlockDataSet> vtkCreateData()
{
  auto data = vtkSmartPointer<vtkMultiBlockDataSet>::New();
  data->SetNumberOfBlocks(3 * 3 * 2);
  int blk = 0;
  for (int i = 0; i < 3; ++i)
  {
    for (int j = 0; j < 3; ++j)
    {
      vtkNew<vtkSphereSource> ssrc;
      ssrc->SetRadius(0.4);
      ssrc->SetCenter(i, j, 0.0);
      ssrc->Update();

      vtkNew<vtkCubeSource> csrc;
      csrc->SetBounds(i - 0.4, i + 0.4, j - 0.4, j + 0.4, 0.6, 1.4);
      csrc->Update();

      vtkNew<vtkPolyData> sphere;
      vtkNew<vtkPolyData> cube;

      sphere->DeepCopy(ssrc->GetOutputDataObject(0));
      cube->DeepCopy(csrc->GetOutputDataObject(0));
      data->SetBlock(blk++, sphere);
      data->SetBlock(blk++, cube);
    }
  }
  return data;
}

int main(int argc, char* argv[])
{
  // Standard rendering classes
  vtkSmartPointer< vtkRenderer > renderer = vtkSmartPointer< vtkRenderer >::New();
  vtkSmartPointer< vtkRenderWindow > renWin = vtkSmartPointer< vtkRenderWindow >::New();
  renWin->SetMultiSamples(0);
  renWin->SetAlphaBitPlanes(1);
  renWin->AddRenderer(renderer);
  vtkSmartPointer< vtkRenderWindowInteractor > iren =
      vtkSmartPointer< vtkRenderWindowInteractor >::New();
  iren->SetRenderWindow(renWin);

  auto subMbds = vtkCreateData();
  vtkNew<vtkMultiBlockDataSet> mbds;
  mbds->SetNumberOfBlocks(1);
  mbds->SetBlock(0, subMbds);

  vtkSmartPointer< vtkCompositePolyDataMapper2 > mapper =
      vtkSmartPointer< vtkCompositePolyDataMapper2 >::New();
  mapper->SetInputDataObject(mbds);

  vtkSmartPointer< vtkCompositeDataDisplayAttributes > attrs =
      vtkSmartPointer< vtkCompositeDataDisplayAttributes >::New();
  mapper->SetCompositeDataDisplayAttributes(attrs);

  /*******************/
  // How to specify colors?
  double rgb[3];
  vtkMath::HSVToRGB(0.8*1,
                    1.0,
                    1.0,
                    rgb+0, rgb+1, rgb+2);
  mapper->SetBlockColor(0, rgb);
  std::cout << "Number of Blocks in root mbds: " << mbds->GetNumberOfBlocks() << std::endl;
  /*******************/

  vtkSmartPointer< vtkActor > actor = vtkSmartPointer< vtkActor >::New();
  actor->SetMapper(mapper);
  renderer->AddActor(actor);

  // Standard testing code.
  renderer->SetBackground(0.5,0.5,0.5);
  renWin->SetSize(300,300);
  renWin->Render();

  int retVal = vtkRegressionTestImage( renWin );
  if ( 3 == vtkRegressionTester::DO_INTERACTOR)
  {
    iren->Start();
  }

  return !retVal;
}