#ifndef OSGUTIL_RENDERVISITOR #define OSGUTIL_RENDERVISITOR 1 #include #include #include #include #include #include #include #include #include #include namespace osgUtil { /** Container class for encapsulating the viewing state in local coordinates, during the cull traversal. */ class OSGUTIL_EXPORT ViewState : public osg::Referenced { public: ViewState(); osg::Matrix* _matrix; osg::Matrix* _inverse; osg::Vec3 _eyePoint; osg::Vec3 _centerPoint; osg::Vec3 _lookVector; osg::Vec3 _upVector; osg::Vec3 _frustumTopNormal; osg::Vec3 _frustumBottomNormal; osg::Vec3 _frustumLeftNormal; osg::Vec3 _frustumRightNormal; float _ratio; bool _viewFrustumCullingActive; bool _smallFeatureCullingActive; bool isCulled(const osg::BoundingSphere& sp); bool isCulled(const osg::BoundingBox& bb); protected: ~ViewState(); }; /** * Basic NodeVisitor implementation for rendering a scene. * This visitor traverses the scene graph, collecting transparent and * opaque osg::GeoSets into a depth sorted transparent bin and a state * sorted opaque bin. The opaque bin is rendered first, and then the * transparent bin in rendered in order from the furthest osg::GeoSet * from the eye to the one nearest the eye. */ class OSGUTIL_EXPORT RenderVisitor : public osg::NodeVisitor { public: RenderVisitor(); virtual ~RenderVisitor(); void reset(); virtual void apply(osg::Node&); virtual void apply(osg::Geode& node); virtual void apply(osg::Billboard& node); virtual void apply(osg::LightSource& node); virtual void apply(osg::Group& node); virtual void apply(osg::DCS& node); virtual void apply(osg::Switch& node); virtual void apply(osg::LOD& node); virtual void apply(osg::Scene& node); void setGlobalState(osg::GeoState* global); void setPerspective(const osg::Camera& camera); void setPerspective(float fovy,float aspect,float znear,float zfar); void setLookAt(const osg::Camera& camera); void setLookAt(const osg::Vec3& eye,const osg::Vec3& center,const osg::Vec3& upVector); void setLookAt(double eyeX,double eyeY,double eyeZ, double centerX,double centerY,double centerZ, double upX,double upY,double upZ); void setLODBias(float bias) { _LODBias = bias; } float getLODBias() { return _LODBias; } enum TransparencySortMode { LOOK_VECTOR_DISTANCE, OBJECT_EYE_POINT_DISTANCE }; void setTransparencySortMode(TransparencySortMode tsm) { _tsm = tsm; } enum CullingType { VIEW_FRUSTUM_CULLING, SMALL_FEATURE_CULLING }; /** * Enables/disables the specified culling type. * @param ct The culling type to enable/disable. * @param active true enables the culling type, false disables. */ void setCullingActive(CullingType ct, bool active); /** * Returns the state of the specified culling type. * @result true, if culling type is enabled, false otherwise. */ bool getCullingActive(CullingType ct); /** * Calculates the near_plane and the far_plane for the current * camera view depending on the objects currently stored in the * opaque and transparent bins. * @param near_plane reference to a variable that can store the * near plane result. * @param far_plane reference to a variable that can store the * far plane result. * @result true, if near_plane and far_plane contain valid values, * false otherwise. */ bool calcNearFar(double& near_plane, double& far_plane); /** * Renders the osg::GeoSets that were collected in the opaque and * transparent bins before. */ void render(); protected: void pushMatrix(const osg::Matrix& matrix); void popMatrix(); osg::Matrix* getCurrentMatrix(); osg::Matrix* getInverseCurrentMatrix(); const osg::Vec3& getEyeLocal(); const osg::Vec3& getCenterLocal(); const osg::Vec3& getLookVectorLocal(); bool _viewFrustumCullingActive; bool _smallFeatureCullingActive; bool isCulled(const osg::BoundingSphere& sp); bool isCulled(const osg::BoundingBox& bb); typedef std::pair MatrixGeoSet; typedef std::vector ViewStateStack; ViewStateStack _viewStateStack; ViewState* _tvs; ViewState* _cvs; typedef std::multimap OpaqueList; typedef std::multimap TransparentList; typedef std::map LightList; OpaqueList _opaqueGeoSets; TransparentList _transparentGeoSets; LightList _lights; osg::GeoState* _globalState; float _LODBias; float _fovy; float _aspect; float _znear; float _zfar; void calculateClippingPlanes(); // frustum clipping normals. osg::Vec3 _frustumTop; osg::Vec3 _frustumBottom; osg::Vec3 _frustumLeft; osg::Vec3 _frustumRight; TransparencySortMode _tsm; }; }; #endif