You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

190 lines
4.4 KiB
C

/*=========================================================================
Program: Visualization Toolkit
Module: vtkViewNode.h
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm 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.
=========================================================================*/
/**
* @class vtkViewNode
* @brief a node within a VTK scene graph
*
* This is the superclass for all nodes within a VTK scene graph. It
* contains the API for a node. It supports the essential operations such
* as graph creation, state storage and traversal. Child classes adapt this
* to VTK's major rendering classes. Grandchild classes adapt those to
* for APIs of different rendering libraries.
*/
#ifndef vtkViewNode_h
#define vtkViewNode_h
#include "vtkObject.h"
#include "vtkRenderingSceneGraphModule.h" // For export macro
#include "vtkWeakPointer.h" //avoid ref loop to parent
class vtkCollection;
class vtkViewNodeFactory;
class vtkViewNodeCollection;
class VTKRENDERINGSCENEGRAPH_EXPORT vtkViewNode : public vtkObject
{
public:
vtkTypeMacro(vtkViewNode, vtkObject);
void PrintSelf(ostream& os, vtkIndent indent) override;
//@{
/**
* This is the VTK class that this node stands in for.
*/
vtkGetObjectMacro(Renderable, vtkObject);
//@}
/**
* Builds myself.
*/
virtual void Build(bool /* prepass */) {}
/**
* Ensures that my state agrees with my Renderable's.
*/
virtual void Synchronize(bool /* prepass */) {}
/**
* Makes calls to make self visible.
*/
virtual void Render(bool /*prepass*/) {}
/**
* Clear any cached data.
*/
virtual void Invalidate(bool /*prepass*/) {}
//@{
/**
* Access the node that owns this one.
*/
virtual void SetParent(vtkViewNode*);
virtual vtkViewNode* GetParent();
//@}
//@{
/**
* Access nodes that this one owns.
*/
virtual void SetChildren(vtkViewNodeCollection*);
vtkGetObjectMacro(Children, vtkViewNodeCollection);
//@}
//@{
/**
* A factory that creates particular subclasses for different
* rendering back ends.
*/
virtual void SetMyFactory(vtkViewNodeFactory*);
vtkGetObjectMacro(MyFactory, vtkViewNodeFactory);
//@}
/**
* Returns the view node that corresponding to the provided object
* Will return NULL if a match is not found in self or descendents
*/
vtkViewNode* GetViewNodeFor(vtkObject*);
/**
* Find the first parent/grandparent of the desired type
*/
vtkViewNode* GetFirstAncestorOfType(const char* type);
/**
* Find the first child of the desired type
*/
vtkViewNode* GetFirstChildOfType(const char* type);
/**
* Allow explicit setting of the renderable for a
* view node.
*/
virtual void SetRenderable(vtkObject*);
// if you want to traverse your children in a specific order
// or way override this method
virtual void Traverse(int operation);
virtual void TraverseAllPasses();
/**
* Allows smart caching
*/
vtkMTimeType RenderTime;
/**
* internal mechanics of graph traversal and actions
*/
enum operation_type
{
noop,
build,
synchronize,
render,
invalidate
};
protected:
vtkViewNode();
~vtkViewNode() override;
static const char* operation_type_strings[];
void Apply(int operation, bool prepass);
//@{
/**
* convenience method to add node or nodes
* if missing from our current list
*/
void AddMissingNode(vtkObject* obj);
void AddMissingNodes(vtkCollection* col);
//@}
//@{
/**
* Called first before adding missing nodes.
* Keeps track of the nodes that should be in the collection
*/
void PrepareNodes();
vtkCollection* PreparedNodes;
//@}
/**
* Called after PrepareNodes and AddMissingNodes
* removes any extra leftover nodes
*/
void RemoveUnusedNodes();
/**
* Create the correct ViewNode subclass for the passed in object.
*/
virtual vtkViewNode* CreateViewNode(vtkObject* obj);
vtkObject* Renderable;
vtkWeakPointer<vtkViewNode> Parent;
vtkViewNodeCollection* Children;
vtkViewNodeFactory* MyFactory;
friend class vtkViewNodeFactory;
private:
vtkViewNode(const vtkViewNode&) = delete;
void operator=(const vtkViewNode&) = delete;
};
#endif