@ -9,6 +9,7 @@
# include "../esm/loadland.hpp"
# include <components/resource/scenemanager.hpp>
# include <components/terrain/storage.hpp>
namespace Terrain
{
@ -21,13 +22,14 @@ CellBorder::CellBorder(Terrain::World *world, osg::Group *root, int borderMask,
{
}
void CellBorder : : createCellBorderGeometry ( int x , int y )
osg : : ref_ptr < osg : : Geode > CellBorder : : createBorderGeometry ( float x , float y , float size , Terrain : : Storage * terrain , Resource : : SceneManager * sceneManager , int mask )
{
const int cellSize = ESM : : Land : : REAL_SIZE ;
const int borderSegments = 40 ;
const float offset = 10.0 ;
osg : : Vec3 cellCorner = osg : : Vec3 ( x * cellSize , y * cellSize , 0 ) ;
size * = cellSize ;
osg : : ref_ptr < osg : : Vec3Array > vertices = new osg : : Vec3Array ;
osg : : ref_ptr < osg : : Vec4Array > colors = new osg : : Vec4Array ;
@ -35,16 +37,16 @@ void CellBorder::createCellBorderGeometry(int x, int y)
normals - > push_back ( osg : : Vec3 ( 0.0f , - 1.0f , 0.0f ) ) ;
float borderStep = cellS ize / ( ( float ) borderSegments ) ;
float borderStep = s ize / ( ( float ) borderSegments ) ;
for ( int i = 0 ; i < = 2 * borderSegments ; + + i )
{
osg : : Vec3f pos = i < borderSegments ?
osg : : Vec3 ( i * borderStep , 0.0f , 0.0f ) :
osg : : Vec3 ( cellSize, ( i - borderSegments ) * borderStep , 0.0f ) ;
osg : : Vec3 ( size, ( i - borderSegments ) * borderStep , 0.0f ) ;
pos + = cellCorner ;
pos + = osg : : Vec3f ( 0 , 0 , mWorld - > getHeightAt ( pos ) + offset ) ;
pos + = osg : : Vec3f ( 0 , 0 , terrain - > getHeightAt ( pos ) + offset ) ;
vertices - > push_back ( pos ) ;
@ -76,10 +78,15 @@ void CellBorder::createCellBorderGeometry(int x, int y)
polygonmode - > setMode ( osg : : PolygonMode : : FRONT_AND_BACK , osg : : PolygonMode : : LINE ) ;
stateSet - > setAttributeAndModes ( polygonmode , osg : : StateAttribute : : ON ) ;
mSceneManager - > recreateShaders ( borderGeode , " debug " ) ;
sceneManager - > recreateShaders ( borderGeode , " debug " ) ;
borderGeode - > setNodeMask ( mask ) ;
borderGeode - > setNodeMask ( mBorderMask ) ;
return borderGeode ;
}
void CellBorder : : createCellBorderGeometry ( int x , int y )
{
auto borderGeode = createBorderGeometry ( x , y , 1.f , mWorld - > getStorage ( ) , mSceneManager , mBorderMask ) ;
mRoot - > addChild ( borderGeode ) ;
mCellBorderNodes [ std : : make_pair ( x , y ) ] = borderGeode ;