Files
ThirdParty-6/ParaView-5.0.1/ParaViewCore/ClientServerCore/Rendering/vtkPVDataDeliveryManager.h

208 lines
8.7 KiB
C++

/*=========================================================================
Program: ParaView
Module: $RCSfile$
Copyright (c) Kitware, Inc.
All rights reserved.
See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
// .NAME vtkPVDataDeliveryManager - manager for data-delivery.
// .SECTION Description
// vtkPVDataDeliveryManager manages geometry delivering for rendering. It is
// used by vtkPVRenderView to manage the delivery of geometry to the nodes where
// rendering is happening. This class helps us consolidate all the code for
// delivering different types of geometries to all the nodes involved as well we
// a managing idiosyncrasies like requiring delivering to all nodes,
// redistributing for ordered compositing, etc.
#ifndef vtkPVDataDeliveryManager_h
#define vtkPVDataDeliveryManager_h
#include "vtkPVClientServerCoreRenderingModule.h" //needed for exports
#include "vtkObject.h"
#include "vtkSmartPointer.h" // needed for iVar.
#include "vtkWeakPointer.h" // needed for iVar.
class vtkAlgorithmOutput;
class vtkDataObject;
class vtkExtentTranslator;
class vtkPKdTree;
class vtkPVDataRepresentation;
class vtkPVRenderView;
//BTX
#include <vector>
//ETX
class VTKPVCLIENTSERVERCORERENDERING_EXPORT vtkPVDataDeliveryManager : public vtkObject
{
public:
static vtkPVDataDeliveryManager* New();
vtkTypeMacro(vtkPVDataDeliveryManager, vtkObject);
void PrintSelf(ostream& os, vtkIndent indent);
// Description:
// Returned a hash number that can be used to verify that both client and
// server side are in synch representation wise for delivery.
int GetSynchronizationMagicNumber();
// Description:
// View uses these methods to register a representation with the storage. This
// makes it possible for representations to communicate with the storage
// directly using a self pointer, while enables views on different processes
// to communicate information about representations using their unique ids.
void RegisterRepresentation(vtkPVDataRepresentation *repr);
void UnRegisterRepresentation(vtkPVDataRepresentation*);
vtkPVDataRepresentation* GetRepresentation(unsigned int);
// Description:
// Representations (indirectly via vtkPVRenderView::SetPiece()) call this
// method to register the geometry type they are rendering. Every
// representation that requires delivering of any geometry must register with
// the vtkPVDataDeliveryManager and never manage the delivery on its own.
void SetPiece(vtkPVDataRepresentation* repr, vtkDataObject* data,
bool low_res, unsigned long trueSize=0);
void SetPiece(unsigned int repr_id, vtkDataObject* data, bool low_res);
// Description:
// Provides access to the producer port for the geometry of a registered
// representation. Representations use these methods (indirectly via
// vtkPVRenderView::GetPieceProducer() and GetPieceProducerLOD()) to obtain
// the geometry producer for the geometry to be rendered.
vtkAlgorithmOutput* GetProducer(vtkPVDataRepresentation*, bool low_res);
vtkAlgorithmOutput* GetProducer(unsigned int, bool low_res);
// Description:
// By default, this class only delivers geometries to nodes that are doing the
// rendering at a given stage. However, certain representations, such as
// data-label representation, or cube-axes representation, need to the
// geometry to be delivered to all nodes always. That can be done by using
// this method (via vtkPVRenderView::SetDeliverToAllProcesses()).
void SetDeliverToAllProcesses(vtkPVDataRepresentation*, bool flag, bool low_res);
// Description:
// By default, this class only delivers geometries to nodes that are doing the
// rendering at a given stage. However, certain representations, such as
// text-source representation, need to the geometry to be delivered to the
// client as well. That can be done by using this method (via
// vtkPVRenderView::SetDeliverToAllProcesses()). The different between
// SetDeliverToAllProcesses() and this is that the former gather-and-scatters
// the data on the server nodes, while the latter will optionally gather the data to
// deliver to the client and never scatter.
void SetDeliverToClientAndRenderingProcesses(
vtkPVDataRepresentation*, bool deliver_to_client,
bool gather_before_delivery, bool low_res);
// Description:
// Under certain cases, e.g. when remote rendering in parallel with
// translucent geometry, the geometry may need to be redistributed to ensure
// ordered compositing can be employed correctly. Marking geometry provided by
// a representation as redistributable makes it possible for this class to
// redistribute the geometry as needed. Only vtkPolyData, vtkUnstructuredGrid
// or a multi-block comprising of vtkPolyData is currently supported.
void MarkAsRedistributable(vtkPVDataRepresentation*, bool value=true);
// Description:
// Returns the size for all visible geometry. If low_res is true, and low-res
// data is not available for a particular representation, then it's high-res
// data size will be used assuming that the representation is going to render
// the high-res geometry for low-res rendering as well.
unsigned long GetVisibleDataSize(bool low_res);
// Description:
// Provides access to the partitioning kd-tree that was generated using the
// data provided by the representations. The view uses this kd-tree to decide
// on the compositing order when ordered compositing is being used.
vtkPKdTree* GetKdTree();
// Description:
// Get/Set the render-view. The view is not reference counted.
void SetRenderView(vtkPVRenderView*);
vtkPVRenderView* GetRenderView();
// Description:
// Called by the view on ever render when ordered compositing is to be used to
// ensure that the geometries are redistributed, as needed.
void RedistributeDataForOrderedCompositing(bool use_lod);
// Description:
// Pass the structured-meta-data for determining rendering order for ordered
// compositing.
void SetOrderedCompositingInformation(
vtkPVDataRepresentation* repr, vtkExtentTranslator* translator,
const int whole_extents[6], const double origin[3], const double spacing[3]);
//BTX
// Description:
// Internal method used to determine the list of representations that need
// their geometry delivered. This is done on the "client" side, with the
// client decide what geometries it needs and then requests those from the
// server-sides using Deliver().
bool NeedsDelivery(unsigned long timestamp,
std::vector<unsigned int>& keys_to_deliver, bool use_low_res);
//ETX
// Description:
// Triggers delivery for the geometries of indicated representations.
void Deliver(int use_low_res, unsigned int size, unsigned int *keys);
// *******************************************************************
// UNDER CONSTRUCTION STREAMING API
// *******************************************************************
// Description:
// Mark a representation as streamable. Any representation can indicate that
// it is streamable i.e. the view can call streaming passses on it and it will
// deliver data incrementally.
void SetStreamable(vtkPVDataRepresentation*, bool);
// Description:
// Passes the current streamed piece. This is the piece that will be delivered
// to the rendering node.
void SetNextStreamedPiece(vtkPVDataRepresentation* repr, vtkDataObject* piece);
vtkDataObject* GetCurrentStreamedPiece(vtkPVDataRepresentation* repr);
void ClearStreamedPieces();
// Description:
// Deliver streamed pieces. Unlike regular data, streamed pieces are delivered
// and released. Representations are expected to manage the pieces once they
// are delivered to them.
void DeliverStreamedPieces(unsigned int size, unsigned int *keys);
//BTX
// Description:
// Fills up the vector with the keys for representations that have non-null
// streaming pieces.
bool GetRepresentationsReadyToStreamPieces(std::vector<unsigned int>& keys);
//ETX
// *******************************************************************
//BTX
protected:
vtkPVDataDeliveryManager();
~vtkPVDataDeliveryManager();
vtkWeakPointer<vtkPVRenderView> RenderView;
vtkSmartPointer<vtkPKdTree> KdTree;
vtkTimeStamp RedistributionTimeStamp;
private:
vtkPVDataDeliveryManager(const vtkPVDataDeliveryManager&); // Not implemented
void operator=(const vtkPVDataDeliveryManager&); // Not implemented
class vtkInternals;
vtkInternals* Internals;
//ETX
};
#endif
// VTK-HeaderTest-Exclude: vtkPVDataDeliveryManager.h