OpenSceneGraph/examples/osgdepthpartition/DepthPartitionNode.h
Robert Osfield 43f0efd6d2 Reorganised the Group::removeChild and Geode::removeDrawable methods so
that removeChild(Node*), removeChild(uint) and equivilant Geode methods are
now inline methods, not designed to be overriden, and seperated out the
multiple remove method to be called removeChildren(uint, uint) which is
now the only virtual method.  There removeChildren is now the method to
override in subclasses.

This reorganisation requires some call code to be rename removeChild usage
to removeChildren.
2006-05-02 09:45:31 +00:00

86 lines
3.0 KiB
C++

#ifndef _OF_DEPTHPARTITIONNODE_
#define _OF_DEPTHPARTITIONNODE_
#include "DistanceAccumulator.h"
#include <osg/CameraNode>
#define CURRENT_CLASS DepthPartitionNode
/**********************************************************
* Ravi Mathur
* OpenFrames API, class DepthPartitionNode
* A type of osg::Group that analyzes a scene, then partitions it into
* several segments that can be rendered separately. Each segment
* is small enough in the z-direction to avoid depth buffer problems
* for very large scenes.
**********************************************************/
class CURRENT_CLASS : public osg::Group
{
public:
CURRENT_CLASS();
CURRENT_CLASS(const CURRENT_CLASS& dpn,
const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY);
META_Node( OpenFrames, CURRENT_CLASS ); // Common Node functions
/** Set the active state. If not active, this node will simply add the
specified scene as it's child, without analyzing it at all. */
void setActive(bool active);
inline bool getActive() const { return _active; }
/** Specify whether the color buffer should be cleared before the first
CameraNode draws it's scene. */
void setClearColorBuffer(bool clear);
inline bool getClearColorBuffer() const { return _clearColorBuffer; }
/** Specify the render order for each CameraNode */
void setRenderOrder(osg::CameraNode::RenderOrder order);
inline osg::CameraNode::RenderOrder getRenderOrder() const
{ return _renderOrder; }
/** Set/get the maximum depth that the scene will be traversed to.
Defaults to UINT_MAX. */
void setMaxTraversalDepth(unsigned int depth)
{ _distAccumulator->setMaxDepth(depth); }
inline unsigned int getMaxTraversalDepth() const
{ return _distAccumulator->getMaxDepth(); }
/** Override update and cull traversals */
virtual void traverse(osg::NodeVisitor &nv);
/** Catch child management functions so the CameraNodes can be informed
of added or removed children. */
virtual bool addChild(osg::Node *child);
virtual bool insertChild(unsigned int index, osg::Node *child);
virtual bool removeChildren(unsigned int pos, unsigned int numRemove = 1);
virtual bool setChild(unsigned int i, osg::Node *node);
protected:
typedef std::vector< osg::ref_ptr<osg::CameraNode> > CameraList;
~CURRENT_CLASS();
void init();
// Creates a new CameraNode object with default settings
osg::CameraNode* createOrReuseCamera(const osg::Matrix& proj,
double znear, double zfar,
const unsigned int &camNum);
bool _active; // Whether partitioning is active on the scene
// The NodeVisitor that computes cameras for the scene
osg::ref_ptr<DistanceAccumulator> _distAccumulator;
osg::CameraNode::RenderOrder _renderOrder;
bool _clearColorBuffer;
// Cameras that should be used to draw the scene. These cameras
// will be reused on every frame in order to save time and memory.
CameraList _cameraList;
unsigned int _numCameras; // Number of CameraNodes actually being used
};
#undef CURRENT_CLASS
#endif