2014-06-29 02:42:36 +02:00
# ifndef COMPONENTS_TERRAIN_WORLD_H
# define COMPONENTS_TERRAIN_WORLD_H
2013-08-16 13:01:52 +02:00
2015-06-03 01:18:36 +02:00
# include <osg/ref_ptr>
2017-03-06 20:41:02 +01:00
# include <osg/Vec3f>
2013-08-16 13:01:52 +02:00
2017-03-06 16:32:56 +01:00
# include <memory>
2014-02-16 18:48:35 +01:00
# include "defs.hpp"
2013-08-27 15:48:13 +02:00
2015-06-03 01:18:36 +02:00
namespace osg
2013-08-16 13:01:52 +02:00
{
2015-06-03 01:18:36 +02:00
class Group ;
2017-02-22 02:18:18 +01:00
class Stats ;
2017-03-06 20:41:02 +01:00
class Node ;
2015-06-03 01:18:36 +02:00
}
namespace Resource
{
class ResourceSystem ;
2013-08-16 13:01:52 +02:00
}
namespace Terrain
{
class Storage ;
2017-03-06 16:32:56 +01:00
class TextureManager ;
2017-03-06 20:41:02 +01:00
class ChunkManager ;
2017-03-09 01:56:43 +01:00
class CompositeMapRenderer ;
2017-03-06 16:32:56 +01:00
2017-03-09 04:17:25 +01:00
/**
* @ brief A View is a collection of rendering objects that are visible from a given camera / intersection .
* The base View class is part of the interface for usage in conjunction with preload feature .
*/
class View
{
public :
virtual ~ View ( ) { }
/// Reset internal structure so that the next addition to the view will override the previous frame's contents.
virtual void reset ( unsigned int frame ) = 0 ;
} ;
2013-08-16 13:01:52 +02:00
/**
2014-06-29 02:42:36 +02:00
* @ brief The basic interface for a terrain world . How the terrain chunks are paged and displayed
* is up to the implementation .
2013-08-16 13:01:52 +02:00
*/
2014-06-29 02:42:36 +02:00
class World
2013-08-16 13:01:52 +02:00
{
public :
/// @note takes ownership of \a storage
2013-08-19 20:30:22 +02:00
/// @param storage Storage instance to get terrain data from (heights, normals, colors, textures..)
2015-06-03 01:18:36 +02:00
/// @param nodeMask mask for the terrain root
2017-03-07 17:25:23 +01:00
/// @param preCompileMask mask for pre compiling textures
World ( osg : : Group * parent , osg : : Group * compileRoot , Resource : : ResourceSystem * resourceSystem , Storage * storage , int nodeMask , int preCompileMask ) ;
2014-06-29 02:42:36 +02:00
virtual ~ World ( ) ;
2013-08-16 13:01:52 +02:00
2017-03-07 17:22:47 +01:00
/// Apply the scene manager's texture filtering settings to all cached textures.
/// @note Thread safe.
void updateTextureFiltering ( ) ;
2016-02-14 23:14:52 +01:00
2015-06-03 01:18:36 +02:00
float getHeightAt ( const osg : : Vec3f & worldPos ) ;
2014-06-29 02:42:36 +02:00
2017-03-08 01:53:13 +01:00
/// Load a terrain cell and store it in cache for later use.
/// @note The returned ref_ptr should be kept by the caller to ensure that the terrain stays in cache for as long as needed.
/// @note Thread safe.
/// @note May be ignored by derived implementations that don't organize the terrain into cells.
virtual osg : : ref_ptr < osg : : Node > cacheCell ( int x , int y ) ;
2016-02-09 20:57:30 +01:00
2017-03-08 01:53:13 +01:00
/// Load the cell into the scene graph.
/// @note Not thread safe.
/// @note May be ignored by derived implementations that don't organize the terrain into cells.
2014-06-29 02:42:36 +02:00
virtual void loadCell ( int x , int y ) { }
2017-03-08 01:53:13 +01:00
/// Remove the cell from the scene graph.
/// @note Not thread safe.
/// @note May be ignored by derived implementations that don't organize the terrain into cells.
2014-06-29 02:42:36 +02:00
virtual void unloadCell ( int x , int y ) { }
2013-08-16 13:01:52 +02:00
2017-03-09 02:17:25 +01:00
virtual void enable ( bool enabled ) { }
2017-03-09 04:17:25 +01:00
/// Create a View to use with preload feature. If a View is returned, it will remain valid until the user calls 'removeView' or the World is destroyed.
/// @note Not thread safe.
virtual View * createView ( ) { return NULL ; }
/// Remove a View that was previously created with 'createView'.
/// @note Not thread safe.
virtual void removeView ( View * view ) { }
/// @note Thread safe, as long as you do not attempt to load into the same view from multiple threads.
virtual void preload ( View * view , const osg : : Vec3f & eyePoint ) { }
2013-08-16 13:01:52 +02:00
Storage * getStorage ( ) { return mStorage ; }
2014-06-29 02:42:36 +02:00
protected :
2013-08-16 13:01:52 +02:00
Storage * mStorage ;
2015-06-03 01:18:36 +02:00
osg : : ref_ptr < osg : : Group > mParent ;
osg : : ref_ptr < osg : : Group > mTerrainRoot ;
2017-03-09 19:17:58 +01:00
osg : : ref_ptr < osg : : Group > mCompositeMapCamera ;
2017-03-09 01:56:43 +01:00
osg : : ref_ptr < CompositeMapRenderer > mCompositeMapRenderer ;
2015-06-03 01:18:36 +02:00
Resource : : ResourceSystem * mResourceSystem ;
2013-08-16 13:01:52 +02:00
2017-03-06 16:32:56 +01:00
std : : auto_ptr < TextureManager > mTextureManager ;
2017-03-06 20:41:02 +01:00
std : : auto_ptr < ChunkManager > mChunkManager ;
2014-03-05 21:45:43 +01:00
} ;
2013-08-16 13:01:52 +02:00
}
# endif