Volume render using ExternalVTKWidget

Hello,

I am trying to modify the TestGLUTRenderWindow example in order to render voume data using glut. I’m not getting anything on screen. I wonder if someone could check the code and see what I might be missing. Thanks!

This is my display function:

void display()
{
 
  if (!initialized)
  {
	  myCamera = new Camera(glm::vec3(0, 0, -4), glm::vec3(0, 0, 1));
	  projectionMatrix = glm::perspective(glm::radians(45.f), 4.0f / 3.0f, 0.1f, 100.0f );
	 
      auto renWin = externalVTKWidget->GetRenderWindow();

      // since our example here is not setting up the `glViewport`, we don't want
      // the vtkExternalOpenGLRenderWindow to update its size based on the
      // glViewport hence we must disable automatic position and size.
       renWin->AutomaticWindowPositionAndResizeOff();

 
 	    vtkNew<vtkCallbackCommand> callback;
        callback->SetCallback(MakeCurrentCallback);
	    renWin->AddObserver(vtkCommand::WindowMakeCurrentEvent,
		callback);
        vtkNew<vtkPolyDataMapper> mapper;

        myRenderer = externalVTKWidget->AddRenderer();


   	 std::string filePath =std::string("D:\\VTK\\Rendering\\External\\Testing\\Cxx\\data\\FullHead.mhd");

	vtkSmartPointer<vtkFixedPointVolumeRayCastMapper> volumeMapper =
		vtkSmartPointer<vtkFixedPointVolumeRayCastMapper>::New();

	vtkSmartPointer<vtkMetaImageReader> metaReader =
		vtkSmartPointer<vtkMetaImageReader>::New();
	metaReader->SetFileName(filePath.c_str());
	metaReader->Update();

	vtkSmartPointer<vtkAlgorithm> reader =
		vtkSmartPointer<vtkAlgorithm>::New();
	vtkSmartPointer<vtkImageData> input =
		vtkSmartPointer<vtkImageData>::New();

	input = metaReader->GetOutput();
	reader = metaReader;

	vtkSmartPointer<vtkTransform> transform =
		vtkSmartPointer<vtkTransform>::New();
	transform->Scale(1,1, 1);

	volumeMapper->SetInputConnection(reader->GetOutputPort());

	vtkSmartPointer<vtkVolumeProperty> volumeProperty =
		vtkSmartPointer<vtkVolumeProperty>::New();
	//volumeProperty->ShadeOff();
	volumeProperty->SetInterpolationTypeToLinear();
	volumeProperty->SetIndependentComponents(true);

	vtkSmartPointer<vtkPiecewiseFunction> opacityFun =
		vtkSmartPointer<vtkPiecewiseFunction>::New();
	volumeProperty->SetScalarOpacity(opacityFun); // composite first.

	vtkSmartPointer<vtkColorTransferFunction> colorFun =
		vtkSmartPointer<vtkColorTransferFunction>::New();
	volumeProperty->SetColor(colorFun);


    volume = vtkSmartPointer<vtkVolume>::New();
	volume->SetMapper(volumeMapper);
	volume->SetProperty(volumeProperty);
	volume->SetUserTransform(transform);
	

	colorFun->AddRGBSegment(0.0, 1.0, 1.0, 1.0, 255.0, 1.0, 1.0, 1.0);
	opacityFun->AddSegment(opacityLevel - 0.5*opacityWindow, 0.0,
		opacityLevel + 0.5*opacityWindow, 1.0);
	volumeMapper->SetBlendModeToMaximumIntensity();


	myRenderer->AddVolume(volume);
    myRenderer->ResetCamera();

    initialized = true;
  }

  // Enable depth testing. Demonstrates OpenGL context being managed by external
  // application i.e. GLUT in this case.
  glEnable(GL_DEPTH_TEST);

  // Buffers being managed by external application i.e. GLUT in this case.
  glClearColor(1.0f, 0.0f, 0.0f, 1.0f); // Set background color to black and opaque
  glClearDepth(1.0f);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear the color buffer

  vtkExternalOpenGLCamera* camera = (vtkExternalOpenGLCamera *)myRenderer->GetActiveCamera();

  double view[16];
  for (int i = 0; i < 16; i++) {
	  //view[i] = glm::value_ptr(viewMatrix)[i];
	  glm::mat4 mat = myCamera->GetView();
	  view[i] = glm::value_ptr(mat)[i];
  }


  camera->SetViewTransformMatrix(view);


  double proj[16];
  for (int i = 0; i < 16; i++) {
	  proj[i] = glm::value_ptr(projectionMatrix)[i];
  }
  camera->SetProjectionTransformMatrix(proj);

  glFlush();  // Render now

  vtkLogScopeF(INFO, "do-vtk-render");
  externalVTKWidget->GetRenderWindow()->Render();
  glutSwapBuffers();
}


void test()
{
  vtkExternalOpenGLCamera* camera = (vtkExternalOpenGLCamera *)myRenderer->GetActiveCamera();

  double view[16];
  for (int i = 0; i < 16; i++) {
	  //view[i] = glm::value_ptr(viewMatrix)[i];
	  glm::mat4 mat = myCamera->GetView();
	  view[i] = glm::value_ptr(mat)[i];
  }


  camera->SetViewTransformMatrix(view);
  glm::mat4 userM = glm::mat4(1.0f);
  glm::mat4 translate = glm::translate(glm::vec3(0, 0, 0));
  glm::mat4 rotate = glm::translate(glm::vec3(0, 0, 0));
  glm::mat4 scale = glm::translate(glm::vec3(1, 1, 1));


  userM = translate * rotate * scale;

  double model[16];
  for (int i = 0; i < 16; i++) {
	  //view[i] = glm::value_ptr(viewMatrix)[i];
	  model[i] = glm::value_ptr(userM)[i];
  }
  
  vtkSmartPointer<vtkMatrix4x4> sm = vtkSmartPointer<vtkMatrix4x4>::New();
  sm->DeepCopy(model);
  sm->Transpose();
  volume->SetUserMatrix(sm);

  double proj[16];
  for (int i = 0; i < 16; i++) {
	  proj[i] = glm::value_ptr(projectionMatrix)[i];
  }

 externalVTKWidget->GetRenderWindow()->Render();
 camera->SetProjectionTransformMatrix(proj);
 }