Program Listing for File vtkMRMLLayerDMPipelineManager.h

Return to documentation for file (MRMLDM/vtkMRMLLayerDMPipelineManager.h)

#pragma once

#include "vtkSlicerLayerDMModuleMRMLDisplayableManagerExport.h"

// VTK includes
#include <vtkCommand.h>
#include <vtkObject.h>
#include <vtkSmartPointer.h>
#include <vtkWeakPointer.h>

// STL includes
#include <functional>
#include <map>

class vtkCamera;
class vtkMRMLAbstractViewNode;
class vtkMRMLInteractionEventData;
class vtkMRMLLayerDMCameraSynchronizer;
class vtkMRMLLayerDMInteractionLogic;
class vtkMRMLLayerDMLayerManager;
class vtkMRMLLayerDMNodeReferenceObserver;
class vtkMRMLLayerDMObjectEventObserver;
class vtkMRMLLayerDMPipelineCreatorI;
class vtkMRMLLayerDMPipelineFactory;
class vtkMRMLLayerDMPipelineI;
class vtkMRMLNode;
class vtkMRMLScene;
class vtkRenderWindow;
class vtkRenderer;

class VTK_SLICER_LAYERDM_MODULE_MRMLDISPLAYABLEMANAGER_EXPORT vtkMRMLLayerDMPipelineManager : public vtkObject
{
public:
  static vtkMRMLLayerDMPipelineManager* New();
  vtkTypeMacro(vtkMRMLLayerDMPipelineManager, vtkObject);

  bool AddNode(vtkMRMLNode* node);

  bool CanProcessInteractionEvent(vtkMRMLInteractionEventData* eventData, double& distance2) const;

  bool CreatePipelineForNode(vtkMRMLNode* displayNode);

  vtkCamera* GetDefaultCamera() const;

  void ClearDisplayableNodes();

  int GetMouseCursor() const;

  vtkSmartPointer<vtkMRMLLayerDMPipelineI> GetNodePipeline(vtkMRMLNode* node) const;

  int GetNumberOfPipelines() const;

  vtkMRMLLayerDMPipelineI* GetNthPipeline(int iPipeline) const;

  void LoseFocus() const;
  void LoseFocus(vtkMRMLInteractionEventData* eventData) const;

  bool ProcessInteractionEvent(vtkMRMLInteractionEventData* eventData) const;

  bool RemoveNode(vtkMRMLNode* node);
  bool RemovePipeline(vtkMRMLNode* displayNode);

  void RequestRender();

  void ResetCameraClippingRange() const;

  void SetFactory(const vtkSmartPointer<vtkMRMLLayerDMPipelineFactory>& factory);

  void SetRenderWindow(vtkRenderWindow* renderWindow);

  void SetRenderer(vtkRenderer* renderer) const;

  void SetRequestRender(const std::function<void()>& requestRender);

  void SetScene(vtkMRMLScene* scene);

  void SetViewNode(vtkMRMLAbstractViewNode* viewNode);

  void UpdateAllPipelines();

  void UpdateFromScene();

  bool BlockRequestRender(bool isBlocked);

protected:
  vtkMRMLLayerDMPipelineManager();
  ~vtkMRMLLayerDMPipelineManager() override = default;

private:
  void OnDefaultCameraModified();

  void UpdatePipeline(const vtkSmartPointer<vtkMRMLLayerDMPipelineI>& pipeline) const;

  void RemoveOutdatedPipelines();

  void AddMissingPipelines();

  vtkSmartPointer<vtkMRMLLayerDMPipelineFactory> m_factory;
  vtkSmartPointer<vtkMRMLLayerDMLayerManager> m_layerManager;
  vtkSmartPointer<vtkMRMLLayerDMCameraSynchronizer> m_cameraSync;
  vtkSmartPointer<vtkMRMLLayerDMInteractionLogic> m_interactionLogic;
  vtkSmartPointer<vtkMRMLLayerDMObjectEventObserver> m_eventObs;
  vtkSmartPointer<vtkCamera> m_defaultCamera;
  vtkSmartPointer<vtkMRMLLayerDMNodeReferenceObserver> m_nodeRefObs;

  vtkWeakPointer<vtkMRMLAbstractViewNode> m_viewNode;
  vtkWeakPointer<vtkMRMLScene> m_scene;
  vtkWeakPointer<vtkRenderWindow> m_renderWindow;

  std::map<vtkWeakPointer<vtkMRMLNode>, vtkSmartPointer<vtkMRMLLayerDMPipelineI>> m_pipelineMap;
  std::function<void()> m_requestRender;

  bool m_isRequestRenderBlocked{ false };
};