mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-15 00:40:02 +00:00
Merge branch 'DistantTerrainDebugChunks' into 'master'
Debug terrain chunks See merge request OpenMW/openmw!1169
This commit is contained in:
commit
68db9869f5
@ -390,7 +390,7 @@ namespace MWRender
|
|||||||
, mRefTrackerLocked(false)
|
, mRefTrackerLocked(false)
|
||||||
{
|
{
|
||||||
mActiveGrid = Settings::Manager::getBool("object paging active grid", "Terrain");
|
mActiveGrid = Settings::Manager::getBool("object paging active grid", "Terrain");
|
||||||
mDebugBatches = Settings::Manager::getBool("object paging debug batches", "Terrain");
|
mDebugBatches = Settings::Manager::getBool("debug chunks", "Terrain");
|
||||||
mMergeFactor = Settings::Manager::getFloat("object paging merge factor", "Terrain");
|
mMergeFactor = Settings::Manager::getFloat("object paging merge factor", "Terrain");
|
||||||
mMinSize = Settings::Manager::getFloat("object paging min size", "Terrain");
|
mMinSize = Settings::Manager::getFloat("object paging min size", "Terrain");
|
||||||
mMinSizeMergeFactor = Settings::Manager::getFloat("object paging min size merge factor", "Terrain");
|
mMinSizeMergeFactor = Settings::Manager::getFloat("object paging min size merge factor", "Terrain");
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#include "../esm/loadland.hpp"
|
#include "../esm/loadland.hpp"
|
||||||
|
|
||||||
#include <components/resource/scenemanager.hpp>
|
#include <components/resource/scenemanager.hpp>
|
||||||
|
#include <components/terrain/storage.hpp>
|
||||||
|
|
||||||
namespace Terrain
|
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,
|
||||||
|
float offset, osg::Vec4f color)
|
||||||
{
|
{
|
||||||
const int cellSize = ESM::Land::REAL_SIZE;
|
const int cellSize = ESM::Land::REAL_SIZE;
|
||||||
const int borderSegments = 40;
|
const int borderSegments = 40;
|
||||||
const float offset = 10.0;
|
|
||||||
|
|
||||||
osg::Vec3 cellCorner = osg::Vec3(x * cellSize,y * cellSize,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::Vec3Array> vertices = new osg::Vec3Array;
|
||||||
osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array;
|
osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array;
|
||||||
@ -35,22 +37,22 @@ void CellBorder::createCellBorderGeometry(int x, int y)
|
|||||||
|
|
||||||
normals->push_back(osg::Vec3(0.0f,-1.0f, 0.0f));
|
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)
|
for (int i = 0; i <= 2 * borderSegments; ++i)
|
||||||
{
|
{
|
||||||
osg::Vec3f pos = i < borderSegments ?
|
osg::Vec3f pos = i < borderSegments ?
|
||||||
osg::Vec3(i * borderStep,0.0f,0.0f) :
|
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 += cellCorner;
|
||||||
pos += osg::Vec3f(0,0,mWorld->getHeightAt(pos) + offset);
|
pos += osg::Vec3f(0,0, terrain->getHeightAt(pos) + offset);
|
||||||
|
|
||||||
vertices->push_back(pos);
|
vertices->push_back(pos);
|
||||||
|
|
||||||
osg::Vec4f col = i % 2 == 0 ?
|
osg::Vec4f col = i % 2 == 0 ?
|
||||||
osg::Vec4f(0,0,0,1) :
|
osg::Vec4f(0,0,0,1) :
|
||||||
osg::Vec4f(1,1,0,1);
|
color;
|
||||||
|
|
||||||
colors->push_back(col);
|
colors->push_back(col);
|
||||||
}
|
}
|
||||||
@ -76,10 +78,15 @@ void CellBorder::createCellBorderGeometry(int x, int y)
|
|||||||
polygonmode->setMode(osg::PolygonMode::FRONT_AND_BACK, osg::PolygonMode::LINE);
|
polygonmode->setMode(osg::PolygonMode::FRONT_AND_BACK, osg::PolygonMode::LINE);
|
||||||
stateSet->setAttributeAndModes(polygonmode,osg::StateAttribute::ON);
|
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);
|
mRoot->addChild(borderGeode);
|
||||||
|
|
||||||
mCellBorderNodes[std::make_pair(x,y)] = borderGeode;
|
mCellBorderNodes[std::make_pair(x,y)] = borderGeode;
|
||||||
|
@ -11,6 +11,7 @@ namespace Resource
|
|||||||
|
|
||||||
namespace Terrain
|
namespace Terrain
|
||||||
{
|
{
|
||||||
|
class Storage;
|
||||||
class World;
|
class World;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -31,6 +32,8 @@ namespace Terrain
|
|||||||
*/
|
*/
|
||||||
void destroyCellBorderGeometry();
|
void destroyCellBorderGeometry();
|
||||||
|
|
||||||
|
static osg::ref_ptr<osg::Geode> createBorderGeometry(float x, float y, float size, Storage* terrain, Resource::SceneManager* sceneManager, int mask, float offset = 10.0, osg::Vec4f color = { 1,1,0,0 });
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Terrain::World *mWorld;
|
Terrain::World *mWorld;
|
||||||
Resource::SceneManager* mSceneManager;
|
Resource::SceneManager* mSceneManager;
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include <osg/Texture2D>
|
#include <osg/Texture2D>
|
||||||
#include <osg/ClusterCullingCallback>
|
#include <osg/ClusterCullingCallback>
|
||||||
#include <osg/Material>
|
#include <osg/Material>
|
||||||
|
#include <osg/MatrixTransform>
|
||||||
|
|
||||||
#include <osgUtil/IncrementalCompileOperation>
|
#include <osgUtil/IncrementalCompileOperation>
|
||||||
|
|
||||||
@ -12,12 +13,14 @@
|
|||||||
#include <components/resource/scenemanager.hpp>
|
#include <components/resource/scenemanager.hpp>
|
||||||
|
|
||||||
#include <components/sceneutil/lightmanager.hpp>
|
#include <components/sceneutil/lightmanager.hpp>
|
||||||
|
#include <components/settings/settings.hpp>
|
||||||
|
|
||||||
#include "terraindrawable.hpp"
|
#include "terraindrawable.hpp"
|
||||||
#include "material.hpp"
|
#include "material.hpp"
|
||||||
#include "storage.hpp"
|
#include "storage.hpp"
|
||||||
#include "texturemanager.hpp"
|
#include "texturemanager.hpp"
|
||||||
#include "compositemaprenderer.hpp"
|
#include "compositemaprenderer.hpp"
|
||||||
|
#include <components/misc/constants.hpp>
|
||||||
|
|
||||||
namespace Terrain
|
namespace Terrain
|
||||||
{
|
{
|
||||||
@ -32,6 +35,7 @@ ChunkManager::ChunkManager(Storage *storage, Resource::SceneManager *sceneMgr, T
|
|||||||
, mCompositeMapSize(512)
|
, mCompositeMapSize(512)
|
||||||
, mCompositeMapLevel(1.f)
|
, mCompositeMapLevel(1.f)
|
||||||
, mMaxCompGeometrySize(1.f)
|
, mMaxCompGeometrySize(1.f)
|
||||||
|
, mDebugChunks(Settings::Manager::getBool("debug chunks", "Terrain"))
|
||||||
{
|
{
|
||||||
mMultiPassRoot = new osg::StateSet;
|
mMultiPassRoot = new osg::StateSet;
|
||||||
mMultiPassRoot->setRenderingHint(osg::StateSet::OPAQUE_BIN);
|
mMultiPassRoot->setRenderingHint(osg::StateSet::OPAQUE_BIN);
|
||||||
@ -234,6 +238,19 @@ osg::ref_ptr<osg::Node> ChunkManager::createChunk(float chunkSize, const osg::Ve
|
|||||||
}
|
}
|
||||||
geometry->setNodeMask(mNodeMask);
|
geometry->setNodeMask(mNodeMask);
|
||||||
|
|
||||||
|
if (mDebugChunks)
|
||||||
|
{
|
||||||
|
osg::ref_ptr<osg::Group> result(new osg::Group);
|
||||||
|
result->addChild(geometry);
|
||||||
|
auto chunkBorder = CellBorder::createBorderGeometry(chunkCenter.x() - chunkSize / 2.f, chunkCenter.y() - chunkSize / 2.f, chunkSize, mStorage, mSceneManager, getNodeMask(), 5.f, { 1, 0, 0, 0 });
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
return geometry;
|
return geometry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,6 +72,7 @@ namespace Terrain
|
|||||||
unsigned int mCompositeMapSize;
|
unsigned int mCompositeMapSize;
|
||||||
float mCompositeMapLevel;
|
float mCompositeMapLevel;
|
||||||
float mMaxCompGeometrySize;
|
float mMaxCompGeometrySize;
|
||||||
|
bool mDebugChunks = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -252,6 +252,7 @@ QuadTreeWorld::QuadTreeWorld(osg::Group *parent, osg::Group *compileRoot, Resour
|
|||||||
, mVertexLodMod(vertexLodMod)
|
, mVertexLodMod(vertexLodMod)
|
||||||
, mViewDistance(std::numeric_limits<float>::max())
|
, mViewDistance(std::numeric_limits<float>::max())
|
||||||
, mMinSize(1/8.f)
|
, mMinSize(1/8.f)
|
||||||
|
, mDebugTerrainChunks(Settings::Manager::getBool("debug chunks", "Terrain"))
|
||||||
{
|
{
|
||||||
mChunkManager->setCompositeMapSize(compMapResolution);
|
mChunkManager->setCompositeMapSize(compMapResolution);
|
||||||
mChunkManager->setCompositeMapLevel(compMapLevel);
|
mChunkManager->setCompositeMapLevel(compMapLevel);
|
||||||
@ -351,7 +352,7 @@ void loadRenderingNode(ViewData::Entry& entry, ViewData* vd, int vertexLodMod, f
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateWaterCullingView(HeightCullCallback* callback, ViewData* vd, osgUtil::CullVisitor* cv, float cellworldsize, bool outofworld)
|
void updateWaterCullingView(HeightCullCallback* callback, ViewData* vd, osgUtil::CullVisitor* cv, float cellworldsize, bool outofworld, bool debugTerrainChunk)
|
||||||
{
|
{
|
||||||
if (!(cv->getTraversalMask() & callback->getCullMask()))
|
if (!(cv->getTraversalMask() & callback->getCullMask()))
|
||||||
return;
|
return;
|
||||||
@ -367,7 +368,11 @@ void updateWaterCullingView(HeightCullCallback* callback, ViewData* vd, osgUtil:
|
|||||||
for (unsigned int i=0; i<vd->getNumEntries(); ++i)
|
for (unsigned int i=0; i<vd->getNumEntries(); ++i)
|
||||||
{
|
{
|
||||||
ViewData::Entry& entry = vd->getEntry(i);
|
ViewData::Entry& entry = vd->getEntry(i);
|
||||||
osg::BoundingBox bb = static_cast<TerrainDrawable*>(entry.mRenderingNode->asGroup()->getChild(0))->getWaterBoundingBox();
|
osg::BoundingBox bb;
|
||||||
|
if(debugTerrainChunk)
|
||||||
|
bb = static_cast<TerrainDrawable*>(entry.mRenderingNode->asGroup()->getChild(0)->asGroup()->getChild(0))->getWaterBoundingBox();
|
||||||
|
else
|
||||||
|
bb = static_cast<TerrainDrawable*>(entry.mRenderingNode->asGroup()->getChild(0))->getWaterBoundingBox();
|
||||||
if (!bb.valid())
|
if (!bb.valid())
|
||||||
continue;
|
continue;
|
||||||
osg::Vec3f ofs (entry.mNode->getCenter().x()*cellworldsize, entry.mNode->getCenter().y()*cellworldsize, 0.f);
|
osg::Vec3f ofs (entry.mNode->getCenter().x()*cellworldsize, entry.mNode->getCenter().y()*cellworldsize, 0.f);
|
||||||
@ -443,7 +448,7 @@ void QuadTreeWorld::accept(osg::NodeVisitor &nv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (mHeightCullCallback && isCullVisitor)
|
if (mHeightCullCallback && isCullVisitor)
|
||||||
updateWaterCullingView(mHeightCullCallback, vd, static_cast<osgUtil::CullVisitor*>(&nv), mStorage->getCellWorldSize(), !isGridEmpty());
|
updateWaterCullingView(mHeightCullCallback, vd, static_cast<osgUtil::CullVisitor*>(&nv), mStorage->getCellWorldSize(), !isGridEmpty(), mDebugTerrainChunks);
|
||||||
|
|
||||||
vd->markUnchanged();
|
vd->markUnchanged();
|
||||||
|
|
||||||
|
@ -72,6 +72,7 @@ namespace Terrain
|
|||||||
int mVertexLodMod;
|
int mVertexLodMod;
|
||||||
float mViewDistance;
|
float mViewDistance;
|
||||||
float mMinSize;
|
float mMinSize;
|
||||||
|
bool mDebugTerrainChunks;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -100,6 +100,18 @@ 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,
|
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).
|
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).
|
||||||
|
If object paging is set to true then this debug setting will allows you to see what objects have been merged in the scene
|
||||||
|
by making them colored randomly.
|
||||||
|
|
||||||
|
|
||||||
object paging
|
object paging
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
@ -194,12 +206,3 @@ object paging min size cost multiplier
|
|||||||
This setting adjusts the calculated cost of merging an object used in the mentioned functionality.
|
This setting adjusts the calculated cost of merging an object used in the mentioned functionality.
|
||||||
The larger this value is, the less expensive objects can be before they are discarded.
|
The larger this value is, the less expensive objects can be before they are discarded.
|
||||||
See the formula above to figure out the math.
|
See the formula above to figure out the math.
|
||||||
|
|
||||||
object paging debug batches
|
|
||||||
---------------------------
|
|
||||||
:Type: boolean
|
|
||||||
:Range: True/False
|
|
||||||
:Default: False
|
|
||||||
|
|
||||||
This debug setting allows you to see what objects have been merged in the scene
|
|
||||||
by making them colored randomly.
|
|
||||||
|
@ -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.
|
# 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
|
max composite geometry size = 4.0
|
||||||
|
|
||||||
|
# Draw lines arround chunks.
|
||||||
|
debug chunks = false
|
||||||
|
|
||||||
# Use object paging for non active cells
|
# Use object paging for non active cells
|
||||||
object paging = true
|
object paging = true
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user