Debug terrain chunks

pull/3119/head^2^2
Cédric Mocquillon 3 years ago
parent e2d0e86020
commit 98a0819d52

@ -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 = cellSize / ((float) borderSegments);
float borderStep = size / ((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;

@ -11,6 +11,7 @@ namespace Resource
namespace Terrain
{
class Storage;
class World;
/**
@ -31,6 +32,8 @@ namespace Terrain
*/
void destroyCellBorderGeometry();
static osg::ref_ptr<osg::Geode> createBorderGeometry(float x, float y, float size, Storage* terrain, Resource::SceneManager* sceneManager, int mask);
protected:
Terrain::World *mWorld;
Resource::SceneManager* mSceneManager;

@ -5,6 +5,7 @@
#include <osg/Texture2D>
#include <osg/ClusterCullingCallback>
#include <osg/Material>
#include <osg/MatrixTransform>
#include <osgUtil/IncrementalCompileOperation>
@ -12,12 +13,14 @@
#include <components/resource/scenemanager.hpp>
#include <components/sceneutil/lightmanager.hpp>
#include <components/settings/settings.hpp>
#include "terraindrawable.hpp"
#include "material.hpp"
#include "storage.hpp"
#include "texturemanager.hpp"
#include "compositemaprenderer.hpp"
#include <components/misc/constants.hpp>
namespace Terrain
{
@ -32,6 +35,7 @@ ChunkManager::ChunkManager(Storage *storage, Resource::SceneManager *sceneMgr, T
, mCompositeMapSize(512)
, mCompositeMapLevel(1.f)
, mMaxCompGeometrySize(1.f)
, mDebugChunks(Settings::Manager::getBool("debug chunks", "Terrain"))
{
mMultiPassRoot = new osg::StateSet;
mMultiPassRoot->setRenderingHint(osg::StateSet::OPAQUE_BIN);
@ -234,7 +238,19 @@ osg::ref_ptr<osg::Node> ChunkManager::createChunk(float chunkSize, const osg::Ve
}
geometry->setNodeMask(mNodeMask);
return geometry;
osg::ref_ptr<osg::Group> result(new osg::Group);
result->addChild(geometry);
if (mDebugChunks)
{
auto chunkBorder = CellBorder::createBorderGeometry(chunkCenter.x() - chunkSize / 2.f, chunkCenter.y() - chunkSize / 2.f, chunkSize, mStorage, mSceneManager, getNodeMask());
osg::Vec3f center = { chunkCenter.x(), chunkCenter.y(), 0 };
osg::ref_ptr<osg::MatrixTransform> trans = new osg::MatrixTransform(osg::Matrixf::translate(-center*Constants::CellSizeInUnits));
trans->setDataVariance(osg::Object::STATIC);
trans->addChild(chunkBorder);
result->addChild(trans);
}
return result;
}
}

@ -72,6 +72,7 @@ namespace Terrain
unsigned int mCompositeMapSize;
float mCompositeMapLevel;
float mMaxCompGeometrySize;
bool mDebugChunks = false;
};
}

@ -367,7 +367,7 @@ void updateWaterCullingView(HeightCullCallback* callback, ViewData* vd, osgUtil:
for (unsigned int i=0; i<vd->getNumEntries(); ++i)
{
ViewData::Entry& entry = vd->getEntry(i);
osg::BoundingBox bb = static_cast<TerrainDrawable*>(entry.mRenderingNode->asGroup()->getChild(0))->getWaterBoundingBox();
osg::BoundingBox bb = static_cast<TerrainDrawable*>(entry.mRenderingNode->asGroup()->getChild(0)->asGroup()->getChild(0))->getWaterBoundingBox();
if (!bb.valid())
continue;
osg::Vec3f ofs (entry.mNode->getCenter().x()*cellworldsize, entry.mNode->getCenter().y()*cellworldsize, 0.f);

@ -100,6 +100,15 @@ max composite geometry size
Controls the maximum size of simple composite geometry chunk in cell units. With small values there will more draw calls and small textures,
but higher values create more overdraw (not every texture layer is used everywhere).
debug chunks
------------
:Type: boolean
:Range: True/False
:Default: False
This debug setting allows you to see the borders of each chunks of the world by drawing lines arround them (as with toggleborder).
object paging
-------------

@ -139,6 +139,9 @@ composite map resolution = 512
# Controls the maximum size of composite geometry, should be >= 1.0. With low values there will be many small chunks, with high values - lesser count of bigger chunks.
max composite geometry size = 4.0
# Draw lines arround chunks.
debug chunks = false
# Use object paging for non active cells
object paging = true

Loading…
Cancel
Save