2017-03-08 22:16:03 +01:00
# ifndef OPENMW_COMPONENTS_TERRAIN_VIEWDATA_H
# define OPENMW_COMPONENTS_TERRAIN_VIEWDATA_H
# include <vector>
# include <deque>
# include <osg/Node>
2017-03-09 04:17:25 +01:00
# include "world.hpp"
2017-03-08 22:16:03 +01:00
namespace Terrain
{
class QuadTreeNode ;
2017-03-09 04:17:25 +01:00
class ViewData : public View
2017-03-08 22:16:03 +01:00
{
public :
ViewData ( ) ;
2017-03-09 04:17:25 +01:00
~ ViewData ( ) ;
2017-03-08 22:16:03 +01:00
2017-03-09 00:01:13 +01:00
void add ( QuadTreeNode * node , bool visible ) ;
2017-03-08 22:16:03 +01:00
2019-02-20 13:37:00 +00:00
void reset ( ) ;
2017-03-08 22:16:03 +01:00
void clear ( ) ;
2017-03-09 00:45:31 +01:00
bool contains ( QuadTreeNode * node ) ;
2019-02-20 13:37:00 +00:00
void copyFrom ( const ViewData & other ) ;
2017-03-08 22:16:03 +01:00
struct Entry
{
Entry ( ) ;
2017-03-09 00:01:13 +01:00
bool set ( QuadTreeNode * node , bool visible ) ;
2017-03-08 22:16:03 +01:00
QuadTreeNode * mNode ;
2017-03-09 00:01:13 +01:00
bool mVisible ;
2017-03-08 22:16:03 +01:00
2017-03-09 04:14:07 +01:00
unsigned int mLodFlags ;
2017-03-08 22:16:03 +01:00
osg : : ref_ptr < osg : : Node > mRenderingNode ;
} ;
unsigned int getNumEntries ( ) const ;
Entry & getEntry ( unsigned int i ) ;
unsigned int getFrameLastUsed ( ) const { return mFrameLastUsed ; }
2019-02-20 13:37:00 +00:00
void finishFrame ( unsigned int frame ) { mFrameLastUsed = frame ; mChanged = false ; }
2017-03-08 22:16:03 +01:00
2017-03-09 04:14:07 +01:00
/// @return Have any nodes changed since the last frame
bool hasChanged ( ) const ;
2019-02-20 13:37:00 +00:00
bool hasViewPoint ( ) const ;
2017-07-19 13:11:44 +02:00
2019-02-20 13:37:00 +00:00
void setViewPoint ( const osg : : Vec3f & viewPoint ) ;
const osg : : Vec3f & getViewPoint ( ) const ;
2017-07-19 13:11:44 +02:00
2017-03-08 22:16:03 +01:00
private :
std : : vector < Entry > mEntries ;
unsigned int mNumEntries ;
unsigned int mFrameLastUsed ;
bool mChanged ;
2019-02-20 13:37:00 +00:00
osg : : Vec3f mViewPoint ;
bool mHasViewPoint ;
float mReuseDistance ;
2017-03-08 22:16:03 +01:00
} ;
class ViewDataMap : public osg : : Referenced
{
public :
2019-02-20 13:37:00 +00:00
ViewDataMap ( )
: mReuseDistance ( 100 ) // large value should be safe because the visibility of each node is still updated individually for each camera even if the base view was reused.
{ }
ViewData * getViewData ( osg : : Object * viewer , const osg : : Vec3f & viewPoint , bool & needsUpdate ) ;
2017-03-08 22:16:03 +01:00
ViewData * createOrReuseView ( ) ;
void clearUnusedViews ( unsigned int frame ) ;
void clear ( ) ;
2017-07-19 13:11:44 +02:00
void setDefaultViewer ( osg : : Object * viewer ) ;
2019-02-20 13:37:00 +00:00
bool getDefaultViewPoint ( osg : : Vec3f & viewPoint ) ;
2017-07-19 13:11:44 +02:00
2017-03-08 22:16:03 +01:00
private :
std : : list < ViewData > mViewVector ;
2019-02-20 13:37:00 +00:00
typedef std : : map < osg : : ref_ptr < osg : : Object > , ViewData * > Map ;
2017-03-08 22:16:03 +01:00
Map mViews ;
2019-02-20 13:37:00 +00:00
float mReuseDistance ;
2017-03-08 22:16:03 +01:00
std : : deque < ViewData * > mUnusedViews ;
2017-07-19 13:11:44 +02:00
osg : : ref_ptr < osg : : Object > mDefaultViewer ;
2017-03-08 22:16:03 +01:00
} ;
}
# endif