Program Listing for File vtkMRMLLayerDMLayerManager.h

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

#pragma once

#include "vtkSlicerLayerDMModuleMRMLDisplayableManagerExport.h"

#include "vtkMRMLLayerDMPipelineI.h"

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

// STL includes
#include <array>
#include <cstdint>
#include <map>
#include <set>
#include <vector>

class vtkMRMLLayerDMPipelineI;
class vtkRenderWindow;
class vtkRenderer;
class vtkCamera;

class VTK_SLICER_LAYERDM_MODULE_MRMLDISPLAYABLEMANAGER_EXPORT vtkMRMLLayerDMLayerManager : public vtkObject
{
public:
  using LayerKey = std::tuple<unsigned int, std::uintptr_t>;

  static vtkMRMLLayerDMLayerManager* New();
  vtkTypeMacro(vtkMRMLLayerDMLayerManager, vtkObject);

  void AddPipeline(vtkMRMLLayerDMPipelineI* pipeline);

  static LayerKey GetPipelineLayerKey(vtkMRMLLayerDMPipelineI* pipeline);

  int GetNumberOfDistinctLayers() const;
  int GetNumberOfManagedLayers() const;

  int GetNumberOfRenderers() const;

  void RemovePipeline(vtkMRMLLayerDMPipelineI* pipeline);

  void ResetCameraClippingRange() const;

  void SetRenderWindow(vtkRenderWindow* renderWindow);

  void SetDefaultCamera(const vtkSmartPointer<vtkCamera>& camera);

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

private:
  vtkRenderer* GetRendererMatchingKey(const LayerKey& key);
  vtkRenderer* GetDefaultRenderer() const;

  void AddMissingLayers();
  static std::array<double, 6> ComputeRenderersVisibleBounds(const std::set<vtkWeakPointer<vtkRenderer>>& renderers);
  bool ContainsLayerKey(const LayerKey& key);
  static std::uintptr_t GetCameraId(vtkCamera* camera);
  vtkCamera* GetCameraForLayer(const LayerKey& key, const std::set<vtkWeakPointer<vtkMRMLLayerDMPipelineI>>& pipelines) const;
  int GetKeyIndex(const LayerKey& key) const;
  void RemoveAllLayers();
  void RemoveAllPipelineRenderers();
  static void RemovePipelineRenderer(vtkMRMLLayerDMPipelineI* pipeline);
  void RemoveOutdatedLayers();
  void RemoveOutdatedPipelines();
  void RemoveRenderer(const vtkSmartPointer<vtkRenderer>& renderer);
  static void ResetRenderersCameraClippingRange(const std::set<vtkWeakPointer<vtkRenderer>>& renderers, const std::array<double, 6>& bounds);
  void SynchronizePipelineRenderers();
  void UpdateRenderWindowNumberOfLayers() const;
  void UpdateLayers();
  void UpdateRendererLayerOrdering() const;
  void UpdateRendererCamera();

  // Map of pipeline layers ordered by ascending <layer value, camera synchronization mode>
  std::map<LayerKey, std::set<vtkWeakPointer<vtkMRMLLayerDMPipelineI>>> m_pipelineLayers;

  // Placeholder empty pipeline with target layer = 0 and camera sync to layer 0 for default renderer
  vtkSmartPointer<vtkMRMLLayerDMPipelineI> m_emptyPipeline;

  // Pointer to the current render window
  vtkWeakPointer<vtkRenderWindow> m_renderWindow;

  // Pointer to the default camera
  vtkSmartPointer<vtkCamera> m_defaultCamera;

  // Renderers managed by the layer manager
  std::vector<vtkSmartPointer<vtkRenderer>> m_renderers;

  // Camera to renderer map
  std::map<vtkWeakPointer<vtkCamera>, std::set<vtkWeakPointer<vtkRenderer>>> m_cameraRendererMap;
};